Inicio → Ayuda
400 en una llamada a herramienta: cada tool_use necesita su tool_result
Cada bloque tool_use de un mensaje del asistente debe responderse con un bloque tool_result con el mismo id, en el mensaje de usuario inmediatamente siguiente, antes de cualquier otro contenido. Si te saltas uno de varios, los reordenas o pones texto delante, la siguiente petición se rechaza.
Lo que ves
messages.N: tool_use ids were found without tool_result blocks immediately afterEach tool_result block must have a corresponding tool_use block in the previous messageThe first tool call succeeds and the next request failsWorks with one tool, breaks when the model calls two in a single turn
Por qué ocurre
La conversación se reproduce entera en cada llamada, así que la API valida toda la estructura cada vez, incluidos turnos que antes se aceptaron. Por eso el error señala un mensaje más antiguo que el que acabas de enviar.
Las llamadas a herramientas en paralelo son el desencadenante habitual. Un modelo puede emitir varios bloques tool_use en un turno, y el código pensado para una sola llamada responde al primero y descarta el resto.
Una herramienta que falla también es un resultado. Omitir el bloque porque tu función lanzó una excepción es justo la forma que la API rechaza: devuelve en su lugar un tool_result con el texto del error.
Cómo solucionarlo
- Responde a cada id, en ordenRecoge los ids de tool_use del turno del asistente, ejecútalos y emite un tool_result por id, en el mismo orden, al principio del siguiente mensaje de usuario.
- Devuelve los errores como resultadosCuando una herramienta lanza una excepción, envía un tool_result con el mensaje de error como contenido. El modelo lo gestiona bien; un bloque que falta, no.
- Pon el texto después de los resultadosSi quieres añadir una nota del usuario en el mismo turno, colócala después de todos los bloques tool_result, nunca antes.
En APICLAN el tráfico de llamadas a herramientas se cobra como tokens normales de entrada y salida. Una petición rechazada nunca se ejecuta, así que no se cobra, pero el reintento sí, y por eso arreglar el emparejamiento es mejor que esquivarlo a base de reintentos.
Relacionado
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.