From 43e50185f938b9036aca383d62593677edda6ba6 Mon Sep 17 00:00:00 2001 From: pewdiepie-archdaemon Date: Fri, 18 Sep 2026 17:00:54 +0000 Subject: [PATCH] normalize named tool choice for Kimi thinking mode --- src/clean_agent_preview.py | 2 +- tests/test_clean_agent_preview.py | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/clean_agent_preview.py b/src/clean_agent_preview.py index b463d9d24..2c7e5757e 100644 --- a/src/clean_agent_preview.py +++ b/src/clean_agent_preview.py @@ -185,7 +185,7 @@ def search_tool_choice_request(request): def provider_compatible_tool_choice_request(request, model): """Keep tools but avoid forced choice unsupported by thinking providers.""" model_name = canonical(str(model or '')).casefold() - if model_name.startswith('deepseek') and 'tool_choice' in request: + if model_name.startswith(('deepseek', 'kimi')) and 'tool_choice' in request: compatible = dict(request) choice = compatible.get('tool_choice') selected_name = ( diff --git a/tests/test_clean_agent_preview.py b/tests/test_clean_agent_preview.py index 7f56d7bb0..f36eba0d9 100644 --- a/tests/test_clean_agent_preview.py +++ b/tests/test_clean_agent_preview.py @@ -124,6 +124,23 @@ def test_deepseek_v4_flash_drops_named_choice_for_thinking_mode(): assert 'tool_choice' not in compatible +def test_kimi_k3_drops_named_choice_incompatible_with_thinking_mode(): + request = { + 'tools': [ + {'type': 'function', 'function': {'name': 'inspect_media'}}, + {'type': 'function', 'function': {'name': 'write_file'}}, + ], + 'tool_choice': {'type': 'function', 'function': {'name': 'inspect_media'}}, + } + + compatible = provider_compatible_tool_choice_request(request, 'kimi-k3') + + assert [tool['function']['name'] for tool in compatible['tools']] == [ + 'inspect_media' + ] + assert 'tool_choice' not in compatible + + def test_qwen_capture_converts_single_required_tool_to_named_constraint(): request = { 'tools': [{'type': 'function', 'function': {'name': 'web_search'}}],