Claude Platform Docs
MessagesConstruindo com Claude

Crédito de fallback

Evite pagar o custo do cache de prompt duas vezes ao repetir uma solicitação recusada em outro modelo.

Os caches de prompt são por modelo. Quando um modelo recusa uma solicitação e você a repete em outro modelo, o prefixo da conversa já armazenado em cache para o primeiro modelo precisa ser gravado no cache do novo modelo do zero. Gravações em cache custam mais do que leituras de cache. O "fallback credit" (crédito de fallback) elimina esse custo extra. A recusa carrega um token de crédito, você ecoa o token na nova tentativa, e a nova tentativa é cobrada como se a conversa tivesse ocorrido no novo modelo desde o início.

Você só precisa desta página quando constrói a nova tentativa por conta própria: via HTTP bruto ou com lógica de repetição personalizada. O fallback do lado do servidor e o middleware do SDK aplicam o crédito de fallback automaticamente. Se você usa qualquer um deles, pule esta página.

Recusas e fallback aborda a detecção de recusas e a escolha de uma abordagem de fallback. Cache de prompt explica leituras de cache e gravações em cache, caso esses termos sejam novos para você.

O fluxo básico

  1. Ative com o cabeçalho beta

    Envie a solicitação que pode ser recusada com o cabeçalho anthropic-beta: fallback-credit-2026-07-01. O cabeçalho server-side-fallback-2026-07-01 também concede os mesmos campos, e o cabeçalho anterior fallback-credit-2026-06-01 continua sendo aceito e concede os mesmos campos.

  2. Leia dois campos da recusa

    Em uma recusa, stop_details inclui dois campos:

    • fallback_credit_token: uma string opaca que representa o crédito.
    • fallback_has_prefill_claim: um booleano que informa qual formato de corpo de nova tentativa usar.

    Ambos são null quando não há crédito disponível para a recusa.

  3. Construa a nova tentativa

    Comece a partir do corpo da solicitação recusada. Defina model como o modelo de fallback e adicione o token como o parâmetro de nível superior fallback_credit_token. Escolha o formato do corpo na tabela a seguir.

  4. Envie a nova tentativa com o mesmo cabeçalho

    Envie a nova tentativa com o mesmo cabeçalho beta fallback-credit-2026-07-01. A nova tentativa precisa do cabeçalho para resgatar o token.

O campo fallback_has_prefill_claim informa se a nova tentativa pode continuar a saída parcial do modelo que recusou em vez de recomeçar:

fallback_has_prefill_claimCorpo da nova tentativa
trueO corpo da solicitação recusada, inalterado, mais uma mensagem de assistente anexada cujo content ecoa o content da resposta recusada. O modelo da nova tentativa continua a resposta de onde o modelo que recusou parou, e as chamadas de ferramentas de servidor concluídas não são reexecutadas.
falseO corpo da solicitação recusada, inalterado.

Exemplo

O exemplo a seguir faz uma solicitação que pode ser recusada e resgata o token de crédito em uma nova tentativa no Claude Opus 4.8. Quando uma tentativa de repetição é rejeitada, o exemplo degrada pela escada de rejeição: a sequência de formatos de nova tentativa progressivamente mais simples abordada em Quando uma nova tentativa é rejeitada.

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}
    # Prefira o formato de continuação, a menos que a afirmação seja 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:
            # Recorra ao corpo inalterado, ainda com o 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
            # O próprio token foi rejeitado: descarte-o e tente novamente sem ele.
            response = send("claude-opus-4-8", request)

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

Onde funciona

O crédito de fallback está em beta na Claude API, Amazon Bedrock, Claude Platform on AWS, Google Cloud e Microsoft Foundry. Recusas em Message Batches não emitem tokens de crédito, e o resgate se aplica apenas a solicitações diretas à Messages API: um token passado em uma solicitação em lote é aceito, mas ignorado.

O modelo da nova tentativa deve ser um dos destinos de fallback permitidos do modelo que recusou. Para Claude Fable 5.1 e Claude Fable 5, esses são Claude Opus 4.8 (claude-opus-4-8) e Claude Opus 5 (claude-opus-5).

Verificando se o crédito foi aplicado

O reembolso é visível no usage da nova tentativa. Em comparação com o que a mesma solicitação reportaria sem o token, cache_creation_input_tokens é menor e cache_read_input_tokens é maior na mesma quantidade. Uma variação de zero significa que o token foi honrado, mas não havia nada a reprecificar, por exemplo porque o cache do modelo da nova tentativa já estava aquecido.

Quando uma nova tentativa é rejeitada

A maioria das novas tentativas é resgatada na primeira tentativa. Quando uma não é, a API retorna um erro 400 que informa o que tentar em seguida.

  1. Continuação rejeitada: reenvie o corpo inalterado

    Se a nova tentativa que anexa a mensagem de assistente for rejeitada com um erro 400, reenvie o corpo da solicitação recusada inalterado, ainda com o token.

  2. Token rejeitado: remova o token

    Se o corpo inalterado também for rejeitado com um erro 400 cuja mensagem menciona fallback_credit_token, tente novamente sem o token. O crédito é perdido, mas a nova tentativa em si é processada.

Referência

As seções a seguir abordam casos extremos e as regras completas de resgate. A maioria das integrações não precisa delas.

Próximos passos

Detecte recusas e escolha entre fallback do lado do servidor, o middleware do SDK e uma nova tentativa manual.

Como leituras de cache e gravações em cache são cobradas.

Cada valor de stop_reason e como lidar com ele.

O auxiliar do SDK que aplica o crédito de fallback automaticamente.

Was this page helpful?