Cómo usar la API de Claude Fable 5.1 (Paso a paso con Apidog)

Guía paso a paso de la API de Claude Fable 5.1: primera solicitud, esfuerzo, streaming, herramientas estrictas en lugar de tool_choice forzado, mecanismos de reserva, actualizaciones de progreso, comprobaciones de caché.

Ashley Innocent

Ashley Innocent

2 September 2026

Cómo usar la API de Claude Fable 5.1 (Paso a paso con Apidog)

Apidog para empresas

Despliegue local

SSO & RBAC

Conforme con SOC 2

Explorar Apidog Enterprise

Claude Fable 5.1 fue lanzado el 1 de septiembre de 2026, y el ID del modelo API es la cadena exacta claude-fable-5-1, sin sufijo de fecha. Cuesta los mismos $10 por millón de tokens de entrada y $50 por millón de tokens de salida que Fable 5, con las lecturas de caché reducidas a $0.25 por millón, y presenta tres cambios importantes que Fable 5 no tenía.

Esta guía recorre todo el camino: obtener una clave, enviar una primera solicitud, controlar el esfuerzo, el streaming, el uso de herramientas sin tool_choice forzado, las soluciones alternativas por rechazo, las actualizaciones de progreso y la lectura del objeto usage para confirmar que su caché funciona a la nueva tarifa. Cada solicitud es HTTP simple con JSON, por lo que puede construirla y depurarla en Apidog antes de que pase al código de la aplicación.

Si está migrando un servicio Fable 5 u Opus 5 existente en lugar de empezar de nuevo, lea la guía de migración completa junto con esta. Para la descripción general del modelo, comience con qué es Claude Fable 5.1.

Antes de su primera llamada: tres cosas que devuelven 400

1. El pensamiento no se puede configurar, solo guiar. Fable 5.1 ejecuta un pensamiento adaptativo en cada solicitud. Omita el campo thinking, o envíe {"type": "adaptive"}. Tanto {"type": "disabled"} como {"type": "enabled", "budget_tokens": N} devuelven un 400. Si viene de Opus 5, donde se aceptaba disabled con un esfuerzo high o inferior, elimínelo y controle el gasto con output_config.effort en su lugar.

2. El uso forzado de herramientas ha desaparecido. tool_choice: {"type": "any"} y {"type": "tool", "name": "..."} devuelven tool_choice: type "tool" and "any" are not supported for this model. La solución se encuentra en el paso de uso de herramientas a continuación.

3. Su organización necesita retención de datos durante 30 días. Fable 5.1 es un Modelo Cubierto. Una solicitud de una organización o espacio de trabajo con retención de datos cero devuelve 400 invalid_request_error sin otra pista. Si su primera llamada falla y el cuerpo parece correcto, verifique la retención antes que nada.

Las tres están documentadas en la sección Novedades en Claude Fable 5.1 de Anthropic.

Paso 1: Obtener una clave API

Inicie sesión en la Consola de Claude, abra la sección de claves API de la configuración de su organización y cree una clave. Cópiela una vez; no podrá leerla de nuevo más tarde. Exporte la clave en lugar de pegarla en el código:

export ANTHROPIC_API_KEY="sk-ant-..."

En Apidog, almacénela como una variable de entorno llamada ANTHROPIC_API_KEY y referénciela como {{ANTHROPIC_API_KEY}} en el encabezado, para que la clave nunca termine en un cuerpo de solicitud guardado.

Paso 2: Envíe su primera solicitud

Cree una solicitud POST a https://api.anthropic.com/v1/messages con tres encabezados: x-api-key, anthropic-version: 2023-06-01 y content-type: application/json.

curl https://api.anthropic.com/v1/messages \
  -H "x-api-key: $ANTHROPIC_API_KEY" \
  -H "anthropic-version: 2023-06-01" \
  -H "content-type: application/json" \
  -d '{
    "model": "claude-fable-5-1",
    "max_tokens": 16000,
    "messages": [
      {"role": "user", "content": "Explain the difference between idempotent and safe HTTP methods, with one example each."}
    ]
  }'

La misma llamada en Python con el SDK oficial:

import anthropic

client = anthropic.Anthropic()

response = client.messages.create(
    model="claude-fable-5-1",
    max_tokens=16000,
    messages=[{"role": "user", "content": "Explain the difference between idempotent and safe HTTP methods, with one example each."}],
)

if response.stop_reason == "refusal":
    print("declined:", response.stop_details.category if response.stop_details else None)
else:
    for block in response.content:
        if block.type == "text":
            print(block.text)

