Inicio → Ayuda

400 al forzar una llamada a herramienta en un modelo de razonamiento

Pon tool_choice en auto y di en el prompt cuándo se aplica la herramienta. En modelos donde el razonamiento está siempre activo, una llamada forzada tendría que saltarse ese razonamiento, así que la API rechaza la petición en lugar de degradar el modelo en silencio.

Lo que ves

Por qué ocurre

Forzar una llamada a herramienta es algo razonable. Es como muchos frameworks garantizan una salida estructurada: definen una herramienta, la fuerzan y analizan los argumentos. Ese truco deja de funcionar en modelos que razonan antes de cada respuesta, porque el camino forzado se salta justo el paso por el que pagas.

El rechazo es mejor que la alternativa. Una API que aceptara el parámetro y lo ignorara te haría creer que has restringido el modelo cuando no es así: un fallo que aparece mucho después, en producción, como salidas ocasionales imposibles de analizar.

Esos mismos modelos suelen rechazar valores no predeterminados de temperature, top_p y top_k, y no admiten rellenar de antemano el turno del asistente. El código portado de un modelo anterior de la misma familia choca con varios a la vez, lo que hace que parezca un problema de autenticación o de endpoint en lugar de un problema de parámetros.

Comprueba si es esta la causa

Envía la misma petición dos veces cambiando solo tool_choice:

for CHOICE in '{"type":"auto"}' '{"type":"any"}'; do
  echo -n "$CHOICE -> "
  curl -s -o /dev/null -w '%{http_code}\n' \
    'YOUR_BASE_URL/chat/completions' \
    -H 'Authorization: Bearer YOUR_KEY' \
    -H 'Content-Type: application/json' \
    -d "{\"model\":\"YOUR_MODEL\",\"max_tokens\":16,
         \"messages\":[{\"role\":\"user\",\"content\":\"hi\"}],
         \"tool_choice\":$CHOICE}"
done

Si auto devuelve 200 y any devuelve 400, el modelo no admite el uso forzado de herramientas. No hay nada mal en tu clave ni en tu endpoint.

Cómo solucionarlo

  1. Deja tool_choice en auto y sé explícito en el promptIndica la condición con claridad: «llama a search cuando la pregunta necesite información actual». Los modelos de razonamiento siguen bien esa instrucción; para eso están.
  2. Usa una respuesta restringida por esquema en lugar de una herramienta forzadaSi forzabas una herramienta solo para obtener salida estructurada, un parámetro de salida estructurada o de JSON schema hace ese trabajo directamente y normalmente sigue admitido.
  3. Revisa temperature a la vezLos frameworks fijan una temperature por defecto que tú nunca elegiste. En estos modelos cualquier valor no predeterminado es un 400, y se ve idéntico al fallo de tool_choice.
  4. Valida la salida en lugar de confiar en la restricciónIncluso donde forzar funciona, los modelos emiten argumentos que no encajan con el esquema. Vale la pena escribir una vez el análisis con un camino alternativo.
En APICLAN esto se aplica a claude-fable-5-1 y claude-fable-5: el uso forzado de herramientas, los parámetros de muestreo no predeterminados y el relleno previo del asistente se rechazan. La guía de Fable 5.1 tiene la lista completa junto con sus precios de caché.

Relacionado

Unexpected token '<' al llamar a una API compatible con OpenAI401 invalid API key: cuando la clave parece correcta pero sigue fallando

Revisado por última vez el 2026-10-01. Escrito a partir de problemas diagnosticados en una pasarela compatible con OpenAI en producción, no recopilado de otras webs.