Les caches de prompts sont propres à chaque modèle. Lorsque Claude Fable 5 refuse une requête et que vous réessayez sur un autre modèle, le préfixe de conversation qui était déjà mis en cache pour Claude Fable 5 doit être écrit de zéro dans le cache du nouveau modèle, et les écritures de cache coûtent plus cher que les lectures de cache. Le « fallback credit » (crédit de repli) élimine ce coût supplémentaire : le refus contient un jeton de crédit, vous renvoyez ce jeton lors de la nouvelle tentative, et celle-ci est facturée comme si la conversation s'était déroulée sur le nouveau modèle depuis le début.
Vous n'avez besoin de cette page que si vous construisez vous-même la nouvelle tentative : avec le SDK Ruby ou PHP, via HTTP brut, ou avec une logique de nouvelle tentative personnalisée. Le repli côté serveur et le middleware du SDK appliquent automatiquement le crédit de repli. Si vous utilisez l'un ou l'autre, ignorez cette page.
La page Refus et repli explique comment détecter les refus et choisir une approche de repli. La page Mise en cache des prompts explique les lectures et écritures de cache si ces termes vous sont nouveaux.
Activez la fonctionnalité avec l'en-tête bêta
Envoyez la requête susceptible d'être refusée avec l'en-tête anthropic-beta: fallback-credit-2026-06-01. L'en-tête server-side-fallback-2026-06-01 donne également accès aux mêmes champs.
Lisez deux champs dans le refus
Lors d'un refus, stop_details inclut fallback_credit_token, une chaîne opaque qui représente le crédit, et fallback_has_prefill_claim, un booléen qui vous indique quelle forme de corps de requête utiliser pour la nouvelle tentative. Les deux valent null lorsqu'aucun crédit n'est disponible pour le refus.
Construisez la nouvelle tentative
Partez du corps de la requête refusée. Définissez model sur le modèle de repli et ajoutez le jeton comme paramètre de premier niveau fallback_credit_token. Choisissez la forme du corps dans le tableau ci-dessous.
Envoyez la nouvelle tentative avec le même en-tête
Envoyez la nouvelle tentative avec le même en-tête bêta fallback-credit-2026-06-01. La nouvelle tentative a besoin de cet en-tête pour utiliser le jeton.
Le champ fallback_has_prefill_claim vous indique si la nouvelle tentative peut poursuivre la sortie partielle du modèle refusé au lieu de recommencer :
fallback_has_prefill_claim | Corps de la nouvelle tentative |
|---|---|
true | Le corps de la requête refusée, inchangé, plus un message assistant ajouté à la fin dont le content reprend le content de la réponse refusée. Le modèle de la nouvelle tentative poursuit la réponse là où le modèle refusé s'est arrêté, et les appels d'outils serveur déjà terminés ne sont pas réexécutés. |
false | Le corps de la requête refusée, inchangé. |
L'exemple ci-dessous effectue une requête susceptible d'être refusée, utilise le jeton de crédit lors d'une nouvelle tentative sur Claude Opus 4.8, et se dégrade en suivant l'échelle de rejet décrite dans Lorsqu'une nouvelle tentative est rejetée.
client = Anthropic()
request = {
"max_tokens": 1024,
"messages": [{"role": "user", "content": "Hello, Claude"}],
}
def send(model, body):
return client.beta.messages.create(
model=model, betas=["fallback-credit-2026-06-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}
# Préférer la forme de continuation sauf si l'assertion est False
if details.fallback_has_prefill_claim is not False:
# Reprendre le contenu du refus, en supprimant les espaces finaux d'un
# dernier bloc de texte (le validateur de préremplissage le rejette ; la
# correspondance côté serveur tolère la modification). Les requêtes avec outils omettent aussi
# les blocs tool_use non appariés, puis resuppriment les espaces après toute omission.
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 str(error):
raise # Transient: retry with the token within its five-minute window
try:
# Revenir au corps inchangé, toujours avec le jeton
response = send("claude-opus-4-8", exact_body)
except BadRequestError as error:
if "redemption temporarily unavailable" in str(error):
raise # Transient: retry with the token within its five-minute window
# Le jeton lui-même a été rejeté : l'abandonner et réessayer sans.
response = send("claude-opus-4-8", request)
print(json.dumps({"stop_reason": response.stop_reason, "model": response.model}))Le crédit de repli est en bêta sur l'API Claude, Claude Platform sur AWS, Amazon Bedrock, Vertex AI et Microsoft Foundry. Les jetons de crédit renvoyés dans les résultats de Message Batches ne peuvent pas être utilisés ; l'utilisation s'applique uniquement aux requêtes directes de l'API Messages.
Le modèle de la nouvelle tentative doit être l'une des cibles de repli autorisées du modèle refusé. Au lancement, la cible autorisée de Claude Fable 5 est Claude Opus 4.8 (claude-opus-4-8).
Le remboursement est visible dans le usage de la nouvelle tentative : cache_creation_input_tokens est plus bas, et cache_read_input_tokens est plus élevé du même montant, par rapport à ce que la même requête indiquerait sans le jeton. Un écart de zéro signifie que le jeton a été honoré mais qu'il n'y avait rien à retarifer, par exemple parce que le cache du modèle de la nouvelle tentative était déjà chaud.
La plupart des nouvelles tentatives aboutissent dès le premier essai. Lorsque ce n'est pas le cas, l'API renvoie une erreur 400 qui vous indique quoi essayer ensuite.
Continuation rejetée : renvoyez le corps inchangé
Si la nouvelle tentative qui ajoute le message assistant est rejetée avec une erreur 400, renvoyez le corps de la requête refusée inchangé, toujours avec le jeton.
Jeton rejeté : supprimez le jeton
Si le corps inchangé est également rejeté avec une erreur 400 dont le message mentionne fallback_credit_token, réessayez sans le jeton. Le crédit est perdu, mais la nouvelle tentative elle-même aboutit.
Si la requête refusée a exécuté des outils serveur, une nouvelle tentative sans jeton réexécute et refacture ces outils. Dans ce cas, remontez l'erreur 400 à votre appelant au lieu de passer à une nouvelle tentative sans jeton.
Les sections ci-dessous couvrent les cas limites et les règles complètes d'utilisation du crédit. La plupart des intégrations n'en ont pas besoin.
Détectez les refus et choisissez entre le repli côté serveur, le middleware du SDK et une nouvelle tentative manuelle.
Comment les lectures et écritures de cache sont facturées.
Chaque valeur de stop_reason et comment la gérer.
L'assistant du SDK qui applique automatiquement le crédit de repli.
Was this page helpful?