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",