After Claude Opus 5.5, Why Can't You Force JSON with tool_choice Anymore? Breaking Changes to JSON Schema

As of 24 September 2026: Opus 5.5 (22 Sep) is not a model-string swap. thinking stays on; tool_choice any/tool returns 400. Forced-tool JSON pipelines must move to auto + strict + JSON Schema, or Structured Output.

Up front: Opus 5.5 is not a model-string swap. On 22 September 2026 Anthropic shipped Claude Opus 5.5 (claude-opus-5-5). The price list looks friendly: $4 / $20 input / output, 20% below Opus 5; cache reads $0.20, down 60%. Anthropic says typical workloads cost about 40% less. The same day OpenAI cut GPT-6 Sol and Luna roughly in half. What breaks production is four hard failures: thinking cannot be turned off; tool_choice values any and tool return 400; thinking blocks are bound to the model and the conversation; the Claude API and Google Cloud reject computer_20251124. Pipelines that guaranteed a JSON object by forcing a tool call now have to use auto plus strict: true and a JSON Schema — or Structured Output.

Written as of 24 September 2026, against Anthropic’s model page and “What’s new” still current that day. This site already has why Tool Calling depends on JSON Schema, what Structured Output is, and why agents need JSON after the Agents API. This piece only answers which layer of the JSON contract has to change when you move to 5.5.

What shipped on 22 September

Claude Opus 5.5 is the first model in the Claude 5.5 family. Official positioning: long-running agentic coding and knowledge work. The ID is claude-opus-5-5 on the Claude API, Google Cloud, and Microsoft Foundry; Bedrock uses anthropic.claude-opus-5-5. Retirement is not sooner than 22 September 2027. Sonnet 5.5 and Haiku 5.5 follow “in the coming weeks.”

Prices per million tokens: $4 in, $20 out, $5 for a 5-minute cache write, $8 for a 1-hour cache write, $0.20 for a cache read. Batch is half price. Fast mode is Claude API only: speed: "fast" plus fast-mode-2026-02-01, $8 / $40, up to about 2.5× speed. Default effort is medium — Opus 5 defaulted to high. Omit effort and behavior changes. That is not silent compatibility.

The launch table puts Terminal-Bench 4.0 at 66.4% against GPT-6 Astra’s 57.9%. Anthropic also says that at this capability band, score gaps are a weaker guide than real tasks, and the felt gap to Fable 5.1 is narrower than the table. This article does not pick a model from a leaderboard.

Four hard failures, one table

The docs list the requests that become 400 on 5.5. The first three also apply to Fable 5.1:

Old requestOn 5.5What to send instead
thinking: {"type": "disabled"} or enabled plus budget_tokens400 invalid_request_errorOmit thinking, or send {"type": "adaptive"}; steer depth with effort
tool_choice: {"type": "any"} or {"type": "tool", "name": "..."}400; the token-counting endpoint applies the same checkauto (or none) plus strict: true, or Structured Output
Replay a thinking block after editing system / tools / an earlier message400 by default on accounts created after 31 August 2026Keep the conversation append-only; change instructions with a mid-conversation system message
computer_20251124 on the Claude API or Google Cloud400computer_toolset_20260801; Bedrock still accepts the old tool

One more change does not fail the request but goes quiet: the short notes between tool calls now arrive as thinking blocks. At the default display: "omitted" the text is empty. A UI that streamed those sentences as a progress bar goes silent. Set thinking.display if you need the progress.

Why you can no longer force JSON with tool_choice

The 2024–2025 patch was: define an “extract” tool, set tool_choice to any or name that tool, and the model had to submit an object that matched input_schema. The program read the tool arguments and never called JSON.parse on chat prose. On 5.5 that path is a 400:

tool_choice: type "tool" and "any" are not supported for this model.

The official replacement is not “please output JSON” again. Keep tool_choice on auto, set strict: true on the tool, and pin the parameters with JSON Schema. If the final answer must be a fixed shape, put the schema on Structured Output. If you want the model to call a tool instead of answering in prose, say in the prompt when the tool applies. The prompt influences which tool auto picks. It does not replace the schema.

So 5.5 does not make JSON less important. It removes the crutch of a forced call. Once the crutch is gone, the contract has to stand on its own. See why Tool Calling depends on JSON Schema.

auto + strict + JSON Schema

The smallest post-migration shape is:

{
  "model": "claude-opus-5-5",
  "tool_choice": { "type": "auto" },
  "tools": [
    {
      "name": "extract_order",
      "description": "Extract a confirmed order. Call when the user has named a sku and a quantity.",
      "strict": true,
      "input_schema": {
        "type": "object",
        "properties": {
          "sku": { "type": "string" },
          "qty": { "type": "integer", "minimum": 1 }
        },
        "required": ["sku", "qty"],
        "additionalProperties": false
      }
    }
  ]
}

strict: true makes the decoder accept parameters against the schema. Missing fields, wrong types, and extra keys should die here — not on a bet that a forced call will produce an object. If the final answer also enters a program, use Structured Output. Do not parse assistant sentences. See what Structured Output is and why JSON.parse fails.

To change a tool schema mid-conversation, 5.5 can carry a full definition in a mid-conversation system message under inline-tools-2026-09-15, without editing the top-level tools array. That is the same rule as prefix-bound thinking: append history; do not rewrite a contract snapshot that already shipped.

Thinking stays on, and you cannot edit the replay

Adaptive thinking is always on for 5.5. disabled or a manual budget_tokens is a 400. Depth, latency, and cost go through effort: low / medium / high / xhigh / max. Where you used to disable thinking to save tokens, lower effort. At the same effort setting, 5.5 tends to think more per turn than Opus 5, especially at xhigh and max. Leave room in max_tokens for that thinking.

