Follow Discord
Sweep 27 Oct 2026 · 19:04Z Build v2.1.312 531 read Stable v2.1.308 Latest v2.1.312 Next v2.1.312 Feeds RSS JSON llms.txt llms-full.txt Unofficial
One change · api

thinking changedbuild-with-claude/thinking

Nearest release: v2.1.310, published 11 hours after this site recorded the change. Shown because the two are within 24 hours of each other. Nothing here says the release caused the edit.

Recorded here
Lines+7added
Lines−7removed
From line 24 where the diff opens
First seen 14 Aug 2026 this site's first read of the page
Recorded edits33to this page, all time

The whole hunk

from line 24, old and new numbered
/
lines
from line 24
2424 
2525Here is what up-front thinking looks like in a response: one or more `thinking` content blocks arrive before the `text` blocks. The thinking block is still generated content, like the `text` block that follows it, but it is separated from the canonical response. Each thinking block also carries a `signature` field, an encrypted copy of the full reasoning that you pass back unchanged in multi-turn and tool-use conversations (see [Thinking encryption](https://platform.claude.com/docs/en/build-with-claude/thinking#thinking-encryption)):
2626 
27```text
27```json
2828{
2929 "content": [
3030 {
from line 482
482482 
483483With `display: "omitted"`, the response contains `thinking` blocks with an empty `thinking` field:
484484 
485```text Output wrap
485```json Output
486486{
487487 "content": [
488488 {
from line 800
800800To reassemble complete thinking blocks with their signatures after streaming, use your SDK's message-accumulation helper, `stream.get_final_message()` (typescript: `stream.finalMessage()`; ruby: `stream.accumulated_message`; csharp: `.Aggregate()`; go: `message.Accumulate(event)`; java, php: `MessageAccumulator`), instead of concatenating deltas yourself.
801801 
802802<Accordion title="Full streaming event trace">
803 ```text Output
803 ```sse Output
804804 event: message_start
805805 data: {"type": "message_start", "message": {"id": "msg_01...", "type": "message", "role": "assistant", "content": [], "model": "claude-opus-5-5", "stop_reason": null, "stop_sequence": null}}
806806 
from line 842
842842 
843843When `display: "omitted"` is set, the thinking block opens, a `thinking_delta` with an empty `thinking` string arrives, a single `signature_delta` follows, and the block closes. Text streaming starts immediately after:
844844 
845```text Output
845```sse Output
846846event: content_block_start
847847data: {"type":"content_block_start","index":0,"content_block":{"type":"thinking","thinking":"","signature":""}}
848848 
from line 861
861861 
862862With `display: "updates"` (beta), reasoning blocks stream as they do under `"omitted"`. Each [progress-update block](https://platform.claude.com/docs/en/build-with-claude/thinking#progress-updates) streams its text as `thinking_delta` events before the `tool_use` block it introduces. A pause of several seconds before the progress-update block opens is normal:
863863 
864```text Output
864```sse Output
865865event: content_block_start
866866data: {"type":"content_block_start","index":1,"content_block":{"type":"thinking","thinking":"","signature":""}}
867867 
from line 1021
10211021 
10221022Under `"updates"`, the start of the response that follows a `tool_result` looks like this. The first block is reasoning and stays empty, as it would under `"omitted"`. The second carries text, so it's a progress update. Under `"summarized"` both blocks carry text, and under `"omitted"` both are empty.
10231023 
1024```text Output
1024```json Output
10251025{
10261026 "content": [
10271027 {
from line 1168
11681168 
11691169In addition to regular `thinking` blocks, the API might return `redacted_thinking` blocks when portions of Claude's reasoning are safety-redacted. A `redacted_thinking` block contains encrypted thinking content in a `data` field, with no readable text:
11701170 
1171```text wrap
1171```json
11721172{
11731173 "type": "redacted_thinking",
11741174 "data": "..."
Feedback