Claude Opus 5.5 defaults effort to medium instead of high, keeps adaptive thinking permanently on, and moves progress notes into thinking blocks that arrive empty by default. Set effort explicitly, resize max_tokens, and turn on summarized display before migrating.
Claude Opus 5.5 is cheaper than the model it replaces, at $4 per million input tokens and $20 per million output tokens against $5 and $25 for Claude Opus 5. Most teams will swap the model ID and move on. That is the mistake, because two defaults changed underneath the new name, and both change what your application sees and pays for.
The first is effort. On Claude Opus 5.5 the effort parameter defaults to medium, where Claude Opus 5 defaulted to high. If your code never set effort, your agent just dropped a level of reasoning depth without anyone deciding it should. Anthropic also says that at the same effort setting Opus 5.5 tends to think more per turn than Opus 5, most of all at xhigh and max. So the old setting is not a safe carryover in either direction. The migration guide says it plainly: set effort explicitly and run a fresh effort sweep on your own evals.
The second is thinking itself. Adaptive thinking is always on. A request that sends thinking type disabled, or a manual budget_tokens, now returns a 400 invalid_request_error. Effort is the only dial left. Because max_tokens remains a hard limit on thinking plus response text, workloads that used to run with thinking off can now hit the ceiling. At xhigh or max, Anthropic's guidance is to start max_tokens at 64k and tune from there.
The third change is the one users notice first. The short notes the model writes between tool calls now arrive as thinking blocks rather than text blocks, and thinking.display defaults to omitted, so those blocks come back with an empty thinking field. An agent interface that used to stream progress between tool calls simply goes quiet. If your product shows users what the agent is doing, set display to summarized and render the non empty thinking blocks.
None of these are exotic. They are defaults, which is exactly why they slip through a migration that only changes one string.
Try it today
- Change the model ID to claude-opus-5-5, then search your codebase for every thinking field and remove thinking type disabled and any budget_tokens setting.
- Set output_config effort explicitly on every request instead of relying on the new medium default.
- Rerun your evals across low, medium, high and xhigh before choosing a level; do not copy the setting you tuned for Claude Opus 5.
- If you run at xhigh or max, raise max_tokens to at least 64k as a starting point, since it now covers thinking plus response text.
- If your interface streams progress between tool calls, set thinking display to summarized and render the non empty thinking blocks.