Preserved thinking
Preserved thinking decides whether the model can use a thinking block that you send back from an earlier turn. Starting with Claude Fable 5.1, the API checks the signature of every thinking or redacted_thinking block in a request for two things:
- The model that produced it. A model reads its own thinking blocks and those of earlier models, never those of a newer model. Claude Fable 5.1 reads blocks from Claude Opus 5, but Claude Opus 5 can't read blocks from Claude Fable 5.1. The API drops a block the current model can't read, without an error and without billing it. See Switching models mid-conversation.
- Everything sent before it. A block stays valid only while the top-level
systemprompt, thetools, and the messages before it are unchanged. If any of them changes, that block and every later thinking block are invalid, and the API rejects the request with a 400 error or drops the invalid blocks, whichever you choose. See Keeping the prefix unchanged.
The model check applies to every account. The API enforces the prefix check by default for accounts created on or after August 31, 2026, 00:00 UTC. On older accounts it enforces the check only on requests that set thinking.block_binding.prefix_mismatch_behavior. Later models will enforce it for all accounts, so make your integration append-only now.
To keep thinking valid, send every assistant turn back exactly as you received it and add new messages only at the end of messages. If your code builds the messages array itself, the Preserved thinking page covers:
- What counts as an edit, and how to check whether your code makes one.
- The API feature that replaces each common edit: mid-conversation system messages for new instructions and per-turn reminders,
tool_additionandtool_removalblocks for tool changes, per-messageoutput_configfor effort changes, and server-side compaction and context editing for trimming. - Client-side compaction: which patterns keep thinking valid and which don't.
- The
thinking-binding-controls-2026-08-01beta header. It adds aninput_transformationsarray to every response that lists the blocks the API dropped, and ablock_binding.prefix_mismatch_behaviorfield on the thinking configuration that accepts"error"or"drop_block".