Claude Platform Docs
MessagesConstruir con Claude

Crédito de respaldo

Evita pagar dos veces el costo de la caché de prompts cuando reintentas en otro modelo una solicitud rechazada.

Las cachés de prompts son por modelo. Cuando un modelo rechaza una solicitud y reintentas en otro modelo, el prefijo de la conversación ya almacenado en caché para el primer modelo debe escribirse desde cero en la caché del nuevo modelo. Las escrituras en caché cuestan más que las lecturas de caché. El "fallback credit" (crédito de respaldo) elimina ese costo adicional. El rechazo incluye un token de crédito, tú devuelves el token en el reintento, y el reintento se factura como si la conversación hubiera estado en el nuevo modelo desde el principio.

Necesitas esta página solo cuando construyes el reintento tú mismo: sobre HTTP sin procesar o con lógica de reintento personalizada. El respaldo del lado del servidor y el middleware del SDK aplican el crédito de respaldo automáticamente. Si usas cualquiera de los dos, omite esta página.

Rechazos y respaldo cubre cómo detectar rechazos y elegir un enfoque de respaldo. Almacenamiento en caché de prompts explica las lecturas de caché y las escrituras en caché si esos términos son nuevos para ti.

El flujo básico

  1. Actívalo con el encabezado beta

    Envía la solicitud que podría ser rechazada con el encabezado anthropic-beta: fallback-credit-2026-07-01. El encabezado server-side-fallback-2026-07-01 también otorga los mismos campos, y el encabezado anterior fallback-credit-2026-06-01 sigue siendo aceptado y otorga los mismos campos.

  2. Lee dos campos del rechazo

    En un rechazo, stop_details incluye dos campos:

    • fallback_credit_token: una cadena opaca que representa el crédito.
    • fallback_has_prefill_claim: un booleano que te indica qué forma de cuerpo de reintento usar.

    Ambos son null cuando no hay crédito disponible para el rechazo.

  3. Construye el reintento

    Parte del cuerpo de la solicitud rechazada. Establece model en el modelo de respaldo y agrega el token como el parámetro de nivel superior fallback_credit_token. Elige la forma del cuerpo según la siguiente tabla.

  4. Envía el reintento con el mismo encabezado

    Envía el reintento con el mismo encabezado beta fallback-credit-2026-07-01. El reintento necesita el encabezado para canjear el token.

El campo fallback_has_prefill_claim te indica si el reintento puede continuar la salida parcial del modelo que rechazó en lugar de empezar de nuevo:

fallback_has_prefill_claimCuerpo del reintento
trueEl cuerpo de la solicitud rechazada, sin cambios, más un mensaje de asistente añadido al final cuyo content replica el content de la respuesta rechazada. El modelo de reintento continúa la respuesta desde donde se detuvo el modelo que rechazó, y las llamadas a herramientas de servidor completadas no se vuelven a ejecutar.
falseEl cuerpo de la solicitud rechazada, sin cambios.

Ejemplo

El siguiente ejemplo realiza una solicitud que podría ser rechazada y canjea el token de crédito en un reintento contra Claude Opus 4.8. Cuando un intento de reintento es rechazado, el ejemplo desciende por la escalera de rechazos: la secuencia de formas de reintento progresivamente más simples que se cubre en Cuando un reintento es rechazado.

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}
    # Prefiere la forma de continuación a menos que la afirmación sea 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:
            # Recurre al cuerpo sin cambios, aún con el 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
            # El token en sí fue rechazado: descártalo y reintenta sin él.
            response = send("claude-opus-4-8", request)

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

Dónde funciona

El crédito de respaldo está en beta en la Claude API, Amazon Bedrock, Claude Platform en AWS, Google Cloud y Microsoft Foundry. Los rechazos en Message Batches no emiten tokens de crédito, y el canje se aplica solo a solicitudes directas de la Messages API: un token pasado en una solicitud por lotes se acepta pero se ignora.

El modelo de reintento debe ser uno de los destinos de respaldo permitidos del modelo que rechazó. Para Claude Fable 5.1 y Claude Fable 5, estos son Claude Opus 4.8 (claude-opus-4-8) y Claude Opus 5 (claude-opus-5).

Verificar que el crédito se aplicó

El reembolso es visible en el usage del reintento. En comparación con lo que la misma solicitud reportaría sin el token, cache_creation_input_tokens es menor y cache_read_input_tokens es mayor en la misma cantidad. Un cambio de cero significa que el token fue aceptado pero no había nada que recalcular, por ejemplo porque la caché del modelo de reintento ya estaba caliente.

Cuando un reintento es rechazado

La mayoría de los reintentos se canjean en el primer intento. Cuando uno no lo hace, la API devuelve un error 400 que te indica qué probar a continuación.

  1. Continuación rechazada: reenvía el cuerpo sin cambios

    Si el reintento que añade el mensaje de asistente es rechazado con un error 400, reenvía el cuerpo de la solicitud rechazada sin cambios, aún con el token.

  2. Token rechazado: descarta el token

    Si el cuerpo sin cambios también es rechazado con un error 400 cuyo mensaje menciona fallback_credit_token, reintenta sin el token. El crédito se pierde, pero el reintento en sí se procesa.

Referencia

Las siguientes secciones cubren casos límite y las reglas completas de canje. La mayoría de las integraciones no las necesitan.

Próximos pasos

Detecta rechazos y elige entre el respaldo del lado del servidor, el middleware del SDK y un reintento manual.

Cómo se facturan las lecturas de caché y las escrituras en caché.

Cada valor de stop_reason y cómo manejarlo.

El asistente del SDK que aplica el crédito de respaldo automáticamente.

Was this page helpful?