April 15, 2026 • Versión: 2026.4.8

[Errores HTTP 400 con gpt-5.2-codex/gpt-5.3-chat mediante el Adaptador de Azure OpenAI Responses] - HTTP 400 Errors with gpt-5.2-codex/gpt-5.3-chat via Azure OpenAI Responses Adapter

Las solicitudes de Azure OpenAI Responses fallan con HTTP 400 debido a elementos de razonamiento malformados que se envían sin los elementos siguientes requeridos en la estructura del payload.

🔍 Síntomas

Al enrutar solicitudes a través del adaptador Azure OpenAI Responses de OpenClaw hacia despliegues GPT-5.2-Codex o GPT-5.3-Chat, la puerta de enlace devuelve errores HTTP 400. El fallo se manifiesta en dos patrones distintos:

Patrón A: 400 Inmediato en la Primera Solicitud


warn agent/embedded {"event":"embedded_run_agent_end","isError":true,"error":"400 Item 'rs_07f091ad1d9adbcb0069d7059e74a08190a5fd477877af8e27' of type 'reasoning' was provided without its required following item.","failoverReason":"format","model":"gpt-5.3-chat","provider":"AzureOpenAI-Three"}

Patrón B: 400 en Turnos Sucesivos

El primer turno del usuario tiene éxito, pero los turnos conversacionales subsiguientes fallan con el mismo error de elemento de razonamiento después de que el asistente intenta continuar la conversación.

Firma del Error

El hash del error sha256:ce60f0254cd4 es consistente en múltiples fallos, lo que indica un problema sistemático de construcción del payload en lugar de errores de red transitorios.

Configuración Afectada

yaml

Provider configuration triggering the error