Each thinking block records which model wrote it. 5.5 can read blocks from Opus 5 and earlier Opus / Sonnet / Haiku. It does not read Fable or Mythos. The other way: Fable 5.1 and Mythos 5.1 on the Claude API can read 5.5 blocks; no other model can. Unreadable blocks are dropped before the model sees them. The request still returns 200; dropped blocks are not billed. To see what was dropped, send thinking-binding-controls-2026-08-01 and read the top-level input_transformations array.

Prefix binding is stricter. Accounts created at or after 31 August 2026, 00:00 UTC, default to checking whether the system prompt, tools, or an earlier message changed since the block was produced. Replay after such a change is a 400. That is preserved thinking from Fable 5.1. Do not go back and edit a tool schema in history to “fix the contract” — that voids the thinking. Add new tools with a mid-conversation system message. Echo thinking blocks unmodified when you return tool results.

computer_20251124 and a quiet progress bar

On the Claude API and Google Cloud, 5.5 only accepts computer_toolset_20260801. Keep the computer-use-2025-11-24 beta header and the old tool type, and you get 400. Bedrock still accepts computer_20251124. Browser use, and integrations already on the toolset, need no change. The loop must handle member tool_use blocks, batched actions, and toolset_name on results.

The short sentence between tool calls is no longer a text block. With display omitted, the progress stream dies and there is no error. That is not a schema failure. It is reading blocks by position instead of by type. Branch on type first, then decide whether to set thinking.display.

Sol and Luna are standing next to the price list

The same day, OpenAI shipped GPT-6 Sol (gpt-6-sol, $2 / $10) and GPT-6 Luna (gpt-6-luna, $0.10 / $0.50), about half the GPT-5.6 peers. Astra stays at $10 / $50. Luna’s official job is high-volume, clear-goal extraction and summarization — the lane JSON pipelines like. A lower sticker does not license a looser schema.

Do not pick a route from the list price alone. Opus 5.5’s 40% typical saving is half cache and fewer tokens per task, not the 20% on the menu. Default effort moving from high to medium moves the bill and the latency. Run the same schema through an extraction sweep before you change routing. GPT-5.5 still leaves ChatGPT / Work / Codex on 14 October (the API is outside that retirement). That is a different product line. Do not merge it with these breaking changes into one “upgrade everything” ticket.

Four checks before you change the model string

  1. Search for tool_choice. Replace every any / named tool with auto. For stable JSON, turn on strict and tighten input_schema.
  2. Search for thinking. Remove disabled and budget_tokens. Set effort explicitly. Read blocks by type. Echo thinking unmodified.
  3. Search for computer_20251124. On the Claude API and Google Cloud, move to the toolset. Bedrock can wait.
  4. Replay and cache. On post-31 August accounts, do not edit tools or system in history. Change a schema with an appended message. Compaction (compact-2026-09-04) can swap in a signed summary while keeping thinking valid, under the conditions on Anthropic’s Compaction page.

Inspect the schema with local JSON tools

Before you set the model to claude-opus-5-5, lay out three texts in the browser: the old input_schema, one arguments object you used to force with tool_choice, and the schema you plan to mark strict.

  • JSON validator — is the grammar legal; if you have a schema, check required fields and extra keys together.
  • JSON formatter — expand a one-line tool definition and see whether additionalProperties is set.
  • JSON Diff — compare a forced-call sample with the smallest object the strict schema allows.

Nothing leaves the browser. Stabilize the contract, then change the model string. 5.5 will change effort, think more, and reject the old tool_choice. Your field names and required list should not loosen with it.

FAQ

Can I ship by only changing the model to claude-opus-5-5?

Not as a default. If the request still has thinking.disabled, budget_tokens, tool_choice any/tool, or computer_20251124 on the Claude API, you get 400.

Without a forced tool, how do I still get JSON?

Keep tool_choice on auto, set strict on the tool, fill required, and set additionalProperties to false. Put the final answer on Structured Output. Do not JSON.parse chat prose.

If thinking cannot be disabled, is the bill always higher?

Not necessarily. List prices are lower, cache reads are cheaper, and Anthropic cites about 40% less on typical loads. Default effort is medium. Trade depth with effort. Do not trade the bill with disabled.

Does Fable 5.1 need the same edits?

Always-on thinking, no forced tools, and bound thinking blocks already apply to Fable 5.1. The computer_20251124 break is mainly on the Claude API and Google Cloud for 5.5. Bedrock still accepts the older computer tool.

Why did the progress bar go silent?

The short notes between tool calls moved into thinking blocks. Default display omits the text. Read blocks by type, and set thinking.display if you need progress. That is not a schema validation failure.

Is this the same as the 14 October GPT-5.5 retirement?

No. GPT-5.5 leaves ChatGPT / Work / Codex; that notice does not touch the API. Opus 5.5 is another vendor’s new model plus breaking changes. Migrate the two lines separately.

Summary

Opus 5.5 turns “force a tool call” from a legal crutch into a 400. The price list and the 40% typical saving do not cover the four hard failures. For stable JSON, use auto plus strict plus JSON Schema, or Structured Output. Thinking stays on, blocks bind to the conversation, and the old computer tool dies on some platforms — that is a checklist before you change the string, not an observation after launch.

Flatten the schema, a sample arguments object, and the strict contract in a local validator first, then switch to claude-opus-5-5. Models will change. Effort will move. Your field contract should not loosen with them.