Parámetro inválido: los mensajes con rol 'tool' deben ser una respuesta a un mensaje anterior con 'tool_calls'

¡Hola! He estado teniendo problemas con algo, no sé qué es. En el mensaje de error aparece “Bad request - please check your parametersInvalid parameter: messages with role ‘tool’ must be a response to a preceeding message with ‘tool_calls’.” ¿Te ha pasado algo similar? Estoy muy atrapado con esto

Bad request - please check your parameters
Invalid parameter: messages with role ‘tool’ must be a response to a preceeding message with ‘tool_calls’.

Información sobre tu configuración de n8n

  • versión de n8n: 2.30.6 (Auto-alojado)
  • Base de datos: PostgreSQL

¡Hola @Christian_G! ¡Bienvenido!
Esto sucede cuando el historial de chat enviado al modelo tiene un mensaje tool que no está precedido directamente por un mensaje de asistente que contenga sus tool_calls, por lo que el proveedor rechaza la solicitud. Tu memoria almacenada se ha desincronizado para una sesión, generalmente por una ejecución interrumpida a mitad de una llamada de herramienta o un cambio de modelo, y como estás usando Postgres Chat Memory, ese historial roto se guarda y se reproduce en cada ejecución.
Borra la memoria de esa sesión. Comprobación más rápida: cambia la Session Key (o pasa un nuevo sessionId) y ejecuta nuevamente; el error debería desaparecer. Para limpiar la sesión actual, conecta un nodo Chat Memory Manager al mismo Postgres Chat Memory, establece Operation en Delete Messages y Delete Mode en All Messages, y ejecútalo una vez.

Hola Sr. Anshul, aplicaremos sus recomendaciones y le diremos cómo funciona.
Muchas gracias por su respuesta rápida​:folded_hands:.

Inspecciona el array de mensajes en la ejecución fallida y empareja cada respuesta de herramienta con la llamada de herramienta del asistente que la creó. Filtrar o fusionar el historial de chat puede dejar un mensaje de herramienta huérfano incluso cuando el prompt actual se ve bien.

Basándome en el punto de @Anshul_Namdev: la causa raíz de este error en n8n AI Agents es generalmente Truncamiento de Buffer de Ventana de Memoria.

La API de OpenAI requiere estrictamente que cualquier mensaje con role: "tool" DEBE seguir inmediatamente a un mensaje assistant que contenga el array de ID tool_calls coincidente.

Esto es cómo sucede en n8n y cómo evitarlo permanentemente:

### La Causa Raíz:

Si utilizas un Buffer de Ventana de Memoria (o Memoria Postgres) configurado para mantener, por ejemplo, los últimos 10 mensajes:

  1. Un mensaje assistant genera una tool_call.

  2. El nodo tool se ejecuta y añade un mensaje de respuesta tool.

  3. A medida que la conversación progresa y alcanza 11 mensajes, el nodo Memory elimina el mensaje más antiguo.

  4. Si el corte de truncamiento divide el mensaje assistant con tool_calls pero deja el mensaje de respuesta tool en la parte superior de la ventana de historial, el payload enviado a OpenAI se vuelve inválido.

### Cómo Solucionarlo:

  1. Utiliza Buffer de Ventana de Memoria con Recuentos de Mensajes Pares (o Aumenta K):

    Asegúrate de que el tamaño de tu buffer de memoria K sea lo suficientemente grande para que los pares de tool-call activos no se truncen a mitad de sesión.

  2. Limpia Sesiones Obsoletas mediante el Administrador de Memoria de Chat:

    Si una sesión se queda atascada con este error, usa un Nodo Chat Memory Manager configurado en Eliminar Mensajes para ese sessionId específico.

  3. Maneja Fallos de Tool (Error Trigger / Sub-Workflow):

    Si una herramienta MCP o Custom falla durante la ejecución, envuelve la lógica de la herramienta en un Try/Catch o configuración Continue on Fail para que siempre devuelva un payload JSON válido al agente en lugar de desconectar el socket y corromper el historial de memoria.