Expected `thinking` or `redacted_thinking`, but found `text`.
The message
Expected `thinking` or `redacted_thinking`, but found `text`.What it means
Extended thinking is on, and the last assistant message you sent back starts with text instead of the thinking block Claude originally produced. Something between you and the API dropped it.
What to do
Send assistant turns back exactly as the API returned them, thinking blocks included. On models that support it, adaptive thinking removes the rule; turning thinking off also clears it.
This is the line people search for. The index in front of it changes with the conversation:
messages.1.content.0.type: Expected `thinking` or `redacted_thinking`, but found `text`.
The rest of the message explains the rule, and it's worth reading in full. This copy is from a Crush bug report (the misspelling is in the original):
When `thinking` is enabled, a final `assistant` message must start with a thinking block (preceeding the lastmost set of `tool_use` and `tool_result` blocks). We recommend you include thinking blocks from previous turns. To avoid this requirement, disable `thinking`.
What the API is checking
With extended thinking on, each assistant reply starts with a thinking block, Claude's reasoning, sometimes replaced by an encrypted redacted_thinking block. The API doesn't remember your conversation, so on the next request you send the whole history back. Anthropic's thinking guide spells out the rule the error enforces: "In extended (manual) mode, the API additionally enforces that the final assistant turn of a thinking-enabled request begins with a thinking block."
messages.1.content.0 reads as "message 1, first content block". So the message at that index is the last assistant turn, and its first block is text. Either Claude's thinking block was removed from that turn on the way back, or the turn was written while thinking was off.
This matters most in a tool loop. The same guide says to "pass every thinking block back to the API complete and unmodified, alongside the tool_use block it accompanied," and adds that you "can't rearrange, edit, or partially drop them." Outside tool use, old thinking is optional: "It is only strictly necessary to send back thinking blocks when using tools with thinking."
What usually strips the block
In the GitHub reports we read, it's rarely the person's own code. It's a layer in between:
- A session store that saves only text. An AWS AgentCore memory manager replayed history without thinking blocks, so the second message in any session failed on Bedrock with
messages.11.content.0.type. - An OpenAI-format bridge. OpenAI's chat format has no field for these blocks, so a proxy that translates Claude into it and back loses them. A Crush contributor put it as "anthropic thinking is incompatible with OpenAI compatiple apis".
- Switching models or settings mid-conversation. In the Crush report, picking a different model loaded a config without that model's reasoning defaults, and the error followed.
Three ways out
The proper fix is to keep the assistant's content list as the API returned it, every block in order, and send it back unchanged. You don't need to trim old thinking to save tokens; the guide says "You don't need to prune old thinking yourself," because the API filters it.
The second is adaptive thinking (thinking: {type: "adaptive"}), where Claude decides how much to think. The guide says "Adaptive mode relaxes this: no assistant turn needs to start with one." Anthropic's docs also say models from 4.7 onward reject the manual type: "enabled" setting altogether, so on current models this error mostly means old code or an old model. The catch runs the other way too: on Claude 4.5 and earlier, extended thinking is the only thinking mode, so adaptive isn't available there.
The third is in the error text: disable thinking for the request. That's the right call inside a tool you can't patch, until it ships a fix.
Other lines the same feature prints
Match yours against these if the one at the top of the page is not quite it. They come from the same code and mean related things.
When `thinking` is enabled, a final `assistant` message must start with a thinking blockmessages.1.content.0.type: Expected `thinking` or `redacted_thinking`, but found `text`.ValidationException: The model returned the following errors: messages.11.content.0.type: Expected `thinking` or `redacted_thinking`, but found `text`.