Dos hábitos a desarrollar desde la primera llamada. Verifique stop_reason antes de leer content, porque un rechazo del clasificador es un HTTP 200 con una matriz de contenido vacía. Y dé a max_tokens un margen real. Limita los tokens de pensamiento más los tokens de respuesta juntos, y el pensamiento siempre está activo, por lo que un valor ajustado para un modelo sin pensamiento se truncará aquí.

La respuesta contiene un bloque thinking cuyo texto está vacío bajo la display predeterminada de "omitted". Esto es lo esperado. Páselo sin cambios en el siguiente turno.

Paso 3: Controle el costo y la profundidad con el esfuerzo

El parámetro de esfuerzo es la palanca principal en Fable 5.1. Va dentro de output_config, no en el nivel superior, y acepta low, medium, high, xhigh y max. El valor predeterminado es high.

{
  "model": "claude-fable-5-1",
  "max_tokens": 16000,
  "output_config": {"effort": "medium"},
  "messages": [{"role": "user", "content": "Summarize this changelog in five bullets."}]
}

La guía de Anthropic: comience en high, luego pruebe los demás con sus propias evaluaciones y vuelva a ejecutar la prueba incluso si ya la hizo en Fable 5, porque los nombres de los niveles no corresponden a la misma cantidad de pensamiento entre los modelos. Su afirmación es que medium se aproxima a Fable 5 con un costo menor y que low a menudo es competitivo con Opus y Sonnet en cuanto a costo por tarea. Dos comportamientos específicos del esfuerzo a conocer: en low, Fable 5.1 llama a las herramientas de búsqueda y recuperación con menos frecuencia y responde más desde la memoria, y en xhigh y max puede redactar un entregable largo en su fase de pensamiento y luego escribirlo de nuevo, así que configure max_tokens para ambos.

Cambio de esfuerzo a mitad de conversación (beta). En Fable 5, cambiar el esfuerzo de nivel superior entre solicitudes eliminaba el prefijo en caché. En Fable 5.1, un mensaje role: "system" con contenido vacío y un output_config cambia el esfuerzo a partir del siguiente turno del usuario sin invalidar la caché. Requiere el encabezado beta mid-conversation-output-config-2026-07-01 y el espacio de nombres client.beta.messages.

response = client.beta.messages.create(
    model="claude-fable-5-1",
    max_tokens=16000,
    output_config={"effort": "high"},
    betas=["mid-conversation-output-config-2026-07-01"],
    messages=[
        {"role": "user", "content": "Plan a migration from SQLite to PostgreSQL in three short steps."},
        {"role": "assistant", "content": "1. Export the SQLite data. 2. Create the PostgreSQL schema. 3. Import the data and verify row counts."},
        {"role": "system", "content": [], "output_config": {"effort": "low"}},
        {"role": "user", "content": "Summarize the plan in one sentence."},
    ],
)

Reducir el esfuerzo de esta manera es fiable. Aumentarlo funciona mejor para grandes saltos, como de low a xhigh. La guía del parámetro de esfuerzo para Opus 5 cubre los cinco niveles en profundidad, y la misma semántica se aplica aquí.

Paso 4: Transmitir la respuesta

Las tareas difíciles en Fable 5.1 pueden tardar minutos con un esfuerzo mayor, por lo que se debe transmitir todo lo que pueda ser largo. El SDK requiere streaming para valores de max_tokens cercanos al límite de 128.000 para evitar tiempos de espera HTTP.

with client.messages.stream(
    model="claude-fable-5-1",
    max_tokens=64000,
    messages=[{"role": "user", "content": "Write a test plan for a rate-limited public API."}],
) as stream:
    for text in stream.text_stream:
        print(text, end="", flush=True)
    final = stream.get_final_message()

print(final.stop_reason, final.usage.output_tokens)

En Apidog, las respuestas de streaming se renderizan a medida que llegan, lo cual es la forma más rápida de ver cuánto tiempo tarda un turno de esfuerzo high en pensar antes del primer token de texto.

Paso 5: Añadir uso de herramientas sin forzarlo

Defina las herramientas de la misma manera que en Fable 5. Lo que cambia es cómo se garantiza una llamada. En Fable 5 se podía forzar con tool_choice: {"type": "tool", ...}. En Fable 5.1 eso devuelve un 400, porque una llamada forzada omitiría el pensamiento y el modelo escribiría su elaboración en los argumentos.

El reemplazo tiene tres partes: mantener tool_choice en auto, nombrar la herramienta en la instrucción y establecer strict: true (uso estricto de herramientas) en la herramienta con additionalProperties: false en el esquema para que los argumentos siempre se validen.

