From c6c70f68f9509d07689f4de3525556b3875d630a Mon Sep 17 00:00:00 2001 From: kimnamu Date: Thu, 24 Sep 2026 09:51:18 +0900 Subject: [PATCH] fix(bedrock): stop sending reasoning effort none to GPT-6 Astra when /v1/messages disables thinking The /v1/messages bridge turns Anthropic thinking {"type": "disabled"} into reasoning_effort "none" for every non-Claude target. Bedrock GPT-6 Astra has no "none" level and answers 400, although its map rows already say supports_none_reasoning_effort: false. Skip "none" when the target's row explicitly disables it, so the request runs at the model's default effort The Bedrock GPT-6 Sol and Luna rows copied Astra's false flag, but both take "none" on Converse and on the runtime and Mantle OpenAI endpoints, as OpenAI's own gpt-6-sol and gpt-6-luna rows say. Set it to true there so they keep getting "none" --- .../adapters/transformation.py | 6 ++++- ...odel_prices_and_context_window_backup.json | 16 ++++++------- model_prices_and_context_window.json | 16 ++++++------- ...al_pass_through_adapters_transformation.py | 24 +++++++++++++++++++ 4 files changed, 45 insertions(+), 17 deletions(-) diff --git a/litellm/llms/anthropic/experimental_pass_through/adapters/transformation.py b/litellm/llms/anthropic/experimental_pass_through/adapters/transformation.py index 85431a5a637..e5fd6258b10 100644 --- a/litellm/llms/anthropic/experimental_pass_through/adapters/transformation.py +++ b/litellm/llms/anthropic/experimental_pass_through/adapters/transformation.py @@ -199,7 +199,7 @@ from litellm.types.llms.openai import ( ToolMessageContentPart, ) from litellm.types.utils import Choices, ModelResponse, StreamingChoices, Usage -from litellm.utils import supports_mid_conversation_system +from litellm.utils import is_explicitly_disabled_factory, supports_mid_conversation_system from .streaming_iterator import AnthropicStreamWrapper @@ -1165,6 +1165,10 @@ class LiteLLMAnthropicMessagesAdapter: ) if not reasoning_effort: return + if reasoning_effort == "none" and is_explicitly_disabled_factory( + model=model, custom_llm_provider=custom_llm_provider, key="supports_none_reasoning_effort" + ): + return new_kwargs["reasoning_effort"] = ( reasoning_effort diff --git a/litellm/model_prices_and_context_window_backup.json b/litellm/model_prices_and_context_window_backup.json index ebea1a6044d..a80d9be5eef 100644 --- a/litellm/model_prices_and_context_window_backup.json +++ b/litellm/model_prices_and_context_window_backup.json @@ -56165,7 +56165,7 @@ "supports_function_calling": true, "supports_max_reasoning_effort": true, "supports_minimal_reasoning_effort": false, - "supports_none_reasoning_effort": false, + "supports_none_reasoning_effort": true, "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, @@ -56203,7 +56203,7 @@ "supports_function_calling": true, "supports_max_reasoning_effort": true, "supports_minimal_reasoning_effort": false, - "supports_none_reasoning_effort": false, + "supports_none_reasoning_effort": true, "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, @@ -56271,7 +56271,7 @@ "supports_function_calling": true, "supports_max_reasoning_effort": true, "supports_minimal_reasoning_effort": false, - "supports_none_reasoning_effort": false, + "supports_none_reasoning_effort": true, "supports_tool_choice": true, "supports_prompt_caching": true, "supports_reasoning": true, @@ -56306,7 +56306,7 @@ "supports_function_calling": true, "supports_max_reasoning_effort": true, "supports_minimal_reasoning_effort": false, - "supports_none_reasoning_effort": false, + "supports_none_reasoning_effort": true, "supports_tool_choice": true, "supports_prompt_caching": true, "supports_reasoning": true, @@ -56376,7 +56376,7 @@ "supports_function_calling": true, "supports_max_reasoning_effort": true, "supports_minimal_reasoning_effort": false, - "supports_none_reasoning_effort": false, + "supports_none_reasoning_effort": true, "supports_tool_choice": true, "supports_prompt_caching": true, "supports_reasoning": true, @@ -56408,7 +56408,7 @@ "supports_function_calling": true, "supports_max_reasoning_effort": true, "supports_minimal_reasoning_effort": false, - "supports_none_reasoning_effort": false, + "supports_none_reasoning_effort": true, "supports_tool_choice": true, "supports_prompt_caching": true, "supports_reasoning": true, @@ -56443,7 +56443,7 @@ "supports_function_calling": true, "supports_max_reasoning_effort": true, "supports_minimal_reasoning_effort": false, - "supports_none_reasoning_effort": false, + "supports_none_reasoning_effort": true, "supports_tool_choice": true, "supports_prompt_caching": true, "supports_reasoning": true, @@ -56475,7 +56475,7 @@ "supports_function_calling": true, "supports_max_reasoning_effort": true, "supports_minimal_reasoning_effort": false, - "supports_none_reasoning_effort": false, + "supports_none_reasoning_effort": true, "supports_tool_choice": true, "supports_prompt_caching": true, "supports_reasoning": true, diff --git a/model_prices_and_context_window.json b/model_prices_and_context_window.json index ebea1a6044d..a80d9be5eef 100644 --- a/model_prices_and_context_window.json +++ b/model_prices_and_context_window.json @@ -56165,7 +56165,7 @@ "supports_function_calling": true, "supports_max_reasoning_effort": true, "supports_minimal_reasoning_effort": false, - "supports_none_reasoning_effort": false, + "supports_none_reasoning_effort": true, "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, @@ -56203,7 +56203,7 @@ "supports_function_calling": true, "supports_max_reasoning_effort": true, "supports_minimal_reasoning_effort": false, - "supports_none_reasoning_effort": false, + "supports_none_reasoning_effort": true, "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, @@ -56271,7 +56271,7 @@ "supports_function_calling": true, "supports_max_reasoning_effort": true, "supports_minimal_reasoning_effort": false, - "supports_none_reasoning_effort": false, + "supports_none_reasoning_effort": true, "supports_tool_choice": true, "supports_prompt_caching": true, "supports_reasoning": true, @@ -56306,7 +56306,7 @@ "supports_function_calling": true, "supports_max_reasoning_effort": true, "supports_minimal_reasoning_effort": false, - "supports_none_reasoning_effort": false, + "supports_none_reasoning_effort": true, "supports_tool_choice": true, "supports_prompt_caching": true, "supports_reasoning": true, @@ -56376,7 +56376,7 @@ "supports_function_calling": true, "supports_max_reasoning_effort": true, "supports_minimal_reasoning_effort": false, - "supports_none_reasoning_effort": false, + "supports_none_reasoning_effort": true, "supports_tool_choice": true, "supports_prompt_caching": true, "supports_reasoning": true, @@ -56408,7 +56408,7 @@ "supports_function_calling": true, "supports_max_reasoning_effort": true, "supports_minimal_reasoning_effort": false, - "supports_none_reasoning_effort": false, + "supports_none_reasoning_effort": true, "supports_tool_choice": true, "supports_prompt_caching": true, "supports_reasoning": true, @@ -56443,7 +56443,7 @@ "supports_function_calling": true, "supports_max_reasoning_effort": true, "supports_minimal_reasoning_effort": false, - "supports_none_reasoning_effort": false, + "supports_none_reasoning_effort": true, "supports_tool_choice": true, "supports_prompt_caching": true, "supports_reasoning": true, @@ -56475,7 +56475,7 @@ "supports_function_calling": true, "supports_max_reasoning_effort": true, "supports_minimal_reasoning_effort": false, - "supports_none_reasoning_effort": false, + "supports_none_reasoning_effort": true, "supports_tool_choice": true, "supports_prompt_caching": true, "supports_reasoning": true, diff --git a/tests/test_litellm/llms/anthropic/experimental_pass_through/adapters/test_anthropic_experimental_pass_through_adapters_transformation.py b/tests/test_litellm/llms/anthropic/experimental_pass_through/adapters/test_anthropic_experimental_pass_through_adapters_transformation.py index d03174bc2c6..febee71ff64 100644 --- a/tests/test_litellm/llms/anthropic/experimental_pass_through/adapters/test_anthropic_experimental_pass_through_adapters_transformation.py +++ b/tests/test_litellm/llms/anthropic/experimental_pass_through/adapters/test_anthropic_experimental_pass_through_adapters_transformation.py @@ -2377,6 +2377,30 @@ def test_thinking_disabled_stays_plain_string_when_auto_summary_enabled(): assert new_kwargs["reasoning_effort"] == "none" +@pytest.mark.parametrize( + ("model", "custom_llm_provider", "expected_effort"), + [ + pytest.param("us.openai.gpt-6-astra", "bedrock", None, id="bedrock-gpt-6-astra"), + pytest.param("global.openai.gpt-6-astra", "bedrock", None, id="bedrock-gpt-6-astra-global"), + pytest.param("openai.gpt-6-astra", "bedrock_mantle", None, id="mantle-gpt-6-astra"), + pytest.param("us.openai.gpt-6-sol", "bedrock", "none", id="bedrock-gpt-6-sol"), + pytest.param("converse/global.openai.gpt-6-luna", "bedrock", "none", id="bedrock-converse-gpt-6-luna"), + pytest.param("openai.gpt-6-sol", "bedrock_mantle", "none", id="mantle-gpt-6-sol"), + pytest.param("converse/us.openai.gpt-5.6-sol", "bedrock", "none", id="bedrock-gpt-5.6-sol-without-flag"), + ], +) +def test_thinking_disabled_sends_effort_none_only_to_targets_that_take_it( + model: str, custom_llm_provider: str, expected_effort: str | None, local_model_cost_map: None +) -> None: + new_kwargs: Final[dict[str, object]] = {"model": model} + LiteLLMAnthropicMessagesAdapter()._translate_thinking_to_openai( + cast(Any, {"thinking": {"type": "disabled"}}), cast(Any, new_kwargs), custom_llm_provider=custom_llm_provider + ) + + assert "thinking" not in new_kwargs + assert new_kwargs.get("reasoning_effort") == expected_effort + + @pytest.mark.parametrize( "model", [