Claude Opus 5.5 Migration: 5 Settings That Will Definitely Trigger 400 Errors

Five categories of 400 errors and silent changes you must avoid when migrating to Claude Opus 5.5 and Sonnet 5.5.
Based on the official migration guide and real API reproductions, this article covers the five most likely HTTP 400 errors when upgrading from Opus 5/Sonnet 5 to 5.5: thinking disabled no longer supported; forced tool_choice deprecated (use auto + strict + prompts); computer_20251124 tools fail on most platforms; editing conversation history causes 400 or silently drops thinking blocks (keep history append-only); and Sonnet 5.5 rejects older models as advisors. It also lists silent changes like default effort degradation, effort recalibration, thinking block display changes, refusal category expansion and billing, and cache threshold adjustments, plus migration tools and the core lesson.
The release of Claude Opus 5.5 and Sonnet 5.5 brings performance gains, but it has also planted plenty of traps for developers who think they can just "change the model name" and be done. Based on the official migration guide and real API reproductions, five settings will return HTTP 400 errors directly upon upgrade. If you plan to migrate smoothly from Opus 5 or Sonnet 5, you need to avoid these pitfalls ahead of time.

Trap 1: thinking Settings No Longer Support disabled
Opus 5.5 cannot disable thinking. On Opus 5, you could send {"type": "disabled"} at high effort level and below, but Opus 5.5 rejects disabled and the enabled + budget_tokens combination at all effort levels. The API returns a clear error: "thinking.type.disabled" is not supported for this model.
The solution is to omit the thinking parameter (equivalent to adaptive mode) and control thinking depth indirectly by lowering output_config.effort.
Sonnet 5.5 handles this differently: it replaces disabled with between_tools. This is the lowest level of thinking—the model doesn't think before responding, only outputs brief notes between tool calls. But between_tools is only valid at high effort and below; pairing it with xhigh/max returns 400, and it cannot be combined with other fields.
**What is the relationship between effort and thinking?** In Anthropic's API, `output_config.effort` is a graduated dial from `low` to `max` that tells the model how much internal reasoning budget it's willing to spend before answering; the `thinking` parameter controls whether extended thinking mode is enabled and how thinking content is handled. The two are not independent: effort determines the "depth ceiling" of thinking, while thinking.type determines whether thinking is "on and how it's displayed." When the new models no longer allow explicitly disabling thinking, the only lever developers have is indirect control from the effort side—lowering effort is equivalent to making the model think less and answer faster, while raising effort lets it unfold longer reasoning chains. Understanding this mapping is the prerequisite for making sense of all the thinking-related 400 errors that follow.
# Correct usage for Sonnet 5.5
client.messages.create(model="claude-sonnet-5-5", max_tokens=16000,
thinking={"type": "between_tools"}, output_config={"effort": "high"}, messages=[...])
Note: When
between_toolsis used in a request without tools, the model does not think at all. Multi-step reasoning tasks should switch back to adaptive.
Trap 2: Forced tool_choice Deprecated
{"type": "any"} and {"type": "tool", "name": ...} are both rejected on the two new models, including on the token counting endpoint. The error message is: tool_choice: type "tool" and "any" are not supported for this model.
The alternative is to use {"type": "auto"}, mark tools as strict: true to ensure input conforms to the schema, and explicitly state in the prompt when to call the tool. Strict mode tools have a per-request cap of 20, and every object needs additionalProperties: false.
Bedrock users take note: Opus 5.5 and Sonnet 5.5 do not support structured outputs (including strict mode) on Amazon Bedrock. You can only send auto, specify tools in the prompt, and validate inputs yourself.
What are strict mode and structured outputs? In tool calling scenarios, strict: true means the model must generate tool parameters strictly according to the JSON Schema you provide—no fields outside the schema, no invented types. It upgrades tool input from a "suggested format" to a "hard contract." Combined with additionalProperties: false, every object is sealed and the model cannot sneak in extra keys. The reason strict is needed after tool_choice is restricted to auto is that auto gives the model the right to not call a tool at all—so the only way to guarantee expected output is to make the schema itself strict enough. If the model decides to call a tool under auto, strict ensures it only uses legal fields; if it doesn't call, you need prompts to clearly specify trigger conditions.
Trap 3: computer_20251124 Fails on Most Platforms
The computer use tool must be declared as the computer_toolset_20260801 toolset, and no beta header is needed. Sonnet 5.5 rejects computer_20250124 on all platforms. The exception is Amazon Bedrock, which retains computer_20251124.
Also, the fine-grained-tool-streaming-2025-05-14 header will return 400 if it appears alongside a toolset entry. Instead, set eager_input_streaming: true on tools that need streaming.
Trap 4: Editing Conversation History Causes 400 or Discards Thinking
The preserved-thinking check introduced in Fable 5.1 now applies to Opus 5.5 and Sonnet 5.5: thinking blocks are bound to the model and conversation prefix. If you edit system, tools, or earlier turns and then send back thinking blocks, accounts created on or after August 31, 2026 will get a direct 400, while other accounts will have them silently dropped.
Keeping history append-only is the core principle:
- Use
{"role": "system", ...}messages within the conversation to change instructions - Use
tool_addition/tool_removalto change tools; with theinline-tools-2026-09-15beta you can include full definitions - Use on-demand compaction (
compact-2026-09-04) to shrink history: you'll receive signed summary blocks that you can send first on the next request
Sonnet 5.5's thinking blocks are also bound to the account: sending from another organization will silently drop them.
What is the "preserved-thinking check"? This is a security mechanism introduced in Fable 5.1 and now extended to Opus 5.5 and Sonnet 5.5. The thinking blocks returned by the model are not stateless text—they are cryptographically bound to the model version that generated them and to the conversation prefix (system, tools, earlier turn content). When you send thinking blocks back to the API, the server re-verifies "did this thinking really originate from the current history?" Once you edit any preceding part of the history, verification fails: new accounts get an immediate 400, older accounts silently lose the thinking blocks, effectively wiping the model's memory. As a result, "append only, never modify" becomes a hard design constraint. Anywhere you need to change instructions or toolsets, you must use official mechanisms—system messages, tool_addition, tool_removal, or compaction summaries—to avoid rewriting the prefix.
Trap 5: Sonnet 5.5 Does Not Accept Older Models as Advisors
When Sonnet 5.5 acts as the executor, the advisor must be Opus 5, Opus 5.5, Sonnet 5.5, Fable 5 / 5.1, or Mythos 5 / 5.1. Opus 4.8 / 4.7 / 4.6, Sonnet 5, Sonnet 4.6, and Haiku 5.5 all return 400. Advisor results are returned in an encrypted form as advisor_redacted_result.
Changes That Won't Error But Still Matter
Beyond those five hard errors, there are quieter changes worth watching:
Opus 5.5 defaults to medium effort (Opus 5 was high). If you migrate without an effort parameter, the model runs a notch lower. Anthropic says 5.5 at medium can match or exceed Opus 5 at high.
Sonnet 5.5's effort levels are recalibrated: coding agents start at medium, general work uses high, and max_tokens of 128K with streaming is recommended.
Text between tool calls is now returned as thinking blocks, empty under the default display. UIs that stream progress notes will silently break; you need display: "updates" (beta header thinking-display-updates-2026-08-18).
Refusal categories expanded: Opus 5.5 adds bio; Sonnet 5.5 includes cyber, bio, frontier_llm, reasoning_extraction, general_harms. Starting September 24, requests rejected before output for bio / frontier_llm / reasoning_extraction will be billed.
Prompt cache minimum is now 512 tokens (Sonnet 5 was 1024). Sonnet 5.5 cache read pricing dropped to $0.10/MTok on October 7.
Priority Tier is not supported on Opus 5.5. Sonnet 4.5 retires on November 30, 2026, replaced by Sonnet 5.5.
Migration Recommendations
The seven pitfalls already hit when migrating from 4.x to Opus 5 / Sonnet 5 (temperature, budget_tokens, prefill, max_tokens consumed by thinking, content[0] on refusal, empty thinking text, ~30% tokenizer growth) still apply.
The author provides an open-source static scanning tool, claude5-migration-kit, that can pinpoint exactly where these issues live in your code:
python scan.py path/to/your/app --target opus-5-5
For teams that need a full migration checklist, there's also a 70-page PDF guide covering per-model checklists, prompt retuning tables, caching and history design, and validation scripts.
The core lesson of migration is simple: changing the model name alone is not enough. Every version iteration adjusts the API contract, and understanding the design intent behind these changes will keep your system more stable than mechanically replacing strings.
One-line Summary
Five categories of 400 errors and silent changes you must avoid when migrating to Claude Opus 5.5 and Sonnet 5.5.
Paragraph Summary
Based on the official migration guide and real API reproductions, this article covers the five most likely HTTP 400 errors when upgrading from Opus 5/Sonnet 5 to 5.5: thinking settings no longer support disabled; forced tool_choice (any/tool) is deprecated, requiring auto + strict + prompt specification; computer_20251124 tools fail on most platforms and require a new toolset; editing conversation history causes 400 or silently drops thinking blocks, so history must be append-only; Sonnet 5.5 does not accept older models as advisors. It also lists silent changes to watch for, such as default effort degradation, effort-level recalibration, changes to how thinking blocks are displayed, refusal category expansion and billing changes, and cache threshold adjustments—plus migration tools and the core lesson.
Related articles

Random Pruning of the DPO Computation Graph: 1.4x Training Speedup and Lower Peak Memory
DPO training too slow and memory-hungry? This paper proposes a random pruning framework for the DPO computation graph, sampling independently across position, sequence, and branch dimensions; branch pruning achieves a 1.426x step-time speedup and cuts training time by about 30%, with in-depth attribution of memory and time gains.

Why Does JEPA Underperform MLM in Longitudinal EHR Representation Learning?
New study compares JEPA and MLM for longitudinal EHR representation learning on MIMIC-IV: three JEPA variants train stably without collapse but underperform MLM; target size, not heterogeneity, drives prediction error.

Transfer Learning + Visible Light Communication: A New Approach to Energy-Efficient Indoor Positioning
A study proposes a transfer learning-based visible light communication indoor positioning method, achieving 47% accuracy improvement on the BOSCH factory dataset, 67.5% model efficiency under high noise, and introducing the ME composite metric for energy-efficient positioning in energy-constrained industrial IoT scenarios.