record_summary_tool = {
    "name": "record_summary",
    "description": "Record the structured summary of the document.",
    "strict": True,
    "input_schema": {
        "type": "object",
        "properties": {"summary": {"type": "string"}},
        "required": ["summary"],
        "additionalProperties": False,
    },
}

response = client.messages.create(
    model="claude-fable-5-1",
    max_tokens=16000,
    tools=[record_summary_tool],
    tool_choice={"type": "auto"},
    messages=[{"role": "user", "content": "Summarize: The meeting moved to Thursday. Call the record_summary tool with your result."}],
)

Si la llamada forzada solo existía para obtener JSON, utilice salidas estructuradas (output_config.format) en lugar de una herramienta. Si su aplicación, no el usuario, requiere una llamada específica en el turno actual de una conversación de varios turnos, agregue un mensaje role: "system" después del último turno del usuario que nombre la herramienta y diga que la llamada es obligatoria, y mantenga ese mensaje en el historial. tool_choice: {"type": "none"} sigue funcionando para un turno que no debe llamar a herramientas.

El propio bucle de agente no ha cambiado: cuando stop_reason es tool_use, ejecute cada bloque tool_use, devuelva todos los bloques tool_result en un mensaje de usuario, y adjunte el turno del asistente exactamente como se devolvió, incluyendo los bloques de pensamiento. Esta última cláusula es más importante en Fable 5.1 que en cualquier modelo anterior, por razones que explica la guía de pensamiento preservado.

Un comportamiento a observar: en bucles largos donde las siguientes lecturas independientes solo están implícitas por la tarea, Fable 5.1 puede emitir una llamada a la herramienta por turno donde Fable 5 agrupaba varias. La solución de Anthropic es un empujón de una frase añadido después de cada mensaje de resultado de herramienta: "Primero, enumere en privado lo que necesita a continuación; luego solicite cada elemento que no dependa del resultado de otro en esta única respuesta". Envíelo como un mensaje del sistema con alcance de turno (clear_at: "next_user_message", encabezado beta mid-conversation-system-clear-at-2026-08-21) y deje todas las copias anteriores en su lugar.

Paso 6: Manejar rechazos con alternativas

Fable 5.1 ejecuta clasificadores de seguridad. Una solicitud rechazada se devuelve como HTTP 200 con stop_reason: "refusal" y un objeto stop_details que nombra la categoría: cyber, bio, frontier_llm, reasoning_extraction o general_harms. Un rechazo antes de cualquier salida no se factura.

Opte por las alternativas por defecto. La forma más sencilla es fallbacks: "default" con el encabezado beta server-side-fallback-2026-07-01, que reintenta una solicitud rechazada en el modelo que Anthropic recomienda para esa categoría. Para Fable 5.1, los objetivos permitidos son claude-opus-4-8 y claude-opus-5.

response = client.beta.messages.create(
    model="claude-fable-5-1",
    max_tokens=16000,
    fallbacks="default",
    betas=["server-side-fallback-2026-07-01"],
    messages=[{"role": "user", "content": "Audit this authentication middleware for logic bugs."}],
)

fallback_ran = any(
    entry.type == "fallback_message" for entry in (response.usage.iterations or [])
)
if fallback_ran and response.stop_reason != "refusal":
    print("served by", response.model)

La respuesta nombra el modelo de servicio en su campo model de nivel superior, y un bloque de contenido fallback marca la transferencia. Mantenga ese bloque donde apareció cuando vuelva a mostrar el turno. Dos límites: fallbacks se rechaza en la API de Batches y no está disponible en Bedrock, Google Cloud o Foundry, donde en su lugar se registra el BetaRefusalFallbackMiddleware del SDK en el cliente. La guía de manejo de rechazos cubre la facturación, el enrutamiento persistente y el reintento manual con crédito de fallback.

Paso 7: Obtener actualizaciones de progreso durante turnos largos

Entre llamadas a herramientas, Fable 5.1 escribe notas cortas sobre lo que encontró y lo que hará a continuación. Cada una llega como su propio bloque thinking inmediatamente antes de la llamada a la herramienta, y bajo la display predeterminada, esos bloques están vacíos. Configure display: "updates" con el encabezado beta thinking-display-updates-2026-08-18 para recibirlos como texto mientras el razonamiento en sí permanece oculto.

{
  "model": "claude-fable-5-1",
  "max_tokens": 16000,
  "thinking": {"type": "adaptive", "display": "updates"},
  "tools": [...],
  "messages": [{"role": "user", "content": "Review the PRs open against our billing service."}]
}

Cualquier bloque thinking con texto no vacío es entonces una línea de estado que puede renderizar. Fable 5.1 escribe menos de ellos que Fable 5, por lo que si su UI depende de la narración, también elimine cualquier línea de prompt que le diga al modelo que retenga los hallazgos para la respuesta final.

