Claude Platform Docs
Messages保留思考

修正綁定到不同對話的思考區塊

在出現表示思考區塊綁定到不同對話的 400 錯誤後,讓對話重新進行,找出您的程式碼變更了什麼,並測試該變更已不復存在。

再次傳送相同的請求不會成功,因為您的歷史記錄仍包含您的程式碼所做的變更。傳送 "drop_block" 以立即停止錯誤。長期修正是讓您的程式碼成為「append-only」(僅附加)。

錯誤:The block is bound to a different conversation

該思考區塊未通過「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",並傳送 beta 標頭 anthropic-beta: thinking-binding-controls-2026-08-01。請在該對話之後的每個請求中都這樣做,因為 API 不會在請求之間儲存此設定。即使您修正了程式碼,已儲存的對話仍包含該變更,因此請將此設定與對話一起儲存。如下所示,將 type 設為 "adaptive":

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

    在 SDK 中,請呼叫 beta Messages 方法並傳入標頭值,如同測試程式的做法。如果錯誤仍要求該標頭,表示標頭沒有送達。

    這會透過捨棄無效的思考來停止錯誤,但可能花費更多,也可能影響輸出品質與「latency」(延遲)。下一個請求會成功,且其 input_transformations 陣列會列出 API 捨棄的每個區塊。

    如果您的請求未設定 thinking 參數,加入它不會改變其他任何事情,因為具備「preserved thinking」(保留思考)的模型預設會以自適應方式思考。

  2. 長期修正

    讓您的整合成為僅附加:

    1. 找出變更。錯誤可能會指出它。若要找出您的程式碼在哪裡做出變更,請執行 claude update,然後在您程式碼的儲存庫中,於 Claude Code 中執行 /claude-api preserved-thinking-migration。或者手動尋找。
    2. 停止做出該變更,否則新的對話也可能出現此錯誤。改為在結尾傳送更新。
    3. 持續為每個進行中的對話傳送其最後一次成功請求的 system 和 tools。

如果變更是最近發生的,您也可以改為復原它:將您的程式碼所變更的內容還原。變更之前的思考會再次有效。此後產生的思考則會未通過前綴檢查,因此請移除它,或持續傳送 "drop_block"。

捨棄思考的代價

Claude 可能會花費更多輸出 token 來重新推導它已無法讀取的推理。捨棄這些區塊也會使從第一個被捨棄的區塊開始的「prompt cache」(提示快取)失效。

當每一輪都有內容變更時,每一輪都會失去先前各輪的思考,因此增加的成本會反覆出現。在依賴 "drop_block" 之前,請在您自己的工作負載上執行評估。

請求 1
400 ⁠錯誤
使用 drop_block
請求 2
請求 3
請求 4
思考,已捨棄
思考,已保留
新的
您的​程式碼所​做的​變更

使用 "drop_block" 讓仍包含您正在修正之變更的既有對話繼續進行,以及用於計畫中的捨棄,例如在您自己的摘要之後。不要一直開著它來掩蓋您的程式碼持續做出的變更。一旦無效區塊已從歷史記錄中移除,您就可以停止傳送它。

找出您的程式碼變更了什麼

變更位於 API 指出的第一個區塊之前。400 錯誤可能會說明變更了什麼,例如 system、tools、缺少的思考區塊,或第一則不同的訊息。如果沒有錯誤,或錯誤沒有說明,請從您手上有的資訊著手,例如 prefix_binding_mismatch 條目或增加的輸出 token。

測試您的程式碼是否有未通過前綴檢查的情況

在您看過測試失敗之後,才能信任它。首先,透過您自己的程式碼執行一個會讓 Claude 思考的工作階段,並刻意變更某些內容。在這個步驟中傳送 "drop_block",讓回應列出每個無效區塊,而不是在第一個就停止,如五個步驟和一個程式所示。

接著移除該變更,並執行您真實的工作階段。在每個請求中傳送 beta 標頭 thinking-binding-controls-2026-08-01,並將 prefix_mismatch_behavior 設為 "error",如此一來,您的程式碼在這些工作階段中做出的變更會以 400 錯誤使建置失敗。

請測試會進行壓縮、較晚加入工具、變更指示、切換模型或恢復的工作階段:一般的輪次不會執行到那些程式碼。

乾淨的執行沒有 prefix_binding_mismatch 條目,也沒有錯誤。它只顯示在您執行的工作階段中,它所檢查的區塊是有效的。在以下情況下,它無法證明任何事:

監看正式環境,並找出在沒有錯誤的情況下遺失的推理

記錄每個 400 錯誤,並在程式碼中處理它,讓對話得以繼續。如果您改為不設定 prefix_mismatch_behavior,請監看正式環境流量,留意送達 Claude 的未通過前綴檢查的思考。

