Studio: don't drop parallel tool calls after an internal no-op (#7157)
This commit is contained in:
parent
8c83478da0
commit
3555dbdda7
6 changed files with 188 additions and 9 deletions
|
|
@ -13,6 +13,7 @@ if _BACKEND_DIR not in sys.path:
|
|||
|
||||
from core.inference.tool_loop_controller import (
|
||||
ToolLoopController,
|
||||
append_deferred_nudges,
|
||||
canonical_tool_call_key,
|
||||
coerce_tool_arguments,
|
||||
status_for_tool,
|
||||
|
|
@ -21,6 +22,22 @@ from core.inference.tool_loop_controller import (
|
|||
)
|
||||
|
||||
|
||||
def test_append_deferred_nudges_merges_deduped_into_one_message():
|
||||
conversation = [{"role": "assistant", "tool_calls": [1]}, {"role": "tool", "content": "r"}]
|
||||
nudges = [
|
||||
{"role": "user", "content": "duplicate"},
|
||||
{"role": "user", "content": "duplicate"}, # dropped: same content
|
||||
{"role": "user", "content": "disabled foo"},
|
||||
]
|
||||
append_deferred_nudges(conversation, nudges)
|
||||
# One user message, after the results, with distinct contents joined.
|
||||
assert conversation[2:] == [{"role": "user", "content": "duplicate\n\ndisabled foo"}]
|
||||
# Empty is a no-op.
|
||||
before = list(conversation)
|
||||
append_deferred_nudges(conversation, [])
|
||||
assert conversation == before
|
||||
|
||||
|
||||
def _tool(name: str) -> dict:
|
||||
return {"type": "function", "function": {"name": name}}
|
||||
|
||||
|
|
@ -111,6 +128,10 @@ def test_successful_duplicate_is_internal_noop_and_keeps_remaining_tools():
|
|||
assert not duplicate.should_execute
|
||||
assert not duplicate.emit_visible_events
|
||||
duplicate_nudge = completion.model_message()["content"]
|
||||
assert duplicate_nudge.startswith(
|
||||
"One earlier request to call tool 'web_search' in this batch was not executed"
|
||||
)
|
||||
assert "previous tool request" not in duplicate_nudge.lower()
|
||||
assert "already completed successfully" in duplicate_nudge
|
||||
assert "different enabled tool" in duplicate_nudge
|
||||
assert completion.model_message()["role"] == "user"
|
||||
|
|
@ -165,7 +186,12 @@ def test_empty_enabled_tool_list_blocks_all_tool_calls():
|
|||
assert decision.action == "disabled"
|
||||
assert not decision.emit_visible_events
|
||||
assert completion.model_message()["role"] == "user"
|
||||
assert "not enabled" in completion.model_message()["content"]
|
||||
disabled_nudge = completion.model_message()["content"]
|
||||
assert disabled_nudge.startswith(
|
||||
"One earlier request to call tool 'web_search' in this batch was not executed"
|
||||
)
|
||||
assert "previous tool request" not in disabled_nudge.lower()
|
||||
assert "not enabled" in disabled_nudge
|
||||
assert controller.force_final_answer
|
||||
assert controller.active_tools() == []
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue