Tras Claude Opus 5.5, ¿por qué tool_choice ya no fuerza JSON? Breaking changes hasta JSON Schema

A 24 de septiembre de 2026: Opus 5.5 (22 sep.) no es un cambio de cadena de modelo. thinking sigue activo; tool_choice any/tool devuelve 400. Las tuberías JSON forzadas deben pasar a auto + strict + JSON Schema, o Structured Output.

Conclusión primero: Opus 5.5 no es un cambio de string de modelo. El 22 de septiembre de 2026 Anthropic publicó Claude Opus 5.5 (claude-opus-5-5). La lista de precios se ve amable: $4 / $20 de entrada / salida, un 20% por debajo de Opus 5; lecturas de caché $0.20, un 60% menos. Anthropic dice que las cargas típicas cuestan unos 40% menos. El mismo día OpenAI recortó GPT-6 Sol y Luna aproximadamente a la mitad. Lo que rompe producción son cuatro fallos duros: thinking no se puede apagar; los valores any y tool de tool_choice devuelven 400; los bloques thinking quedan ligados al modelo y a la conversación; la Claude API y Google Cloud rechazan computer_20251124. Las pipelines que garantizaban un objeto JSON forzando una llamada a herramienta ahora tienen que usar auto más strict: true y un JSON Schema — o Structured Output.

Escrito a fecha de 24 de septiembre de 2026, contra la página de modelo de Anthropic y el «What's new» aún vigentes ese día. Este sitio ya tiene por qué Tool Calling depende de JSON Schema, qué es Structured Output y por qué los agentes necesitan JSON después de la Agents API. Este texto solo responde qué capa del contrato JSON hay que cambiar al pasar a 5.5.

Qué se publicó el 22 de septiembre

Claude Opus 5.5 es el primer modelo de la familia Claude 5.5. Posicionamiento oficial: coding agentico de larga duración y trabajo de conocimiento. El ID es claude-opus-5-5 en la Claude API, Google Cloud y Microsoft Foundry; Bedrock usa anthropic.claude-opus-5-5. La retirada no es antes del 22 de septiembre de 2027. Sonnet 5.5 y Haiku 5.5 llegan «en las próximas semanas».

Precios por millón de tokens: $4 de entrada, $20 de salida, $5 por escritura de caché de 5 minutos, $8 por escritura de caché de 1 hora, $0.20 por lectura de caché. El batch va a mitad de precio. Fast mode solo en Claude API: speed: "fast" más fast-mode-2026-02-01, $8 / $40, hasta unas 2,5× de velocidad. El effort por defecto es medium — Opus 5 usaba high. Si omites effort, el comportamiento cambia. Eso no es compatibilidad silenciosa.

La tabla de lanzamiento pone Terminal-Bench 4.0 en 66,4% frente al 57,9% de GPT-6 Astra. Anthropic también dice que en esta banda de capacidad, los huecos de puntuación son una guía más débil que las tareas reales, y el hueco percibido frente a Fable 5.1 es más estrecho que la tabla. Este artículo no elige un modelo por un ranking.

Cuatro fallos duros, una tabla

La documentación lista las peticiones que se vuelven 400 en 5.5. Las tres primeras también aplican a Fable 5.1:

Petición antiguaEn 5.5Qué enviar en su lugar
thinking: {"type": "disabled"} o enabled más budget_tokens400 invalid_request_errorOmite thinking, o envía {"type": "adaptive"}; dirige la profundidad con effort
tool_choice: {"type": "any"} o {"type": "tool", "name": "..."}400; el endpoint de recuento de tokens aplica la misma comprobaciónauto (o none) más strict: true, o Structured Output
Reenviar un bloque thinking después de editar system / tools / un mensaje anterior400 por defecto en cuentas creadas después del 31 de agosto de 2026Mantén la conversación en solo-append; cambia instrucciones con un mensaje system a mitad de conversación
computer_20251124 en la Claude API o Google Cloud400computer_toolset_20260801; Bedrock sigue aceptando la herramienta antigua

Un cambio más no falla la petición pero se calla: las notas cortas entre llamadas a herramientas ahora llegan como bloques thinking. Con el display: "omitted" por defecto el texto está vacío. Una UI que emitía esas frases como barra de progreso se queda en silencio. Pon thinking.display si necesitas el progreso.

Por qué ya no puedes forzar JSON con tool_choice

El parche de 2024–2025 era: define una herramienta «extract», pon tool_choice en any o nombra esa herramienta, y el modelo tenía que entregar un objeto que coincidiera con input_schema. El programa leía los arguments de la herramienta y nunca llamaba a JSON.parse sobre la prosa del chat. En 5.5 ese camino es un 400:

tool_choice: type "tool" and "any" are not supported for this model.

El recambio oficial no es otra vez «por favor, saca JSON». Deja tool_choice en auto, pon strict: true en la herramienta y clava los parámetros con JSON Schema. Si la respuesta final tiene que ser una forma fija, pon el schema en Structured Output. Si quieres que el modelo llame a una herramienta en vez de responder en prosa, di en el prompt cuándo aplica la herramienta. El prompt influye qué herramienta elige auto. No sustituye el schema.

Así que 5.5 no hace JSON menos importante. Quita la muleta de la llamada forzada. Sin muleta, el contrato tiene que sostenerse solo. Ver por qué Tool Calling depende de JSON Schema.

auto + strict + JSON Schema

La forma mínima post-migración es:

{
  "model": "claude-opus-5-5",
  "tool_choice": { "type": "auto" },
  "tools": [
    {
      "name": "extract_order",
      "description": "Extract a confirmed order. Call when the user has named a sku and a quantity.",
      "strict": true,
      "input_schema": {
        "type": "object",
        "properties": {
          "sku": { "type": "string" },
          "qty": { "type": "integer", "minimum": 1 }
        },
        "required": ["sku", "qty"],
        "additionalProperties": false
      }
    }
  ]
}

strict: true hace que el decoder acepte parámetros contra el schema. Campos que faltan, tipos incorrectos y claves de más deberían morir aquí — no en la apuesta de que una llamada forzada produzca un objeto. Si la respuesta final también entra en un programa, usa Structured Output. No parsees las frases del assistant. Ver qué es Structured Output y por qué JSON.parse falla.

Para cambiar un schema de herramienta a mitad de conversación, 5.5 puede llevar una definición completa en un mensaje system a mitad de conversación bajo inline-tools-2026-09-15, sin editar el array tools de nivel superior. Es la misma regla que el thinking ligado al prefijo: añade historial; no reescribas un snapshot de contrato que ya salió.

Thinking se queda encendido, y no puedes editar el replay

El adaptive thinking está siempre encendido en 5.5. disabled o un budget_tokens manual es un 400. Profundidad, latencia y coste van por effort: low / medium / high / xhigh / max. Donde antes apagabas thinking para ahorrar tokens, baja effort. Con el mismo effort, 5.5 tiende a pensar más por turno que Opus 5, sobre todo en xhigh y max. Deja margen en max_tokens para ese thinking.

Cada bloque thinking registra qué modelo lo escribió. 5.5 puede leer bloques de Opus 5 y Opus / Sonnet / Haiku anteriores. No lee Fable ni Mythos. Al revés: Fable 5.1 y Mythos 5.1 en la Claude API pueden leer bloques de 5.5; ningún otro modelo puede. Los bloques ilegibles se descartan antes de que el modelo los vea. La petición sigue devolviendo 200; los bloques descartados no se facturan. Para ver qué se descartó, envía thinking-binding-controls-2026-08-01 y lee el array de nivel superior input_transformations.

El prefix binding es más estricto. Las cuentas creadas el 31 de agosto de 2026 a las 00:00 UTC o después comprueban por defecto si el system prompt, las tools o un mensaje anterior cambiaron desde que se produjo el bloque. Reenviar después de ese cambio es un 400. Es el preserved thinking que trajo Fable 5.1. No vuelvas atrás a editar un schema de herramienta en el historial para «arreglar el contrato» — eso anula el thinking. Añade herramientas nuevas con un mensaje system a mitad de conversación. Devuelve los bloques thinking sin modificar cuando envías resultados de herramienta.

computer_20251124 y una barra de progreso que se calla

En la Claude API y Google Cloud, 5.5 solo acepta computer_toolset_20260801. Si mantienes la cabecera beta computer-use-2025-11-24 y el tipo de herramienta antiguo, recibes 400. Bedrock sigue aceptando computer_20251124. Browser use, y las integraciones que ya van por toolset, no necesitan cambio. El bucle tiene que manejar bloques tool_use de miembro, acciones en lote y toolset_name en los resultados.

La frase corta entre llamadas a herramientas ya no es un bloque text. Con display omitido, el stream de progreso muere y no hay error. Eso no es un fallo de schema. Es leer bloques por posición en vez de por type. Bifurca primero por tipo, luego decide si pones thinking.display.

Sol y Luna están al lado de la lista de precios

El mismo día, OpenAI publicó GPT-6 Sol (gpt-6-sol, $2 / $10) y GPT-6 Luna (gpt-6-luna, $0.10 / $0.50), más o menos la mitad de sus pares GPT-5.6. Astra se queda en $10 / $50. El trabajo oficial de Luna es extracción y resumen de alto volumen y objetivo claro — el carril que les gusta a las pipelines JSON. Un precio más bajo no licencia un schema más flojo.

