From 756900723a64cb3cbd17bb720773daca9ebabcb1 Mon Sep 17 00:00:00 2001 From: briandevans <252620095+briandevans@users.noreply.github.com> Date: Mon, 18 May 2026 20:06:43 -0700 Subject: [PATCH] fix(agent): add qwen and deepseek to TOOL_USE_ENFORCEMENT_MODELS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Qwen3.x and DeepSeek-V3.x default to chatty/hallucinatory tool use without enforcement steering — agents narrate "calling tool X" without actually emitting a tool call, or run partial loops. Both model families fit the same failure pattern TOOL_USE_ENFORCEMENT_GUIDANCE was already injected for (gpt, codex, gemini, gemma, grok, glm). Co-authored-by: briandevans <252620095+briandevans@users.noreply.github.com> Squashed salvage of: - 403e567ce fix(agent): add qwen and deepseek to TOOL_USE_ENFORCEMENT_MODELS - 9433eabe7 test(agent): use realistic qwen-plus identifier in enforcement test Fixes #28079. --- agent/prompt_builder.py | 2 +- tests/agent/test_prompt_builder.py | 6 ++++++ tests/run_agent/test_run_agent.py | 14 ++++++++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/agent/prompt_builder.py b/agent/prompt_builder.py index 0db33e1cb36..603b44ff9ba 100644 --- a/agent/prompt_builder.py +++ b/agent/prompt_builder.py @@ -268,7 +268,7 @@ TOOL_USE_ENFORCEMENT_GUIDANCE = ( # Model name substrings that trigger tool-use enforcement guidance. # Add new patterns here when a model family needs explicit steering. -TOOL_USE_ENFORCEMENT_MODELS = ("gpt", "codex", "gemini", "gemma", "grok", "glm") +TOOL_USE_ENFORCEMENT_MODELS = ("gpt", "codex", "gemini", "gemma", "grok", "glm", "qwen", "deepseek") # OpenAI GPT/Codex-specific execution guidance. Addresses known failure modes # where GPT models abandon work on partial results, skip prerequisite lookups, diff --git a/tests/agent/test_prompt_builder.py b/tests/agent/test_prompt_builder.py index 936aff16bff..76d13f5d22c 100644 --- a/tests/agent/test_prompt_builder.py +++ b/tests/agent/test_prompt_builder.py @@ -1144,6 +1144,12 @@ class TestToolUseEnforcementGuidance: def test_enforcement_models_includes_grok(self): assert "grok" in TOOL_USE_ENFORCEMENT_MODELS + def test_enforcement_models_includes_qwen(self): + assert "qwen" in TOOL_USE_ENFORCEMENT_MODELS + + def test_enforcement_models_includes_deepseek(self): + assert "deepseek" in TOOL_USE_ENFORCEMENT_MODELS + def test_enforcement_models_is_tuple(self): assert isinstance(TOOL_USE_ENFORCEMENT_MODELS, tuple) diff --git a/tests/run_agent/test_run_agent.py b/tests/run_agent/test_run_agent.py index 9ff7ab28612..20019a05f85 100644 --- a/tests/run_agent/test_run_agent.py +++ b/tests/run_agent/test_run_agent.py @@ -1103,6 +1103,20 @@ class TestToolUseEnforcementConfig: prompt = agent._build_system_prompt() assert TOOL_USE_ENFORCEMENT_GUIDANCE in prompt + def test_auto_injects_for_qwen(self): + """Qwen models default to chatty/hallucinatory tool use without enforcement.""" + from agent.prompt_builder import TOOL_USE_ENFORCEMENT_GUIDANCE + agent = self._make_agent(model="qwen/qwen-plus", tool_use_enforcement="auto") + prompt = agent._build_system_prompt() + assert TOOL_USE_ENFORCEMENT_GUIDANCE in prompt + + def test_auto_injects_for_deepseek(self): + """DeepSeek models default to chatty/hallucinatory tool use without enforcement.""" + from agent.prompt_builder import TOOL_USE_ENFORCEMENT_GUIDANCE + agent = self._make_agent(model="deepseek/deepseek-r1", tool_use_enforcement="auto") + prompt = agent._build_system_prompt() + assert TOOL_USE_ENFORCEMENT_GUIDANCE in prompt + def test_auto_injects_execution_guidance_for_grok(self): """Grok also gets OPENAI_MODEL_EXECUTION_GUIDANCE (verification, mandatory_tool_use, act_dont_ask). Same failure modes as GPT in