API は返送された thinking ブロックの署名を確認しましたが、検証できませんでした。署名が切り詰められている、変更されている、空のまま返送されている、ブロックが Claude によって署名されていない、または Claude Fable 5.1 と Claude Opus 5.5 では会話の以前の部分が変更されています。同じ履歴を再送しても、毎回同じように失敗します。何が壊したのかを特定し、その会話から thinking ブロックを一度削除して続行してください。失われるのはモデルの以前の推論であり、会話ではありません。
エラー
// Through Kunavo: the upstream message as it reaches you, typed as Anthropic
// types a 400; no request_id field, the upstream's own id is appended instead:
{"type":"error","error":{"type":"invalid_request_error","message":"messages.1.content.0: Invalid `signature` in `thinking` block (request id: …)"}}
// (the message path, any masking of it and the appended request id vary by upstream)
// From Anthropic's API directly:
{
"type": "error",
"error": {
"type": "invalid_request_error",
"message": "messages.1.content.0: Invalid `signature` in `thinking` block"
},
"request_id": "req_011C..."
}
// messages.{i}.content.{j}: i = position in messages[], j = block index. Both vary.
// An upstream can mask that path (***.***) and append its own request id, as above.
// Claude Code prints the body after "API Error: 400".
// On Claude Fable 5.1 and Claude Opus 5.5 the message can continue:
// "... The block is bound to a different conversation. Remove the block, or set
// `thinking.block_binding.prefix_mismatch_behavior` to "drop_block"."原因と対処法の概要
| 原因 | 対処法 |
|---|---|
| 返送される前に署名が切り詰められた、空になった、または編集された | 各ブロックを返されたとおりに完全に保存して再生してください。SDK にストリーミングされたターンを組み立てさせ、signature_delta が失われないようにします。 |
| ブロックが Claude によって署名されていない | Anthropic 互換 URL の背後にある非 Claude モデル、または独自の署名を書き込むプロキシです。これらのターンはテキストと tool_use のみとして返送してください。 |
| 会話の途中で base URL、アカウント、またはログインを切り替えた | Claude Code 2.1.152 以降は、モデルまたはログインの切り替え後に古い署名を削除します。独自のコードでは、切り替え後の最初のリクエストが失敗した場合に一度だけ thinking を削除してください。 |
| 「ブロックが別の会話に紐付いている」(Fable 5.1、Opus 5.5) | システムプロンプト、ツール、または以前のメッセージが変更されています。履歴は追記専用にするか、drop_block を有効にしてください(ベータヘッダーが必要です)。 |
| プロキシまたはゲートウェイが通過中に履歴を書き換えている | その書き換えは、あなたによる編集として扱われます。API に直接接続して再現し、原因かどうかを切り分けてください。 |
どのチェックに失敗したかを読む
文言が手がかりになります。「Invalid `signature` in `thinking` block」で終わるメッセージは、署名自体の検証に失敗したことを示します。Anthropic は原因として、署名が切り詰められた、変更された、または空のまま返送された場合を挙げています(2026年9月時点、https://platform.claude.com/docs/en/build-with-claude/thinking-troubleshooting)。また、保存された thinking のページでは、改ざんされた、または復号できない署名であり、常に 400 を返すと説明されています。***.***.content.0 のようにパスがマスクされていたり、ゲートウェイによってリクエスト ID が付加されていたりしても、この点は変わりません。重要なのは、その後に会話に関する文が続くかどうかです。Claude Fable 5.1 と Claude Opus 5.5 では、同じ文言の後に「The block is bound to a different conversation」と続くことがあります。これは別のチェックで、最後の手順で扱います。3つ目のメッセージ「blocks in the latest assistant message cannot be modified」は、最新の assistant ターンが編集、フィルタリング、並べ替え、または再構築されたことを示します。thinking テキストを編集すると発生するのは、このエラーであり、署名エラーではありません。同じ本文を再試行しても、いずれも解消されません。
Invalid `signature` in `thinking` block
-> the signature did not verify: truncated, altered, empty, or not Claude's
Invalid `signature` in `thinking` block. The block is bound to a different conversation. ...
-> Fable 5.1 / Opus 5.5: system, tools or an earlier message changed after the block was made
`thinking` or `redacted_thinking` blocks in the latest assistant message cannot be modified
-> the newest assistant turn was edited, filtered, reordered or rebuilt before it was sent backassistant ターンを返されたとおりに送信する
各 thinking ブロックには署名、つまり完全な推論の暗号化コピーが含まれており、API はそれを使ってブロックが Claude によって生成されたことを検証します(https://platform.claude.com/docs/en/build-with-claude/thinking#thinking-encryption)。レスポンスの content リストは変更せずに追加してください。thinking、redacted_thinking、tool_use ブロックをそのまま含め、テキストが空の thinking ブロックも含めてください。これは新しいモデルでのデフォルトの表示です。ストリーミング時、署名はブロックが閉じる直前に単一の signature_delta として届くため、それを取りこぼす自作のアキュムレーターは空の署名を保存します。空の署名を付けて返送されたブロックは検証に失敗します。Anthropic は、SDK にメッセージを組み立てさせることを推奨しています。JSON のキー順と空白は関係ありません。重要なのは値です。
import anthropic
client = anthropic.Anthropic(base_url="https://api.kunavo.com", api_key="sk-kn-...")
tools = [{
"name": "get_weather",
"description": "Current weather for a city.",
"input_schema": {
"type": "object",
"properties": {"city": {"type": "string"}},
"required": ["city"],
},
}]
messages = [{"role": "user", "content": "What's the weather in Paris?"}]
with client.messages.stream(
model="claude-sonnet-4-6",
max_tokens=16000,
thinking={"type": "adaptive"},
tools=tools,
messages=messages,
) as stream:
final = stream.get_final_message() # signature_delta already applied
# Append the content list untouched: thinking, redacted_thinking, tool_use.
messages.append({"role": "assistant", "content": final.content})
# Not this: a store that keeps the text but not the signature replays
# {"type": "thinking", "thinking": "...", "signature": ""} -> this 400.他のバックエンドの thinking を Claude の履歴に混在させない
Anthropic のドキュメントによれば、Anthropic 自身の API 上で Claude モデル間を切り替えるだけでは、この問題は発生しないはずです。切り替え時もブロックを送り続けるよう求め、新しいモデルが読めないブロックはエラーなしで破棄し、署名は Claude API、Amazon Bedrock、Google Cloud 間で移植可能だと説明しています(2026年9月時点、https://platform.claude.com/docs/en/build-with-claude/thinking)。検証できないのは、Claude が署名したことのないブロックです。公開されている報告には、別のバックエンドを通過した履歴が関係しています。GLM バックエンドで実行した後に Anthropic に戻った Claude Code セッション(github.com/anthropics/claude-code/issues/21726)、プロキシが Claude の thinking ブロックに見せかけ、プロキシ独自の署名を付けた Gemini のターン(github.com/router-for-me/CLIProxyAPI/issues/1584)、セッション中に別のキーへ切り替えてから戻った Claude Code セッション(github.com/lbjlaq/Antigravity-Manager/issues/388)です。非 Claude モデルが生成したターンについて、Anthropic はそのモデルの出力をテキストと tool_use のコンテンツのみとして返送するよう推奨しています。
def as_foreign_turn(content: list[dict]) -> list[dict]:
"""A turn a non-Claude model produced: keep what it said and did,
never its thinking blocks, which Claude cannot verify."""
return [b for b in content if b["type"] in ("text", "tool_use")]すでに失敗している会話を復旧する
保存した履歴から thinking と redacted_thinking ブロックを一度削除してください。これらをすべて削除するのが最も簡単です。「bound to a different conversation」という種類のエラーでは、Anthropic が示す最低限の削除対象は、指定されたブロックと、それ以降のすべての thinking および redacted_thinking ブロックです。それ以外のブロックは元の位置に残し、その履歴を保存して続行してください。Anthropic は、再送できなくなった保存済みセッションの復旧方法としてこれを示しています(https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#faq)。署名を検証できない場合、ほかに取れる方法は、元のブロックがまだ手元にあれば、返されたとおりに完全に再送することだけです。API が署名を拒否すると、Claude Code は以前の thinking を自動的に削除します。ブロックを削除して先に進んだら、元に戻さないでください。Fable 5.1 では、削除したブロックを戻すと、そのブロックが存在しなかった間に生成された thinking が無効になります。モデルは以前の推論なしで回答し、そこから新しい thinking が有効になります。Claude Code 2.1.152(2026年5月27日、https://code.claude.com/docs/en/changelog)は、モデルまたはログインの切り替え後に古い署名を削除します。また、ゲートウェイガイドでは、署名拒否時に以前の thinking ブロックなしで再試行すると説明されています。ただし、この再試行は上流のエラー文言との一致に基づいて判定されるため、独自のエンベロープでエラーを包むゲートウェイでは機能しない可能性があります(https://code.claude.com/docs/en/llm-gateway-protocol#automatic-retry-and-error-forwarding)。
THINKING = {"thinking", "redacted_thinking"}
def block_type(b) -> str:
return b["type"] if isinstance(b, dict) else b.type # dicts or SDK objects
def strip_thinking(messages: list[dict]) -> list[dict]:
"""One-time recovery: drop every thinking block, keep everything else."""
out = []
for m in messages:
content = m["content"]
if m["role"] == "assistant" and isinstance(content, list):
kept = [b for b in content if block_type(b) not in THINKING]
content = kept or [{"type": "text", "text": "(no visible reply)"}] # keep the turn non-empty
out.append({**m, "content": content})
return out
messages = strip_thinking(messages) # save this version; never re-add the blocksFable 5.1 ではプレフィックスを固定する — または drop_block を有効にする
「Bound to a different conversation」は保存された thinking のチェックです。Claude Fable 5.1 と Claude Opus 5.5 では、システムプロンプト、ツール、それ以前のすべてのメッセージが変更されていない場合に限り、再送されたブロックが有効です。Anthropic は、2026年8月31日以降に作成されたアカウントでは、デフォルトでこれを適用します(https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#enforcement)。ゲートウェイ経由では、そのアカウントはあなたのものではないため、有効だと考えてください。セッション中はシステムとツールを固定し、編集ではなく追記してください。編集箇所を特定する間もリクエストを成功させるには、thinking-binding-controls-2026-08-01 ベータヘッダーを送り、prefix_mismatch_behavior を drop_block に設定します。このヘッダーがない場合、フィールド自体が「block_binding: Extra inputs are not permitted」で拒否されます(https://platform.claude.com/docs/en/api/errors)。
# Anthropic's API directly. The field needs the beta header; Kunavo forwards it (see below).
curl https://api.anthropic.com/v1/messages \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "anthropic-beta: thinking-binding-controls-2026-08-01" \
-H "content-type: application/json" \
-d '{
"model": "claude-fable-5-1",
"max_tokens": 16000,
"thinking": {
"type": "adaptive",
"block_binding": {"prefix_mismatch_behavior": "drop_block"}
},
"messages": [{"role": "user", "content": "..."}]
}'Kunavo経由で呼び出している場合
Kunavo は、送信された thinking および redacted_thinking ブロックを、署名とデータを含めて /v1/messages にそのまま通し、リクエストで変更するのはモデル ID と、それらを拒否するモデルでの temperature、top_p、top_k の削除だけです。ストリーミングの有無にかかわらず、上流から送られたレスポンス本文をそのまま返します。2026年9月時点では、各 Claude モデルはフォールバックなしで1つの上流チャネルを通じて提供されるため、Kunavo のルーティングによって会話がプロバイダー間を移動することはなく、400 が別の場所で再試行されることもありません。Anthropic 直結と Kunavo の間で会話を移動するテストはしていないため、その切り替え後の最初のリクエストでは thinking の削除が必要になると想定してください。2026年9月24日以降、Kunavo は thinking-binding-controls-2026-08-01 ベータ版を転送しています。その日のテストでは、Claude を提供するチャネルは、Claude Fable 5.1 でヘッダーの有無にかかわらず block_binding を受け入れました。また、これまでそのチャネルがブロックを削除する動作は確認していません。拒否は HTTP 400 の invalid_request_error として届き、request_id フィールドはなく、上流のメッセージテキストを含みます。messages.N のパスがマスクされ、上流独自のリクエスト ID で終わる場合もあります。そのため、ステータスと「Invalid `signature` in `thinking` block」という語句で照合してください。Claude Code の自動削除・再試行はこの語句を基準にします。このエンベロープで応答するテストサーバーを指定した Claude Code 2.1.280 は、thinking ブロックを削除して再試行しました。Kunavo 経由でこのエラーを発生させたことはないため、セッションが毎ターン失敗する場合は新しいセッションを開始してください。失敗したリクエストには課金されません。 ネイティブエンドポイントがそのまま通す内容は、 Messages API リファレンス.
よくある質問
「Invalid `signature` in `thinking` block」とはどういう意味ですか?
API は、返送された thinking ブロックを検証できませんでした。すべての thinking ブロックには署名、つまり Claude の推論の暗号化コピーが含まれています。署名が切り詰められている、変更されている、空のまま返送されている、またはブロックが Claude によって署名されていない場合、チェックに失敗します。これは一時的なエラーではなく 400 です。同じリクエストは毎回失敗します。
thinking ブロックの署名に有効期限はありますか?
Anthropic のドキュメントに有効期限の記載はありません。anthropic-sdk-python のトラッカー(issue #1598、2026年8月)では、GitHub がコントリビューターと表示するアカウントからの返信に、有効期限はなく、API に届いたブロックが返されたものと異なる場合にチェックが失敗するとあります。これはドキュメントではなく、Issue コメントです。以前は動作していた保存済みセッションが現在失敗する場合は、保存されたブロックまたは通過した経路を変更し得るものを確認してください。ストレージ層、プロキシ、またはバックエンドの切り替えなどです。
thinking ブロックを削除して続行するだけでよいですか?
はい。Anthropic は、再生できない保存済みセッションの復旧方法としてこれを示しており、Claude Code も署名が拒否されると以前の thinking を自動的に削除します。thinking と redacted_thinking ブロックを削除し、すべて削除するのが最も簡単です。それ以外のブロックは残して、一度再試行してください。モデルが失うのは以前の推論であり、会話ではありません。ツール使用以外では、Anthropic のドキュメント上、以前のターンの thinking を省略してもかまいません。
モデルまたはプロバイダーを切り替えた後に発生するのはなぜですか?
Anthropic のドキュメントでは、同社の API で Claude モデル間を切り替えると、新しいモデルが読めないブロックはエラーなしで削除され、署名は Claude API、Amazon Bedrock、Google Cloud 間で機能すると説明されています。それでも Claude Code は、モデルまたはログインの切り替え後に古い署名で停止したセッションを修正する必要がありました(2.1.152)。公開されている報告には、Claude が検証できないものを通過した履歴が関係しています。同じ base URL の背後にある非 Claude モデル、独自の署名を書き込むプロキシ、または署名を失ったクライアントなどです。切り替え後に thinking ブロックを一度削除してください。
Claude Code はこれを自動的に修正しますか?
最近のバージョンでは、自動修復を試みます。2.1.152 以降は、モデルまたはログインの切り替え後に古い署名を削除し、以前の thinking ブロックを含めずに署名拒否を再試行します。この再試行は上流のエラー文言に基づいて判定されます。Anthropic のゲートウェイガイドによると、エラーを独自のエンベロープで包むゲートウェイでは、この再試行が機能しなくなる可能性があります。まず claude update を実行してください。それでもあるセッションが毎ターン失敗する場合は、新しいセッションを開始してください。