Claude Platform Docs
メッセージ保持された思考

別の会話にバインドされた思考ブロックを修正する

思考ブロックが別の会話にバインドされていることを示す400エラーの後に会話を再開し、コードが何を変更したかを見つけ、その変更がなくなったことをテストします。

同じリクエストを再送信してもうまくいきません。履歴にはコードが加えた変更がまだ残っているためです。今すぐエラーを止めるには、"drop_block"を送信してください。長期的な修正は、コードを「append-only」(追記のみ)にすることです。

エラー: The block is bound to a different conversation

「thinking block」(思考ブロック)が「prefix check」(プレフィックスチェック)に失敗しました。Claudeがそのブロックを生成した後に、その前にある何かが変更されたか(何が変更とみなされるかを参照)、他の思考ブロックの間にある思考ブロックが省かれたか移動されました。エラーは次のようになり、続けて何が変更されたかを示す場合があります:

messages.1.content.0: Invalid `signature` in `thinking` block. The block is bound to a different conversation. Remove the block, or set `thinking.block_binding.prefix_mismatch_behavior` to "drop_block".

「A different conversation」とは、ブロックの前にある内容が異なることを意味します。プレフィックスチェックはセッションやユーザーを比較しません。エラーメッセージはブロックを削除するよう指示しますが、そのブロックだけを削除するのでは不十分です。他のエラーも似たように見える場合があります。

アプリが自分のものでない場合は、新しい会話を開始し、そのメンテナーに伝えてください。シークレット、個人データ、または注入されたテキストを削除した場合、またはリクエストで思考をオフにしている場合は、ステップ1の代わりに思考を手動で削除してください。

  1. 今すぐエラーを止める

    thinking.block_binding.prefix_mismatch_behaviorを"drop_block"に設定し、ベータヘッダー anthropic-beta: thinking-binding-controls-2026-08-01を送信します。APIはリクエスト間で設定を保存しないため、会話内の以降のすべてのリクエストでこれを行ってください。保存された会話は、コードを修正した後でも変更を保持したままなので、設定を会話と一緒に保存してください。次のようにtypeを"adaptive"に設定します:

    {
      "thinking": {
        "type": "adaptive",
        "block_binding": {
          "prefix_mismatch_behavior": "drop_block"
        }
      }
    }

    SDKでは、テストプログラムのように、ベータ版のMessagesメソッドを呼び出してヘッダー値を渡します。エラーがまだヘッダーを要求する場合、ヘッダーは届いていません。

    これにより無効な思考が除外されてエラーは止まりますが、コストが増える場合があり、出力の品質とレイテンシに影響する場合があります。次のリクエストは成功し、そのinput_transformations配列には、APIが除外した各ブロックが一覧表示されます。

    リクエストでthinkingパラメータを設定していない場合、これを追加しても他には何も変わりません。「preserved thinking」(保持された思考)を備えたモデルは、デフォルトで適応的に思考するためです。

  2. 長期的な修正

    インテグレーションを追記のみにします:

    1. 変更を見つけます。エラーがそれを示す場合があります。コードのどこでその変更を行っているかを見つけるには、claude updateを実行してから、コードのリポジトリ内のClaude Codeで/claude-api preserved-thinking-migrationを実行します。または手動で探します。
    2. その変更をやめてください。そうしないと、新しい会話でもエラーが発生する場合があります。代わりに末尾で更新を送信します。
    3. 実行中の各会話には、最後に成功したリクエストのsystemとtoolsを送信し続けてください。

変更が最近のものであれば、代わりに元に戻すこともできます。コードが変更したものを元に戻してください。変更前の思考は再び有効になります。それ以降に生成された思考はプレフィックスチェックに失敗するため、削除するか、"drop_block"を送信し続けてください。

思考の除外によるコスト

Claudeは、もう読めなくなった推論を改めて導き出すために、より多くの出力トークンを費やす場合があります。また、ブロックを除外すると、最初に除外されたブロック以降のプロンプトキャッシングのキャッシュが無効になります。

毎ターン何かが変更される場合、毎ターン以前のターンの思考が失われるため、増加が繰り返されます。"drop_block"に頼る前に、自分のワークロードで評価を実行してください。

