What do I send instead of thinking disabled?
thinking type between_tools, at low, medium, or high effort. The migration guide says xhigh and max return a 400 with between_tools. Switch guide: claude-sonnet-4-5-20250929 to claude-sonnet-5-5.
A request that sets thinking to disabled fails on claude-sonnet-5-5. The migration guide says to send between_tools when you want no up-front thinking.
To turn thinking off on this model, send "thinking": {"type": "between_tools"} instead of {"type": "disabled"}. The model does not think before responding. The short updates it writes between tool calls come back as thinking blocks. The Sonnet 5.5 migration guide says thinking type disabled returns a 400 invalid_request_error on claude-sonnet-5-5. Claude Sonnet 5 turns thinking off with that setting. between_tools is accepted at low, medium, and high effort. At xhigh or max it returns a 400. between_tools takes no display, budget_tokens, or block_binding field. Source: Claude Sonnet 5.5 migration guide, checked October 20, 2026.
| Model id | What the source says |
|---|---|
claude-sonnet-5-5 | Returns 400 for thinking type disabled. Use between_tools to skip up-front thinking. |
claude-sonnet-5 | The migration guide's before example turns thinking off with thinking type disabled. |
Replace thinking type disabled with between_tools, and set effort to high or lower. The migration guide's after request uses effort high.
client.messages.create(
model="claude-sonnet-5",
max_tokens=16000,
thinking={"type": "disabled"},
output_config={"effort": "xhigh"},
messages=[{"role": "user", "content": "Hello"}],
)
client.messages.create(
model="claude-sonnet-5-5",
max_tokens=16000,
thinking={"type": "between_tools"},
output_config={"effort": "high"},
messages=[{"role": "user", "content": "Hello"}],
)
Source: Claude Sonnet 5.5 migration guide, checked October 20, 2026.
Do not send thinking type disabled. LiteLLM's Anthropic page documents passing a thinking object on completion(). The migration guide's working value is between_tools. That LiteLLM page does not name claude-sonnet-5-5, so confirm the forwarded body.
import litellm
response = litellm.completion(
model="anthropic/claude-sonnet-5-5",
messages=[{"role": "user", "content": "Hello"}],
thinking={"type": "between_tools"},
)
Source: LiteLLM Anthropic provider, checked October 20, 2026.
Do not send thinking type disabled. The AI SDK Anthropic docs show providerOptions.anthropic.thinking set to adaptive, and they say the provider removes disabled for claude-opus-5-5, claude-fable-5, and claude-fable-5-1. Those docs do not list between_tools and do not name claude-sonnet-5-5 for that removal. Use the raw request when you need between_tools.
import { anthropic, type AnthropicProviderOptions } from "@ai-sdk/anthropic";
import { generateText } from "ai";
const { text } = await generateText({
model: anthropic("claude-sonnet-5-5"),
prompt: "Hello",
providerOptions: {
anthropic: {
thinking: { type: "adaptive" },
effort: "high",
} satisfies AnthropicProviderOptions,
},
});
Source: AI SDK Anthropic provider, checked October 20, 2026.
thinking type between_tools, at low, medium, or high effort. The migration guide says xhigh and max return a 400 with between_tools. Switch guide: claude-sonnet-4-5-20250929 to claude-sonnet-5-5.