Paso 8: Lea el objeto de uso para la tarifa de caché de $0.25

El almacenamiento en caché de prompts es donde entra en juego el cambio de precios de Fable 5.1. Coloque cache_control en el prefijo estable y confirme los aciertos en usage:

response = client.messages.create(
    model="claude-fable-5-1",
    max_tokens=16000,
    system=[{"type": "text", "text": LONG_STABLE_SYSTEM_PROMPT, "cache_control": {"type": "ephemeral"}}],
    messages=[{"role": "user", "content": "Which endpoints in the spec lack an error schema?"}],
)
u = response.usage
print(u.input_tokens, u.cache_creation_input_tokens, u.cache_read_input_tokens)

En el primer envío, cache_creation_input_tokens no es cero (facturado a $12.50 por millón para un TTL de 5 minutos). En el segundo envío dentro de los cinco minutos, cache_read_input_tokens debería no ser cero, facturado a $0.25 por millón. Si permanece en cero en solicitudes idénticas, algo en el prefijo cambia cada vez: una marca de tiempo en el prompt del sistema, JSON no ordenado, una matriz de herramientas variable. El prompt mínimo cacheable es de 512 tokens.

Dos hechos de caché específicos de este modelo. Debido a que un fallo cuesta 40 veces más que un acierto, mantener la caché "caliente" importa más que en Fable 5, y tanto el esfuerzo por mensaje como los mensajes del sistema con alcance de turno existen en parte para que pueda cambiar cosas a mitad de sesión sin un reinicio. Y las mismas ediciones que reinician la caché (reconstruir system, editar turnos anteriores) ahora también invalidan los bloques de pensamiento, por lo que la disciplina de solo añadir paga doble.

Pruebe y depure todo el flujo en Apidog

Guarde cada paso anterior como una solicitud en una colección de Apidog: primera llamada, variantes de esfuerzo, streaming, bucle de herramientas, alternativa, verificación de caché. Utilice variables de entorno para la clave y para model, de modo que cambiar una colección completa entre claude-fable-5 y claude-fable-5-1 sea una sola edición. Luego, agregue aserciones: stop_reason no es refusal en sus prompts de prueba benignos, usage.cache_read_input_tokens es mayor que cero en la segunda solicitud de caché, y ninguna entrada de input_transformations tiene reason: "prefix_binding_mismatch" cuando se ejecuta con el encabezado `thinking-binding`. Ejecute la colección antes y después de cualquier cambio en el harness. Descargue Apidog para configurarlo; la misma colección funciona como una verificación de CI a través de la CLI de Apidog.

Errores y trampas que encontrará

Preguntas Frecuentes

¿Cuál es el ID del modelo para la API de Claude Fable 5.1? claude-fable-5-1. En Amazon Bedrock es anthropic.claude-fable-5-1; Google Cloud, Microsoft Foundry y Claude Platform en AWS usan claude-fable-5-1.

¿Necesito un encabezado beta para usar Claude Fable 5.1? No. El modelo base, el pensamiento adaptativo, el esfuerzo, las herramientas y el almacenamiento en caché funcionan con el encabezado estándar anthropic-version: 2023-06-01. Los encabezados beta solo son necesarios para el esfuerzo por mensaje, los mensajes del sistema con ámbito de turno, las actualizaciones de progreso, las alternativas del lado del servidor y los controles de enlace de pensamiento.

¿Puedo forzar una llamada a una herramienta en Claude Fable 5.1? No. tool_choice any y tool devuelven un 400. Use auto, nombre la herramienta en el prompt y establezca strict: true para argumentos válidos según el esquema, o use salidas estructuradas para la extracción de JSON.

¿Cuál es la salida máxima en la API de Claude Fable 5.1? 128.000 tokens en la API de Mensajes. Use streaming para cualquier cosa grande. La beta de la API de Batch de 300.000 tokens no está listada para Fable 5.1.

¿Cómo veo las lecturas de caché más baratas? Mire usage.cache_read_input_tokens en una solicitud repetida. Esos tokens se facturan a $0.25 por millón en Fable 5.1, frente a $1 en Fable 5 y $0.50 en Opus 5. El desglose de precios explica los números.

¿Sigue siendo aplicable la guía de la API de Fable 5? En su mayoría. La guía de la API de Fable 5 cubre el mismo endpoint, pero sus ejemplos de uso forzado de herramientas ahora devuelven un 400 y es anterior al esfuerzo por mensaje y a las actualizaciones de progreso.

botón

Practica el diseño de API en Apidog

Descubre una forma más fácil de construir y usar APIs