Creuto is now an OpenAI Select Partner Read More

AI & Machine Learning

Claude Sonnet 5.5: five ways your Sonnet 5 code can break

Claude Sonnet 5.5 shipped on 28 September with five breaking changes. What returns a 400, the one that fails silently, and the fix for each.

Claude Sonnet 5.5: five ways your Sonnet 5 code can break

Anthropic released Claude Sonnet 5.5 on 28 September 2026, and four of its five breaking changes fail loudly, with a 400 on the first request. The fifth does not fail at all: the API drops the block, the request succeeds, and the model answers with less reasoning than you were billed for. This is the migration checklist.

The model ID is claude-sonnet-5-5, with no date suffix. It carries a 1M-token context window, 128K max output, and pricing of $2 per million input tokens and $10 per million output tokens — identical to Claude Sonnet 5, including prompt caching and batch rates. So the swap is free. The code around it is not.

What changed in Claude Sonnet 5.5

The release note for 28 September names five breaking changes against code already running on Claude Sonnet 5. Here they are with the request that used to work and the one that does now.

ChangeWorked on Sonnet 5Required on Sonnet 5.5
Turn thinking offthinking: {"type": "disabled"}thinking: {"type": "between_tools"}, at high effort or below
Force a tool calltool_choice any or toolauto plus strict: true
Replay a thinking blockEdited history acceptedAppend-only history, same model, same account
Computer usecomputer_20251124computer_toolset_20260801 on the Claude API and Google Cloud
Advisor tool pairingOpus 4.8, Opus 4.7, Sonnet 5 as advisorOpus 5, Opus 5.5, Mythos or Fable 5/5.1, or Sonnet 5.5 itself

Why does my thinking parameter fail?

Because disabled no longer exists on this model. A request that sends thinking: {"type": "disabled"} returns a 400 invalid_request_error whose message points you at between_tools, the lowest thinking setting Sonnet 5.5 offers. It needs no beta header and works on every platform that carries the model.

The substitution is not one-for-one. between_tools is accepted at low, medium and high effort only — send it at xhigh or max and you get a 400. It also refuses company: display, budget_tokens and block_binding alongside it each return a 400, and the old manual budget form thinking: {"type": "enabled", "budget_tokens": N} is gone. Effort cannot change mid-conversation either; a per-message output_config.effort that differs from the level in force is a 400. If you need varying effort or the top two levels, drop the field entirely and let adaptive thinking run.

One consequence catches interfaces rather than servers. On Sonnet 5.5, notes the model writes between tool calls come back as progress-update thinking blocks rather than text, and at the default display: "omitted" their text is empty. An app that streams that commentary to users goes quiet between tool calls with no error at all. Set thinking.display, or use between_tools, which returns the text without it.

Forced tool use returns a 400

Claude Sonnet 5.5 does not support forced tool use. Both tool_choice: {"type": "any"} and {"type": "tool", "name": "..."} return a 400 with the message tool_choice: type "tool" and "any" are not supported for this model. The same check runs on the token counting endpoint, which is where it tends to surface first in a cost-estimation path nobody thought of as a model call.

This is the change we expect to hurt most in the systems we build, because forcing a tool is how a great deal of production code guarantees structured output. The documented replacement is tool_choice: {"type": "auto"} with the tool marked strict: true, or moving the schema to structured outputs. Strict tool use accepts a subset of JSON Schema and requires additionalProperties: false on every object, so a permissive schema needs tightening before it will load. And auto means the model may answer in text instead, so the prompt now has to say when the tool applies — a guarantee has become an instruction.

On Amazon Bedrock there is no fallback: structured outputs, and with them strict tool use, are not available for Sonnet 5.5 there. Anthropic's advice on Bedrock is to send auto without strict, describe when to call the tool, and validate the tool input in your own code.

Thinking blocks are tied to a model, a conversation and an account

Every thinking block records which model produced it. Sonnet 5.5 reads blocks from Sonnet 5, Opus 4.8, Haiku 4.5 and earlier, but not from Opus 5, Opus 5.5 or any Fable or Mythos model — and no other model reads Sonnet 5.5 blocks. A conversation that migrates up from Sonnet 5 keeps its reasoning; one that later routes out to another model loses it. Unreadable blocks are dropped rather than rejected, and are not billed.

The conversation binding is stricter. The API checks whether the system prompt, the tools or any earlier message changed after a Sonnet 5.5 thinking block was produced, and enforces that check by default for accounts created on or after 31 August 2026 00:00 UTC on the Claude API, Amazon Bedrock and Google Cloud. On those accounts, replaying a block after such an edit is a 400. The fix is architectural rather than a parameter: keep history append-only and change instructions or tools with mid-conversation system messages instead of rewriting the transcript.

What account binding means for multi-tenant setups

Read this paragraph twice. Thinking blocks Sonnet 5.5 produces work only in the account that produced them, or in an account linked to it. When another account sends one, the API drops the block before the model sees it — and the request succeeds. There is no error, no status code, nothing in your logs. Blocks from earlier models are unaffected.