推理可能會在沒有錯誤的情況下遺失,原因包括 "drop_block"、批次項目、切換模型、移至另一個帳戶,或不回傳任何思考的程式碼。使用 beta 標頭時,除了最後一項之外,每一項都會留下條目。對於最後一項,請檢查您的請求是否包含 thinking 區塊。

技術細節

錯誤訊息還可能說明什麼

在 API 能夠判斷的情況下,錯誤訊息會接著指出變更了什麼,例如 system、tools、第一則不同的訊息或區塊、缺少或新增的內容,或是缺少或順序錯亂的較早思考區塊。該句子的措辭可能會改變,因此請勿以它進行比對。如果請求沒有 beta 標頭,錯誤訊息會加上這句話:

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",而這會開啟思考並增加輸出 token。
  1. 移除錯誤指出的區塊,以及其後的每個 thinking 和 redacted_thinking 區塊,否則相同的錯誤接著會指出下一個無效區塊。但如果您的歷史記錄包含 role: "system" 訊息,或連續兩則相同角色的訊息,請移除每個 thinking 和 redacted_thinking 區塊。錯誤會將這類訊息計為其前一則訊息的一部分,因此它指出的位置可能會小於您陣列中的索引。input_transformations 條目的 path 則會將每則訊息分開計算。
  2. 保留所有其他區塊,然後再次傳送請求。不要把已移除的區塊放回去。

與此錯誤相似的錯誤

這些錯誤不會說明區塊綁定到不同的對話,而設定 prefix_mismatch_behavior 可能無法消除它們:

  • 在「Invalid signature in thinking block」之後就結束、包含「cannot be modified」,或與 budget_tokens 有關的訊息:思考功能疑難排解
  • 與 temperature 或預先填入的回覆有關的訊息:限制與功能相容性

何時可以停止傳送 "drop_block"

若要停止傳送 "drop_block",請移除它所捨棄的區塊,並保留此後產生的思考。如果沒有其他任何變更,該對話接著就能在使用 "error" 時通過。

在程式碼中處理錯誤

若要在程式碼中處理錯誤,請在每個請求中傳送 beta 標頭和 "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 錯誤,且未指出任何變更: 請自行比較請求。其中一個原因是傳送了壓縮區塊,卻沒有移除它所摘要的訊息。

  • prefix_binding_mismatch 條目: 將直到第一個條目 path 為止的 system、tools 和 messages,與產生該區塊時的對話進行比較。如果每個區塊都被列出,請從 system 和 tools 開始。

    如果沒有任何差異,請尋找內容已變更的圖片或文件 URL、MCP 伺服器變更過的工具清單(請參閱固定 MCP 伺服器的工具清單),或被省略、移動或放回的思考區塊。如果沒有請求記錄,請使用 "error" 再次傳送請求,並閱讀說明差異之處的句子(如果有的話)。

  • 中間有不屬於您的代理伺服器或程式庫: 比較它傳送的內容與您傳送的內容,並讓其維護者參閱程式庫、代理伺服器和閘道。

  • 只是懷疑,且沒有 Claude Code: 擷取某個對話的請求主體,選擇包含壓縮或工具變更的對話。將每個請求主體與前一個進行比較,排除其新的輪次。

可能失敗的測試的五個步驟,以及執行這些步驟的程式

  1. 在您自己的程式碼中,對具備保留思考的模型傳送工作階段的每個請求時,都附上 beta 標頭和 "drop_block"。
  2. 使用會讓 Claude 思考的提示,並檢查第一個回應是否有 thinking 區塊。使用自適應思考時,Claude 可能會在簡單的提示上略過思考。
  3. 只在原因為 prefix_binding_mismatch 的 input_transformations 條目上判定失敗。要求空陣列的測試在切換模型後也會失敗,因為屆時預期會出現 model_binding_mismatch 或 organization_binding_mismatch 的條目。
  4. 刻意變更某些內容,例如只在第三個請求中加入 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

如果以 "error" 取代 "drop_block",第三個請求會收到 400 錯誤。

每個 input_transformations 條目的含義,以及哪些需要由您修正

使用 beta 標頭時,來自支援思考之模型的回應會在 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 的條目。

批次與 token 計數

  • 訊息批次: 不設定 prefix_mismatch_behavior 的項目永遠不會收到 400 錯誤。API 會捨棄無效的區塊,或者在部分模型上,可能會讓它們通過。設定 "error" 的項目在某個區塊未通過前綴檢查時,會以 errored 結果結束。block_binding 放在該項目的 params.thinking 中。
  • Token 計數: 在 Claude API 上,token 計數可能會傳回相同的 400 錯誤,並在相同標頭下接受 prefix_mismatch_behavior。它不會將被捨棄的區塊計入,也不會傳回 input_transformations。

後續步驟

針對您的程式碼對對話所做的每種變更,應改為傳送什麼。

什麼是保留思考、思考區塊與什麼綁定,以及切換模型或帳戶。

其他思考錯誤的修正方式,例如無法驗證的簽章。

這個頁面有幫助嗎?