feat: map reasoning_effort=xhigh/max to budget_tokens on pre-4.6 Anthropic models

Adds DEFAULT_REASONING_EFFORT_XHIGH_THINKING_BUDGET=8192 and
DEFAULT_REASONING_EFFORT_MAX_THINKING_BUDGET=16384 (env-overridable) and
extends AnthropicConfig._map_reasoning_effort so reasoning_effort='xhigh'
and 'max' produce thinking={type:'enabled', budget_tokens:N} on pre-4.6
models. 4.6/4.7 behavior is unchanged: those still short-circuit to
adaptive thinking and have output_config.effort applied separately by
_apply_output_config (with per-model gating).
This commit is contained in:
mateo-berri 2026-05-02 08:02:19 -07:00
parent c94a8d6514
commit 053f53fa89
3 changed files with 20 additions and 0 deletions

View file

@ -202,6 +202,12 @@ DEFAULT_REASONING_EFFORT_MEDIUM_THINKING_BUDGET = int(
DEFAULT_REASONING_EFFORT_HIGH_THINKING_BUDGET = int(
os.getenv("DEFAULT_REASONING_EFFORT_HIGH_THINKING_BUDGET", 4096)
)
DEFAULT_REASONING_EFFORT_XHIGH_THINKING_BUDGET = int(
os.getenv("DEFAULT_REASONING_EFFORT_XHIGH_THINKING_BUDGET", 8192)
)
DEFAULT_REASONING_EFFORT_MAX_THINKING_BUDGET = int(
os.getenv("DEFAULT_REASONING_EFFORT_MAX_THINKING_BUDGET", 16384)
)
MAX_TOKEN_TRIMMING_ATTEMPTS = int(
os.getenv("MAX_TOKEN_TRIMMING_ATTEMPTS", 10)
) # Maximum number of attempts to trim the message

View file

@ -11,8 +11,10 @@ from litellm.constants import (
DEFAULT_ANTHROPIC_CHAT_MAX_TOKENS,
DEFAULT_REASONING_EFFORT_HIGH_THINKING_BUDGET,
DEFAULT_REASONING_EFFORT_LOW_THINKING_BUDGET,
DEFAULT_REASONING_EFFORT_MAX_THINKING_BUDGET,
DEFAULT_REASONING_EFFORT_MEDIUM_THINKING_BUDGET,
DEFAULT_REASONING_EFFORT_MINIMAL_THINKING_BUDGET,
DEFAULT_REASONING_EFFORT_XHIGH_THINKING_BUDGET,
RESPONSE_FORMAT_TOOL_NAME,
)
from litellm.litellm_core_utils.core_helpers import map_finish_reason
@ -823,6 +825,16 @@ class AnthropicConfig(AnthropicModelInfo, BaseConfig):
type="enabled",
budget_tokens=DEFAULT_REASONING_EFFORT_MINIMAL_THINKING_BUDGET,
)
elif reasoning_effort == "xhigh":
return AnthropicThinkingParam(
type="enabled",
budget_tokens=DEFAULT_REASONING_EFFORT_XHIGH_THINKING_BUDGET,
)
elif reasoning_effort == "max":
return AnthropicThinkingParam(
type="enabled",
budget_tokens=DEFAULT_REASONING_EFFORT_MAX_THINKING_BUDGET,
)
else:
raise ValueError(f"Unmapped reasoning effort: {reasoning_effort}")

View file

@ -2159,6 +2159,8 @@ def test_reasoning_effort_maps_to_budget_thinking_for_non_opus_4_6():
("medium", 2048), # DEFAULT_REASONING_EFFORT_MEDIUM_THINKING_BUDGET
("high", 4096), # DEFAULT_REASONING_EFFORT_HIGH_THINKING_BUDGET
("minimal", 128), # DEFAULT_REASONING_EFFORT_MINIMAL_THINKING_BUDGET
("xhigh", 8192), # DEFAULT_REASONING_EFFORT_XHIGH_THINKING_BUDGET
("max", 16384), # DEFAULT_REASONING_EFFORT_MAX_THINKING_BUDGET
]
for effort, expected_budget in test_cases: