-
-
Notifications
You must be signed in to change notification settings - Fork 52.8k
Description
Bug Report
Every request with openai-codex/gpt-5.3-codex (Codex subscription via OAuth) fails immediately:
run error: {"detail":"Store must be set to false"}
Root Cause
isDirectOpenAIBaseUrl() in src/agents/pi-embedded-runner/extra-params.ts (line 107) returns true for empty/falsy baseUrl:
if (typeof baseUrl !== "string" || !baseUrl.trim()) {
return true; // BUG: empty string != direct OpenAI
}gpt-5.3-codex is registered in models.generated.js with baseUrl: "" and provider: "azure-openai-responses". The empty baseUrl causes shouldForceResponsesStore() -> createOpenAIResponsesStoreWrapper() (line 149) to force store = true on the request payload. OpenAI then rejects it.
Call chain:
applyExtraParamsToAgent() (line 213)
+-- createOpenAIResponsesStoreWrapper() (line 137)
+-- shouldForceResponsesStore(model) (line 120)
+-- isDirectOpenAIBaseUrl(model.baseUrl) (line 107)
+-- baseUrl is "" -> !("".trim()) -> true <- BUG
+-- wrapper forces store = true
+-- OpenAI rejects
Additionally, azure-openai-responses.js in @mariozechner/pi-ai never sets store: false in buildParams(), unlike openai-codex-responses.js and openai-responses.js which both do.
Suggested Fix
Simply changing isDirectOpenAIBaseUrl() to return false for empty strings would break actual direct OpenAI models that also have empty baseUrl and legitimately need store: true for multi-turn server-side state.
The fix should be in shouldForceResponsesStore() — exclude azure-openai-responses from the providers that force store, since azure-routed models shouldn't have store: true forced even if they ultimately reach OpenAI:
function shouldForceResponsesStore(model: {
api?: unknown;
provider?: unknown;
baseUrl?: unknown;
}): boolean {
if (typeof model.api !== "string" || typeof model.provider !== "string") {
return false;
}
if (!OPENAI_RESPONSES_APIS.has(model.api)) {
return false;
}
// Azure-routed models should not have store forced to true
if (model.provider === "azure-openai-responses") {
return false;
}
if (!OPENAI_RESPONSES_PROVIDERS.has(model.provider)) {
return false;
}
return isDirectOpenAIBaseUrl(model.baseUrl);
}As defense-in-depth, azure-openai-responses.js buildParams() should also explicitly set store: false, matching the other two providers.
Steps to Reproduce
- Set up OpenClaw with Codex subscription (OAuth)
- Configure
openai-codex/gpt-5.3-codexas primary model - Send any message
- Observe:
run error: {"detail":"Store must be set to false"}
Expected Behavior
Requests should succeed. The store parameter should remain false for models routed through azure-openai-responses with empty baseUrl.
Environment
- OpenClaw version: 2026.2.15
- Provider: openai-codex (Codex subscription, OAuth)
- Model: openai-codex/gpt-5.3-codex
- Runtime: Docker
- pi-ai: @mariozechner/pi-ai@0.52.12
- OS: Linux (Docker)
Log Output
[openclaw] {"detail":"Store must be set to false"}
run error: {"detail":"Store must be set to false"}
connected | error
agent main | session main (openclaw-tui) | openai-codex/gpt-5.3-codex | think low | tokens 188k/272k (69%)
Related
extra-params.tsL106-117 -isDirectOpenAIBaseUrl()extra-params.tsL210-213 - wrapper applied unconditionally@mariozechner/pi-aiproviders/azure-openai-responses.js- missingstore: falseinbuildParams()