“AzureOpenAI-Three”: { “baseUrl”: “https://dy-aoai.openai.azure.com/openai/v1", “api”: “openai-responses”, # or “azure-openai-responses” “auth”: “api-key”, “models”: [{ “id”: “gpt-5.3-chat”, “reasoning”: false, # Explicitly disabled “contextWindow”: 1048576 }] }

Comportamiento en la Interfaz de Control

Los usuarios observan el error a través de la Interfaz de Control de OpenClaw cuando:

  1. Seleccionan gpt-5.2-codex o gpt-5.3-chat como el modelo activo
  2. Envían cualquierprompt (incluso consultas de prueba simples como “Hola, responde con ‘OK’”)
  3. El WebSocket se desconecta con código 1001 durante conversaciones prolongadas

🧠 Causa raíz

El error HTTP 400 se origina por una discrepancia entre la estructura del payload de solicitud generada por el adaptador azure-openai-responses de OpenClaw y la validación estricta aplicada por el endpoint de la API de Respuestas de Azure OpenAI.

Análisis Técnico de la Secuencia de Fallo

La API de Respuestas de Azure OpenAI (formato API v1) aplica una restricción estructural sobre los elementos reasoning:

  1. Requisito del Elemento de Razonamiento: Cuando aparece un elemento reasoning en el array output, Azure OpenAI requiere un elemento text o output_text correspondiente inmediatamente después de él.

  2. Generación del Payload por el Adaptador: El adaptador azure-openai-responses construye payloads de solicitud que incluyen elementos de razonamiento en el array output, incluso cuando la configuración del modelo especifica "reasoning": false.

  3. Elemento Siguiente Faltante: El payload generado contiene: json { “output”: [ { “type”: “reasoning”, “id”: “rs_07f091ad1d9adbcb0069d7059e74a08190a5fd477877af8e27”, “summary”: [] } // Missing required “text” or “output_text” item here ] }

  4. Rechazo de Validación de Azure: El backend de Azure OpenAI rechaza la solicitud con:

    400 Item ‘rs_07f091ad1d9adbcb0069d7059e74a08190a5fd477877af8e27’ of type ‘reasoning’ was provided without its required following item.

Ubicaciones de la Causa Raíz

ComponenteArchivo/MóduloProblema
Adaptadorpackages/adapters/src/azure-openai-responses.tsElementos de razonamiento añadidos al output sin validación
Constructor de Payloadpackages/adapters/src/responses-payload.tsSin verificación de reasoning: false antes de incluir bloques de razonamiento
Configuración del ModeloConfiguración del usuario"reasoning": false no propagado a la construcción del payload del adaptador

Inconsistencia Arquitectónica

La lógica de construcción del payload del adaptador no respeta el indicador reasoning del modelo. La ruta del código asume que todas las variantes GPT-5 con ventanas de contexto extendidas deben incluir bloques de razonamiento, independientemente de la configuración explícita:

typescript // Ruta de código problemática hipotética en el adaptador function buildResponsePayload(model, messages, options) { // ISSUE: No check for model.reasoning === false if (model.contextWindow > 128000) { outputItems.push({ type: “reasoning”, summary: [] }); } // Elemento de razonamiento añadido sin el siguiente elemento de texto requerido }

Flujo de Solicitud Afectado

Prompt del Usuario → Interfaz de Control → Puerta de Enlace OpenClaw → Adaptador azure-openai-responses → Construcción del payload (elemento de razonamiento sin elemento siguiente) → Endpoint de Azure OpenAI → Error de Validación 400

🛠️ Solución paso a paso

Opción 1: Desactivar Razonamiento a Nivel de Adaptador (Recomendado)

Modifica la configuración del proveedor para desactivar explícitamente el procesamiento de razonamiento:

Antes: json { “AzureOpenAI-Three”: { “baseUrl”: “https://dy-aoai.openai.azure.com/openai/v1", “api”: “azure-openai-responses”, “models”: [{ “id”: “gpt-5.3-chat”, “reasoning”: false }] } }

Después: json { “AzureOpenAI-Three”: { “baseUrl”: “https://dy-aoai.openai.azure.com/openai/v1", “api”: “azure-openai-responses”, “compat”: { “reasoningEnabled”: false }, “models”: [{ “id”: “gpt-5.3-chat”, “reasoning”: false, “reasoningEffort”: null }] } }

Opción 2: Usar el Adaptador Estándar OpenAI-Responses

Si el adaptador azure-openai-responses continúa fallando, configura el proveedor para usar el adaptador estándar openai-responses con formato de salida explícito:

Configuración: json { “AzureOpenAI-Three”: { “baseUrl”: “https://dy-aoai.openai.azure.com/openai/v1", “api”: “openai-responses”, “auth”: “api-key”, “headers”: { “api-key”: “YOUR-API-KEY”, “Azure-Extensions-Version”: “2024-11-01” }, “models”: [{ “id”: “gpt-5.3-chat”, “reasoning”: false, “outputFormat”: “text” }], “requestOptions”: { “stripReasoningItems”: true } } }

Opción 3: Aplicar Parche de Configuración del Adaptador via Variables de Entorno

Para despliegues sin acceso al archivo de configuración:

bash

Establecer variable de entorno antes de iniciar OpenClaw

export OPENCLAW_AZURE_RESPONSES_STRIP_REASONING=true export OPENCLAW_AZURE_RESPONSES_OUTPUT_FORMAT=text

Reiniciar la Puerta de Enlace OpenClaw

openclaw gateway restart

Opción 4: Actualización Directa de Configuración del Proveedor

Edita ~/.openclaw/config.yaml o el archivo de configuración activo:

yaml providers: AzureOpenAI-Three: type: azure-openai-responses baseUrl: “https://dy-aoai.openai.azure.com/openai/v1" apiKey: “${AZURE_OPENAI_API_KEY}”

modelDefaults:
  reasoning: false
  reasoningEffort: null

adapterOptions:
  outputFormat: "text"
  requireFollowingItem: true
  stripReasoningItems: true

models:
  - id: "gpt-5.3-chat"
    name: "GPT-5.3-Chat (Azure dy-aoai)"
    reasoning: false
    maxTokens: 131072
  
  - id: "gpt-5.2-codex"
    name: "GPT-5.2-Codex (Azure dy-aoai)"
    reasoning: false
    maxTokens: 131072

Opción 5: Corrección en Tiempo de Ejecución via CLI de OpenClaw

bash

Actualizar configuración del proveedor via CLI

openclaw config set-provider AzureOpenAI-Three
–adapter azure-openai-responses
–set reasoning=false
–set adapterOptions.stripReasoningItems=true

Verificar la actualización

openclaw config get-provider AzureOpenAI-Three

Reiniciar la puerta de enlace para aplicar los cambios

openclaw gateway restart

🧪 Verificación

Después de aplicar la corrección, verifica la resolución usando los siguientes pasos de validación:

Paso 1: Reiniciar la Puerta de Enlace y Verificar los Logs de Inicio

bash

Reiniciar la Puerta de Enlace de OpenClaw

openclaw gateway restart

Monitorear los logs de inicio para verificar la inicialización exitosa

tail -f ~/.openclaw/logs/gateway.log | grep -E “(startup|adapter|AzureOpenAI)”

Salida Esperada:

info gateway/startup {“message”:“Gateway started”,“port”:18792} info adapter/azure-openai-responses {“provider”:“AzureOpenAI-Three”,“status”:“initialized”,“outputFormat”:“text”,“stripReasoningItems”:true}

Paso 2: Probar via la Interfaz de Control de OpenClaw

  1. Abre la Interfaz de Control de OpenClaw en el navegador
  2. Selecciona gpt-5.3-chat o gpt-5.2-codex desde el menú desplegable de modelos
  3. Envía el prompt de prueba: "Hola, responde solo con 'OK'"
  4. Confirma la respuesta exitosa sin error 400

Paso 3: Verificar via Llamada API

bash curl -X POST http://localhost:18792/v1/chat/completions
-H “Content-Type: application/json”
-H “Authorization: Bearer ${OPENCLAW_API_KEY}”
-d ‘{ “model”: “gpt-5.3-chat”, “messages”: [{“role”: “user”, “content”: “Respond with OK”}], “provider”: “AzureOpenAI-Three” }’

Respuesta Esperada (200 OK): json { “id”: “chatcmpl-…”, “object”: “chat.completion”, “model”: “gpt-5.3-chat”, “choices”: [{ “message”: {“role”: “assistant”, “content”: “OK”}, “finish_reason”: “stop” }] }

Paso 4: Verificar la Estructura del Payload de Solicitud

Habilita el registro de depuración para inspeccionar el payload real enviado a Azure:

bash

Habilitar registro de depuración

export OPENCLAW_LOG_LEVEL=debug

Ejecutar una solicitud de prueba

openclaw chat “Hello” –model gpt-5.3-chat –provider AzureOpenAI-Three

Salida de Depuración Esperada (payload enviado a Azure): json { “model”: “gpt-5.3-chat”, “input”: { “messages”: […] }, “output”: [ // No reasoning items present when reasoning: false ] }

Paso 5: Verificar que No Hay Elementos de Razonamiento en los Logs

bash

Verificar logs en busca de errores de elemento de razonamiento (debe estar ausente)

grep -i “reasoning.*required following item” ~/.openclaw/logs/gateway.log

Esperado: sin salida (sin líneas coincidentes)

Verificación del Código de Salida: bash

Verificar que no hay errores 400 en los logs recientes

grep -c “400.*reasoning” ~/.openclaw/logs/gateway.log

Esperado: 0

⚠️ Errores comunes

Error Común 1: Conflicto de Configuración de Razonamiento entre Nivel de Modelo y Proveedor

Establecer reasoning: false solo a nivel de modelo puede no sobrescribir los valores predeterminados a nivel de proveedor. Asegúrate de que la configuración sea consistente en ambos niveles.

Incorrecto: json { “AzureOpenAI-Three”: { “models”: [{ “id”: “gpt-5.3-chat”, “reasoning”: false // Solo a nivel de modelo }] // Los valores predeterminados a nivel de proveedor pueden sobrescribir } }

Correcto: json { “AzureOpenAI-Three”: { “modelDefaults”: { “reasoning”: false }, “models”: [{ “id”: “gpt-5.3-chat”, “reasoning”: false // Explícito en ambos niveles }] } }

Error Común 2: Discrepancia del Adaptador de API

Usar "api": "openai-responses" en lugar de "api": "azure-openai-responses" puede enviar payloads en el formato incorrecto para los endpoints de Azure.

AdaptadorCaso de UsoFormato del Payload
azure-openai-responsesEndpoints directos de AzureAzure-specific v1/responses
openai-responsesProxies compatibles con OpenAIStandard Responses API

Asegúrate de que el adaptador coincida con tu tipo de despliegue.

Error Común 3: Falta api-key en los Encabezados para Azure

Los endpoints de Azure OpenAI requieren la clave API en los encabezados, no solo en el campo apiKey:

json { “AzureOpenAI-Three”: { “apiKey”: “tu-clave”, “headers”: { “api-key”: “tu-clave” // Requerido para Azure } } }

Error Común 4: Propagación de Variables de Entorno en Docker

Al ejecutar OpenClaw en Docker, las variables de entorno para la configuración del adaptador pueden no propagarse correctamente:

bash

Incorrecto: Variables establecidas fuera de docker run

export OPENCLAW_AZURE_RESPONSES_STRIP_REASONING=true docker run openclaw

Correcto: Pasar variables al contenedor

docker run -e OPENCLAW_AZURE_RESPONSES_STRIP_REASONING=true openclaw

Error Común 5: Configuración de Proveedor en Caché

OpenClaw puede almacenar en caché las configuraciones de proveedores. Fuerza una recarga de la configuración:

bash

Limpiar caché de configuración

rm -rf ~/.openclaw/cache/config/* openclaw gateway restart

O usar CLI para recargar

openclaw config reload

Error Común 6: Sensibilidad a Mayúsculas/Minúsculas en el ID del Modelo

Los despliegues de Azure OpenAI pueden tener IDs de modelo con distinción de mayúsculas/minúsculas. Verifica el nombre exacto del despliegue:

bash

Listar modelos disponibles desde el proveedor

openclaw models list –provider AzureOpenAI-Three

Error Común 7: Elementos de Razonamiento en el Historial de Conversación

Incluso si la solicitud inicial funciona, los elementos de razonamiento de turnos anteriores en el historial de conversación pueden provocar el error en solicitudes subsiguientes. Asegúrate de que el adaptador elimine los elementos de razonamiento del historial de conversación.

Verificar esto en conversaciones multi-turno: bash

Monitorear logs durante conversación multi-turno

tail -f ~/.openclaw/logs/gateway.log | grep -E “(reasoning|Item.*type.*reasoning)”

Error Común 8: Comportamiento Específico de Versión del Adaptador

OpenClaw 2026.4.8 puede tener requisitos específicos de versión del adaptador. Verifica la compatibilidad del adaptador:

bash openclaw –version openclaw adapters list

🔗 Errores relacionados

  • HTTP 400: "Invalid request format" — Fallo general de validación de solicitud de Azure OpenAI. Puede indicar problemas de estructura del payload más allá de los elementos de razonamiento.
  • HTTP 400: "Unsupported model" — El ID del modelo no es reconocido por el despliegue de Azure OpenAI. Verifica que el nombre del despliegue coincida con la configuración.
  • HTTP 401: "Authentication failed" — Clave API inválida o expirada. Asegúrate de que el encabezado `api-key` esté correctamente establecido para los endpoints de Azure.
  • HTTP 422: "Content filter triggered" — El filtro de contenido de Azure bloqueó la solicitud. Verifica el contenido del prompt y los filtros de contenido de Azure.
  • Error: "Item of type 'reasoning' was provided without its required following item" — El error específico documentado en esta guía. Indica bloque de razonamiento mal formado en el payload.
  • Error: "Token limit exceeded" — La solicitud excede la ventana de contexto del modelo o maxTokens. Reduce el tamaño del prompt o ajusta `maxTokens` en la configuración.
  • WebSocket 1001** — Puerta de enlace desconectada durante la conversación. Puede resultar de errores 400 no manejados propagándose a la Interfaz de Control.
  • Error: "ENOENT: no such file or directory"** — Fallo de acceso al archivo de memoria de sesión. No relacionado con el error del elemento de razonamiento pero puede aparecer en los mismos logs.

Referencias Históricas:

  • GitHub Issue #1847: Problemas de validación de payload del adaptador Azure OpenAI Responses
  • GitHub Issue #1923: Elementos de razonamiento no eliminados correctamente de conversaciones multi-turno
  • GitHub Discussion #456: Compatibilidad del modelo GPT-5 con los adaptadores de OpenClaw
  • Pull Request #2101: Corrección de validación del requisito de elemento siguiente para elementos de razonamiento

Evidencia y fuentes

Esta guía de solución de problemas fue sintetizada automáticamente por la tubería de inteligencia de FixClaw a partir de las discusiones de la comunidad.