CertSafari
    Anthropic Claude Certified Developer – Foundations (CCDV-F)· Lessons

    Domain 5 · Lesson 14/25

    Claude thinking modes and breaking changes between models

    Model Selection and Tradeoffs

    11 min read
    4.2% of exam
    5 sources
    Published 12 Oct 2026
    Docs as of 30 Sep 2026

    What you will be able to do

    • Say which models use adaptive thinking, which use extended thinking with a budget, and what each one rejects
    • Choose a thinking display setting knowing what it changes for latency and cost
    • List the request settings that newer models reject with a 400 error
    • Spot behaviour changes that break code when you switch models without raising an error

    1.Adaptive and extended thinking, model by model

    Thinking lets Claude work through a problem before it answers. It restates the question, tries approaches, checks intermediate results and drops paths that don't hold up. That is why thinking helps most on math, coding, analysis and long agentic tasks. It also costs money: thinking tokens are billed as output tokens even when you never see the text, and they count toward max_tokens.

    There are two ways to configure thinking. Adaptive thinking (type: "adaptive") lets Claude decide when to think and how deeply, and you steer it with effort. Extended thinking (type: "enabled" with budget_tokens) sets a token budget yourself. The budget must be at least 1,024 tokens and less than max_tokens, and it is a target, not a hard cap. max_tokens is still the hard limit on total output.

    Effort is the request parameter output_config.effort, which controls how many tokens Claude spends on a response, thinking included. It has five levels, from least to most spending: low, medium, high, xhigh and max. Not every model accepts every level, and the default differs by model.

    What each model does with each thinking setting
    ModelNo thinking field"adaptive""enabled" with budget_tokens"disabled"
    Claude Opus 5.5Adaptive thinkingAdaptive thinking400 error400 error
    Claude Sonnet 5.5Adaptive thinkingAdaptive thinking400 error400 error (use "between_tools")
    Claude Opus 4.8Thinking offAdaptive thinking400 errorThinking off
    Claude Sonnet 4.6Thinking offAdaptive thinkingExtended thinking (deprecated)Thinking off
    Claude Haiku 4.5Thinking off400 errorExtended thinkingThinking off

    Support splits by model generation. On Opus 5.5, Sonnet 5.5 and Fable 5.1, adaptive thinking is on with no configuration, and manual budgets are rejected. On Opus 4.8 and 4.7, thinking stays off until you send "adaptive". Claude Haiku 4.5 goes the other way: it rejects "adaptive" and only supports extended thinking with budget_tokens. So if a workload needs an exact thinking budget at the lowest price per token, Haiku 4.5 is the model.

    Checkpoint 1 of 5· Match them up

    Match each model to how it handles thinking.

    Tap a term, then the definition that fits it.

    Checkpoint 2 of 5· Exam question

    A team upgrades an integration from claude-opus-4-6 to claude-opus-4-8 without changing any code. Their existing calls set thinking: {type: "enabled", budget_tokens: 10000} and now fail with a 400 error. What is the correct fix?

    Sources1234

    2.Choosing what thinking output comes back

    Thinking arrives in thinking content blocks before the text. Even when it is visible, it is a summary of Claude's reasoning, never the raw chain of thought. The display field controls what is returned, and it works with both adaptive and extended thinking. It takes three values:

    - "summarized" returns a readable summary. It is the default on Claude Opus 4.6, Sonnet 4.6, Haiku 4.5 and earlier models. - "omitted" returns the block with an empty thinking field and an encrypted signature. It is the default on Opus 5.5, Sonnet 5.5, Fable 5.1, Opus 5, Opus 4.8 and Opus 4.7. - "updates" (beta) also leaves thinking empty but returns the short progress notes some models write between tool calls.

    A response with display set to omitted: the thinking field is empty and the signature is keptjson
    {
      "content": [
        {
          "type": "thinking",
          "thinking": "",
          "signature": "EosnCkYICxIMMb3LzNrMu..."
        },
        {
          "type": "text",
          "text": "The answer is 12,231."
        }
      ]
    }

    "omitted" speeds up delivery but does not lower cost. When streaming, the server skips the thinking text and sends only the signature, so the final answer starts sooner. You still pay for every thinking token. If your interface shows reasoning to users, "omitted" looks like a long pause before anything appears, so set "summarized" to bring back visible progress. Whichever value you choose, pass thinking blocks back unchanged in multi-turn conversations.

    Checkpoint 3 of 5· Check yourself

    A team running Claude Sonnet 4.6 sets display to "omitted" because they never show reasoning to users and want to cut their monthly bill. What happens?

    Sources14

    3.Request settings newer models reject

    Moving a working integration to Claude Opus 5.5 or Sonnet 5.5 can turn previously valid requests into 400 errors. These failures are loud, which makes them the easy kind to fix. On these models the following are rejected:

    - thinking: {"type": "enabled", "budget_tokens": N}. Control thinking depth with effort instead. - thinking: {"type": "disabled"}. Opus 5.5 cannot turn thinking off at all. Sonnet 5.5 uses "between_tools" as its lowest setting. - Non-default temperature, top_p or top_k. - A prefilled assistant turn at the end of the messages. - tool_choice of type any or tool. On Sonnet 5.5 this applies even on the token counting endpoint. - The computer_20251124 tool for Opus 5.5 on the Claude API and Google Cloud. Use the computer_toolset_20260801 toolset there.

    between_tools suppresses up-front thinking but keeps thinking between tool calls: the model skips deliberation before it starts, and the short progress updates it writes while tools run still come back as thinking blocks. Choose it when a request should start answering immediately and you don't need deep reasoning first. Without tools, the response contains only text.

    between_tools has its own limit. It works at low, medium and high effort and returns a 400 at xhigh or max. If you need those levels, use adaptive thinking. Code ported from Sonnet 5 that paired disabled with xhigh therefore needs two changes, not one.

    Checkpoint 4 of 5· Fill the gap

    This request moves a Sonnet 5 call that disabled thinking over to Claude Sonnet 5.5. Which thinking type completes it?

    client.messages.create(
        model="claude-sonnet-5-5",
        max_tokens=16000,
        thinking={"type": " ? "},
        output_config={"effort": "high"},
        messages=[{"role": "user", "content": "..."}],
    )

    Forced tool calls need a different approach on these models. Send tool_choice: {"type": "auto"}, mark the tool strict: true so its input matches the schema, and tell the model in the prompt when to call the tool. With auto, the model can now answer without calling the tool at all.

    Replacing a forced tool call with auto plus strict tool use on Claude Sonnet 5.5python
    client.messages.create(
        model="claude-sonnet-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.",
            }
        ],
    )

    Sources451

    4.Behaviour changes that break code without an error

    The worst migration bugs return 200. The most common one comes from thinking that switches on by itself. A request that ran without thinking on an older model now thinks, so the response can start with a thinking block. Code that reads content[0].text, or a stream handler that treats the first block as text, breaks. Pick out blocks by their type field instead.

    The same change also affects budgets. max_tokens is still a hard limit on thinking plus text together, so a limit sized for answer-only output can now cut responses off. Thinking is billed as output, so cost per request goes up too. At xhigh or max, start max_tokens at 64k. Defaults shift as well. Opus 5.5 defaults to medium effort where Opus 5 defaulted to high, so set effort explicitly and re-run your effort sweep instead of carrying over an old setting. Code that parsed thinking text gets empty strings, because display now defaults to "omitted".

    Switching models partway through a conversation drops thinking without warning. Claude Sonnet 5.5 can't read thinking blocks from Opus 5, Opus 5.5, Fable or Mythos models. The API removes those blocks and still returns 200, and the removed blocks aren't billed. A router that falls back from Opus 5.5 to another model should expect that model to run without Opus 5.5's earlier reasoning.

    Checkpoint 5 of 5· Check yourself

    After moving from Claude Opus 4.8 to Opus 5.5 without adding a thinking field, a service starts storing blank replies, yet every request returns 200. What is the most likely cause?

    Sources45

    Exam traps

    Each one states something that sounds right. Open it to see what is actually true.

    1. 1.Setting display to "omitted" reduces thinking cost.Why is that wrong?

      Omitted only skips returning the thinking text, which improves time to first text token. The full thinking tokens are still billed.

      Covered in Choosing what thinking output comes back

    2. 2.On Claude Sonnet 5.5, between_tools works at any effort level, just like adaptive thinking.Why is that wrong?

      between_tools is only accepted at low, medium and high effort. At xhigh or max it returns a 400.

      Covered in Request settings newer models reject

    3. 3.If a model switch mid-conversation drops prior thinking, the API returns an error.Why is that wrong?

      Blocks the new model can't read are removed without warning, the request returns 200, and the removed blocks aren't billed.

      Covered in Behaviour changes that break code without an error

    Sources

    Every claim above is drawn from one of these pages, quoted as it was written on the date shown.

    1. 1.
      “the tokens Claude spends reasoning are billed as output tokens, even when the thinking text isn't returned to you”
      ↩︎ Adaptive and extended thinking, model by model
      “thinking is off until you set thinking: {type: "adaptive"}, which lets Claude decide when and how deeply to think based on the request.”
      ↩︎ Adaptive and extended thinking, model by model
      “what you see is never the raw chain of thought: the text in a thinking block is a summary of Claude's reasoning.”
      ↩︎ Choosing what thinking output comes back
      “The model still returns its progress updates between tool calls.”
      ↩︎ Request settings newer models reject
      “You're still charged for the full thinking tokens. Omitting reduces latency, not cost.”
      ↩︎ Exam trap 1
      “If your model supports only extended thinking (see the per-model configuration table), configure it with type: "enabled" and a budget_tokens value instead.”
      ↩︎ Checkpoint
      “You're still charged for the full thinking tokens. Omitting reduces latency, not cost.”
      ↩︎ Checkpoint
    2. 2.
      “Minimum of 1,024 tokens. The API rejects smaller values.”
      ↩︎ Adaptive and extended thinking, model by model
      “The budget is a target rather than a strict cap.”
      ↩︎ Adaptive and extended thinking, model by model
    3. 3.
      “The effort parameter lets you control how many tokens Claude spends when responding to requests.”
      ↩︎ Adaptive and extended thinking, model by model
    4. 4.
      “All five levels (low, medium, high, xhigh, max) are supported, and the default is medium.”
      ↩︎ Adaptive and extended thinking, model by model
      “If your product streams reasoning to users, the default appears as a long pause before output begins”
      ↩︎ Choosing what thinking output comes back
      “Omit temperature, top_p, and top_k, or leave them at their defaults: any other value is rejected.”
      ↩︎ Request settings newer models reject
      “the earlier computer_20251124 tool is rejected there”
      ↩︎ Request settings newer models reject
      “max_tokens remains a hard limit on total output, thinking plus response text, so revisit it for workloads that ran without thinking.”
      ↩︎ Behaviour changes that break code without an error
      “Set effort explicitly: the default is medium, where Claude Opus 5's is high.”
      ↩︎ Behaviour changes that break code without an error
      “Select content blocks by their type field instead”
      ↩︎ Checkpoint
    5. 5.
      “Claude Sonnet 5.5 rejects both with a 400 error, including on the token counting endpoint:”
      ↩︎ Request settings newer models reject
      “The API drops blocks the model can't read. The request still returns 200, and dropped blocks aren't billed.”
      ↩︎ Behaviour changes that break code without an error
      “It's accepted at low, medium, and high effort. At xhigh or max, it returns a 400 error.”
      ↩︎ Exam trap 2
      “The API drops blocks the model can't read. The request still returns 200, and dropped blocks aren't billed.”
      ↩︎ Exam trap 3
      “On Claude Sonnet 4.6 and earlier models and on Claude Haiku 4.5, that request ran without thinking.”
      ↩︎ Prediction

    Ready to test yourself?

    Practise the 20 questions on this subdomain.

    Spotted a mistake, or was something unclear? Tell us.