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
/
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": "..."
No line in this hunk matches that.