備援抵免
當您在另一個模型上重試被拒絕的請求時,避免重複支付提示快取的費用。
提示快取是依模型區分的。當某個模型拒絕一個請求,而您在另一個模型上重試時,已為第一個模型快取的對話前綴必須從頭寫入新模型的快取。快取寫入的費用高於快取讀取。「Fallback credit」(備援抵免)可消除這筆額外費用。拒絕回應會附帶一個抵免權杖,您在重試時回傳該權杖,重試便會以彷彿對話一直都在新模型上進行的方式計費。
只有當您自行建構重試時才需要閱讀本頁:透過原始 HTTP 或使用自訂重試邏輯。伺服器端備援與 SDK 中介軟體會自動套用備援抵免。如果您使用其中任一種,請跳過本頁。
拒絕與備援涵蓋如何偵測拒絕以及選擇備援方式。若您對快取讀取與快取寫入這些術語感到陌生,提示快取有相關說明。
基本流程
使用 beta 標頭選擇加入
傳送可能被拒絕的請求時,附上
anthropic-beta: fallback-credit-2026-07-01標頭。server-side-fallback-2026-07-01標頭也會提供相同的欄位,而較早的fallback-credit-2026-06-01標頭仍被接受,並提供相同的欄位。從拒絕回應中讀取兩個欄位
發生拒絕時,
stop_details包含兩個欄位:fallback_credit_token: 代表抵免的不透明字串。fallback_has_prefill_claim: 一個布林值,告訴您應使用哪種重試主體形式。
當該拒絕沒有可用的抵免時,兩者皆為
null。建構重試
從被拒絕的請求主體開始。將
model設為備援模型,並將權杖加入為頂層的fallback_credit_token參數。從下表中選擇主體形式。使用相同的標頭傳送重試
使用相同的
fallback-credit-2026-07-01beta 標頭傳送重試。重試需要該標頭才能兌換權杖。
fallback_has_prefill_claim 欄位告訴您重試是否可以接續被拒絕模型的部分輸出,而非從頭開始:
fallback_has_prefill_claim | 重試主體 |
|---|---|
true | 被拒絕的請求主體(不變),再附加一則 assistant 訊息,其 content 回傳被拒絕回應的 content。重試模型會從被拒絕模型停止的地方接續回應,且已完成的伺服器工具呼叫不會重新執行。 |
false | 被拒絕的請求主體(不變)。 |
範例
以下範例發出一個可能被拒絕的請求,並在針對 Claude Opus 4.8 的重試中兌換抵免權杖。當某次重試嘗試被拒絕時,範例會沿著拒絕階梯逐步降級:也就是當重試被拒絕時中所涵蓋的一系列逐漸簡化的重試形式。
client = Anthropic()
request = {
"max_tokens": 1024,
"messages": [{"role": "user", "content": "Hello, Claude"}],
}
def send(model: str, body: dict[str, object]) -> BetaMessage:
return client.beta.messages.create(
model=model, betas=["fallback-credit-2026-07-01"], **body
)
response = send("claude-fable-5", request)
if (
response.stop_reason == "refusal"
and (details := response.stop_details)
and (token := details.fallback_credit_token)
):
exact_body = request | {"fallback_credit_token": token}
# 除非 claim 為 False,否則優先採用 continuation 形式
if details.fallback_has_prefill_claim is not False:
echoed = [block.model_dump() for block in response.content]
match echoed:
case [*_, {"type": "text"} as final_block]:
final_block["text"] = final_block["text"].rstrip()
attempt = exact_body | {
"messages": [
*request["messages"],
{"role": "assistant", "content": echoed},
]
}
else:
attempt = exact_body
try:
response = send("claude-opus-4-8", attempt)
except BadRequestError as error:
if "redemption temporarily unavailable" in error.message:
raise # Transient: retry with the token within its five-minute window
try:
# 退回使用未變更的 body,仍附帶 token
response = send("claude-opus-4-8", exact_body)
except BadRequestError as retry_error:
if "redemption temporarily unavailable" in retry_error.message:
raise # Transient: retry with the token within its five-minute window
# token 本身遭拒:放棄該 token 並在不帶 token 的情況下重試。
response = send("claude-opus-4-8", request)
print(json.dumps({"stop_reason": response.stop_reason, "model": response.model}))適用範圍
備援抵免目前在 Claude API、Amazon Bedrock、Claude Platform on AWS、Google Cloud 以及 Microsoft Foundry 上處於 beta 階段。Message Batches 中的拒絕不會產生抵免權杖,且兌換僅適用於直接的 Messages API 請求:在批次請求中傳入的權杖會被接受但忽略。
重試模型必須是被拒絕模型所允許的備援目標之一。對於 Claude Fable 5.1 與 Claude Fable 5,這些目標為 Claude Opus 4.8(claude-opus-4-8)與 Claude Opus 5(claude-opus-5)。
在 Claude API 與 Claude Platform on AWS 上,當設定了 server-side-fallback-2026-07-01 beta 標頭時,目標清單會以 allowed_fallback_models 的形式發布於 Models API 中每個模型的項目上。僅使用 fallback-credit-* 標頭時,該清單尚不可見。它在 Amazon Bedrock、Google Cloud 或 Microsoft Foundry 上不會公開。
確認抵免已套用
退款可在重試的 usage 中看到。與同一請求在沒有權杖時所回報的數值相比,cache_creation_input_tokens 較低,而 cache_read_input_tokens 則高出相同的數量。若變動為零,表示權杖已被接受,但沒有需要重新計價的項目,例如因為重試模型的快取已經是熱的。
當重試被拒絕時
大多數重試在第一次嘗試時即可兌換。若未能兌換,API 會回傳一個 400 錯誤,告訴您接下來該嘗試什麼。
接續被拒絕:重新傳送未變更的主體
如果附加 assistant 訊息的重試被以 400 錯誤拒絕,請重新傳送未變更的被拒絕請求主體,仍附上權杖。
權杖被拒絕:移除權杖
如果未變更的主體也被以 400 錯誤拒絕,且錯誤訊息中提及
fallback_credit_token,請在不附權杖的情況下重試。抵免會被放棄,但重試本身會成功送出。
此拒絕是暫時性的,並非對您重試形式的判定。請在權杖的五分鐘有效期內,使用相同的權杖重試相同的請求。不要進入階梯的下一步。
參考
以下各節涵蓋邊緣案例與完整的兌換規則。大多數整合不需要這些內容。
兌換會將重試與被拒絕的請求進行比對。每個會影響提示內容的欄位都必須完全相符。不影響提示內容的欄位可以在重試時變更。
| 規則 | 欄位 |
|---|---|
| 必須完全相符 | system、messages、tools、tool_choice、thinking 與 cache_control,以及當您使用時的 output_config、mcp_servers、context_management 與 container |
| 可在重試時變更 | model、max_tokens、stop_sequences、temperature、top_p、top_k、stream、metadata 與 service_tier |
接續形式(fallback_has_prefill_claim: true)是 messages 相符規則的唯一例外:它會在 messages 的末尾恰好新增一則 assistant 訊息。
重試時不要從先前的輪次中移除 thinking 或 redacted_thinking 區塊,即使不附權杖的一般重試通常會移除它們。主體必須與被拒絕的請求相符,而伺服器會自行處理這些區塊。
在重試時傳送與被拒絕請求相同的 anthropic-beta 標頭。若某個 beta 標頭只出現在兩個請求中的其中一個,即使主體完全相同,也可能導致比對失敗。所產生的 400 錯誤會帶有與主體差異相同的 request body ... does not match 訊息,因此標頭差異很容易被誤判為主體問題。特別是,不要根據請求所針對的模型來新增或移除 beta 標頭。
為了重試的需要,有兩個標頭系列不受比對限制:
server-side-fallback-*: 重試必須移除fallbacks參數,而連同此標頭一併移除不會造成不相符。fallback-credit-*: 在兩個請求上都保留此標頭。重試需要它才能兌換權杖。
該欄位僅在權杖也為 null 時才為 null,因此當您持有權杖時所觀察到的值永遠不會是 null。在 Amazon Bedrock、Google Cloud 與 Microsoft Foundry 對該欄位的支援逐步推出期間,它仍可能不存在(在具型別的 SDK 中為 None)。在這種情況下,請將重試形式視為未知,而非視為 false。先嘗試附加 assistant 訊息的形式,並依賴當重試被拒絕時中的拒絕處理,它會退回到未變更的主體。
當拒絕的權杖支援接續形式時,回應的 content 僅包含模型自身的輸出,而拒絕說明則透過 stop_details.explanation 傳遞。因此您可以將 content 原樣回傳到附加的 assistant 訊息中。
傳送前可能仍需要兩項調整:
- 如果您傳送的最後一個區塊是
text區塊,請移除其結尾的空白字元。 - 省略任何沒有對應
tool_result的用戶端tool_use區塊。
如果回傳的內容包含來自先前伺服器端備援的 fallback 區塊,請將該區塊保留在其原本出現的確切位置。它在任何請求中都會被接受,無需 beta 標頭。API 會使用其位置來驗證其周圍的 thinking 區塊,因此若該區塊被省略或移動,回傳該邊界兩側 thinking 區塊的請求將被拒絕。
權杖只能由收到拒絕的組織與工作區兌換,包括在 Microsoft Foundry 上。在沒有工作區的 Amazon Bedrock 與 Google Cloud 上,權杖則改為綁定至該平台的呼叫者身分。
權杖在拒絕後五分鐘到期。之後,請在不附權杖的情況下傳送重試。權杖也是無狀態的:伺服器不會儲存任何與其相關的資訊,也沒有可用於檢視或撤銷它的端點。
當拒絕發生在請求中伺服器工具已執行之後,權杖只能透過接續部分回應來兌換。正是這項限制防止了已完成的工具呼叫再次執行與計費。
因此,當以下兩項同時成立時,有一種組合可能導致權杖無法以任一形式兌換:
- 請求使用了
output_config.format或強制工具使用的tool_choice。任一者都會排除附加 assistant 訊息的形式。 - 拒絕發生在伺服器工具已執行之後。這會排除未變更的主體。
如果未變更主體的重試被以 400 錯誤拒絕,且錯誤表示權杖必須透過接續部分回應來兌換,請捨棄該權杖。不附權杖的重試會成功送出,但它會重新執行並重新計費已完成的伺服器工具。請將費用或錯誤呈現給您的呼叫端,而非靜默重試。
後續步驟
Was this page helpful?