修正綁定到不同對話的思考區塊
在出現表示思考區塊綁定到不同對話的 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。
立即停止錯誤
將
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」(保留思考)的模型預設會以自適應方式思考。
如果變更是最近發生的,您也可以改為復原它:將您的程式碼所變更的內容還原。變更之前的思考會再次有效。此後產生的思考則會未通過前綴檢查,因此請移除它,或持續傳送 "drop_block"。
捨棄思考的代價
Claude 可能會花費更多輸出 token 來重新推導它已無法讀取的推理。捨棄這些區塊也會使從第一個被捨棄的區塊開始的「prompt cache」(提示快取)失效。
當每一輪都有內容變更時,每一輪都會失去先前各輪的思考,因此增加的成本會反覆出現。在依賴 "drop_block" 之前,請在您自己的工作負載上執行評估。
使用 "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 條目,也沒有錯誤。它只顯示在您執行的工作階段中,它所檢查的區塊是有效的。在以下情況下,它無法證明任何事:
- 該工作階段沒有思考區塊
- 您的程式碼移除了所有思考,或該模型不具備保留思考
- 您沒有傳送 beta 標頭,而模型可能會讓未通過前綴檢查的區塊通過且不產生錯誤
監看正式環境,並找出在沒有錯誤的情況下遺失的推理
記錄每個 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。
- 移除錯誤指出的區塊,以及其後的每個
thinking和redacted_thinking區塊,否則相同的錯誤接著會指出下一個無效區塊。但如果您的歷史記錄包含role: "system"訊息,或連續兩則相同角色的訊息,請移除每個thinking和redacted_thinking區塊。錯誤會將這類訊息計為其前一則訊息的一部分,因此它指出的位置可能會小於您陣列中的索引。input_transformations條目的path則會將每則訊息分開計算。 - 保留所有其他區塊,然後再次傳送請求。不要把已移除的區塊放回去。
與此錯誤相似的錯誤
這些錯誤不會說明區塊綁定到不同的對話,而設定 prefix_mismatch_behavior 可能無法消除它們:
- 在「Invalid
signatureinthinkingblock」之後就結束、包含「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: 擷取某個對話的請求主體,選擇包含壓縮或工具變更的對話。將每個請求主體與前一個進行比較,排除其新的輪次。
可能失敗的測試的五個步驟,以及執行這些步驟的程式
- 在您自己的程式碼中,對具備保留思考的模型傳送工作階段的每個請求時,都附上 beta 標頭和
"drop_block"。 - 使用會讓 Claude 思考的提示,並檢查第一個回應是否有
thinking區塊。使用自適應思考時,Claude 可能會在簡單的提示上略過思考。 - 只在原因為
prefix_binding_mismatch的input_transformations條目上判定失敗。要求空陣列的測試在切換模型後也會失敗,因為屆時預期會出現model_binding_mismatch或organization_binding_mismatch的條目。 - 刻意變更某些內容,例如只在第三個請求中加入
system提示。 - 檢查
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)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。
後續步驟
針對您的程式碼對對話所做的每種變更,應改為傳送什麼。
什麼是保留思考、思考區塊與什麼綁定,以及切換模型或帳戶。
其他思考錯誤的修正方式,例如無法驗證的簽章。
這個頁面有幫助嗎?