From c18f26d538f54e5cb92ad2cbbe8c4d07c2beeb12 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sun, 3 May 2026 07:46:38 +0000 Subject: [PATCH] fix(anthropic,bedrock): correct effort error message and dedupe effort_map - Remove 'none' from the Bedrock _validate_anthropic_adaptive_effort error message; it was listed as a valid value but rejected by the membership check, leaving users in a feedback loop if they tried 'none'. - Hoist the duplicated reasoning_effort -> output_config.effort mapping out of AnthropicConfig.map_openai_params and AmazonConverseConfig._handle_reasoning_effort_parameter into a single AnthropicConfig.REASONING_EFFORT_TO_OUTPUT_CONFIG_EFFORT class constant so the two routes cannot drift. --- litellm/llms/anthropic/chat/transformation.py | 24 ++++++++++++------- .../bedrock/chat/converse_transformation.py | 16 +++++-------- 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/litellm/llms/anthropic/chat/transformation.py b/litellm/llms/anthropic/chat/transformation.py index 7b07a96ca5..a1cff6b2e2 100644 --- a/litellm/llms/anthropic/chat/transformation.py +++ b/litellm/llms/anthropic/chat/transformation.py @@ -108,6 +108,18 @@ class AnthropicConfig(AnthropicModelInfo, BaseConfig): metadata: Optional[dict] = None system: Optional[str] = None + # Shared mapping from OpenAI ``reasoning_effort`` values to Anthropic + # ``output_config.effort`` tier values. Used by both the direct Anthropic + # path and the Bedrock Converse path so the two routes cannot drift. + REASONING_EFFORT_TO_OUTPUT_CONFIG_EFFORT: Dict[str, str] = { + "low": "low", + "minimal": "low", + "medium": "medium", + "high": "high", + "xhigh": "xhigh", + "max": "max", + } + def __init__( self, max_tokens: Optional[int] = None, @@ -1121,15 +1133,9 @@ class AnthropicConfig(AnthropicModelInfo, BaseConfig): if AnthropicConfig._is_claude_4_6_model( model ) or AnthropicConfig._is_claude_4_7_model(model): - effort_map = { - "low": "low", - "minimal": "low", - "medium": "medium", - "high": "high", - "xhigh": "xhigh", - "max": "max", - } - mapped_effort = effort_map.get(value, value) + mapped_effort = AnthropicConfig.REASONING_EFFORT_TO_OUTPUT_CONFIG_EFFORT.get( + value, value + ) optional_params["output_config"] = {"effort": mapped_effort} elif param == "web_search_options" and isinstance(value, dict): hosted_web_search_tool = self.map_web_search_tool( diff --git a/litellm/llms/bedrock/chat/converse_transformation.py b/litellm/llms/bedrock/chat/converse_transformation.py index 9e46a5f2ae..7f42743cfc 100644 --- a/litellm/llms/bedrock/chat/converse_transformation.py +++ b/litellm/llms/bedrock/chat/converse_transformation.py @@ -485,15 +485,11 @@ class AmazonConverseConfig(BaseConfig): if AnthropicConfig._is_claude_4_6_model( model ) or AnthropicConfig._is_claude_4_7_model(model): - effort_map = { - "low": "low", - "minimal": "low", - "medium": "medium", - "high": "high", - "xhigh": "xhigh", - "max": "max", - } - mapped_effort = effort_map.get(reasoning_effort, reasoning_effort) + mapped_effort = ( + AnthropicConfig.REASONING_EFFORT_TO_OUTPUT_CONFIG_EFFORT.get( + reasoning_effort, reasoning_effort + ) + ) self._validate_anthropic_adaptive_effort( model=model, effort=mapped_effort ) @@ -534,7 +530,7 @@ class AmazonConverseConfig(BaseConfig): message=( f"Invalid reasoning_effort/output_config.effort value: " f"{effort!r}. Must be one of: 'low', 'medium', 'high', " - f"'xhigh', 'max', or 'none'." + f"'xhigh', or 'max'." ), model=model, llm_provider="bedrock_converse",