フォールバッククレジット
拒否されたリクエストを別のモデルで再試行する際に、プロンプトキャッシュのコストを二重に支払うことを回避します。
プロンプトキャッシュはモデルごとに保持されます。あるモデルがリクエストを拒否し、別のモデルで再試行する場合、最初のモデル向けにすでにキャッシュされていた会話のプレフィックスは、新しいモデルのキャッシュにゼロから書き込む必要があります。キャッシュ書き込みはキャッシュ読み取りよりもコストがかかります。「fallback credit」(フォールバッククレジット)はその追加コストを取り除きます。拒否レスポンスにはクレジットトークンが含まれており、再試行時にそのトークンをそのまま送り返すと、再試行は会話が最初から新しいモデル上で行われていたかのように課金されます。
このページが必要になるのは、生のHTTPやカスタムの再試行ロジックを使って、再試行を自分で構築する場合のみです。サーバーサイドフォールバックとSDKミドルウェアはフォールバッククレジットを自動的に適用します。いずれかを使用している場合は、このページを読み飛ばしてください。
拒否とフォールバックでは、拒否の検出とフォールバック手法の選択について説明しています。キャッシュ読み取りやキャッシュ書き込みという用語に馴染みがない場合は、プロンプトキャッシングで説明しています。
基本的な流れ
ベータヘッダーでオプトインする
拒否される可能性のあるリクエストを、
anthropic-beta: fallback-credit-2026-07-01ヘッダーを付けて送信します。server-side-fallback-2026-07-01ヘッダーでも同じフィールドが付与されます。また、以前のfallback-credit-2026-06-01ヘッダーも引き続き受け付けられ、同じフィールドが付与されます。拒否レスポンスから2つのフィールドを読み取る
拒否時には、
stop_detailsに2つのフィールドが含まれます。fallback_credit_token: クレジットを表す不透明な文字列です。fallback_has_prefill_claim: どちらの再試行ボディ形式を使用すべきかを示すブール値です。
その拒否に対してクレジットが利用できない場合、両方とも
nullになります。再試行を構築する
拒否されたリクエストボディから始めます。
modelをフォールバックモデルに設定し、トークンをトップレベルのfallback_credit_tokenパラメータとして追加します。以下の表からボディ形式を選択してください。同じヘッダーを付けて再試行を送信する
同じ
fallback-credit-2026-07-01ベータヘッダーを付けて再試行を送信します。トークンを引き換えるには、再試行にこのヘッダーが必要です。
fallback_has_prefill_claim フィールドは、再試行が最初からやり直すのではなく、拒否したモデルの部分的な出力を継続できるかどうかを示します。
fallback_has_prefill_claim | 再試行ボディ |
|---|---|
true | 拒否されたリクエストボディをそのまま使用し、拒否レスポンスの content をそのまま反映した content を持つアシスタントメッセージを1つ末尾に追加します。再試行モデルは拒否したモデルが停止した箇所からレスポンスを継続し、完了済みのサーバーツール呼び出しは再実行されません。 |
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でない限り、継続形式を優先する
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:
# トークンを保持したまま、変更なしのボディにフォールバックする
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
# トークン自体が拒否された場合: トークンを破棄し、トークンなしで再試行する。
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 でベータ版として提供されています。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 ベータヘッダーが設定されている場合、Models API の各モデルのエントリに allowed_fallback_models としてフォールバック先のリストが公開されます。このリストは fallback-credit-* ヘッダー単独ではまだ表示されません。Amazon Bedrock、Google Cloud、Microsoft Foundry では公開されていません。
クレジットが適用されたことを確認する
払い戻しは再試行の usage で確認できます。トークンなしで同じリクエストを送った場合の報告値と比較すると、cache_creation_input_tokens が少なくなり、cache_read_input_tokens が同じ量だけ多くなります。差がゼロの場合は、トークンは受理されたものの、再計算すべきものがなかったことを意味します。たとえば、再試行モデルのキャッシュがすでにウォーム状態だった場合などです。
再試行が拒否された場合
ほとんどの再試行は最初の試行で引き換えに成功します。成功しなかった場合、API は次に何を試すべきかを示す 400 エラーを返します。
継続が拒否された場合: 変更なしのボディを再送信する
アシスタントメッセージを追加した再試行が 400 エラーで拒否された場合は、拒否されたリクエストボディを変更せずに、トークンを付けたまま再送信します。
トークンが拒否された場合: トークンを外す
変更なしのボディも、メッセージに
fallback_credit_tokenの名前が含まれる 400 エラーで拒否された場合は、トークンなしで再試行します。クレジットは失われますが、再試行自体は通ります。
この拒否は一時的なものであり、再試行形式に対する判定ではありません。トークンの5分間の有効期間内に、同じトークンを付けて同じリクエストを再試行してください。ラダーの次のステップには進まないでください。
リファレンス
以下のセクションでは、エッジケースと完全な引き換えルールについて説明します。ほとんどの統合では必要ありません。
引き換えでは、再試行が拒否されたリクエストと比較されます。プロンプトを形成するすべてのフィールドは完全に一致する必要があります。プロンプトを形成しないフィールドは再試行時に変更できます。
| ルール | フィールド |
|---|---|
| 完全に一致する必要がある | 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 の末尾にアシスタントメッセージをちょうど1つ追加します。
トークンなしの通常の再試行では通常それらを削除しますが、再試行時に以前のターンの thinking ブロックや redacted_thinking ブロックを削除しないでください。ボディは拒否されたリクエストと一致する必要があり、それらのブロックはサーバー側で処理されます。
再試行では、拒否されたリクエストと同じ anthropic-beta ヘッダーを送信してください。2つのリクエストの一方にのみ存在するベータヘッダーがあると、ボディが同一であっても一致に失敗する可能性があります。その結果生じる 400 エラーには、ボディの差異の場合と同じ request body ... does not match メッセージが含まれるため、ヘッダーの差異をボディの問題と誤解しやすくなります。特に、リクエストの対象モデルに応じてベータヘッダーを追加したり削除したりしないでください。
再試行のために、2つのヘッダーファミリーは一致の対象から除外されています。
server-side-fallback-*: 再試行ではfallbacksパラメータを削除する必要があり、それに伴ってこのヘッダーを削除しても不一致にはなりません。fallback-credit-*: このヘッダーは両方のリクエストに付けたままにしてください。トークンを引き換えるには再試行にこのヘッダーが必要です。
このフィールドが null になるのはトークンも null の場合のみであるため、トークンを保持している状態で観測される値が null になることはありません。ただし、Amazon Bedrock、Google Cloud、Microsoft Foundry では、このフィールドへの対応が展開されるまでの間、フィールドが存在しない(型付き SDK では None)場合があります。その場合は、再試行形式を false ではなく不明として扱ってください。まずアシスタントメッセージ追加形式を試し、変更なしのボディにフォールバックする再試行が拒否された場合の拒否処理に任せてください。
拒否のトークンが継続形式をサポートしている場合、レスポンスの content にはモデル自身の出力のみが含まれ、拒否の説明は stop_details.explanation で提供されます。したがって、content をそのまま追加のアシスタントメッセージに反映できます。
送信前に、なお2つの調整が必要になる場合があります。
- 送信する最後のブロックが
textブロックの場合は、末尾の空白を削除してください。 - 対応する
tool_resultのないクライアントサイドのtool_useブロックは省略してください。
反映する content に、以前のサーバーサイドフォールバックによる fallback ブロックが含まれている場合は、そのブロックを元の位置にそのまま残してください。このブロックはベータヘッダーなしでもあらゆるリクエストで受け付けられます。API はその位置を使って周囲の thinking ブロックを検証するため、その境界の両側の thinking ブロックを反映するリクエストは、このブロックが省略または移動されていると拒否されます。
トークンは、Microsoft Foundry 上を含め、拒否を受け取った組織およびワークスペースからのみ引き換えできます。ワークスペースを持たない Amazon Bedrock と Google Cloud では、トークンは代わりにプラットフォームの呼び出し元 ID に紐付けられます。
トークンは拒否から5分後に期限切れになります。それ以降は、トークンなしで再試行を送信してください。また、トークンはステートレスです。サーバーはトークンについて何も保存せず、トークンを検査または取り消すためのエンドポイントもありません。
リクエスト内でサーバーツールがすでに実行された後に拒否が発生した場合、トークンは部分的なレスポンスを継続することによってのみ引き換えできます。この制限により、完了済みのツール呼び出しが再度実行され、再度課金されることが防止されます。
したがって、以下の両方が当てはまる場合、どちらの形式でもトークンを引き換えられなくなる組み合わせが1つ存在します。
- リクエストが
output_config.formatまたはツール使用を強制するtool_choiceを使用していた。いずれもアシスタントメッセージ追加形式を使用できなくします。 - サーバーツールが実行された後に拒否が発生した。これにより変更なしのボディが使用できなくなります。
変更なしボディの再試行が、トークンは部分的なレスポンスを継続することで引き換える必要があるという 400 エラーで拒否された場合は、トークンを破棄してください。トークンなしの再試行は通りますが、完了済みのサーバーツールが再実行され、再課金されます。黙って再試行するのではなく、コストまたはエラーを呼び出し元に伝えてください。
次のステップ
拒否を検出し、サーバーサイドフォールバック、SDKミドルウェア、手動再試行のいずれかを選択します。
キャッシュ読み取りとキャッシュ書き込みの課金方法。
すべての stop_reason の値とその処理方法。
フォールバッククレジットを自動的に適用する SDK ヘルパー。
Was this page helpful?