thinkingのdisplay: summarizedとは — フィールドが空文字になる理由
新しいモデルはthinkingブロックのthinkingフィールドを既定で空にし、signatureだけを返します。本文を受け取るにはdisplay: summarizedへの切り替えが必要です。
レスポンスにthinkingブロックは入っているのに、その中のthinkingフィールドを見ると空文字で、signatureフィールドだけが埋まっている。この現象は不具合ではなく、新しいモデルのdisplay設定の既定値が"omitted"になっていることによる仕様です。
{
"type": "thinking",
"thinking": "",
"signature": "EqQBCgIY..."
}エラーにはならずリクエストは正常に完了するので、ログを見て初めて気づくことになります。対処は、リクエストのthinking設定にdisplay: "summarized"を足すことです。
空のthinkingに出会ったときの切り分け
空文字を見つけたら上から順に確認する
- 1
signatureが埋まっているか見る
signatureに値があれば、ブロックは正常に生成されています。signatureは元の思考全体を暗号化したもので、空なのは表示用のテキストだけです。 - 2
使っているモデルの display 既定値を調べる
後述の表のとおり、モデルによって既定値が違います。
omittedが既定のモデルなら、何も指定していなければ空になるのが正常です。 - 3
欲しい情報で display の値を選ぶ
思考の要約なら
summarized、ツール呼び出しの合間の状況表示だけならupdates(ベータ)です。 - 4
ブロック自体が無いなら別の話
thinkingブロックそのものが返っていない場合は、そのターンで思考がスキップされた可能性があります。adaptive thinkingで一部ターンにthinkingブロックが出ない理由で扱っています。
なぜ空文字になるのか
displayは、生成された思考をレスポンスにどう返すかを決めるパラメーターです。"omitted"では、thinkingブロックの構造(typeやsignature)は返しつつ、本文にあたるthinkingテキストを返しません。signatureは後続のターンでこのブロックを会話履歴として送り返すときに使う値で、displayの設定にかかわらず同じものが返ります。
displayの既定値は、モデルごとに次のように分かれます。
| 既定値 | 対象モデル |
|---|---|
omitted | 対象モデルClaude Fable 5.1 / Mythos 5.1 / Fable 5 / Mythos 5 / Mythos Preview、Claude Opus 5.5 / Opus 5 / Sonnet 5.5 / Sonnet 5、Claude Opus 4.8 / 4.7 |
summarized | 対象モデルClaude Opus 4.6、Claude Sonnet 4.6、それ以前のモデル |
omittedが既定になっている狙いはレイテンシです。ストリーミング時にサーバーが思考テキストの配信を省き、シグネチャだけを返すので、最終的なテキスト応答が早く流れ始めます。コストを減らす設定ではなく、思考トークンはomittedでも全額課金されます。
本文を受け取るにはdisplay: "summarized"を指定する
思考の要約テキストを受け取りたい場合は、リクエストのthinking設定にdisplay: "summarized"を明示します。displayはtype: "adaptive"とtype: "enabled"のどちらにも付けられます。
{
"thinking": {
"type": "adaptive",
"display": "summarized"
}
}thinkingフィールドに、Claudeの思考内容を要約したテキストが入って返ります。モデルやthinking.type、ツール定義、messagesの組み立て方を変える必要はなく、変更はthinkingオブジェクトの1フィールドで済みます。
displayの3つの値で何が返るか
displayごとに返る内容
omitted
思考を画面に出さず、後続ターンへの引き継ぎだけしたい実装向けです。
summarized
ユーザーに思考の流れを見せたいUIや、デバッグ時に向きます。
updates(ベータ)
ツール呼び出しの合間の状況だけを画面に出したいUI向けです。
updatesは進捗メモだけを読めるようにする設定
updatesでテキストが入るのは、モデルがツール呼び出しの前に書く進捗メモ(progress update)のブロックです。見つけたことと次にすることを、画面を見ている人向けに書いた一言で、推論とは別のthinkingブロックとして返ります。進捗メモを書けるモデルは、Claude Fable 5.1 / Mythos 5.1 / Fable 5 / Opus 5.5 / Sonnet 5.5です。
リクエストにはanthropic-beta: thinking-display-updates-2026-08-18ヘッダーが要ります。ヘッダーなしでupdatesを送ると、未知のdisplay値と同じ400のinvalid_request_errorで拒否されます。Amazon Bedrock・Google Cloud・Microsoft Foundryでは、ベータ値の渡し方が別ページの規則に従います。
返ってくる進捗メモのテキストは、通常は1〜2文の要約です。長さには依存できません。出力トークンには、要約ではなく進捗メモ本来の長さで計上されます。
進捗メモは、effortが高いときや、ツール呼び出しが長く続くときほど書かれる数が減ります。状況表示に頼るUIでは、メモが出ないターンがあっても崩れない作りにします。
進捗メモのブロックがどの値でどう返るかは、推論ブロックと対にすると違いがはっきりします。summarizedでは、2種類のブロックがどちらも要約テキストで返るため、返ってきたブロックだけでは進捗メモと推論を区別できません。
| display | 推論ブロック | 進捗メモのブロック |
|---|---|---|
omitted | 推論ブロック空 | 進捗メモのブロック空 |
updates | 推論ブロック空 | 進捗メモのブロック要約テキスト |
summarized | 推論ブロック要約テキスト | 進捗メモのブロック要約テキスト |
updatesでは、テキストが入ったthinkingブロックはすべて進捗メモなので、描画する対象はそれだけです。空のブロックは何も描画しません。進捗メモのブロックが空で返ることは、どのdisplayでもあります。
Claude Sonnet 5.5だけは、thinking: {type: "between_tools"}でも進捗メモがテキスト付きで返ります。この設定は最初の推論を止めるもので、displayを同時には送れません。
summarizedは要約であって生の思考ではない
display: "summarized"で返るテキストは、思考過程をそのまま出力したものではなく、要約用の別モデルが生成した要約です。思考を行ったモデル自身は、この要約を見ません。どのdisplay値でも、生のチェーンオブソートは返りません。
課金されるのは、要約のトークン数ではなく、元の思考で実際に生成されたトークン数です。画面のテキスト量と、請求されるthinkingトークン数は一致しません。
Claude Opus 4.6・Sonnet 4.6以前では、要約の冒頭の数行がやや詳しく書かれ、プロンプトの検討に使いやすくなっています。Claude Mythos Previewは最初のトークンから要約するので、この詳しい冒頭は付きません。完全な思考出力が必要な例外的な場合は、Anthropicの営業窓口に問い合わせる扱いです。
やりがちな3つの誤対処
thinking.typeをdisabledにする
「本文が空なら思考自体を切ればよい」と考えてthinking.typeを"disabled"にしても、解決にはなりません。今回の現象は、思考が行われていないのではなく、行われた思考の本文を返す設定になっていないだけです。
モデルによっては、disabledそのものが400になります。公式の対応表では次のとおりです。
| モデル | "disabled"の扱い |
|---|---|
| Claude Fable 5.1 / Mythos 5.1 / Fable 5 / Mythos 5 / Opus 5.5 | "disabled"の扱い常時オン。"enabled"と"disabled"は400 |
| Claude Sonnet 5.5 | "disabled"の扱い"disabled"は全effortで400。代わりに"between_tools"(effort high以下) |
| Claude Opus 5 | "disabled"の扱いeffort high以下なら受け付ける。xhigh・maxとの組み合わせは400 |
displayはthinking.type: "disabled"とも組み合わせられません。displayを残したままtypeだけ"disabled"に変えるミスが起きやすいので、思考を切るときはdisplayキーもthinkingオブジェクトから外します。
thinkingパラメーターごと省略する
thinkingを丸ごと外しても、omittedが既定のモデルでは空文字のままです。省略したときのdisplayは、そのモデルの既定値がそのまま適用されます。
ただし、省略の効果はモデルで分かれます。Claude Opus 4.8・4.7はtype: "adaptive"を指定するまで思考がオフで、省略すればthinkingブロック自体が出ません。Claude Fable 5.1などの常時オンのモデルは、省略しても思考します。空文字を避けたいなら、省略ではなくdisplayをsummarizedにします。
空のthinkingに文字を書いて送り返す
omittedのまま運用すると、前のターンのthinkingは空文字です。このブロックは、次のリクエストのmessagesへ変更せずに含めて送り返します。空のthinking欄に独自のテキストを書き込んでも、サーバー側で無視され、検証に使われるのはsignatureだけです。
通常、改変されたthinkingブロックは400で拒否されます。空文字のomittedブロックに書いたテキストだけが例外で、拒否されず無視されます。400の原因と直し方はthinking blocks cannot be modifiedの解説にあります。
display・effort・thinking.typeは別々の設定
| 設定 | 制御する対象 |
|---|---|
thinking.type | 制御する対象思考をするかどうか、どの思考モードか(adaptive / enabled / disabled) |
effort | 制御する対象思考にどれだけの労力をかけるか |
display | 制御する対象生成された思考を、レスポンスにどう返すか |
3つは独立しています。effortを上げてもdisplayは変わらず、displayをsummarizedにしても思考の量は増えません。
ストリーミングで空になるときの見え方
display: "omitted"のストリーミングでも、thinking_deltaは発行されますが、中身が空文字です。ブロックはcontent_block_startで開きます。続いて空のthinking_delta、1つのsignature_delta、content_block_stopの順に進みます。すぐ後にtextブロックが始まります。
event: content_block_start
data: {"type":"content_block_start","index":0,"content_block":{"type":"thinking","thinking":"","signature":""}}
event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"thinking_delta","thinking":""}}
event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"signature_delta","signature":"EosnCkYICxIMMb3LzNrMu..."}}
event: content_block_stop
data: {"type":"content_block_stop","index":0}フロントエンドでは「thinkingブロックが開いたのに、テキストが来ない」と見えます。イベントが来ないのではなく、来ているイベントが空です。本文を受け取る対処は同じdisplay: "summarized"で、サンプルは次のとおりです。
with client.messages.stream(
model="claude-opus-4-8",
max_tokens=16000,
thinking={"type": "adaptive", "display": "summarized"},
messages=[{"role": "user", "content": "..."}],
) as stream:
for event in stream:
if event.type == "content_block_delta":
if event.delta.type == "thinking_delta":
print(event.delta.thinking, end="", flush=True)display: "updates"では、進捗メモのブロックだけがテキスト付きのthinking_deltaを流し、そのブロックは対応するtool_useブロックの前に届きます。開き始めるまでに数秒の間が空くことがありますが、正常な挙動です。
displayを会話の途中で切り替えてもよいか
signatureはdisplayの値にかかわらず同一なので、会話の途中でdisplayを切り替えても構いません。omittedで始めた会話を途中からsummarizedに変えても、それまでのやり取りは壊れません。
よくある質問
max_tokensで止まったとき、最後のブロックはどうなるか
ツール呼び出しやtool_resultの直後に止まることがあります。停止理由はmax_tokens・model_context_window_exceeded・stop_sequenceのいずれかです。このとき最後のブロックが、終えられなかった作業を代わりに示す進捗メモになることがあります。updatesとsummarizedではテキストがThis part of the response was interrupted before it finished.になり、omittedでは空です。
続けるには、そのターンを変更せずに送り返し、新しいuserメッセージを足します。そのターンにtool_useブロックがあれば、それぞれに対応するtool_resultも付けます。
まとめ
Claude Opus 4.6からOpus 4.7・4.8へ移ると、displayの既定値はsummarizedからomittedに変わります。思考テキストを画面やログに出している実装は、displayを明示しないと移行後に空表示になります。effortとの使い分けはClaude effortとは — low〜maxの使い分け方にあります。