Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ def map(


class ThinkingLevelMapper(_ThinkingLevelMapper):
"""Map thinking_level to Anthropic's thinking.effort parameter (adaptive)."""
"""Map thinking_level to Anthropic's adaptive thinking + output_config.effort."""

name = TextParameter.THINKING_LEVEL

Expand Down
11 changes: 7 additions & 4 deletions src/celeste/providers/anthropic/messages/parameters.py
Original file line number Diff line number Diff line change
Expand Up @@ -72,10 +72,12 @@ def map(


class ThinkingLevelMapper(ParameterMapper[TextContent]):
"""Map thinking_level to Anthropic thinking field (adaptive mode).
"""Map thinking_level to adaptive thinking plus output_config.effort.

Emits {"type": "adaptive", "effort": <value>} where <value> is one of
"low" | "medium" | "high" | "xhigh" | "max".
Emits {"thinking": {"type": "adaptive"}, "output_config": {"effort": <value>}}
where <value> is one of "low" | "medium" | "high" | "xhigh" | "max" — the
Messages API rejects an "effort" key inside the thinking object
("thinking.adaptive.effort: Extra inputs are not permitted").
"""

def map(
Expand All @@ -88,7 +90,8 @@ def map(
validated_value = self._validate_value(value, model)
if validated_value is None:
return request
request["thinking"] = {"type": "adaptive", "effort": validated_value}
request["thinking"] = {"type": "adaptive"}
request.setdefault("output_config", {})["effort"] = validated_value
return request


Expand Down
Loading