リクエスト1
400エラー
drop_blockあり
リクエスト2
リクエスト3
リクエスト4
思考、除外
思考、保持
新規
コードによる​変更

"drop_block"は、修正中の変更を保持している既存の会話を継続させるため、また独自の要約の後など計画的な除外のために使用してください。コードが繰り返し行っている変更を隠すためにこれを有効のままにしないでください。無効なブロックが履歴からなくなったら、送信をやめることができます。

コードが変更したものを見つける

変更は、APIが示す最初のブロックより前にあります。400エラーは、system、tools、欠落している思考ブロック、または最初に異なるメッセージなど、何が変更されたかを示す場合があります。エラーがない場合や、エラーが変更内容を示さない場合は、prefix_binding_mismatchエントリや出力トークンの増加など、手元にあるものから始めてください。

コードのプレフィックスチェック失敗をテストする

テストは、それが失敗するのを確認して初めて信頼できます。まず、自分のコードを通じてClaudeに思考させるセッションを実行し、意図的に何かを変更します。このステップでは"drop_block"を送信し、最初のブロックで止まるのではなく、レスポンスがすべての無効なブロックを一覧表示するようにします。5つのステップとプログラムに示すとおりです。

次に、その変更を取り除き、実際のセッションを実行します。すべてのリクエストでベータヘッダーthinking-binding-controls-2026-08-01を送信し、prefix_mismatch_behaviorを"error"に設定します。これにより、それらのセッションでコードが行った変更は、400エラーでビルドを失敗させます。

コンパクションを行う、後からツールを追加する、指示を変更する、モデルを切り替える、または再開するセッションをテストしてください。通常のターンではそのコードに到達しません。

クリーンな実行とは、prefix_binding_mismatchエントリもエラーもない実行です。これが示すのは、実行したセッションにおいて、プレフィックスチェックを受けたブロックが有効であることだけです。次の場合は何も証明しません:

本番環境を監視し、エラーなしで失われた推論を見つける

各400エラーをログに記録し、会話が継続するようにコードで処理してください。代わりにprefix_mismatch_behaviorを指定しないままにする場合は、Claudeに届いた、プレフィックスチェックに失敗した思考がないか、本番トラフィックを監視してください。

推論は、"drop_block"、バッチアイテム、モデルの切り替え、別のアカウントへの移行、または思考を送り返さないコードによって、エラーなしで失われる場合があります。ベータヘッダーがあれば、最後のもの以外はそれぞれエントリを残します。最後のものについては、リクエストにthinkingブロックが含まれていることを確認してください。

技術的な詳細

エラーメッセージがほかに示す場合がある内容

APIが判別できる場合、エラーメッセージは続けて、system、tools、最初に異なるメッセージまたはブロック、欠落している内容や新しい内容、または欠落しているか順序が異なる以前の思考ブロックなど、何が変更されたかを示します。その文の文言は変わる可能性があるため、それに対してマッチングしないでください。リクエストにベータヘッダーがなかった場合、エラーメッセージには次の文が追加されます:

That setting requires the `thinking-binding-controls-2026-08-01` value in the `anthropic-beta` header.

エラーがまだヘッダーを要求する、またはExtra inputs are not permittedと表示される

エラーがまだヘッダーを要求する場合、ヘッダーはAPIに届いていません。プロキシまたはライブラリがヘッダーを削除した可能性があります。block_binding: Extra inputs are not permittedで終わる別のエラーも同じこと、または思考がオフになっていることを意味します。

無効な思考を手動で削除する

設定を送信できない場合、または次のいずれかの場合に使用してください:

  • シークレット、個人データ、または注入されたテキストを削除した後。"drop_block"は保存された履歴に思考を残すためです。
  • 思考がオフ("disabled"または"between_tools")の場合。"drop_block"には"adaptive"が必要で、それにより思考がオンになり、出力トークンが増えるためです。
  1. エラーが示すブロックと、その後にあるすべてのthinkingおよびredacted_thinkingブロックを削除してください。そうしないと、同じエラーが次の無効なブロックを示します。ただし、履歴にrole: "system"メッセージ、または同じロールのメッセージが2つ連続して含まれている場合は、すべてのthinkingおよびredacted_thinkingブロックを削除してください。エラーはそのようなメッセージを直前のメッセージの一部として数えるため、エラーが示す位置は配列内のインデックスより小さくなる場合があります。input_transformationsエントリのpathは、すべてのメッセージを個別に数えます。
  2. 他のすべてのブロックは保持し、リクエストを再送信してください。削除したブロックを元に戻さないでください。