That is a correctness problem disguised as a non-event. If you run a shared conversation store across tenant-specific API accounts, or replay production transcripts into a staging account for evaluation, or fail over between organisations, the reasoning silently evaporates and your eval scores drift for reasons that never appear in a trace. The only way to see it is the thinking-binding-controls-2026-08-01 beta header, which lists each dropped block in a top-level input_transformations array with reason: "organization_binding_mismatch". Without the header, the drop is silent. Turn it on before you migrate, not after.

Computer use and advisor pairings

On the Claude API and Google Cloud, Sonnet 5.5 supports computer use only through the computer_toolset_20260801 toolset; declaring the earlier computer_20251124 tool returns a 400 naming the rejected type. Amazon Bedrock still accepts the old tool, so the same code can pass on one platform and fail on another. Migrating means dropping the beta header, replacing the tools entry, and updating the agent loop for member tool_use blocks, batch actions and toolset_name on results. The browser use tool needs no change.

The advisor tool, still in beta, rejects Claude Opus 4.8, Opus 4.7 and Sonnet 5 as advisors to a Sonnet 5.5 executor with a 400. Accepted advisors are Mythos 5.1, Fable 5.1, Mythos 5, Fable 5, Opus 5.5, Opus 5, or Sonnet 5.5 itself — and every one of them returns advice encrypted as an advisor_redacted_result block, so a client that logged or parsed advice text will need reworking regardless of which advisor you pick.

Is Sonnet 5.5 cheaper than Opus?

Yes, by half. Sonnet 5.5 is $2 / $10 per million tokens against Opus 5.5 at $4 / $20, on the same 1M context and 128K output ceiling, with a June 2026 knowledge cutoff on both. Cache reads are $0.20 per million and the Batch API halves input and output. The minimum cacheable prompt drops to 512 tokens from Sonnet 5's 1,024, which is a real saving on short system prompts.

Price is not the whole decision. We made the same point about the Opus 5.5 upgrade being cheaper and faster rather than more accurate, and the honest move here is the same: re-run your effort sweep. Anthropic states plainly that effort levels are recalibrated and a level does not produce the same amount of thinking it did on Sonnet 5. Carrying medium across unchanged is how a migration that looked free turns into a quality regression nobody attributes to the model swap.

What to do this week

Grep for four strings before you change a model ID: "disabled", tool_choice, computer_20251124, and any advisor model name. Each has a mechanical fix and each one throws on the first request, so a single integration test against claude-sonnet-5-5 will find them. Then add the thinking-binding-controls-2026-08-01 header in staging and watch input_transformations for a week — that is the only one of these that will not announce itself.

This is the second Anthropic migration in short order with the same shape; our notes on the four things Claude Opus 5.5 broke for agents cover the overlapping parameter work, and the wider pattern of protocol-level breaking changes arriving without a deprecation window is why we now pin model IDs in config rather than code. If you want that migration audited rather than attempted between releases, that is the sort of work our AI engineering practice does. Figures above are as of 29 September 2026.

Frequently asked questions

Claude Sonnet 5.5 introduces five breaking changes against Sonnet 5 code: thinking is turned off with between_tools rather than disabled, forced tool use returns a 400, thinking blocks are tied to the model and conversation, computer_20251124 is rejected on the Claude API and Google Cloud, and three older models are refused as advisors.

Sonnet 5.5 rejects thinking type disabled with a 400 invalid_request_error. Send thinking type between_tools instead, at high effort or below. It cannot be combined with display, budget_tokens or block_binding, and at xhigh or max effort you must omit the thinking field and let adaptive thinking run.

Claude Sonnet 5.5 costs $2 per million input tokens and $10 per million output tokens, half the $4 and $20 that Opus 5.5 charges. Both offer a 1M-token context window and 128K maximum output. Sonnet 5.5 is priced identically to Sonnet 5, so upgrading within the Sonnet line costs nothing extra.

Replace tool_choice any or tool with tool_choice auto and mark the tool strict true, or move the schema to structured outputs. Strict tool use needs additionalProperties false on every object. Because auto lets the model answer in text, the prompt must now state when the tool applies.

No. Thinking blocks that Claude Sonnet 5.5 produces work only in the account that produced them or an account linked to it. Another account's request succeeds but the block is dropped before the model sees it. The thinking-binding-controls-2026-08-01 beta header reports each drop.

Not a rewrite, but a re-test. Anthropic states that effort levels are recalibrated, so a given effort level does not produce the same amount of thinking as on Sonnet 5. Re-run your effort sweep rather than carrying a setting over, and expect quality shifts without any code change.

Written by

Akash Mohapatra

Akash Mohapatra

Co Founder & Director

29 Sep 2026

·

8 min read

Share

LET'S CONNECT

Connect with Creuto!

Ready to take the first step towards unlocking opportunities, realizing goals, and embracing innovation? We're here and eager to connect.

We don't just aim to fit in – we strive to stand out. Experience the perfect blend of innovation, excellence, and trust that makes us truly unforgettable. Discover the difference with Creuto.

© 2026 Creuto All Rights Reserved