From 35a35530ed9dc0a8ac7b7df299554eb9370bb720 Mon Sep 17 00:00:00 2001 From: alex s <46074070+bearsyankees@users.noreply.github.com> Date: Fri, 10 Jul 2026 18:43:07 -0400 Subject: [PATCH] Support routed OpenAI required tool choice (#732) --- strix/core/inputs.py | 4 ++++ tests/test_inputs.py | 20 ++++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/strix/core/inputs.py b/strix/core/inputs.py index f723c52b..e53ae321 100644 --- a/strix/core/inputs.py +++ b/strix/core/inputs.py @@ -24,6 +24,10 @@ DEFAULT_MAX_TURNS = 500 def _accepts_required_tool_choice(model_name: str | None) -> bool: name = (model_name or "").strip().lower() + for prefix in ("litellm/", "any-llm/"): + if name.startswith(prefix): + name = name[len(prefix) :] + break return name.startswith("openai/") or is_known_openai_bare_model(name) diff --git a/tests/test_inputs.py b/tests/test_inputs.py index ca1ba0d9..486c7e54 100644 --- a/tests/test_inputs.py +++ b/tests/test_inputs.py @@ -135,3 +135,23 @@ def test_make_model_settings_skips_required_tool_choice_for_non_openai_models() ) assert settings.tool_choice is None + + +def test_make_model_settings_forces_required_for_routed_openai_model() -> None: + settings = make_model_settings( + None, + model_name="litellm/openai/gpt-4o", + force_required_tool_choice=True, + ) + + assert settings.tool_choice == "required" + + +def test_make_model_settings_forces_required_for_anyllm_routed_openai_model() -> None: + settings = make_model_settings( + None, + model_name="any-llm/openai/gpt-4o", + force_required_tool_choice=True, + ) + + assert settings.tool_choice == "required"