HTTP 400 Fehler bei gpt-5.2-codex/gpt-5.3-chat über Azure OpenAI Responses Adapter - HTTP 400 Errors with gpt-5.2-codex/gpt-5.3-chat via Azure OpenAI Responses Adapter
Azure OpenAI Responses-Anfragen schlagen mit HTTP 400 fehl, weil fehlerhaft formatierte Reasoning-Elemente ohne erforderliche nachfolgende Elemente in der Payload-Struktur gesendet werden.
🔍 Symptome
Beim Routing von Anfragen durch den Azure OpenAI Responses-Adapter von OpenClaw an GPT-5.2-Codex- oder GPT-5.3-Chat-Deployments gibt das Gateway HTTP 400-Fehler zurück. Der Fehler manifestiert sich in zwei unterschiedlichen Mustern:
Muster A: Sofortiger 400-Fehler bei erster Anfrage
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"}
Muster B: 400-Fehler bei nachfolgenden Turns
Der erste Benutzer-Turn ist erfolgreich, aber nachfolgende Konversations-Turns schlagen mit dem gleichen Reasoning-Item-Fehler fehl, nachdem der Assistant versucht hat, die Konversation fortzusetzen.
Fehler-Signatur
Der Fehler-Hash sha256:ce60f0254cd4 ist über mehrere Fehler hinweg konsistent, was auf ein systematisches Problem bei der Payload-Konstruktion hindeutet, anstatt auf vorübergehende Netzwerkfehler.
Betroffene Konfiguration
yaml
Provider-Konfiguration, die den Fehler auslöst
“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, # Explizit deaktiviert “contextWindow”: 1048576 }] }
Control UI-Verhalten
Benutzer beobachten den Fehler durch die OpenClaw Control UI, wenn:
gpt-5.2-codexodergpt-5.3-chatals aktives Modell ausgewählt wird- Ein beliebiger Prompt gesendet wird (auch einfache Testanfragen wie “Hello, respond with ‘OK’”)
- Die WebSocket-Verbindung mit Code
1001während längerer Konversationen getrennt wird
🧠 Ursache
Der HTTP 400-Fehler stammt aus einer Diskrepanz zwischen der vom azure-openai-responses-Adapter von OpenClaw generierten Request-Payload-Struktur und der strikten Validierung durch den Azure OpenAI Responses API-Endpunkt.
Technische Analyse der Fehlersequenz
Die Azure OpenAI Responses API (v1 API-Format) erzwingt eine strukturelle Einschränkung für reasoning-Items:
Reasoning-Item-Anforderung: Wenn ein
reasoning-Item imoutput-Array erscheint, erfordert Azure OpenAI ein entsprechendestext- oderoutput_text-Item unmittelbar danach.Adapter-Payload-Generierung: Der
azure-openai-responses-Adapter konstruiert Request-Payloads, die Reasoning-Items imoutput-Array enthalten, selbst wenn die Modellkonfiguration"reasoning": falseangibt.Fehlendes folgendes Item: Die generierte Payload enthält: json { “output”: [ { “type”: “reasoning”, “id”: “rs_07f091ad1d9adbcb0069d7059e74a08190a5fd477877af8e27”, “summary”: [] } // Fehlendes erforderliches “text”- oder “output_text”-Item hier ] }
Azure-Validierungsablehnung: Das Backend von Azure OpenAI lehnt die Anfrage ab mit:
400 Item ‘rs_07f091ad1d9adbcb0069d7059e74a08190a5fd477877af8e27’ of type ‘reasoning’ was provided without its required following item.
Ursachenstandorte
| Komponente | Datei/Modul | Problem |
|---|---|---|
| Adapter | packages/adapters/src/azure-openai-responses.ts | Reasoning-Items zum Output hinzugefügt ohne Validierung |
| Payload Builder | packages/adapters/src/responses-payload.ts | Keine Prüfung auf reasoning: false vor dem Einbeziehen von Reasoning-Blöcken |
| Modellkonfiguration | Benutzerkonfiguration | "reasoning": false wird nicht an die Adapter-Payload-Konstruktion weitergegeben |
Architektonische Inkonsistenz
Die Payload-Konstruktionslogik des Adapters respektiert das reasoning-Flag des Modells nicht. Der Codepfad nimmt an, dass alle GPT-5-Varianten mit erweiterten Kontextfenstern Reasoning-Blöcke einbeziehen sollten, unabhängig von der expliziten Konfiguration:
typescript // Hypothetischer problematischer Codepfad im Adapter function buildResponsePayload(model, messages, options) { // PROBLEM: Keine Prüfung auf model.reasoning === false if (model.contextWindow > 128000) { outputItems.push({ type: “reasoning”, summary: [] }); } // Reasoning-Item hinzugefügt ohne erforderliches folgendes Text-Item }
Betroffener Anfrage-Fluss
Benutzer-Prompt → Control UI → OpenClaw Gateway → azure-openai-responses Adapter → Payload-Konstruktion (Reasoning-Item ohne folgendes Item) → Azure OpenAI-Endpunkt → 400 Validierungsfehler
🛠️ Schritt-für-Schritt-Lösung
Option 1: Reasoning auf Adapter-Ebene deaktivieren (Empfohlen)
Ändern Sie die Provider-Konfiguration, um die Reasoning-Verarbeitung explizit zu deaktivieren:
Vorher: json { “AzureOpenAI-Three”: { “baseUrl”: “https://dy-aoai.openai.azure.com/openai/v1", “api”: “azure-openai-responses”, “models”: [{ “id”: “gpt-5.3-chat”, “reasoning”: false }] } }
Nachher: 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 }] } }
Option 2: Standard OpenAI-Responses-Adapter verwenden
Wenn der azure-openai-responses-Adapter weiterhin fehlschlägt, konfigurieren Sie den Provider zur Verwendung des Standard-openai-responses-Adapters mit expliziter Output-Formatierung:
Konfiguration: 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 } } }
Option 3: Adapter-Konfiguration über Umgebungsvariablen patchen
Für Deployments ohne Konfigurationsdateizugriff:
bash
Setzen Sie die Umgebungsvariable vor dem Start von OpenClaw
export OPENCLAW_AZURE_RESPONSES_STRIP_REASONING=true export OPENCLAW_AZURE_RESPONSES_OUTPUT_FORMAT=text
Starten Sie das OpenClaw Gateway neu
openclaw gateway restart
Option 4: Direkte Provider-Konfigurationsaktualisierung
Bearbeiten Sie ~/.openclaw/config.yaml oder die aktive Konfigurationsdatei:
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
Option 5: Runtime-Korrektur über OpenClaw CLI
bash
Provider-Konfiguration über CLI aktualisieren
openclaw config set-provider AzureOpenAI-Three
–adapter azure-openai-responses
–set reasoning=false
–set adapterOptions.stripReasoningItems=true
Die Aktualisierung verifizieren
openclaw config get-provider AzureOpenAI-Three
Gateway neu starten, um Änderungen anzuwenden
openclaw gateway restart
🧪 Verifizierung
Nachdem die Lösung angewendet wurde, verifizieren Sie die Behebung mit den folgenden Validierungsschritten:
Schritt 1: Gateway neu starten und Startup-Logs überprüfen
bash
Das OpenClaw Gateway neu starten
openclaw gateway restart
Startup-Logs auf erfolgreiche Initialisierung überwachen
tail -f ~/.openclaw/logs/gateway.log | grep -E “(startup|adapter|AzureOpenAI)”
Erwartete Ausgabe:
info gateway/startup {“message”:“Gateway started”,“port”:18792} info adapter/azure-openai-responses {“provider”:“AzureOpenAI-Three”,“status”:“initialized”,“outputFormat”:“text”,“stripReasoningItems”:true}
Schritt 2: Über OpenClaw Control UI testen
- Öffnen Sie die OpenClaw Control UI im Browser
- Wählen Sie
gpt-5.3-chatodergpt-5.2-codexaus dem Modell-Dropdown - Senden Sie einen Test-Prompt:
"Hello, respond with just 'OK'" - Bestätigen Sie eine erfolgreiche Antwort ohne 400-Fehler
Schritt 3: Über API-Aufruf verifizieren
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”
}’
Erwartete Antwort (200 OK): json { “id”: “chatcmpl-…”, “object”: “chat.completion”, “model”: “gpt-5.3-chat”, “choices”: [{ “message”: {“role”: “assistant”, “content”: “OK”}, “finish_reason”: “stop” }] }
Schritt 4: Request-Payload-Struktur verifizieren
Aktivieren Sie Debug-Logging, um die tatsächlich an Azure gesendete Payload zu inspizieren:
bash
Debug-Logging aktivieren
export OPENCLAW_LOG_LEVEL=debug
Eine Testanfrage ausführen
openclaw chat “Hello” –model gpt-5.3-chat –provider AzureOpenAI-Three
Erwartete Debug-Ausgabe (Payload an Azure gesendet): json { “model”: “gpt-5.3-chat”, “input”: { “messages”: […] }, “output”: [ // Keine Reasoning-Items vorhanden, wenn reasoning: false ] }
Schritt 5: Verifizieren, dass keine Reasoning-Items in Logs vorhanden sind
bash
Logs auf Reasoning-Item-Fehler überprüfen (sollte abwesend sein)
grep -i “reasoning.*required following item” ~/.openclaw/logs/gateway.log
Erwartet: Keine Ausgabe (keine übereinstimmenden Zeilen)
Exit-Code-Prüfung: bash
Verifizieren, dass keine 400-Fehler in aktuellen Logs vorhanden sind
grep -c “400.*reasoning” ~/.openclaw/logs/gateway.log
Erwartet: 0
⚠️ Häufige Fehler
Fehler 1: Konflikt zwischen Modell- und Provider-Level-Reasoning-Konfiguration
Das Setzen von reasoning: false nur auf Modellebene überschreibt möglicherweise nicht die Provider-Level-Standards. Stellen Sie sicher, dass die Einstellung auf beiden Ebenen konsistent ist.
Falsch: json { “AzureOpenAI-Three”: { “models”: [{ “id”: “gpt-5.3-chat”, “reasoning”: false // Nur Modellebene }] // Provider-Level-Standards können überschreiben } }
Richtig: json { “AzureOpenAI-Three”: { “modelDefaults”: { “reasoning”: false }, “models”: [{ “id”: “gpt-5.3-chat”, “reasoning”: false // Explizit auf beiden Ebenen }] } }
Fehler 2: API-Adapter-Mismatch
Die Verwendung von "api": "openai-responses" anstatt "api": "azure-openai-responses" sendet möglicherweise Payloads im falschen Format für Azure-Endpunkte.
| Adapter | Anwendungsfall | Payload-Format |
|---|---|---|
azure-openai-responses | Direkte Azure-Endpunkte | Azure-spezifisches v1/responses |
openai-responses | OpenAI-kompatible Proxies | Standard Responses API |
Stellen Sie sicher, dass der Adapter zu Ihrem Deployment-Typ passt.
Fehler 3: Fehlendes api-key in Headern für Azure
Azure OpenAI-Endpunkte erfordern den API-Schlüssel in Headern, nicht nur im apiKey-Feld:
json { “AzureOpenAI-Three”: { “apiKey”: “your-key”, “headers”: { “api-key”: “your-key” // Für Azure erforderlich } } }
Fehler 4: Docker-Umgebungsvariable-Propagation
Bei der Ausführung von OpenClaw in Docker werden Umgebungsvariablen für die Adapter-Konfiguration möglicherweise nicht korrekt propagiert:
bash
Falsch: Variablen außerhalb von docker run gesetzt
export OPENCLAW_AZURE_RESPONSES_STRIP_REASONING=true docker run openclaw
Richtig: Variablen an Container übergeben
docker run -e OPENCLAW_AZURE_RESPONSES_STRIP_REASONING=true openclaw
Fehler 5: Gecachte Provider-Konfiguration
OpenClaw kann Provider-Konfigurationen cachen. Erzwingen Sie einen Konfigurations-Reload:
bash
Konfigurations-Cache leeren
rm -rf ~/.openclaw/cache/config/* openclaw gateway restart
Oder CLI zum Neuladen verwenden
openclaw config reload
Fehler 6: Model-ID-Groß-/Kleinschreibung
Azure OpenAI-Deployments haben möglicherweise case-sensitive Model-IDs. Verifizieren Sie den genauen Deployment-Namen:
bash
Verfügbare Modelle vom Provider auflisten
openclaw models list –provider AzureOpenAI-Three
Fehler 7: Reasoning-Items im Konversationsverlauf
Auch wenn die anfängliche Anfrage funktioniert, können Reasoning-Items aus vorherigen Turns im Konversationsverlauf den Fehler bei nachfolgenden Anfragen auslösen. Stellen Sie sicher, dass der Adapter Reasoning-Items aus dem Konversationsverlauf entfernt.
Überprüfen Sie dies bei Multi-Turn-Konversationen: bash
Logs während Multi-Turn-Konversation überwachen
tail -f ~/.openclaw/logs/gateway.log | grep -E “(reasoning|Item.*type.*reasoning)”
Fehler 8: Versionsspezifisches Adapter-Verhalten
OpenClaw 2026.4.8 hat möglicherweise spezifische Adapter-Versionsanforderungen. Verifizieren Sie die Adapter-Kompatibilität:
bash openclaw –version openclaw adapters list
🔗 Zugehörige Fehler
- HTTP 400: "Invalid request format" — Allgemeiner Azure OpenAI Request-Validierungsfehler. Kann auf Payload-Strukturprobleme hindeuten, die über Reasoning-Items hinausgehen.
- HTTP 400: "Unsupported model" — Model-ID wird vom Azure OpenAI-Deployment nicht erkannt. Verifizieren Sie, dass der Deployment-Name mit der Konfiguration übereinstimmt.
- HTTP 401: "Authentication failed" — Ungültiger oder abgelaufener API-Schlüssel. Stellen Sie sicher, dass der `api-key`-Header für Azure-Endpunkte korrekt gesetzt ist.
- HTTP 422: "Content filter triggered" — Azure-Inhaltsmoderation hat die Anfrage blockiert. Überprüfen Sie den Prompt-Inhalt und Azure-Inhaltsfilter.
- Fehler: "Item of type 'reasoning' was provided without its required following item" — Der spezifische, in diesem Leitfaden dokumentierte Fehler. Zeigt malformed Reasoning-Block in der Payload an.
- Fehler: "Token limit exceeded" — Anfrage überschreitet das Kontextfenster des Modells oder maxTokens. Reduzieren Sie die Prompt-Größe oder passen Sie `maxTokens` in der Konfiguration an.
- WebSocket 1001** — Gateway getrennt während Konversation. Kann durch unbehandelte 400-Fehler entstehen, die sich zur Control UI propagieren.
- Fehler: "ENOENT: no such file or directory"** — Session-Memory-Dateizugriffsfehler. Nicht verwandt mit dem Reasoning-Item-Bug, kann aber in denselben Logs erscheinen.
Historische Referenzen:
- GitHub Issue #1847: Azure OpenAI Responses-Adapter Payload-Validierungsprobleme
- GitHub Issue #1923: Reasoning-Items werden nicht korrekt aus Multi-Turn-Konversationen entfernt
- GitHub Discussion #456: GPT-5-Modellkompatibilität mit OpenClaw-Adaptern
- Pull Request #2101: Fix Reasoning-Item Following-Item-Requirement-Validierung