Skip to content

Commit bd360bc

Browse files
committed
fix: compact ask_user_question validation output
1 parent 988ce7b commit bd360bc

10 files changed

Lines changed: 86 additions & 0 deletions

File tree

src/iac_code/i18n/locales/de/LC_MESSAGES/messages.po

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3069,6 +3069,10 @@ msgstr ""
30693069
msgid "The user-facing question to ask."
30703070
msgstr "Die dem Benutzer zu stellende Frage."
30713071

3072+
#: src/iac_code/pipeline/engine/ask_user_question_tool.py
3073+
msgid "ask_user_question validation failed."
3074+
msgstr "Die Validierung von ask_user_question ist fehlgeschlagen."
3075+
30723076
#: src/iac_code/pipeline/engine/ask_user_question_tool.py
30733077
msgid "ask_user_question requires a pipeline event queue."
30743078
msgstr "ask_user_question erfordert eine Pipeline-Ereigniswarteschlange."
@@ -3366,6 +3370,7 @@ msgid "<fill according to the current step requirements>"
33663370
msgstr "<gemäß den Anforderungen des aktuellen Schritts ausfüllen>"
33673371

33683372
#: src/iac_code/pipeline/engine/complete_step_tool.py
3373+
#: src/iac_code/ui/renderer.py
33693374
msgid "complete_step validation failed."
33703375
msgstr "Die Validierung von complete_step ist fehlgeschlagen."
33713376

src/iac_code/i18n/locales/es/LC_MESSAGES/messages.po

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3070,6 +3070,10 @@ msgstr ""
30703070
msgid "The user-facing question to ask."
30713071
msgstr "La pregunta que se mostrará al usuario."
30723072

3073+
#: src/iac_code/pipeline/engine/ask_user_question_tool.py
3074+
msgid "ask_user_question validation failed."
3075+
msgstr "La validación de ask_user_question falló."
3076+
30733077
#: src/iac_code/pipeline/engine/ask_user_question_tool.py
30743078
msgid "ask_user_question requires a pipeline event queue."
30753079
msgstr "ask_user_question requiere una cola de eventos del pipeline."
@@ -3358,6 +3362,7 @@ msgid "<fill according to the current step requirements>"
33583362
msgstr "<rellenar según los requisitos del paso actual>"
33593363

33603364
#: src/iac_code/pipeline/engine/complete_step_tool.py
3365+
#: src/iac_code/ui/renderer.py
33613366
msgid "complete_step validation failed."
33623367
msgstr "La validación de complete_step falló."
33633368

src/iac_code/i18n/locales/fr/LC_MESSAGES/messages.po

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3077,6 +3077,10 @@ msgstr ""
30773077
msgid "The user-facing question to ask."
30783078
msgstr "Question à poser à l’utilisateur."
30793079

3080+
#: src/iac_code/pipeline/engine/ask_user_question_tool.py
3081+
msgid "ask_user_question validation failed."
3082+
msgstr "La validation de ask_user_question a échoué."
3083+
30803084
#: src/iac_code/pipeline/engine/ask_user_question_tool.py
30813085
msgid "ask_user_question requires a pipeline event queue."
30823086
msgstr "ask_user_question nécessite une file d’événements du pipeline."
@@ -3365,6 +3369,7 @@ msgid "<fill according to the current step requirements>"
33653369
msgstr "<renseigner selon les exigences de l’étape actuelle>"
33663370

33673371
#: src/iac_code/pipeline/engine/complete_step_tool.py
3372+
#: src/iac_code/ui/renderer.py
33683373
msgid "complete_step validation failed."
33693374
msgstr "La validation de complete_step a échoué."
33703375

src/iac_code/i18n/locales/ja/LC_MESSAGES/messages.po

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2958,6 +2958,10 @@ msgstr "ユーザーに選択肢の選択または確認内容の入力を求め
29582958
msgid "The user-facing question to ask."
29592959
msgstr "ユーザーに表示する質問です。"
29602960

2961+
#: src/iac_code/pipeline/engine/ask_user_question_tool.py
2962+
msgid "ask_user_question validation failed."
2963+
msgstr "ask_user_question の検証に失敗しました。"
2964+
29612965
#: src/iac_code/pipeline/engine/ask_user_question_tool.py
29622966
msgid "ask_user_question requires a pipeline event queue."
29632967
msgstr "ask_user_question にはパイプラインイベントキューが必要です。"
@@ -3201,6 +3205,7 @@ msgid "<fill according to the current step requirements>"
32013205
msgstr "<現在のステップ要件に従って入力>"
32023206

32033207
#: src/iac_code/pipeline/engine/complete_step_tool.py
3208+
#: src/iac_code/ui/renderer.py
32043209
msgid "complete_step validation failed."
32053210
msgstr "complete_step の検証に失敗しました。"
32063211

src/iac_code/i18n/locales/pt/LC_MESSAGES/messages.po

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3053,6 +3053,10 @@ msgstr ""
30533053
msgid "The user-facing question to ask."
30543054
msgstr "A pergunta a ser exibida ao usuário."
30553055

3056+
#: src/iac_code/pipeline/engine/ask_user_question_tool.py
3057+
msgid "ask_user_question validation failed."
3058+
msgstr "A validação de ask_user_question falhou."
3059+
30563060
#: src/iac_code/pipeline/engine/ask_user_question_tool.py
30573061
msgid "ask_user_question requires a pipeline event queue."
30583062
msgstr "ask_user_question requer uma fila de eventos do pipeline."
@@ -3335,6 +3339,7 @@ msgid "<fill according to the current step requirements>"
33353339
msgstr "<preencher conforme os requisitos da etapa atual>"
33363340

