[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:
- Seleccionan
gpt-5.2-codexogpt-5.3-chatcomo el modelo activo - Envían cualquierprompt (incluso consultas de prueba simples como “Hola, responde con ‘OK’”)
- El WebSocket se desconecta con código
1001durante 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:
Requisito del Elemento de Razonamiento: Cuando aparece un elemento
reasoningen el arrayoutput, Azure OpenAI requiere un elementotextooutput_textcorrespondiente inmediatamente después de él.Generación del Payload por el Adaptador: El adaptador
azure-openai-responsesconstruye payloads de solicitud que incluyen elementos de razonamiento en el arrayoutput, incluso cuando la configuración del modelo especifica"reasoning": false.Elemento Siguiente Faltante: El payload generado contiene: json { “output”: [ { “type”: “reasoning”, “id”: “rs_07f091ad1d9adbcb0069d7059e74a08190a5fd477877af8e27”, “summary”: [] } // Missing required “text” or “output_text” item here ] }
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
| Componente | Archivo/Módulo | Problema |
|---|---|---|
| Adaptador | packages/adapters/src/azure-openai-responses.ts | Elementos de razonamiento añadidos al output sin validación |
| Constructor de Payload | packages/adapters/src/responses-payload.ts | Sin verificación de reasoning: false antes de incluir bloques de razonamiento |
| Configuración del Modelo | Configuració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
- Abre la Interfaz de Control de OpenClaw en el navegador
- Selecciona
gpt-5.3-chatogpt-5.2-codexdesde el menú desplegable de modelos - Envía el prompt de prueba:
"Hola, responde solo con 'OK'" - 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.
| Adaptador | Caso de Uso | Formato del Payload |
|---|---|---|
azure-openai-responses | Endpoints directos de Azure | Azure-specific v1/responses |
openai-responses | Proxies compatibles con OpenAI | Standard 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