No elijas una ruta solo por el precio de lista. El ahorro típico del 40% de Opus 5.5 es mitad caché y menos tokens por tarea, no el 20% del menú. Que el effort por defecto pase de high a medium mueve la factura y la latencia. Pasa el mismo schema por una pasada de extracción antes de cambiar el enrutado. GPT-5.5 sigue saliendo de ChatGPT / Work / Codex el 14 de octubre (la API queda fuera de esa retirada). Es otra línea de producto. No lo mezcles con estos breaking changes en un ticket de «actualiza todo».

Cuatro comprobaciones antes de cambiar el string del modelo

  1. Busca tool_choice. Sustituye cada any / tool nombrado por auto. Para JSON estable, activa strict y aprieta input_schema.
  2. Busca thinking. Quita disabled y budget_tokens. Pon effort de forma explícita. Lee los bloques por type. Devuelve thinking sin modificar.
  3. Busca computer_20251124. En la Claude API y Google Cloud, pasa al toolset. Bedrock puede esperar.
  4. Replay y caché. En cuentas posteriores al 31 de agosto, no edites tools ni system en el historial. Cambia un schema con un mensaje añadido. Compaction (compact-2026-09-04) puede sustituir un resumen firmado y mantener el thinking válido, bajo las condiciones de la página de Compaction de Anthropic.

Inspecciona el schema con herramientas JSON locales

Antes de poner el modelo en claude-opus-5-5, extiende tres textos en el navegador: el input_schema antiguo, un objeto arguments que solías forzar con tool_choice, y el schema que piensas marcar strict.

  • Validador JSON — ¿es legal la gramática? Si tienes un schema, comprueba campos required y claves de más juntos.
  • Formateador JSON — expande una definición de herramienta de una línea y mira si additionalProperties está puesto.
  • JSON Diff — compara una muestra de llamada forzada con el objeto más pequeño que permite el schema strict.

Nada sale del navegador. Estabiliza el contrato y luego cambia el string del modelo. 5.5 cambiará effort, pensará más y rechazará el tool_choice antiguo. Tus nombres de campo y la lista required no deberían aflojarse con él.

FAQ

¿Puedo publicar solo cambiando el modelo a claude-opus-5-5?

No como valor por defecto. Si la petición sigue teniendo thinking.disabled, budget_tokens, tool_choice any/tool, o computer_20251124 en la Claude API, recibes 400.

Sin una herramienta forzada, ¿cómo sigo obteniendo JSON?

Deja tool_choice en auto, pon strict en la herramienta, rellena required y pon additionalProperties en false. Pon la respuesta final en Structured Output. No hagas JSON.parse de la prosa del chat.

Si no se puede apagar thinking, ¿la factura es siempre más alta?

No necesariamente. Los precios de lista son más bajos, las lecturas de caché son más baratas, y Anthropic cita unos 40% menos en cargas típicas. El effort por defecto es medium. Intercambia profundidad con effort. No intercambies la factura con disabled.

¿Fable 5.1 necesita los mismos cambios?

Thinking siempre encendido, sin herramientas forzadas y bloques thinking ligados ya aplican a Fable 5.1. La rotura de computer_20251124 está sobre todo en la Claude API y Google Cloud para 5.5. Bedrock sigue aceptando la herramienta computer antigua.

¿Por qué se calló la barra de progreso?

Las notas cortas entre llamadas a herramientas se movieron a bloques thinking. El display por defecto omite el texto. Lee los bloques por type y pon thinking.display si necesitas progreso. Eso no es un fallo de validación de schema.

¿Es lo mismo que la retirada de GPT-5.5 del 14 de octubre?

No. GPT-5.5 sale de ChatGPT / Work / Codex; ese aviso no toca la API. Opus 5.5 es el modelo nuevo de otro vendor más breaking changes. Migra las dos líneas por separado.

Resumen

Opus 5.5 convierte «forzar una llamada a herramienta» de muleta legal en un 400. La lista de precios y el ahorro típico del 40% no cubren los cuatro fallos duros. Para JSON estable, usa auto más strict más JSON Schema, o Structured Output. Thinking se queda encendido, los bloques se ligan a la conversación, y la herramienta computer antigua muere en algunas plataformas — eso es una checklist antes de cambiar el string, no una observación después del lanzamiento.

Aplana el schema, un objeto arguments de muestra y el contrato strict en un validador local primero, luego cambia a claude-opus-5-5. Los modelos cambiarán. Effort se moverá. Tu contrato de campos no debería aflojarse con ellos.