Cómo usar Claude Fable 5.1 desde la API: esfuerzo, streaming, herramientas y caché
Claude Fable 5.1 se lanzó el 1 de septiembre de 2026. Su ID exacto en la API es claude-fable-5-1, sin sufijo de fecha. Mantiene el precio de Fable 5: $10 por millón de tokens de entrada y $50 por millón de tokens de salida. Las lecturas de caché cuestan $0.25 por millón de tokens.
Esta guía cubre el flujo completo:
- Obtener una clave API.
- Enviar una primera solicitud.
- Controlar el esfuerzo y el costo.
- Activar streaming.
- Usar herramientas sin
tool_choiceforzado. - Gestionar rechazos y alternativas.
- Mostrar actualizaciones de progreso.
- Confirmar las lecturas de caché mediante
usage.
Todas las solicitudes usan HTTP y JSON estándar, por lo que puedes construirlas y depurarlas en Apidog antes de integrarlas en tu aplicación.
Si migras un servicio existente basado en Fable 5 u Opus 5, consulta también la guía de migración completa. Para una introducción al modelo, empieza por qué es Claude Fable 5.1.
Antes de tu primera llamada: tres errores que devuelven 400
1. El pensamiento no se puede desactivar
Fable 5.1 usa pensamiento adaptativo en todas las solicitudes. Omite el campo thinking o envía:
{"type": "adaptive"}
Estas configuraciones devuelven 400:
{"type": "disabled"}
{"type": "enabled", "budget_tokens": 10000}
Si vienes de Opus 5, donde disabled era válido con un esfuerzo high o inferior, elimina ese campo y controla el gasto con output_config.effort.
2. El uso forzado de herramientas ya no está disponible
Estas opciones devuelven un error:
{"type": "any"}
{"type": "tool", "name": "..."}
El mensaje es:
tool_choice: type "tool" and "any" are not supported for this model
Más adelante se muestra cómo garantizar una llamada sin forzar tool_choice.
3. La retención de datos debe ser de 30 días
Fable 5.1 es un Modelo Cubierto. Las organizaciones o espacios de trabajo con retención de datos cero reciben un 400 invalid_request_error, incluso si el cuerpo de la solicitud es válido.
Si la primera llamada falla sin una explicación clara, verifica primero la configuración de retención.
Consulta la documentación de Novedades en Claude Fable 5.1 para conocer estos cambios.
Paso 1: Obtener una clave API
Inicia sesión en la Consola de Claude, abre las claves API en la configuración de tu organización y crea una clave. Cópiala inmediatamente: no podrás volver a verla.
Guárdala como una variable de entorno:
export ANTHROPIC_API_KEY="sk-ant-..."
En Apidog, crea una variable de entorno llamada ANTHROPIC_API_KEY y úsala en el encabezado como {{ANTHROPIC_API_KEY}}. Así evitarás que la clave se guarde dentro del cuerpo de una solicitud.
Paso 2: Enviar tu primera solicitud
Crea una solicitud POST a https://api.anthropic.com/v1/messages con estos encabezados:
x-api-keyanthropic-version: 2023-06-01-
content-type: application/json
curl https://api.anthropic.com/v1/messages \
-H "x-[REDACTED CREDENTIAL] \
-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 solicitud con el SDK oficial de Python:
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)
Desarrolla estos dos hábitos desde el principio:
- Comprueba
stop_reasonantes de leercontent. Un rechazo del clasificador se devuelve como HTTP200, pero con una matriz de contenido vacía. - Da a
max_tokensun margen suficiente. El límite incluye los tokens de pensamiento y los tokens de respuesta. Como el pensamiento siempre está activo, un valor ajustado para un modelo sin pensamiento puede truncar la respuesta en Fable 5.1.
La respuesta contiene un bloque thinking cuyo texto está vacío con la configuración predeterminada display: "omitted". Es normal. Cuando envíes el turno siguiente, conserva ese bloque sin modificaciones.
Paso 3: Controlar costo y profundidad con effort
output_config.effort es la principal palanca de Fable 5.1. Se encuentra dentro de output_config, no en el nivel superior, y acepta:
lowmediumhighxhighmax
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 del parámetro de esfuerzo recomienda empezar en high, evaluar los demás niveles con tus propios casos de prueba y repetir las pruebas aunque ya las hayas ejecutado con Fable 5. Los nombres de nivel no representan necesariamente la misma cantidad de pensamiento entre modelos.
Anthropic indica que:
-
mediumpuede aproximarse a Fable 5 con menor costo. -
lowsuele ser competitivo con Opus y Sonnet en costo por tarea. - Con
low, Fable 5.1 usa las herramientas de búsqueda y recuperación con menor frecuencia y responde más desde la memoria. - Con
xhighymax, puede redactar un entregable extenso durante la fase de pensamiento y volver a escribirlo después. Configuramax_tokenspara cubrir ambas fases.
Consulta también la guía del parámetro de esfuerzo para Opus 5, cuya semántica de cinco niveles también se aplica aquí.
Cambiar el esfuerzo a mitad de una conversación
Esta función beta permite cambiar el esfuerzo sin invalidar el prefijo de caché. En lugar de modificar el nivel superior entre solicitudes, envía un mensaje system vacío con output_config. El nuevo esfuerzo se aplica desde el siguiente turno del usuario.
Requiere:
- El encabezado beta
mid-conversation-output-config-2026-07-01. - 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 forma es fiable. Para aumentarlo, los saltos grandes —por ejemplo, de low a xhigh— suelen funcionar mejor.
Paso 4: Transmitir respuestas largas
Con un esfuerzo alto, las tareas difíciles pueden tardar varios minutos. Usa streaming siempre que la respuesta pueda ser extensa. El SDK requiere streaming para valores de max_tokens cercanos al límite de 128.000, con el fin de 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. Esto permite medir rápidamente cuánto tarda un turno con esfuerzo high antes de producir el primer token de texto.
Paso 5: Añadir herramientas sin forzarlas
La definición de herramientas es la misma que en Fable 5. Lo que cambia es cómo se solicita una llamada.
En Fable 5 podías usar:
{"type": "tool", "...": "..."}
En Fable 5.1, una llamada forzada puede omitir el pensamiento y hacer que el modelo escriba su razonamiento dentro de los argumentos. Por eso devuelve 400.
Usa este patrón:
- Mantén
tool_choiceenauto. - Nombra explícitamente la herramienta en la instrucción.
- Establece
strict: true. - Usa
additionalProperties: falseen el esquema.
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 solo querías obtener JSON, usa salidas estructuradas mediante output_config.format en lugar de una herramienta.
Si tu aplicación necesita una llamada concreta en el turno actual de una conversación de varios turnos, añade un mensaje system después del último turno del usuario. El mensaje debe nombrar la herramienta y declarar que la llamada es obligatoria. Conserva ese mensaje en el historial.
tool_choice: {"type": "none"} sigue funcionando cuando un turno no debe llamar a herramientas.
Bucle del agente
El bucle no cambia:
- Comprueba si
stop_reason == "tool_use". - Ejecuta cada bloque
tool_use. - Devuelve todos los bloques
tool_resulten un mensaje de usuario. - Adjunta el turno del asistente exactamente como fue devuelto, incluidos los bloques de pensamiento.
Este último paso es especialmente importante en Fable 5.1. Consulta la guía de pensamiento preservado.
En bucles largos, Fable 5.1 puede emitir una llamada por turno cuando las siguientes lecturas independientes solo están implícitas en la tarea. Anthropic recomienda añadir después de cada resultado de herramienta esta instrucción:
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íala como un mensaje system con alcance de turno (clear_at: "next_user_message"). Requiere el encabezado beta mid-conversation-system-clear-at-2026-08-21. Conserva todas las copias anteriores del mensaje.
Paso 6: Gestionar rechazos con alternativas
Fable 5.1 ejecuta clasificadores de seguridad. Una solicitud rechazada devuelve HTTP 200 con:
stop_reason: "refusal"- Un objeto
stop_details. - Una categoría entre
cyber,bio,frontier_llm,reasoning_extractionygeneral_harms.
Un rechazo que ocurre antes de cualquier salida no se factura.
Alternativa del lado del servidor
La opción más sencilla es fallbacks: "default" con el encabezado beta server-side-fallback-2026-07-01. Anthropic reintentará la solicitud usando el modelo recomendado para la categoría.
Para Fable 5.1, los objetivos permitidos son:
claude-opus-4-8-
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)
El campo model de nivel superior identifica el modelo que sirvió la respuesta. Un bloque de contenido fallback marca la transferencia. Conserva ese bloque en la misma posición cuando vuelvas a mostrar el turno.
fallbacks:
- No está disponible en la API de Batches.
- No está disponible en Bedrock, Google Cloud ni Foundry.
- En esos entornos debes registrar
BetaRefusalFallbackMiddlewaredel SDK en el cliente.
Consulta la guía de manejo de rechazos para conocer la facturación, el enrutamiento persistente y el reintento manual con crédito de fallback.
Paso 7: Mostrar actualizaciones de progreso
Entre llamadas a herramientas, Fable 5.1 puede escribir notas breves sobre lo que encontró y lo que hará después. Cada nota llega como un bloque thinking independiente inmediatamente antes de la llamada.
Por defecto, estos bloques están vacíos. Usa display: "updates" con el encabezado beta thinking-display-updates-2026-08-18:
{
"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."}]
}
Los bloques thinking con texto no vacío son líneas de estado que puedes mostrar en la interfaz. Fable 5.1 produce menos actualizaciones que Fable 5. Si tu UI depende de esta narración, elimina también cualquier instrucción del prompt que pida al modelo reservar los hallazgos para la respuesta final.
Paso 8: Confirmar la tarifa de caché de $0.25
La caché de prompts es donde se aplica el principal cambio de precio. Marca el prefijo estable con cache_control y revisa el objeto 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 será cero. Con un TTL de cinco minutos, esos tokens se facturan a $12.50 por millón.
En una segunda solicitud dentro de esos cinco minutos:
u.cache_read_input_tokens
debería ser mayor que cero. Esos tokens se facturan a $0.25 por millón en Fable 5.1.
Si permanece en cero en solicitudes aparentemente idénticas, el prefijo cambia entre llamadas. Revisa especialmente:
- Marcas de tiempo en el prompt del sistema.
- JSON sin ordenar.
- Matrices de herramientas variables.
El prompt mínimo que se puede almacenar en caché es de 512 tokens.
Dos detalles específicos de Fable 5.1:
- Un fallo de caché cuesta 40 veces más que un acierto, así que mantener la caché activa es más importante que en Fable 5.
- El esfuerzo por mensaje y los mensajes
systemcon alcance de turno permiten cambiar partes de la sesión sin reiniciar el prefijo.
Las mismas ediciones que reinician la caché —reconstruir system o editar turnos anteriores— también invalidan los bloques de pensamiento. En Fable 5.1, la estrategia de solo añadir contenido ofrece ambas ventajas.
Consulta la documentación de almacenamiento en caché de prompts.
Probar y depurar el flujo en Apidog
Guarda cada etapa como una solicitud dentro de una colección de Apidog:
- Primera llamada.
- Variantes de
effort. - Streaming.
- Bucle de herramientas.
- Fallback.
- Verificación de caché.
Usa variables de entorno para la clave y el modelo. Así puedes cambiar toda la colección entre claude-fable-5 y `claude-fable-5-1 editando una sola variable.
Añade estas aserciones:
text
stop_reason != "refusal"
En la segunda solicitud de caché:
text
usage.cache_read_input_tokens > 0
Cuando uses el encabezado thinking-binding, verifica que ninguna entrada de input_transformations tenga:
text
reason: "prefix_binding_mismatch"
Ejecuta la colección antes y después de cada cambio en el harness. Puedes descargar Apidog para configurarla; la misma colección puede utilizarse como verificación de CI mediante la CLI de Apidog.
Errores y trampas frecuentes
400 tool_choice: type "tool" and "any" are not supported for this model
Cambia aauto, nombra la herramienta en la instrucción y usastrict: true.400conthinking: {"type": "disabled"}
Elimina el campo y reduce el esfuerzo medianteoutput_config.effort.400 invalid_request_errorcon un cuerpo aparentemente válido
Comprueba que la organización o el espacio de trabajo tenga una retención de datos de 30 días.400 Invalid signature in thinking block. The block is bound to a different conversation.
El código modificó un turno anterior, el prompt del sistema o la matriz de herramientas. Revisa la guía de pensamiento preservado.El texto de pensamiento está vacío
Es normal condisplay: "omitted". Usasummarizedoupdatessi necesitas mostrarlo.Las lecturas de caché son cero
El prefijo probablemente es variable. Revisa marcas de tiempo y objetos sin ordenar.Falla la validación de Priority Tier
Fable 5.1 no admite el nivel de prioridad; Fable 5 sí.
Preguntas frecuentes
¿Cuál es el ID del modelo de Claude Fable 5.1?
En la API de Claude es:
text
claude-fable-5-1
En Amazon Bedrock:
text
anthropic.claude-fable-5-1
Google Cloud, Microsoft Foundry y Claude Platform en AWS usan claude-fable-5-1.
¿Necesito un encabezado beta?
No para el modelo base, el pensamiento adaptativo, el esfuerzo, las herramientas ni la caché. Todas estas funciones usan el encabezado estándar:
text
anthropic-version: 2023-06-01
Los encabezados beta solo son necesarios para:
- Cambiar el esfuerzo por mensaje.
- Usar mensajes
systemcon alcance de turno. - Mostrar actualizaciones de progreso.
- Usar fallbacks del lado del servidor.
- Controlar el enlace de pensamiento.
¿Puedo forzar una llamada a una herramienta?
No. tool_choice con any o tool devuelve 400.
Usa auto, menciona la herramienta en el prompt y establece strict: true para validar los argumentos. Si necesitas extraer JSON, considera salidas estructuradas.
¿Cuál es la salida máxima?
La API de Messages admite hasta 128.000 tokens. Usa streaming para respuestas grandes.
La beta de la API de Batch, con 300.000 tokens, no está listada para Fable 5.1.
¿Cómo compruebo las lecturas de caché más baratas?
Repite una solicitud con el mismo prefijo y revisa:
python
response.usage.cache_read_input_tokens
En Fable 5.1, esos tokens cuestan $0.25 por millón, frente a $1 en Fable 5 y $0.50 en Opus 5. Consulta el desglose de precios.
¿Sigue siendo válida la guía de la API de Fable 5?
En su mayor parte. El endpoint es el mismo, pero los ejemplos de uso forzado de herramientas ahora devuelven 400 y la guía anterior no cubre el esfuerzo por mensaje ni las actualizaciones de progreso.
Consulta la guía de la API de Fable 5 junto con la documentación actual de Claude.

Top comments (0)