このエラーに似たエラー

これらのエラーは、ブロックが別の会話にバインドされているとは示しておらず、prefix_mismatch_behaviorを設定しても解消されない可能性があります:

"drop_block"の送信をやめられるタイミング

"drop_block"の送信をやめるには、それが除外するブロックを削除し、それ以降に生成された思考は保持してください。他に何も変更されていなければ、その会話は"error"でも通るようになります。

コードでエラーを処理する

コードでエラーを処理するには、すべてのリクエストでベータヘッダーと"error"を送信し、どのモデルでも失敗が400エラーになるようにします。エラーが返されたら、その会話だけを以降のすべてのリクエストで"drop_block"に切り替え、その選択を会話と一緒に保存し、一度だけ再送信して、エラーをログに記録します。同じエラーが再び返される場合、設定はAPIに届いていません。エラーがまだヘッダーを要求する、またはExtra inputs are not permittedと表示されるを参照してください。

コードはこのエラーをmessageフィールドで認識する必要があります。これは、エラーのテキストに対してマッチングしないという一般的なアドバイスの例外です。すべての400エラーはタイプinvalid_request_errorを持ち、このエラーにはerror.details.error_codeがありません。メッセージの残りの部分は変わる可能性があるため、「The block is bound to a different conversation」のみでマッチングしてください。

エラーがない、またはエラーが何が変更されたかを示さない

  • 400エラーで、変更が示されていない場合: リクエストを自分で比較してください。原因の1つは、要約対象のメッセージを削除せずにコンパクションブロックを送信することです。

  • prefix_binding_mismatchエントリがある場合: 最初のエントリのpathまでのsystem、tools、messagesを、そのブロックが生成された時点の会話と比較してください。すべてのブロックが一覧表示されている場合は、systemとtoolsから始めてください。

    何も違いがない場合は、内容が変更された画像またはドキュメントのURL、MCPサーバーの変更されたツールリスト(MCPサーバーのツールリストを固定するを参照)、または省かれた、移動された、または元に戻された思考ブロックを探してください。リクエストログがない場合は、"error"を指定してリクエストを再送信し、何が異なるかを示す文があれば読んでください。

  • 自分のものでないプロキシまたはライブラリが間にある場合: それが送信する内容と、あなたが送信した内容を比較し、そのメンテナーにライブラリ、プロキシ、ゲートウェイを案内してください。

  • 疑いがあるだけで、Claude Codeがない場合: 会話のリクエストボディを取得します。コンパクションまたはツール変更を含むものにしてください。新しいターンを除いて、各ボディを直前のものと比較します。

失敗し得るテストの5つのステップと、それを実行するプログラム

  1. 自分のコードで、保持された思考を備えたモデルに対し、セッションの各リクエストでベータヘッダーと"drop_block"を送信します。
  2. Claudeに思考させるプロンプトを使用し、最初のレスポンスにthinkingブロックがあることを確認します。適応型思考では、Claudeは簡単なプロンプトでは思考を省略する場合があります。
  3. reasonがprefix_binding_mismatchであるinput_transformationsエントリがある場合にのみ失敗させます。空の配列を期待するテストは、モデルの切り替え後にも失敗します。その場合はmodel_binding_mismatchまたはorganization_binding_mismatchのエントリが想定されるためです。
  4. 3番目のリクエストでのみsystemプロンプトを追加するなど、意図的に何かを変更します。
  5. input_transformationsが、変更の後にある思考ブロックを一覧表示していることを確認します。何も一覧表示されない場合は、履歴に思考ブロックが含まれていることを確認してください。

このプログラムはステップ1、2、4、5を実行します。各レスポンスに含まれる思考ブロックとinput_transformationsエントリの数を出力し、続いて各エントリを出力します。これがステップ3でチェックする内容です:

