Migrating to Claude Opus 5.5
Migrate to Claude Opus 5.5 from earlier Opus models or Claude Sonnet 5: request settings that return errors, thinking blocks in every response, and a checklist for each starting model.
This page lists the code changes for moving to Claude Opus 5.5 from Claude Opus 5, Claude Opus 4.8, Claude Opus 4.7, Claude Opus 4.6 and earlier Opus models, or Claude Sonnet 5. Every reader needs What every request to Claude Opus 5.5 must satisfy and Handle thinking in every response. Then go to the section for your current model: its first sentence names the other sections that apply to you. The migration checklist lists every change by starting model.
Claude Opus 5.5 costs less than Claude Opus 5 ($4 / $20 USD per million input / output tokens, compared with $5 / $25; see Claude pricing). For feature support, see What's new in Claude Opus 5.5. For behavioral differences and model-specific prompting patterns, see Prompting Claude Opus 5.5.
What every request to Claude Opus 5.5 must satisfy
Whichever model you are coming from, a request to claude-opus-5-5 must meet the following. Where an item says a setting is rejected, the API returns a 400 error.
- Model ID: Use
claude-opus-5-5, a fixed model ID with no date suffix. On Amazon Bedrock, Claude Platform on AWS, Google Cloud, and Microsoft Foundry, use that platform's model ID; see Availability. - Thinking: Send no
thinkingfield, or sendthinking: {"type": "adaptive"}, which is equivalent: adaptive thinking is always on.thinking: {"type": "disabled"}and manual thinking budgets (thinking: {"type": "enabled", "budget_tokens": N}) are rejected. See the before and after for thinking. - Effort: Control thinking depth with the effort parameter, the only request parameter that controls it. All five levels (
low,medium,high,xhigh,max) are supported, and the default ismedium. See Recommended effort levels for Claude Opus 5.5. - Tool choice: Use
tool_choice{"type": "auto"}(the default) or{"type": "none"}. Forcing a tool call with{"type": "any"}or{"type": "tool", "name": "..."}is rejected. See the before and after for tool choice. - Sampling parameters: Omit
temperature,top_p, andtop_k, or leave them at their defaults: any other value is rejected. Use prompting to guide the model's behavior. - Prefill: Don't end
messageswith a prefilled assistant turn: it is rejected. Use structured outputs or system prompt instructions instead. - Computer use: On the Claude API and Google Cloud, declare computer use as the
computer_toolset_20260801toolset; the earliercomputer_20251124tool is rejected there. See the computer use breaking change. - Context window: No context-window beta header is needed. The 1M token context window is the default, and a header sent for older models has no effect.
The following request satisfies every item in the list: effort is set, and there is no thinking field. The SDK tabs that print text select it by block type, because thinking blocks come first.
client = anthropic.Anthropic()
response = client.messages.create(
model="claude-opus-5-5",
max_tokens=4096,
messages=[
{
"role": "user",
"content": "Analyze the trade-offs between microservices and monolithic architectures",
}
],
output_config={"effort": "medium"},
)
for block in response.content:
if block.type == "text":
print(block.text)Handle thinking in every response
Thinking runs on every Claude Opus 5.5 request, so every response can begin with thinking blocks, and max_tokens covers thinking plus text. If your code already runs with thinking on, items 1 to 3 are likely in place: check items 4 and 5. If it ran without thinking, on any earlier model, each item is a change.
-
max_tokenscovers thinking plus text: On Claude Opus 4.8 and earlier Opus models, requests without athinkingfield run without thinking. Claude Opus 5 and Claude Sonnet 5 acceptthinking: {"type": "disabled"}. On Claude Opus 5.5, every request runs with adaptive thinking.max_tokensremains a hard limit on total output, thinking plus response text, so revisit it for workloads that ran without thinking. Thinking tokens are billed as output tokens even when the thinking text is not returned to you, so such a workload can produce more output tokens per request. See Cost control. To spend fewer tokens on thinking, lower the effort level. If you run atxhighormaxeffort, set a largemax_tokensso the model has room to think and act; start at 64k tokens and tune from there. If your prompts were tuned for running without thinking, see Prompts written for thinking disabled. -
Responses begin with thinking blocks: A response can begin with one or more
thinkingblocks before the firsttextblock. Code that reads the reply by position, such ascontent[0].textor a stream handler that treats the firstcontent_block_startevent as text, breaks on these responses. Select content blocks by theirtypefield instead: readtextfrom the blocks whosetypeis"text", and branch on the block type when handling stream events. -
Return thinking blocks unmodified in tool-use loops: If you run a tool-use loop, pass the
thinkingblocks from each assistant response back to the API complete and unmodified when you return tool results, including blocks whosethinkingfield is empty. Echo the assistant message as received rather than filtering its content blocks by type or rebuilding it: the API rejects edited, reordered, or partially dropped thinking blocks with a 400 error. See Preserving thinking blocks. -
Thinking text is omitted by default:
thinking.displaydefaults to"omitted", sothinkingblocks arrive with an emptythinkingfield alongside theirsignature. Treat thethinkingfield as display text only. To receive readable summaries instead, setthinking.displayto"summarized":thinking = { "type": "adaptive", "display": "summarized", }If your product streams reasoning to users, the default appears as a long pause before output begins; set
display: "summarized"to restore visible progress during thinking. See Controlling thinking display. -
Text between tool calls arrives in thinking blocks: The short notes the model writes between tool calls come back as
thinkingblocks, which are empty at the default display. See Text between tool calls is returned in thinking blocks.
Migration checklist by starting model
Work down the groups and stop after the one that names your current model: every item up to that point applies to you. If you are on Claude Opus 5, the first group is the whole list. If you are on Claude Sonnet 5, apply the first group and the last.
Every starting model
- Update the model ID to
claude-opus-5-5. - Remove
thinking: {"type": "disabled"}andthinking: {"type": "enabled", ...}; choose an effort level instead. - Set
effortexplicitly: the default ismedium, where Claude Opus 5's ishigh. - Replace
tool_choicetypesanyandtoolwithautoplus strict tool use or structured outputs. - If you use computer use on the Claude API or Google Cloud, declare
computer_toolset_20260801(no beta header) instead ofcomputer_20251124and update your agent loop for the toolset. On Amazon Bedrock, keepcomputer_20251124; check the computer use tool's Compatibility section for other platforms. - If a router or fallback can move a conversation from Claude Opus 5.5 to another model, expect that model to run without Claude Opus 5.5's thinking blocks (Claude Fable 5.1 and Claude Mythos 5.1 on the Claude API are the exception and keep them). Claude Opus 5.5 itself reads thinking from Claude Opus 5 and earlier Opus, Sonnet, and Haiku models, but not from Claude Fable or Claude Mythos models.
- Read content blocks by
type, and passthinkingblocks back unmodified in tool-use loops. - If your interface renders text between tool calls, set
display: "updates"(beta) or"summarized"and render the non-emptythinkingblocks. - If your code edits earlier turns, the
systemprompt, ortoolsmid-conversation, follow Preserved thinking. - Handle
stop_reason: "refusal"and configure fallback. - Re-baseline cost and latency at your chosen effort level.
- If your code disabled thinking, revisit
max_tokens, which covers thinking plus response text; atxhighormaxeffort, start at 64k. See Handle thinking in every response.
Claude Opus 4.8 or earlier
- Review workloads that ran without a
thinkingfield: on Claude Opus 5.5 they run with thinking, and thinking can't be disabled. Revisitmax_tokens, which remains a hard limit on total output (thinking plus response text), and lowereffortwhere you want less thinking. Thinking tokens are billed as output tokens, so these workloads can produce more output tokens per request. - Verify any code that parses the
thinkingfield treats it as display text only. Setdisplay: "summarized"to receive readable summaries. - Review prompts near the caching minimum: prompts of 512 tokens or more can create cache entries.
- If your organization has a Priority Tier commitment, plan capacity separately: Priority Tier is not supported on Claude Opus 5.5.
- If you run at
xhighormaxeffort, raisemax_tokensto at least 64k as a starting point. - For agentic workloads, consider task budgets (beta) and mid-conversation tool changes (beta).
Claude Opus 4.7 or earlier
- Run a fresh effort sweep on your own evals rather than carrying over a setting tuned for an earlier model.
- Remove any context-window beta header.
- If you rebuild conversation history to update instructions, consider switching to a mid-conversation system message to preserve prompt cache hits.
- Verify your stop-reason handling reads
stop_detailson refusals. - If you want fast mode, which Claude Opus 4.7 rejects, set
speed: "fast"with thefast-mode-2026-02-01beta header on the Claude API.
Claude Opus 4.6 or earlier
- Remove
temperature,top_p, andtop_kfrom request payloads. - Replace
thinking: {"type": "enabled", "budget_tokens": N}withthinking: {"type": "adaptive"}plus the effort parameter, or remove thethinkingfield entirely; adaptive thinking is always on. - If your UI displays thinking content, explicitly opt in to thinking summarization.
- Re-benchmark end-to-end cost and latency under the updated tokenization.
- Re-tune
max_tokensto account for the updated tokenization, including compaction triggers. - Re-test any client-side token-count estimations.
- If your application sends images, re-budget for high-resolution image support (up to approximately 3x more image tokens per full-resolution image). Downsample before sending if you do not need the additional fidelity.
- If you consume pointing or bounding-box coordinates from the model, remove any scale-factor conversion; coordinates are 1:1 with actual image pixels on Claude Opus 4.7 and later models.
- Review the behavior changes that began in Claude Opus 4.7.
- If your product does legitimate security work, apply to the Cyber Verification Program for access to lower restrictions on cyber content.
Claude Opus 4.5 or earlier
- Remove any assistant-message prefills; Claude Opus 4.6 already rejects them.
- Verify tool call JSON parsing uses a standard JSON parser.
- Move from
client.beta.messages.createtoclient.messages.create: adaptive thinking and effort need no beta namespace. - Remove the
effort-2025-11-24beta header (the effort parameter does not require it). - Remove the
fine-grained-tool-streaming-2025-05-14beta header. - Remove the
interleaved-thinking-2025-05-14beta header (adaptive thinking enables interleaved thinking automatically). - Migrate
output_formattooutput_config.format(if applicable).
Claude 4.1 or earlier
- Update tool versions (
text_editor_20250728,code_execution_20260521). - Handle the
refusalstop reason. - Handle the
model_context_window_exceededstop reason. - Verify tool string parameter handling for trailing newlines.
- Remove legacy beta headers (
token-efficient-tools-2025-02-19,output-128k-2025-02-19). - Review and update prompts following prompting best practices.
Claude Sonnet 5 only
- If you rebuild conversation history to update instructions, consider switching to a mid-conversation system message to preserve prompt cache hits.
- Review prompts near the caching minimum: prompts of 512 tokens or more can create cache entries.
Migrating to Claude Opus 5.5 from Claude Opus 5
First work through What every request to Claude Opus 5.5 must satisfy and Handle thinking in every response. Every starting model needs the changes in this section. They are the request settings that Claude Opus 5.5 rejects and the response changes that come with it. The checklist for this section is the first group of the migration checklist.
Update your model name
model = "claude-opus-5" # Before
model = "claude-opus-5-5" # Afterclaude-opus-5-5 is a fixed model ID with no date suffix, the same scheme as claude-opus-5. On Amazon Bedrock, Claude Platform on AWS, Google Cloud, and Microsoft Foundry, use that platform's model ID; see Availability.
Breaking changes
Each change is explained in What's new in Claude Opus 5.5; this section gives the code change for each.
Thinking can't be disabled
thinking: {"type": "disabled"} and thinking: {"type": "enabled", "budget_tokens": N} both return a 400 error ("thinking.type.disabled" is not supported for this model. or "thinking.type.enabled" is not supported for this model.). Remove the thinking field and pick an effort level; where you disabled thinking to save tokens, use a lower one. Responses then begin with thinking blocks, so select content blocks by type and pass thinking blocks back unmodified with tool results. See Thinking can't be disabled.
Before. Claude Opus 5 accepts this request, and Claude Opus 5.5 rejects it with a 400 error:
client.messages.create(
model="claude-opus-5",
max_tokens=16000,
thinking={"type": "disabled"},
messages=[{"role": "user", "content": "..."}],
)After:
client.messages.create(
model="claude-opus-5-5",
max_tokens=16000,
output_config={"effort": "low"}, # thinking is always on; effort is the control
messages=[{"role": "user", "content": "..."}],
)Forced tool use is not supported
tool_choice types any and tool return a 400 error (tool_choice: type "tool" and "any" are not supported for this model.), including on the token counting endpoint. Use auto with strict tool use or structured outputs, and say in the prompt when the tool applies. Strict tool use accepts a subset of JSON Schema, so check each tool's input_schema before you add strict: true. Every object in the schema must set additionalProperties: false; see JSON Schema limitations. See Forced tool use is not supported.
Before. Claude Opus 5 accepts this request, and Claude Opus 5.5 rejects it with a 400 error:
client.messages.create(
model="claude-opus-5",
max_tokens=1024,
tools=tools,
tool_choice={"type": "tool", "name": "get_weather"},
messages=[{"role": "user", "content": "What's the weather in Paris?"}],
)After:
client.messages.create(
model="claude-opus-5-5",
max_tokens=1024,
# strict tool use: every call matches the tool's input_schema
tools=[{**tool, "strict": True} for tool in tools],
tool_choice={"type": "auto"},
messages=[
{
"role": "user",
"content": "What's the weather in Paris? Use the get_weather tool.",
}
],
)Thinking blocks are tied to the model and the conversation
On the Claude API, Claude Fable 5.1 and Claude Mythos 5.1 read Claude Opus 5.5 thinking blocks; no other model does. A router or fallback that moves a conversation from Claude Opus 5.5 to any other model runs those turns without them. In the other direction, Claude Opus 5.5 reads thinking blocks from Claude Opus 5 and earlier Opus, Sonnet, and Haiku models, but not from Claude Fable or Claude Mythos models. Keep the conversation append-only (no edits to the system prompt, tools, or earlier messages mid-conversation) so the blocks stay valid; Claude Code, claude.ai, Claude Managed Agents, and the Claude Agent SDK already do. Enforcement matches Claude Fable 5.1 on every platform: for accounts created on or after August 31, 2026, 00:00 UTC, replaying a thinking block after such an edit returns a 400 error by default. There is no code change for append-only integrations. See Thinking blocks are tied to the model and the conversation and Preserved thinking.
The computer_20251124 computer use tool is not supported on the Claude API and Google Cloud
On the Claude API and Google Cloud, a tools entry of type computer_20251124 returns a 400 error ('claude-opus-5-5' does not support tool types: computer_20251124., followed by the tool types the model accepts). Declare the computer_toolset_20260801 toolset instead: drop the beta header and send the entry with no name or display dimensions. In your agent loop, handle member tool_use blocks (the action is the block's name, not input.action), several of them per turn, and echo toolset_name on every result. The request change is shown below; the agent-loop changes are listed in Migrate from computer_20251124. On Amazon Bedrock, the earlier computer_20251124 tool continues to work on Claude Opus 5.5 as it does on Claude Opus 5, so no change is needed there; for other platforms, see the computer use tool's Compatibility section. See The computer_20251124 computer use tool is not supported on the Claude API and Google Cloud.
Before. Claude Opus 5 accepts this request, and on the Claude API and Google Cloud, Claude Opus 5.5 rejects it with a 400 error:
client.beta.messages.create(
model="claude-opus-5",
max_tokens=4096,
betas=["computer-use-2025-11-24"],
tools=[
{
"type": "computer_20251124",
"name": "computer",
"display_width_px": 1024,
"display_height_px": 768,
}
],
messages=[{"role": "user", "content": "Open the display settings."}],
)After:
client.messages.create(
model="claude-opus-5-5",
max_tokens=4096,
# no beta header; the toolset entry takes no name or display size
tools=[{"type": "computer_toolset_20260801"}],
messages=[{"role": "user", "content": "Open the display settings."}],
)Text between tool calls is returned in thinking blocks
On Claude Opus 5, text the model writes between tool calls comes back as text blocks. On Claude Opus 5.5, as on Claude Fable 5.1, that narration comes back as progress-update thinking blocks, at most one before each tool call. At the default thinking.display of "omitted", their thinking field is empty. No request fails, but an application that streams that text to its users as progress updates goes quiet between tool calls. To restore the updates, read them from thinking blocks and set a display value that returns their text: "updates" (beta, thinking-display-updates-2026-08-18 header) returns the progress updates while reasoning stays hidden, and "summarized" returns both, mixed together. Then render each non-empty thinking block ahead of the tool_use block it precedes, and pass the blocks back unchanged with the rest of the assistant turn. See User-facing progress updates.
Safety classifiers and fallback
Claude Opus 5.5 can return stop_reason: "refusal" with a stop_details category. Its classifiers cover a broader set of categories than Claude Opus 5's, so expect stop_details.category values such as "bio" and "reasoning_extraction" in addition to "cyber"; see the refusal category table. Handle refusals and configure server-side fallback or your own retry (server-side fallback doesn't retry requests declined with "reasoning_extraction"; that refusal is returned to you); see Refusals and fallback and Safeguard refusals.
Recommended changes
- Re-run your effort sweep. Effort is the only thinking control on Claude Opus 5.5, and its default is
mediumwhere Claude Opus 5's ishigh, so a request that omitseffortnow runs atmedium. Step down where quality holds, and step up for the most demanding work. See Effort. - Re-evaluate model-specific prompt instructions. Instructions tuned for Claude Opus 5's behavior may no longer be needed; see Prompting Claude Opus 5.5. If you ran with thinking disabled, also see Prompts written for thinking disabled.
- Test in a development environment before switching production traffic.
Migrating to Claude Opus 5.5 from Claude Opus 4.8
First work through What every request to Claude Opus 5.5 must satisfy, Handle thinking in every response, and Migrating to Claude Opus 5.5 from Claude Opus 5. Use claude-opus-4-8 as the model ID you replace. That last section applies to code on Claude Opus 4.8 as written, because Claude Opus 4.8, like Claude Opus 5:
- Accepts
thinking: {"type": "disabled"}, forced tool choice, and thecomputer_20251124tool. - Returns the text between tool calls as
textblocks. - Defaults to
higheffort.
This section adds what changed between Claude Opus 4.8 and Claude Opus 5. For a checklist, see the first two groups of the migration checklist.
What changed
-
Thinking runs on requests that omitted it: On Claude Opus 4.8, thinking is off unless you ask for it. On Claude Opus 5.5, a request with no
thinkingfield runs with thinking, so every item in Handle thinking in every response is a change for that code. If your code never sent athinkingfield, there is nothing to remove under the before and after for thinking. -
Lower prompt caching minimum: The minimum cacheable prompt length on Claude Opus 5.5 is 512 tokens, down from 1,024 tokens on Claude Opus 4.8. Prompts that were too short to cache on Claude Opus 4.8 can create cache entries, with no code changes required. See Prompt caching for per-model minimums.
-
Priority Tier is not supported: Priority Tier is not supported on Claude Opus 5.5, while Claude Opus 4.8 keeps it. If your organization has a Priority Tier commitment, plan capacity separately.
Recommended changes
These are not required but will improve your experience:
-
Consider task budgets (beta): For agentic workloads, task budgets tell the model how many tokens it has for a full agentic loop. They require the
task-budgets-2026-03-13beta header. -
Consider mid-conversation tool changes (beta): Mid-conversation tool changes let you add or remove tools between turns of a conversation without invalidating prompt cache hits on earlier turns. Changing the
toolsarray itself invalidates the cached prefix. On the Claude API, send theinline-tools-2026-09-15beta header. The oldermid-conversation-tool-changes-2026-07-01header still works for changes that name a tool by reference, on the Claude API, Amazon Bedrock, and Google Cloud.
Migrating to Claude Opus 5.5 from Claude Opus 4.7
First work through What every request to Claude Opus 5.5 must satisfy, Handle thinking in every response, Migrating to Claude Opus 5.5 from Claude Opus 5, and Migrating to Claude Opus 5.5 from Claude Opus 4.8. Use claude-opus-4-7 as the model ID you replace. Those sections apply to code on Claude Opus 4.7 as written. Like Claude Opus 4.8, it accepts thinking: {"type": "disabled"}, forced tool choice, and the computer_20251124 tool. It defaults to high effort and runs without thinking unless you ask for it.
This section adds what changed after Claude Opus 4.7. If your code is on Claude Opus 4.6 or earlier, continue with Migrating to Claude Opus 5.5 from Claude Opus 4.6 and earlier Opus models after this section. It adds the breaking changes that took effect in Claude Opus 4.7. For a checklist, see the first three groups of the migration checklist.
What changed
None of these items adds a breaking change to those in the earlier sections; they are worth checking after you swap the model ID.
-
Effort levels recalibrated: The token allocation behind each effort level changes on Claude Opus 5.5 compared to Claude Opus 4.7. The default is
medium, where Claude Opus 4.7's ishigh. Run a fresh effort sweep on your own evals rather than carrying over a setting tuned for Claude Opus 4.7. See Effort. -
1M context window is the default: Claude Opus 5.5 serves the full 1M token context window by default with no beta header. If your client passes a context-window beta header for compatibility with older models, remove it.
-
Mid-conversation system messages: On the Claude API, Amazon Bedrock, and Google Cloud, Claude Opus 5.5 accepts
role: "system"messages immediately after a user turn in themessagesarray (subject to placement rules). Use the top-levelsystemfield for instructions that apply from the start. Claude Opus 4.7 rejectsrole: "system"inmessageswith a 400 error. If you maintain code paths that rebuild the full message history to update instructions, you can simplify them and preserve prompt cache hits on earlier turns. -
Refusal stop details: When the model declines a request, Claude Opus 5.5 returns a
stop_detailsobject that names the category of refusal, alongside therefusalstop reason. Claude Opus 4.7 returns the same object, so this matters only if your stop-reason handling does not read it yet. No beta header is required, and there is no opt-out. If your stop-reason handling doesn't read it yet, see Handling stop reasons. Claude Opus 5.5 declines in more categories; see Safety classifiers and fallback. -
Fast mode: Claude Opus 5.5 supports fast mode (research preview) on the Claude API. Fast mode is not available on Claude Opus 4.7, where requests with
speed: "fast"return an error. Setspeed: "fast"with thefast-mode-2026-02-01beta header. -
Computer use toolset and browser use tool: On the Claude API and Google Cloud, Claude Opus 5.5 supports computer use as the
computer_toolset_20260801toolset and the browser use tool for tasks inside webpages. Claude Opus 4.7 supports neither. On those platforms Claude Opus 5.5 doesn't accept the earliercomputer_20251124tool; see the computer use breaking change.
Migrating to Claude Opus 5.5 from Claude Opus 4.6 and earlier Opus models
First work through every earlier section, in page order. They are What every request to Claude Opus 5.5 must satisfy, Handle thinking in every response, and the sections for Claude Opus 5, Claude Opus 4.8, and Claude Opus 4.7. Those sections apply to code on Claude Opus 4.6 as written. Like Claude Opus 4.7, it accepts thinking: {"type": "disabled"}, forced tool choice, and the computer_20251124 tool. It defaults to high effort and runs without thinking unless you ask for it. Claude Opus 4.5 and earlier Opus models also accept thinking: {"type": "disabled"} and forced tool choice, and run without thinking unless you ask for it, so those sections apply to them too.
This section adds what changed in Claude Opus 4.7, with claude-opus-4-6 as the model ID you replace. Its two subsections add what changed before that, for readers on Claude Opus 4.5 or earlier and Claude 4.1 or earlier. For a checklist, see the migration checklist up to the group that names your model.
Breaking changes
-
Extended thinking removed:
thinking: {"type": "enabled", "budget_tokens": N}is no longer supported on Claude Opus 4.7 and later models and returns a 400 error. Switch to adaptive thinking (thinking: {"type": "adaptive"}) and use the effort parameter to control thinking depth. On Claude Opus 5.5, adaptive thinking is always on:thinking: {"type": "adaptive"}is valid and equivalent to omitting thethinkingfield entirely.Before (Claude Opus 4.6):
client.messages.create( model="claude-opus-4-6", max_tokens=16000, thinking={"type": "enabled", "budget_tokens": 10000}, messages=[{"role": "user", "content": "..."}], )After (Claude Opus 5.5), where the model ID,
thinking, andoutput_configlines differ:client.messages.create( model="claude-opus-5-5", max_tokens=16000, thinking={"type": "adaptive"}, output_config={"effort": "high"}, # or "max", "xhigh", "medium", "low" messages=[{"role": "user", "content": "..."}], )Adaptive thinking is steerable through prompting and the effort parameter, which replaces the thinking budget as the way to control how much the model reasons. Run an effort sweep on your own evals rather than translating a
budget_tokensvalue. The effort levels table describes when to use each level, and Recommended effort levels for Claude Opus 5.5 covers this model. -
Sampling parameters removed: Setting
temperature,top_p, ortop_kto any non-default value on Claude Opus 4.7 and later models, including Claude Opus 5.5, returns a 400 error. The Python SDK (v1.0 and later) does not define them, and passing them raises aTypeError. The safest migration path is to omit these parameters entirely from request payloads. Prompting is the recommended way to guide model behavior on Claude Opus 5.5. If you were usingtemperature = 0for determinism, note that it never guaranteed identical outputs on prior models. -
Thinking content omitted by default: Thinking blocks still appear in the response stream on Claude Opus 4.7 and later models, but their
thinkingfield is empty unless you explicitly opt in. This is a silent change from Claude Opus 4.6, where the default was to return summarized thinking text. To restore it, see item 4 of Handle thinking in every response. -
Updated token counting: Claude Opus 4.7 introduced a new tokenizer, which later Opus models, including Claude Opus 5.5, also use. It contributes to improved performance on a wide range of tasks, and it may use roughly 1x to 1.35x as many tokens when processing text compared to models before Claude Opus 4.7 (up to ~35% more, varying by content).
/v1/messages/count_tokensreturns a different number of tokens for Claude Opus 5.5 than it did for Claude Opus 4.6. Token efficiency can vary by workload shape.Update your
max_tokensparameters to give additional headroom, including compaction triggers, and re-test any code path that estimates tokens client-side or assumes a fixed token-to-character ratio. Use the Token counting endpoint to verify. Prompting interventions,task_budget, andeffortcan help control costs; these controls may trade off model intelligence. -
Prefill removal (already in effect on Claude Opus 4.6): Prefilling assistant messages returns a 400 error on Claude Opus 4.6 and later Opus models, including Claude Opus 5.5, so this is a change only if you come from Claude Opus 4.5 or earlier. Use structured outputs, system prompt instructions, or
output_config.formatinstead.
Behavior changes
Claude Opus 4.7 introduced behavioral differences from Claude Opus 4.6 that are not API breaking changes. These three affect code or scaffolding:
-
Built-in progress updates in agentic traces: Claude Opus 4.7 provides more regular, higher-quality updates to the user throughout long agentic traces. If you've added scaffolding to force interim status messages ("After every 3 tool calls, summarize progress"), try removing it. On Claude Opus 5.5 these updates arrive in
thinkingblocks, which are empty at the defaultthinking.display. To receive them, see Text between tool calls is returned in thinking blocks. To shape their length and contents, see User-facing progress updates. -
Real-time cybersecurity safeguards: Newly added in Claude Opus 4.7, requests that involve prohibited or high-risk topics may lead to refusals. For legitimate security work such as penetration testing, vulnerability research, or red-teaming, apply to the Cyber Verification Program to request reduced restrictions. The application route depends on how you access Claude.
-
High-resolution image support: Claude Opus 4.7 is the first Claude model with high-resolution image support. Maximum image resolution is 2,576 pixels on the long edge, up from 1,568 pixels on prior models. This unlocks gains on vision-heavy workloads and is particularly valuable for computer use, screenshot understanding, and document analysis.
High-resolution support is automatic and requires no beta header or client-side opt-in. Two things to plan for:
- Full-resolution images can use up to approximately 3x more image tokens than on prior models (up to 4,784 tokens per image, compared to the previous cap of roughly 1,600 tokens per image). Re-budget
max_tokensand cost expectations for image-heavy workloads, or downsample before sending if you do not need the additional fidelity. - Pointing and bounding-box coordinates returned by the model are 1:1 with actual image pixels on Claude Opus 4.7, so no scale-factor conversion is required.
See High-resolution image support on Claude Opus 4.7 for details.
- Full-resolution images can use up to approximately 3x more image tokens than on prior models (up to 4,784 tokens per image, compared to the previous cap of roughly 1,600 tokens per image). Re-budget
For prompt-side differences, see Prompting Claude Opus 5.5 and Prompting best practices.
Migrating from Claude Opus 4.5 or earlier
If you are migrating from Claude Opus 4.5, Claude Opus 4.1, or an earlier model directly to Claude Opus 5.5, read this page from the top: first work through every earlier section, in page order. Then work through the breaking changes for migrating from Claude Opus 4.6 earlier in this section. Then apply the following cumulative changes, which took effect between Claude Opus 4.5 and Claude Opus 4.7. If you are on Claude Opus 4.1 or earlier, continue with Migrating from Claude 4.1 or earlier after this subsection.
Breaking changes
-
Prefill removal is covered in the breaking changes for migrating from Claude Opus 4.6.
-
Tool parameter quoting: Claude Opus 4.6 and later models may produce slightly different JSON string escaping in tool call arguments (for example, different handling of Unicode escapes or forward slash escaping). If you parse tool call
inputas a raw string rather than using a JSON parser, verify your parsing logic. Standard JSON parsers (such asjson.loads()orJSON.parse()) handle these differences automatically.
Recommended changes
The first item is required on Claude Opus 5.5; the rest are recommended.
-
Migrate to adaptive thinking (required):
thinking: {"type": "enabled", "budget_tokens": N}returns a 400 error on Claude Opus 4.7 and later models. The before and after is item 1 of the breaking changes for migrating from Claude Opus 4.6. The migration also moves fromclient.beta.messages.createtoclient.messages.create: adaptive thinking and effort do not require the beta SDK namespace or any beta headers. -
Remove effort beta header: The effort parameter does not require a beta header. Remove
betas=["effort-2025-11-24"]from your requests. -
Remove fine-grained tool streaming beta header: Fine-grained tool streaming does not require a beta header. Remove
betas=["fine-grained-tool-streaming-2025-05-14"]from your requests. -
Remove interleaved thinking beta header: With adaptive thinking, interleaved thinking is automatic on every model that supports adaptive thinking. Remove
betas=["interleaved-thinking-2025-05-14"]from your requests. -
Migrate to output_config.format: If using structured outputs, update
output_format={...}tooutput_config={"format": {...}}. Theoutput_formatparameter is deprecated and will be removed in the future. To use it anyway, add thestructured-outputs-2025-11-13beta header. Without it, the API returns a 400 error. The Python SDK (v1.0 and later) does not acceptoutput_format={...}onclient.beta.messages.create()orcount_tokens(). Theoutput_format=Modelargument of theparse()andstream()helpers is unchanged.
Migrating from Claude 4.1 or earlier
If you're migrating from Claude Opus 4.1 or earlier models directly to Claude Opus 5.5, first apply everything in Migrating from Claude Opus 4.5 or earlier. That subsection starts with every earlier section, so in effect you read this page from the top. Then apply the additional changes in this subsection.
Additional breaking changes
-
Remove sampling parameters: Covered in Sampling parameters removed.
-
Update tool versions
Update to the current tool versions. Remove any code using the
undo_editcommand.# Before tools = [{"type": "text_editor_20250124", "name": "str_replace_editor"}] # After tools = [{"type": "text_editor_20250728", "name": "str_replace_based_edit_tool"}]- Text editor: Use
text_editor_20250728andstr_replace_based_edit_tool. See Text editor tool documentation for details. - Code execution: Upgrade to
code_execution_20260521. See Code execution tool documentation for migration instructions. - Computer use: On the Claude API and Google Cloud, Claude Opus 5.5 accepts computer use only as the
computer_toolset_20260801toolset: the earliercomputer_20250124andcomputer_20251124tools are rejected there. See the computer use breaking change.
- Text editor: Use
-
Handle the
refusalstop reasonUpdate your application to handle
refusalstop reasons:response = client.messages.create(...) if response.stop_reason == "refusal": # Handle refusal appropriately pass -
Handle the
model_context_window_exceededstop reasonClaude 4.5 and later models return a
model_context_window_exceededstop reason when generation stops because of hitting the context window limit, rather than the requestedmax_tokenslimit. Update your application to handle this new stop reason:response = client.messages.create(...) if response.stop_reason == "model_context_window_exceeded": # Handle context window limit appropriately pass -
Verify tool parameter handling (trailing newlines)
Claude 4.5 and later models preserve trailing newlines in tool call string parameters that were previously stripped. If your tools rely on exact string matching against tool call parameters, verify your logic handles trailing newlines correctly.
-
Update your prompts for behavioral changes
Claude 4 and later models have a more concise, direct communication style and require explicit direction. Review prompting best practices for optimization guidance.
Additional recommended changes
- Remove legacy beta headers: Remove
token-efficient-tools-2025-02-19andoutput-128k-2025-02-19. All Claude 4 and later models have built-in token-efficient tool use and these headers have no effect.
Migrating to Claude Opus 5.5 from Claude Sonnet 5
Work through What every request to Claude Opus 5.5 must satisfy, Handle thinking in every response, and Migrating to Claude Opus 5.5 from Claude Opus 5. Use claude-sonnet-5 as the model ID you replace. That last section applies to code on Claude Sonnet 5 as written, because Claude Sonnet 5, like Claude Opus 5:
- Runs with thinking on by default and accepts
thinking: {"type": "disabled"}, in its case at any effort level. - Accepts forced tool choice and the
computer_20251124tool. - Returns the text between tool calls as
textblocks. - Defaults to
higheffort.
Manual extended thinking, non-default sampling parameters, and assistant prefill return a 400 error on both models, so nothing changes there. None of the required changes in the sections for Claude Opus 4.8, Claude Opus 4.7, and Claude Opus 4.6 apply to you.
What changed
-
Mid-conversation system messages: On the Claude API, Amazon Bedrock, and Google Cloud, Claude Opus 5.5 accepts
role: "system"messages immediately after a user turn in themessagesarray (subject to placement rules). This feature is not available on Claude Sonnet 5. If you maintain code paths that rebuild the full message history to update instructions, you can simplify them and preserve prompt cache hits on earlier turns. -
Lower prompt caching minimum: The minimum cacheable prompt length on Claude Opus 5.5 is 512 tokens, down from 1,024 tokens on Claude Sonnet 5. Prompts that were too short to cache on Claude Sonnet 5 can create cache entries, with no code changes required. See Prompt caching for per-model minimums.
Was this page helpful?