From 34e2cda44dd06bcc51fc6c03d1eb29700fb1dc7c Mon Sep 17 00:00:00 2001 From: kamilbenkirane Date: Thu, 2 Jul 2026 19:33:31 +0200 Subject: [PATCH] fix(anthropic): move thinking effort to output_config The Messages API rejects an effort key inside the adaptive thinking object (thinking.adaptive.effort: Extra inputs are not permitted). thinking_level now emits {"thinking": {"type": "adaptive"}, "output_config": {"effort": }} instead, which is where the finalized API accepts it. setdefault on output_config so future output_config fields (e.g. format) compose. --- .../modalities/text/providers/anthropic/parameters.py | 2 +- .../providers/anthropic/messages/parameters.py | 11 +++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/celeste/modalities/text/providers/anthropic/parameters.py b/src/celeste/modalities/text/providers/anthropic/parameters.py index c19b138..e8d370d 100644 --- a/src/celeste/modalities/text/providers/anthropic/parameters.py +++ b/src/celeste/modalities/text/providers/anthropic/parameters.py @@ -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 diff --git a/src/celeste/providers/anthropic/messages/parameters.py b/src/celeste/providers/anthropic/messages/parameters.py index f9c2aad..96f0d7f 100644 --- a/src/celeste/providers/anthropic/messages/parameters.py +++ b/src/celeste/providers/anthropic/messages/parameters.py @@ -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": } where is one of - "low" | "medium" | "high" | "xhigh" | "max". + Emits {"thinking": {"type": "adaptive"}, "output_config": {"effort": }} + where 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( @@ -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