Claude Fable 5 包含可拒絕請求的安全分類器。當發生這種情況時,您會收到一個正常的回應(而非錯誤),其中包含 stop_reason: "refusal"。通常您仍可透過將相同的請求傳送至另一個 Claude 模型來取得答案。本頁面將說明如何辨識拒絕,以及如何設定該重試機制。
當您基於 Claude Fable 5 進行建置,並希望被拒絕的請求能自動轉由另一個模型處理時,請閱讀本頁面。當您剛在回應中看到 "refusal" 並想知道接下來該怎麼做時,本頁面同樣適用。
stop_reason 值的完整清單請參閱停止原因與備援。關於被拒絕請求的計費方式,以及如何避免在重試時為提示快取支付兩次費用的詳細資訊,請參閱備援額度。封裝上述所有功能的 SDK 輔助工具請參閱 SDK 中介軟體。如需完整的端對端範例,請參閱備援與計費 Cookbook。
最簡單的設定:在請求中指定一個備援模型,API 會處理重試。
await client.beta.messages.create({
model: "claude-fable-5",
max_tokens: 1024,
messages,
betas: ["server-side-fallback-2026-06-01"],
fallbacks: [{ model: "claude-opus-4-8" }]
});以下各節涵蓋拒絕回應包含的內容、何時使用伺服器端或用戶端備援,以及各自的計費方式。
拒絕是一個成功的 HTTP 200 回應,其中包含 stop_reason: "refusal":
{
"id": "msg_01XFUDYJgAACzvnptvVoYEL",
"type": "message",
"role": "assistant",
"model": "claude-fable-5",
"content": [],
"stop_reason": "refusal",
"stop_details": {
"type": "refusal",
"category": "cyber",
"explanation": "This request was declined because it could enable cyber harm."
},
"usage": {
"input_tokens": 412,
"output_tokens": 0
}
}stop_details 物件說明了拒絕的原因。其 category 欄位指出觸發分類器的政策領域。其 explanation 欄位是人類可讀的描述;該文字並非穩定不變,因此請將其顯示而非解析。當拒絕未對應到具名類別時,這兩個欄位皆為 null,且 null 是正常的永久值,而非佔位符。對於 refusal 以外的所有停止原因,stop_details 本身為 null。
category | 含義 |
|---|---|
"cyber" | 該請求可能促成網路危害,例如惡意軟體或漏洞利用程式的開發。良性的網路安全工作也可能觸發此類別。 |
"bio" | 該請求可能促成生物危害,例如危險的實驗室方法。有益的生命科學工作也可能觸發此類別。 |
"reasoning_extraction" | 該請求要求模型在回應文字中重現其內部推理。若要改以結構化形式取得推理內容,請使用自適應思考。 |
拒絕可能在任何輸出之前到達,或在部分輸出後於串流中途到達。無論哪種情況,請將任何部分輸出視為不完整並予以捨棄。
**拒絕的計費方式:**在任何輸出之前的拒絕會使 content 保持空白,且您不會被計費(token 計數會出現在 usage 中但不會收費,且該請求不計入速率限制)。串流中途的拒絕會以正常費率對輸入 token 和已串流的輸出進行計費。
有三種方式可在另一個模型上重試被拒絕的請求。正確的選擇取決於您的執行環境以及您需要多少控制權。
| 您的情況 | 使用 | 原因 |
|---|---|---|
| Claude API 或 AWS 上的 Claude Platform,最簡單的設定 | 伺服器端備援 | 一個請求,一個回應。API 會處理重試。 |
| 任何平台,搭配 TypeScript、Python、Go、Java 或 C# SDK | SDK 中介軟體 | 在用戶端設定一次。重試會自動發生。 |
| Ruby、PHP、原始 HTTP 或自訂重試邏輯 | 搭配備援額度的手動重試 | 完全控制。備援額度可降低成本。 |
伺服器端備援和 SDK 中介軟體會為您套用備援額度,因此只有在自行建置重試時才需要參閱該頁面。
伺服器端備援會在單一 API 呼叫內重試被拒絕的請求。您最多可指定三個備援模型,當 Claude Fable 5 拒絕時,API 會對相同的請求執行鏈中的下一個模型。您會收到一個回應,其中指出回答的模型,因此您的使用者可在一次往返中取得答案。
伺服器端備援在 Claude API 和 AWS 上的 Claude Platform 中處於測試階段。fallbacks 參數在 Message Batches API 上會被拒絕,且在 Amazon Bedrock、Vertex AI 或 Microsoft Foundry 上不可用。在這些平台上,請改用 SDK 中介軟體。
在 fallbacks 參數中指定備援模型,並傳送 server-side-fallback-2026-06-01 測試版標頭。
fallbacks 清單適用以下幾項規則:
allowed_fallback_models 的形式發布在 Models API 中該模型的項目上。model,並可僅針對該次嘗試覆寫 max_tokens 和 thinking。測試版標頭必須精確帶有日期 2026-06-01。在任何其他 server-side-fallback-* 值下,fallbacks 參數會被拒絕並回傳 400 錯誤。如果您是基於此功能的早期預覽版進行建置,請將測試版標頭以及請求和回應的結構一併更新為本頁面所示的版本。
回應看起來與任何其他訊息相同,但有兩項新增內容:
model 欄位回報產生所回傳訊息的模型,無論是所請求的模型還是備援模型。fallback 內容區塊標記 content 中一個模型的輸出讓位給下一個模型的每個位置:{"type": "fallback", "from": {"model": ...}, "to": {"model": ...}}。當拒絕的環節是所請求的模型時,from.model 會回傳您所傳送的模型字串。to.model 始終是接續模型的解析後 ID。在任何輸出之前的拒絕,fallback 區塊會是第一個內容區塊:
{
"id": "msg_01XFUDYJgAACzvnptvVoYEL",
"type": "message",
"role": "assistant",
"model": "claude-opus-4-8",
"content": [
{
"type": "fallback",
"from": { "model": "claude-fable-5" },
"to": { "model": "claude-opus-4-8" }
},
{ "type": "text", "text": "Hi! How can I help you today?" }
],
"stop_reason": "end_turn",
"stop_details": null,
"usage": {
"input_tokens": 412,
"output_tokens": 264,
"cache_read_input_tokens": 0,
"cache_creation_input_tokens": 0,
"iterations": [
{
"type": "message",
"model": "claude-fable-5",
"input_tokens": 535,
"output_tokens": 0,
"cache_read_input_tokens": 0,
"cache_creation_input_tokens": 0
},
{
"type": "fallback_message",
"model": "claude-opus-4-8",
"input_tokens": 412,
"output_tokens": 264,
"cache_read_input_tokens": 0,
"cache_creation_input_tokens": 0
}
]
}
}usage.iterations 陣列記錄每次嘗試。拒絕的模型會以一般的 message 項目出現,而服務該回合的模型會以 fallback_message 項目出現。如果鏈中的每個模型都拒絕,回應會是最後一個模型的拒絕,其中每個先前的環節都有一個 message 項目,最後一個則有一個 fallback_message 項目。
在下一回合,將助理內容按您收到的原樣傳回。在輸出中途備援後,content 可能包含拒絕模型在交接前產生的區塊類型;下表涵蓋在回傳該回合時應保留哪些、捨棄哪些。
| 區塊類型 | 下一回合的處理 |
|---|---|
fallback | 保留在其原本出現的位置。API 會使用其位置來驗證其周圍的思考區塊,因此若回傳的請求包含邊界兩側的思考區塊,但該區塊被省略或移動,則請求會被拒絕。 |
text | 保留。 |
最後一個 fallback 區塊之後的任何區塊 | 保留。 |
最後一個 fallback 區塊之前的 thinking、redacted_thinking 或 connector_text | 捨棄。 |
最後一個 fallback 區塊之前的用戶端 tool_use | 捨棄。 |
最後一個 fallback 區塊之前的 server_tool_use |
connector_text 區塊承載某些使用工具的回應在工具呼叫之間包含的敘述文字。
在串流請求中,重試會在同一個串流上發生,且您已收到的任何內容都不會失效。當拒絕發生在任何輸出之前時,message_start 會指出備援模型,且 fallback 區塊是第一個內容區塊;由於 message_start 會等待備援嘗試開始,首位元組時間會包含被拒絕的嘗試。當拒絕發生在輸出中途時,開啟的內容區塊會關閉,fallback 區塊(一對沒有 delta 的普通 content_block_start 和 content_block_stop)會標記邊界,備援模型會從部分輸出繼續。只有部分輸出的 text 區塊會作為上下文傳遞給備援模型;其他區塊類型仍保留在 content 中。在輸出中途的情況下,message_start 已指出所請求的模型,因此請從 fallback 區塊的 to.model 以及最終 message_delta 的 usage.iterations 中的 fallback_message 項目讀取服務模型。
在非串流請求中,輸出中途的拒絕行為不同:回應會省略被拒絕模型的部分輸出,備援模型會從頭開始回答。結果看起來像是任何輸出之前的拒絕,fallback 區塊位於最前面。被拒絕的嘗試及其輸出 token 仍會出現在 usage.iterations 中。
當拒絕在伺服器工具(例如網路搜尋或程式碼執行)已在請求內執行後觸發時,API 會回傳拒絕,而非前進至備援模型。如果同時設定了 fallback-credit-2026-06-01 標頭,該拒絕會帶有一個可透過繼續部分回應來兌換的額度 token,因此已完成的工具工作不會遺失。這僅適用於在單一請求內迭代的伺服器工具;使用用戶端工具的對話會正常進行備援。
TypeScript、Python、Go、Java 和 C# SDK 包含拒絕備援中介軟體。您在用戶端上使用備援模型清單設定一次。透過 client.beta.messages 的呼叫隨後會在任何平台上自動重試被拒絕的請求。該中介軟體也會在其處理的每個請求上傳送 fallback-credit-2026-06-01 測試版標頭,因此重試會重新定價,無需逐請求設定。
拒絕備援中介軟體輔助工具尚未在 Ruby 和 PHP SDK 中提供。在這些 SDK 上,請直接實作偵測並重試的模式。
將中介軟體傳遞給用戶端建構函式,並在對話的各個請求之間共用一個 BetaFallbackState 實例。
fallback 內容區塊,與伺服器端備援回應相同。中介軟體會在後續請求中為您管理這些區塊。BetaFallbackState 中,因此共用該狀態的後續請求會固定使用該模型,而非重新詢問已拒絕的模型。中介軟體和伺服器端的 fallbacks 參數執行相同的工作。請設定其中之一,切勿在同一個請求上同時使用兩者。若要從安裝了中介軟體的應用程式傳送伺服器端 fallbacks 請求,請使用未安裝中介軟體的獨立用戶端實例。
Message Batch 中被拒絕的請求會以 result.type: "succeeded" 和 stop_reason: "refusal" 的形式回傳。批次結果中的 stop_details 欄位可能為 null,因此請直接檢查 stop_reason 來偵測拒絕。
伺服器端備援不適用於批次(包含 fallbacks 的批次請求會產生逐項目的錯誤結果)。若要重試被拒絕的批次項目:
fallbacks 參數不會傳播到工具執行內部發出的模型呼叫中。usage.iterations 中的 fallback_message 項目標記後者),然後針對兩個計數之間的差距發出警示。stop_reason 進行分支,而非 stop_details 或 content。stop_details 僅供參考,在拒絕時可能為 null。請直接檢查 是否等於 。Was this page helpful?
client = Anthropic()
response = client.beta.messages.create(
model="claude-fable-5",
max_tokens=1024,
messages=[{"role": "user", "content": "Hello, Claude"}],
fallbacks=[{"model": "claude-opus-4-8"}],
betas=["server-side-fallback-2026-06-01"],
)
# usage.iterations 中出現 fallback_message 項目表示備援模型已執行;
# 將其與 stop_reason 搭配檢視,以確認該回應是由備援模型提供。
fallback_ran = any(
iteration.type == "fallback_message"
for iteration in response.usage.iterations or []
)
served_by_fallback = fallback_ran and response.stop_reason != "refusal"
print(
json.dumps(
{
"stop_reason": response.stop_reason,
"model": response.model,
"served_by_fallback": served_by_fallback,
}
)
)| 與其結果配對時保留。沒有對應結果時捨棄。 |
# 遇到拒絕時,中介軟體會在列出的備援模型上重試,並
# 自動在其處理的每個請求上傳送 fallback-credit beta 標頭。
client = Anthropic(
middleware=[BetaRefusalFallbackMiddleware([{"model": "claude-opus-4-8"}])],
)
state = BetaFallbackState() # pins follow-ups to the model that accepted
# 串流:遇到拒絕時,中介軟體會在備援模型上重試,並
# 將其事件拼接到已開啟的串流上。
with (
state,
client.beta.messages.stream(
max_tokens=1024,
model="claude-fable-5",
messages=[{"role": "user", "content": "Hello, Claude"}],
) as stream,
):
for event in stream:
if event.type == "text":
print(event.text, end="", flush=True)
final_message = stream.get_final_message()
print(f"\nserved by: {final_message.model}")
# 非串流:重複使用狀態可讓對話保持固定。
with state:
message = client.beta.messages.create(
max_tokens=1024,
model="claude-fable-5",
messages=[{"role": "user", "content": "Hello, Claude"}],
)
print(f"served by: {message.model}")stop_reason"refusal"SDK 中介軟體的運作方式,包括拒絕備援輔助工具。