diff --git a/packages/ai/src/providers/openai-codex-responses.ts b/packages/ai/src/providers/openai-codex-responses.ts index db61ee383..2a15b7bc9 100644 --- a/packages/ai/src/providers/openai-codex-responses.ts +++ b/packages/ai/src/providers/openai-codex-responses.ts @@ -2151,14 +2151,29 @@ function recordCodexWebSocketFailure(state: CodexWebSocketSessionState, activate } } +function getCodexWebSocketEnvValue(): boolean | undefined { + const envVal = $env.PI_CODEX_WEBSOCKET; + if (envVal !== undefined) { + return $flag("PI_CODEX_WEBSOCKET"); + } + return undefined; +} + function shouldUseCodexWebSocket( model: Model<"openai-codex-responses">, state: CodexWebSocketSessionState | undefined, preferWebsockets?: boolean, ): boolean { + // Explicitly disabled by the model or session state. + if (model.preferWebsockets === false) return false; + // Explicitly disabled by the session state. if (!state || state.disableWebsocket) return false; + // Env val > Preference + const envVal = getCodexWebSocketEnvValue(); + if (envVal !== undefined) return envVal; + // Negative preference overrides model preference; otherwise use the model's preference. if (preferWebsockets === false) return false; - return $flag("PI_CODEX_WEBSOCKET") || preferWebsockets === true || model.preferWebsockets === true; + return true; } export interface OpenAICodexTransportDetails { @@ -2214,10 +2229,13 @@ export function getOpenAICodexTransportDetails( providerSessionState?: Map; }, ): OpenAICodexTransportDetails { + const envVal = getCodexWebSocketEnvValue(); const websocketPreferred = - options?.preferWebsockets === false - ? false - : $flag("PI_CODEX_WEBSOCKET") || options?.preferWebsockets === true || model.preferWebsockets === true; + envVal !== undefined + ? envVal + : options?.preferWebsockets === false + ? false + : options?.preferWebsockets === true || model.preferWebsockets === true; const state = getCodexWebSocketStateForPublicSession(model, options); return {