casos practicos
Fable 5 llegó y se suspendió en 3 días: agentes que cambian de modelo
Anthropic lanzó Claude Fable 5 el 9 de junio y tuvo que suspenderlo el 12. Qué trae el modelo, qué cambia en la API y cómo diseñar un agente en Python que siga funcionando si su modelo desaparece.
Focuz Academy · 27 de junio de 2026 · 7 min
Junio dejó una lección que todo desarrollador de agentes debería anotar. El 9 de junio de 2026 Anthropic lanzó Claude Fable 5, su modelo más capaz abierto al público. Tres días después, el 12 de junio, tuvo que suspender el acceso para todos sus clientes tras una directiva de control de exportaciones del gobierno de Estados Unidos. Al cierre de este artículo, el acceso no se ha restablecido.
Veamos qué trae Fable 5 y, sobre todo, cómo diseñar un agente que no se caiga cuando su modelo deja de estar disponible.
Qué es Claude Fable 5
Según el anuncio y las notas de versión de la API del 9 de junio:
- Modelo:
claude-fable-5. Anthropic lo describe como un modelo "clase Mythos" preparado para uso general. Junto con él salió Claude Mythos 5 (claude-mythos-5), el mismo modelo de base con las salvaguardas levantadas en algunas áreas, desplegado inicialmente solo para participantes del Project Glasswing. - Capacidad: ventana de contexto de 1M de tokens y hasta 128k tokens de salida.
- Precio: 10 USD por millón de tokens de entrada y 50 USD por millón de salida.
- Tokenizador: el introducido con Opus 4.7. Frente a modelos anteriores a Opus 4.7, el mismo texto produce aproximadamente un 30 % más de tokens.
- Salvaguardas: clasificadores de seguridad que pueden rechazar solicitudes. Anthropic indica que se activan en menos del 5 % de las sesiones, en promedio.
Qué cambia en tu código
Si tu integración llama a Fable 5, hay varias diferencias con modelos anteriores:
- Pensamiento adaptativo siempre activo.
thinking: {"type": "disabled"}no está soportado, y los presupuestos manuales de pensamiento y el prefill de la respuesta del asistente devuelven un error 400. - El pensamiento llega omitido por defecto.
thinking.displayes"omitted"(igual que en Opus 4.7 y 4.8); usa"summarized"si quieres un resumen legible. - Rechazos como respuesta normal. Cuando un clasificador rechaza la solicitud, la API responde con
stop_reason: "refusal". No se cobra una solicitud rechazada antes de generar salida. - Reintento en otro modelo. Existe un parámetro opcional
fallbacks(en beta en la API de Claude) que vuelve a ejecutar la solicitud rechazada en otro modelo. El SDKanthropic0.108.0 (9 de junio) agregó soporte para él y un middleware de fallbacks del lado del cliente, pensado para proveedores que no admiten los del servidor. - Retención de datos de 30 días. Fable 5 no está disponible con retención cero de datos (ZDR). Si tus contratos con clientes exigen ZDR, este modelo no aplica.
Lo que pasó el 12 de junio
Según el comunicado de Anthropic, la directiva exigía suspender el acceso a Fable 5 y Mythos 5 para cualquier ciudadano extranjero, dentro o fuera de EE. UU. Según Anthropic, el efecto neto de la orden fue que, para cumplirla, debía desactivar ambos modelos para todos sus clientes. El acceso al resto de modelos no se vio afectado. Anthropic manifestó su desacuerdo con la medida y dijo estar trabajando para restablecer el acceso.
Para un desarrollador, la lección técnica es clara: el modelo es una dependencia externa y puede dejar de estar disponible por razones ajenas a tu código. Un agente bien diseñado lo trata como configuración, no como una constante.
Patrón 1: modelo de respaldo con el Claude Agent SDK
El Claude Agent SDK para Python tiene desde la versión 0.1.7 la opción fallback_model. Según su CHANGELOG: "When the primary model is unavailable, the SDK will automatically use a fallback model". En la versión vigente (0.2.108, del 23 de junio), cada AssistantMessage trae el campo model con el modelo que respondió, y el ResultMessage final trae model_usage:
import asyncio
import os
from claude_agent_sdk import (
AssistantMessage, ClaudeAgentOptions, ResultMessage, TextBlock, query,
)
opciones = ClaudeAgentOptions(
model=os.environ.get("AGENTE_MODELO", "claude-opus-4-8"),
fallback_model=os.environ.get("AGENTE_RESPALDO", "claude-sonnet-4-6"),
effort="high",
allowed_tools=["Read", "Grep", "Glob"],
cwd="addons/mi_modulo",
max_turns=30,
)
async def main():
prompt = "Explica qué hace cada modelo Python de este módulo de Odoo 19."
async for msg in query(prompt=prompt, options=opciones):
if isinstance(msg, AssistantMessage):
texto = "".join(b.text for b in msg.content if isinstance(b, TextBlock))
if texto:
print(f"[{msg.model}] {texto}")
elif isinstance(msg, ResultMessage):
print("Uso por modelo:", msg.model_usage)
asyncio.run(main())
El modelo sale de variables de entorno: cambiarlo es una decisión de operación, no un despliegue de código.
Patrón 2: cadena de modelos con la Messages API
Si llamas directamente a la API, puedes escribir tu propia cadena de respaldo. Este ejemplo cubre los dos casos de junio: el modelo no está disponible (error HTTP) y el modelo rechaza la solicitud (stop_reason: "refusal"):
import anthropic
client = anthropic.Anthropic()
CADENA = ["claude-fable-5", "claude-opus-4-8", "claude-sonnet-4-6"]
def preguntar(prompt: str) -> tuple[str, str]:
for modelo in CADENA:
try:
r = client.messages.create(
model=modelo,
max_tokens=16000,
output_config={"effort": "high"},
messages=[{"role": "user", "content": prompt}],
)
except anthropic.APIStatusError as e:
print(f"{modelo}: error {e.status_code}, pruebo el siguiente")
continue
if r.stop_reason == "refusal":
print(f"{modelo}: solicitud rechazada, pruebo el siguiente")
continue
texto = "".join(b.text for b in r.content if b.type == "text")
return modelo, texto
raise RuntimeError("Ningún modelo de la cadena respondió")
Fíjate en que seleccionamos los bloques por su type y no por su posición: con pensamiento siempre activo, la respuesta puede empezar con bloques de pensamiento. En producción, limita los reintentos a los errores que tengan sentido (no reintentes un 400 causado por tu propia solicitud) y registra qué modelo respondió para tus métricas de calidad y costo.
Ejercicio
- Busca en tu código todos los nombres de modelo escritos a mano y muévelos a configuración.
- Elimina cualquier
thinking: {"type": "disabled"}y cualquier prefill si planeas usar Fable 5 cuando vuelva. - Ejecuta el patrón 1 o 2 con un modelo inexistente como principal y comprueba que el respaldo entra en acción.
- Mide los tokens de tus prompts típicos con la API de conteo de tokens antes de cambiar de modelo: el nuevo tokenizador cambia tu costo.
- Revisa con tu equipo legal si la retención de 30 días es compatible con los datos de tus clientes.
Fuentes: Anthropic: Claude Fable 5 and Claude Mythos 5 · Comunicado del 12 de junio · Notas de versión de la API · CHANGELOG del Claude Agent SDK para Python · CHANGELOG del SDK anthropic para Python
Guía gratuita: 5 agentes Python para Odoo
Casos de Junior a Senior, con código verificado contra Odoo 20.
Descargar →¿Empiezas desde cero? Lee qué es el agent loop y sigue las lecciones gratuitas.