Which Claude Opus 5.5 changes break your code without an error?
AI Architect
Key takeaways
- Claude Opus 5.5 returns a 400 error for four documented changes, including disabled thinking and forced tool_choice.
- Text Claude writes between tool calls now arrives as an empty thinking block instead of a text block, so a streaming UI goes quiet with no error.
- The effort parameter defaults to medium on Claude Opus 5.5, down from high on Claude Opus 5, whenever a request omits the field.
- Setting thinking.display to updates or summarized restores the progress text, at the cost of a beta header or mixed-in reasoning.
- Amazon Bedrock keeps accepting the older computer_20251124 tool on Claude Opus 5.5; the Claude API and Google Cloud do not.
Claude Opus 5.5 shipped on September 22, 2026, and the migration guide lists four changes that return a 400 error the first time your code hits them. Buried past that list is a fifth change that returns 200 and does something quieter: an application that streams Claude’s commentary between tool calls stops receiving any text to show, with nothing in the response that says so.
What did Claude Opus 5.5 ship on September 22, 2026?
A model priced at $4 per million input tokens and $20 per million output tokens, both about 20 percent below Claude Opus 5’s $5 and $25, while keeping the same 1M token context window and 128k max output tokens. Anthropic’s own framing draws a line between two kinds of change: four things that “affect code already running on Claude Opus 5” by returning an error, and one thing that “alters the response shape without failing any request.” That second category is the one worth reading closely, because a request that succeeds gives you no reason to go check what changed inside it. The launch post and the release notes cover the headline capability gains; the migration guide and the what’s-new page carry the behavior a running integration actually needs to handle before traffic moves. Opus 5.5 also picks up the on-demand compaction beta, which the docs note matters more here than elsewhere, because compacted turns need to stay valid against a model whose thinking blocks are tied to the specific conversation that produced them.
Which four changes return a 400 error before you ship?
Thinking can no longer be turned off. A request with thinking: {"type": "disabled"} or a manual budget_tokens now returns "thinking.type.disabled" is not supported for this model, and the fix is to omit the field and pick an
effort level
instead. Forced tool use is gone too: tool_choice types any and tool
fail with the same error on the token counting endpoint as on a real request,
so a router that forces the first tool by name needs auto plus strict tool
use
or structured outputs. computer_20251124
is rejected outright on the Claude API and Google Cloud, though Amazon
Bedrock still accepts it unchanged. And a thinking block replayed after the
system prompt, tools, or an earlier message changed returns a 400 on accounts
created on or after August 31, 2026, unless the conversation stays
append-only.
Which Opus 5.5 changes you will notice, and when
Show as text
| # | Layer | Note |
|---|---|---|
| 1 | thinking.type disabled or enabled | 400, invalid_request_error |
| 2 | tool_choice any or tool | 400, also fails token counting |
| 3 | computer_20251124, API and GCP only | 400, Bedrock keeps working |
| 4 | thinking block after an edited turn | 400, accounts after Aug 31 2026 |
| · | No error returned (breakpoint) | |
| 5 | Text between tool calls | 200, thinking field empty by default |
| 6 | Effort default drops to medium | 200, no signal anything changed |
Why does tool-call progress text go quiet after you upgrade to Opus 5.5?
Because the short notes Claude writes between tool calls changed content
block type. On Claude Opus 5 that narration came back as a text block. On
Claude Opus 5.5, as on Claude Fable 5.1, it arrives as a progress-update
thinking
block
instead, and at the default display: "omitted", a progress-update block’s
thinking field is empty. No request fails. A chat interface that streamed
that narration to show a user what the agent is doing mid-task simply stops
receiving anything for that slot, turn after turn, with nothing in the
response to explain why. The documentation’s own table is blunt about it:
under "omitted", both reasoning blocks and progress-update blocks carry an
empty field. Getting the text back means setting display to "updates",
gated behind the thinking-display-updates-2026-08-18 beta header, or to
"summarized", which mixes the progress notes back in with full reasoning
text.
Why does Claude Opus 5.5 quietly think less unless you set effort explicitly?
The default value of effort changed. Thinking itself did not weaken.
Opus 5 defaulted to high; Opus 5.5 defaults to medium, so any
call that never set effort picks up a shallower setting purely by
upgrading the model string. Anthropic’s own guidance complicates a simple
read of that: at a matched effort level, Opus 5.5 tends to think more per
turn than Opus 5 did, most noticeably at xhigh and max. The two facts
together mean a request run with no effort field set can land anywhere
from more thorough to distinctly shallower than the same call on Opus 5,
depending entirely on whether the caller ever specified the parameter. The
same silence applies to Opus 5.5’s refusal handling: a declined request
returns HTTP 200 with stop_reason: "refusal", now including a
reasoning_extraction category alongside the existing cyber one, so a
status-code check alone will not catch it.
Claude Opus 5.5 pricing against Claude Opus 5
Show data
| Item | Value (USD per million tokens) |
|---|---|
| Opus 5, input | 5 |
| Opus 5, output | 25 |
| Opus 5.5, input | 4 |
| Opus 5.5, output | 20 |
What should you actually do before moving production traffic to Claude Opus 5.5?
Treat the four 400 errors as a pre-flight check and the two silent changes as
a separate, deliberate review. The errors will surface in staging the moment
a test suite exercises the affected code paths, because Anthropic’s error
messages name the exact field at fault. The silent changes will not surface
that way. Nothing about setting effort or thinking.display is optional
work hiding behind a flag; both need someone to decide the value on purpose,
because the old behavior, high-effort reasoning and visible progress text,
does not come back just because the request still succeeds. Anthropic ships
a /claude-api migrate skill that handles the model ID swap and the
mechanical parameter changes across a codebase, which is worth running first,
but it cannot watch your streaming UI go quiet and tell you that matters.
Claude Code’s own system-prompt recording
shipped the same shape of change: a successful response that silently carries
different behavior than the caller expects, catchable only by someone who
goes looking.
Does a lower effort default actually make Claude Opus 5.5 worse than Opus 5?
Not necessarily, and the documentation stops short of saying either way.
Anthropic states that Opus 5.5 thinks more per turn than Opus 5 at a matched
effort level, but does not publish a comparison of Opus 5 at high against
Opus 5.5 at its new default of medium, which is the actual before-and-after
an upgrading caller experiences if they never touch the parameter. Whether
that specific pair nets out ahead, even, or behind is not answered in either
the migration guide or the what’s-new page, and treating it as settled in
either direction would be repeating a claim nobody has measured. The safer
position is the one Anthropic’s own recommended change already implies:
re-run an effort sweep rather than assume the new default matches the old
one’s quality, and pick the level a measured test actually supports.
Do this
Migrate to Claude Opus 5.5 without missing the changes that don't throw
The loud changes get caught the first time you run your test suite. The quiet ones only show up once someone is watching the actual output, so order the work around that difference.
Reproduce all four documented 400 errors in a dev environment first
Disabled or manually budgeted thinking, forced tool_choice, computer_20251124 on the Claude API or Google Cloud, and a replayed thinking block after an edited turn on a newer account. Each returns an error message naming the exact field, so catching them here costs one failed request in dev rather than a production incident.
Set effort explicitly on every call
The default moved from high to medium. A request that omits effort now runs shallower reasoning than it did on Claude Opus 5, with no error to flag it. Re-run your effort sweep rather than trusting the old default carried over.
Decide whether your app needs to see text between tool calls, and set thinking.display
At the default omitted, progress-update blocks return with an empty thinking field. Use updates, which needs the thinking-display-updates-2026-08-18 beta header, for progress text alone, or summarized to get both progress and reasoning mixed together.
Move computer use to the computer_toolset_20260801 toolset on the Claude API and Google Cloud
Drop the beta header, send a tools entry with no name or display size, and read tool names off member tool_use blocks instead of input.action. Amazon Bedrock keeps accepting the older tool unchanged, so check your platform before you touch this code.
Handle stop_reason "refusal" and configure fallback before switching traffic
Claude Opus 5.5 adds a biology classifier and a reasoning_extraction category alongside the existing cyber one. A declined request still returns HTTP 200, so code that only checks status codes will not notice it happened.
Test with the streaming UI your users actually see
A test suite catches the loud changes on its own. The silent ones only show up once you watch what a user watches, so include the progress-update rendering path in whatever you run before moving production traffic.
Frequently asked questions
- What breaking changes does Claude Opus 5.5 add over Claude Opus 5?
- Four return a 400 error someone will see immediately, covering disabled thinking, forced tool_choice, computer_20251124 on the Claude API and Google Cloud, and a thinking block replayed after an edited turn on accounts created on or after August 31, 2026.
- Why did my app stop showing progress text between tool calls after upgrading?
- Because that narration now arrives as a thinking block instead of a text block, and thinking blocks return with an empty field at the default display setting. Set thinking.display to updates, a beta feature, or summarized to get the text back.
- Does Claude Opus 5.5 think less than Claude Opus 5 by default?
- At a matched effort level it tends to think more, but the effort default itself dropped from high to medium, so a call that omits effort runs shallower than it did on Claude Opus 5 unless you set effort explicitly.
- Does computer use still work the same way on Claude Opus 5.5?
- Only on Amazon Bedrock. The Claude API and Google Cloud reject the older computer_20251124 tool outright and accept only the computer_toolset_20260801 toolset, which reads tool names off member tool_use blocks instead of input.action.
- Is Claude Opus 5.5 cheaper than Claude Opus 5?
- Yes, $4 per million input tokens and $20 per million output tokens, down from $5 and $25, with the same 1M token context window and 128k max output tokens.