client = anthropic.Anthropic()

user_turns = [
    "How many positive integers below 500 have exactly 6 positive divisors?",
    "How many have exactly 8?",
    "How many have exactly 10?",
]

messages = []
for turn, user_turn in enumerate(user_turns, start=1):
    messages.append({"role": "user", "content": user_turn})
    response = client.beta.messages.create(
        model="claude-opus-5-5",
        max_tokens=16000,
        thinking={
            "type": "adaptive",
            "block_binding": {"prefix_mismatch_behavior": "drop_block"},
        },
        # 最後のリクエストだけがシステムプロンプトを追加し、意図的にプレフィックスを変更します
        system="Answer briefly." if turn == len(user_turns) else anthropic.omit,
        messages=messages,
        betas=["thinking-binding-controls-2026-08-01"],
    )
    messages.append({"role": "assistant", "content": response.content})
    thinking_blocks = sum(block.type == "thinking" for block in response.content)
    entries = response.input_transformations or []
    print(f"thinking blocks: {thinking_blocks}, entries: {len(entries)}")
    for entry in entries:
        if entry.type == "thinking_dropped":
            print(entry.type, entry.path, entry.reason)
Output
thinking blocks: 1, entries: 0
thinking blocks: 1, entries: 0
thinking blocks: 1, entries: 2
thinking_dropped messages.1.content.0 prefix_binding_mismatch
thinking_dropped messages.3.content.0 prefix_binding_mismatch

"drop_block"の代わりに"error"を使用すると、3番目のリクエストは400エラーになります。

各input_transformationsエントリの意味と、修正すべきもの

ベータヘッダーを使用すると、思考をサポートするモデルからのレスポンスには、usageの横にinput_transformations配列が含まれます。何も除外されず、無効なものが何も通されなかった場合は空です。「streaming」(ストリーミング)時は、message_startイベントのmessageに含まれます。ストリーミング途中のフォールバックの後は、最終的なmessage_deltaイベントに含まれるものが正となります。エラーの位置とは異なり、pathは常に、送信したとおりのブロックの位置です:

{
  "input_transformations": [
    {
      "type": "thinking_dropped",
      "path": "messages.1.content.0",
      "reason": "prefix_binding_mismatch"
    }
  ]
}

各エントリのtypeとreason、およびその意味:

  • thinking_dropped、prefix_binding_mismatch: このブロックの前にあるものが、ブロックが記録したものと一致しません。修正すべきものです:コードが変更したものを見つける。
  • thinking_mismatch_allowed、prefix_binding_mismatch: 同じですが、Claudeはブロックを変更されないまま読み、課金されます。このエントリは、一部のモデルで設定が指定されていない場合にのみ表示されます。修正すべきものです。
  • thinking_dropped、model_binding_mismatch: このモデルは、ブロックを生成したモデルのブロックを読むことができません。修正すべきものではありません:会話全体を送信し続けてください。
  • thinking_dropped、organization_binding_mismatch: 別のアカウントがブロックを生成したため、APIがそれを除外しました。修正すべきものではありません。

認識できないtypeまたはreasonを持つエントリは無視してください。

バッチとトークンカウント

  • メッセージバッチ: prefix_mismatch_behaviorを指定しないアイテムが400エラーを受け取ることはありません。APIは無効なブロックを除外するか、一部のモデルではそれらを通す場合があります。"error"を設定したアイテムは、ブロックがプレフィックスチェックに失敗するとerroredとして解決されます。block_bindingはアイテムのparams.thinkingに入れます。
  • トークンカウント: Claude APIでは、トークンカウントが同じ400エラーを返す場合があり、同じヘッダーのもとでprefix_mismatch_behaviorを受け付けます。除外されたブロックはカウントから除かれ、input_transformationsは返されません。

次のステップ

コードが会話に加える各変更の代わりに送信するもの。

保持された思考とは何か、思考ブロックが何に紐付けられているか、そしてモデルやアカウントの切り替えについて。

検証できない署名など、その他の思考エラーの修正方法。

このページは役に立ちましたか?