33373341
#: src/iac_code/pipeline/engine/complete_step_tool.py
3342+
#: src/iac_code/ui/renderer.py
33383343
msgid "complete_step validation failed."
33393344
msgstr "A validação de complete_step falhou."
33403345

src/iac_code/i18n/locales/zh/LC_MESSAGES/messages.po

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2934,6 +2934,10 @@ msgstr "仅用于 pipeline 的工具,用于请用户选择选项或输入澄
29342934
msgid "The user-facing question to ask."
29352935
msgstr "要询问用户的问题。"
29362936

2937+
#: src/iac_code/pipeline/engine/ask_user_question_tool.py
2938+
msgid "ask_user_question validation failed."
2939+
msgstr "ask_user_question 校验失败。"
2940+
29372941
#: src/iac_code/pipeline/engine/ask_user_question_tool.py
29382942
msgid "ask_user_question requires a pipeline event queue."
29392943
msgstr "ask_user_question 需要 pipeline 事件队列。"
@@ -3167,6 +3171,7 @@ msgid "<fill according to the current step requirements>"
31673171
msgstr "<按当前步骤要求填写>"
31683172

31693173
#: src/iac_code/pipeline/engine/complete_step_tool.py
3174+
#: src/iac_code/ui/renderer.py
31703175
msgid "complete_step validation failed."
31713176
msgstr "complete_step 校验失败。"
31723177

src/iac_code/pipeline/engine/ask_user_question_tool.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,15 @@ def is_concurrency_safe(self, tool_input: dict[str, Any]) -> bool:
6868
def needs_event_queue(self) -> bool:
6969
return True
7070

71+
def render_tool_result_message(self, output: str, *, is_error: bool = False, verbose: bool = False) -> str | None:
72+
if not output or not is_error:
73+
return None
74+
if output.startswith("Invalid input for tool 'ask_user_question':"):
75+
if verbose:
76+
return output.strip()
77+
return _("ask_user_question validation failed.")
78+
return output.strip()
79+
7180
async def execute(self, *, tool_input: dict[str, Any], context: ToolContext) -> ToolResult:
7281
if context.event_queue is None:
7382
return ToolResult.error(_("ask_user_question requires a pipeline event queue."))

src/iac_code/ui/renderer.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,15 @@ def _known_tool_result_message(
106106
return output.strip()
107107
return _("complete_step validation failed.")
108108

109+
if (
110+
tool_name == "ask_user_question"
111+
and is_error
112+
and output.startswith("Invalid input for tool 'ask_user_question':")
113+
):
114+
if verbose:
115+
return output.strip()
116+
return _("ask_user_question validation failed.")
117+
109118
if tool_name == "ros_deploy":
110119
from iac_code.pipeline.selling.tools.ros_deploy_tool import RosDeployTool
111120

tests/pipeline/engine/test_ask_user_question_tool.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,19 @@ def test_schema_requires_question_and_options(self):
4242
assert option_schema["required"] == ["id", "label"]
4343
assert schema["additionalProperties"] is False
4444

45+
def test_validation_error_renders_compact_summary(self):
46+
long_error = (
47+
"Invalid input for tool 'ask_user_question': "
48+
"[{'id': 'tech_stack_nodejs', 'label': 'Node.js'}] is not of type 'object'. "
49+
"Please provide all required parameters as defined in the tool schema."
50+
)
51+
52+
compact = AskUserQuestionTool().render_tool_result_message(long_error, is_error=True)
53+
54+
assert compact == "ask_user_question validation failed."
55+
assert "tech_stack_nodejs" not in compact
56+
assert "not of type" not in compact
57+
4558

4659
class TestAskUserQuestionToolExecute:
4760
@pytest.mark.asyncio

tests/ui/test_renderer_helpers.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,31 @@ def test_replay_history_summarizes_legacy_complete_step_error_without_metadata(s
376376
assert "'conclusion' is a required property" not in output
377377
assert "schema summary" not in output
378378

379+
def test_replay_history_summarizes_legacy_ask_user_question_error_without_metadata(self):
380+
renderer = Renderer(make_console(), ToolRegistry(), status_callback=lambda: "ready")
381+
long_error = (
382+
"Invalid input for tool 'ask_user_question': "
383+
"[{'id': 'tech_stack_nodejs', 'label': 'Node.js'}] is not of type 'object'. "
384+
"Please provide all required parameters as defined in the tool schema."
385+
)
386+
messages = [
387+
Message(
388+
role="assistant",
389+
content=[ToolUseBlock(id="tu_bad", name="ask_user_question", input={})],
390+
),
391+
Message(
392+
role="user",
393+
content=[ToolResultBlock(tool_use_id="tu_bad", content=long_error, is_error=True)],
394+
),
395+
]
396+
397+
renderer.replay_history(messages)
398+
399+
output = renderer.console.file.getvalue()
400+
assert "ask_user_question validation failed." in output
401+
assert "tech_stack_nodejs" not in output
402+
assert "not of type" not in output
403+
379404
def test_render_progress_groups_include_resource_rows(self):
380405
renderer = make_renderer()
381406

0 commit comments

Comments
 (0)