Claude Platform Docs
MessagesSviluppare con Claude

Credito di fallback

Evita di pagare due volte il costo della cache dei prompt quando ritenti su un altro modello una richiesta rifiutata.

Le cache dei prompt sono per modello. Quando un modello rifiuta una richiesta e tu ritenti su un altro modello, il prefisso della conversazione già memorizzato nella cache per il primo modello deve essere scritto da zero nella cache del nuovo modello. Le scritture in cache costano più delle letture dalla cache. Il "fallback credit" (credito di fallback) elimina quel costo aggiuntivo. Il rifiuto contiene un token di credito, tu ripeti il token nel nuovo tentativo, e il nuovo tentativo viene fatturato come se la conversazione fosse stata sul nuovo modello fin dall'inizio.

Questa pagina ti serve solo quando costruisci tu stesso il nuovo tentativo: tramite HTTP grezzo o con una logica di retry personalizzata. Il fallback lato server e il middleware dell'SDK applicano il credito di fallback automaticamente. Se usi uno dei due, salta questa pagina.

Rifiuti e fallback tratta il rilevamento dei rifiuti e la scelta di un approccio di fallback. Cache dei prompt spiega le letture dalla cache e le scritture in cache, se questi termini ti sono nuovi.

Il flusso di base

  1. Aderisci con l'header beta

    Invia la richiesta che potrebbe essere rifiutata con l'header anthropic-beta: fallback-credit-2026-07-01. Anche l'header server-side-fallback-2026-07-01 concede gli stessi campi, e il precedente header fallback-credit-2026-06-01 resta accettato e concede gli stessi campi.

  2. Leggi due campi dal rifiuto

    In caso di rifiuto, stop_details include due campi:

    • fallback_credit_token: una stringa opaca che rappresenta il credito.
    • fallback_has_prefill_claim: un booleano che ti indica quale forma del corpo del nuovo tentativo usare.

    Entrambi sono null quando non è disponibile alcun credito per il rifiuto.

  3. Costruisci il nuovo tentativo

    Parti dal corpo della richiesta rifiutata. Imposta model sul modello di fallback e aggiungi il token come parametro di primo livello fallback_credit_token. Scegli la forma del corpo dalla tabella seguente.

  4. Invia il nuovo tentativo con lo stesso header

    Invia il nuovo tentativo con lo stesso header beta fallback-credit-2026-07-01. Il nuovo tentativo ha bisogno dell'header per riscattare il token.

Il campo fallback_has_prefill_claim ti indica se il nuovo tentativo può continuare l'output parziale del modello che ha rifiutato invece di ricominciare da capo:

fallback_has_prefill_claimCorpo del nuovo tentativo
trueIl corpo della richiesta rifiutata, invariato, più un messaggio assistant aggiunto in coda il cui content ripete il content della risposta rifiutata. Il modello del nuovo tentativo continua la risposta dal punto in cui il modello che ha rifiutato si è fermato, e le chiamate a strumenti server completate non vengono rieseguite.
falseIl corpo della richiesta rifiutata, invariato.

Esempio

L'esempio seguente effettua una richiesta che potrebbe essere rifiutata e riscatta il token di credito in un nuovo tentativo su Claude Opus 4.8. Quando un tentativo viene respinto, l'esempio degrada lungo la scala dei rifiuti: la sequenza di forme di retry progressivamente più semplici trattata in Quando un nuovo tentativo viene respinto.

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}
    # Preferisci la forma di continuazione a meno che il claim non sia 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:
            # Ripiega sul body invariato, sempre con il 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
            # Il token stesso è stato rifiutato: rinunciavi e riprova senza.
            response = send("claude-opus-4-8", request)

print(json.dumps({"stop_reason": response.stop_reason, "model": response.model}))

Dove funziona

Il credito di fallback è in beta sulla Claude API, Amazon Bedrock, Claude Platform su AWS, Google Cloud e Microsoft Foundry. I rifiuti nei Message Batches non emettono token di credito, e il riscatto si applica solo alle richieste dirette alla Messages API: un token passato in una richiesta batch viene accettato ma ignorato.

Il modello del nuovo tentativo deve essere uno dei target di fallback consentiti per il modello che ha rifiutato. Per Claude Fable 5.1 e Claude Fable 5, questi sono Claude Opus 4.8 (claude-opus-4-8) e Claude Opus 5 (claude-opus-5).

Verificare che il credito sia stato applicato

Il rimborso è visibile nello usage del nuovo tentativo. Rispetto a quanto la stessa richiesta riporterebbe senza il token, cache_creation_input_tokens è più basso e cache_read_input_tokens è più alto della stessa quantità. Uno scostamento pari a zero significa che il token è stato onorato ma non c'era nulla da riprezzare, ad esempio perché la cache del modello del nuovo tentativo era già calda.

Quando un nuovo tentativo viene respinto

La maggior parte dei nuovi tentativi riscatta il credito al primo colpo. Quando ciò non accade, l'API restituisce un errore 400 che ti indica cosa provare dopo.

  1. Continuazione respinta: reinvia il corpo invariato

    Se il nuovo tentativo che aggiunge il messaggio assistant viene respinto con un errore 400, reinvia il corpo della richiesta rifiutata invariato, sempre con il token.

  2. Token respinto: elimina il token

    Se anche il corpo invariato viene respinto con un errore 400 il cui messaggio cita fallback_credit_token, ritenta senza il token. Il credito viene perso, ma il nuovo tentativo in sé va a buon fine.

Riferimento

Le sezioni seguenti trattano i casi limite e le regole complete di riscatto. La maggior parte delle integrazioni non ne ha bisogno.

Prossimi passi

Rileva i rifiuti e scegli tra fallback lato server, middleware dell'SDK e nuovo tentativo manuale.

Come vengono fatturate le letture dalla cache e le scritture in cache.

Ogni valore di stop_reason e come gestirlo.

L'helper dell'SDK che applica il credito di fallback automaticamente.

Was this page helpful?