@opengeni/codex 0.2.17 → 0.2.18-canary.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -27,6 +27,10 @@ var CODEX_REALTIME_MODEL = "gpt-live-1-boulder-alpha";
27
27
  var CODEX_REALTIME_VERSION = "v3";
28
28
  var CODEX_REALTIME_DEFAULT_VOICE = "cove";
29
29
  var CODEX_REALTIME_CALL_TIMEOUT_MS = 15e3;
30
+ var CODEX_REALTIME_CONFIG_TIMEOUT_MS = 5e3;
31
+ var CODEX_REALTIME_CONFIG_ID = "3566525122";
32
+ var CODEX_REALTIME_PROVIDER_MODEL_FALLBACK = "gpt-live-1-codex";
33
+ var CODEX_REALTIME_PROVIDER_ARCHITECTURE_FALLBACK = "avas";
30
34
  var CODEX_REFRESH_WINDOW_MS = 5 * 60 * 1e3;
31
35
  var CODEX_REFRESH_FALLBACK_MS = 8 * 24 * 60 * 60 * 1e3;
32
36
  var CODEX_RESPONSE_HEADERS_TIMEOUT_MS = 4 * 6e4;
@@ -66,6 +70,10 @@ export {
66
70
  CODEX_REALTIME_VERSION,
67
71
  CODEX_REALTIME_DEFAULT_VOICE,
68
72
  CODEX_REALTIME_CALL_TIMEOUT_MS,
73
+ CODEX_REALTIME_CONFIG_TIMEOUT_MS,
74
+ CODEX_REALTIME_CONFIG_ID,
75
+ CODEX_REALTIME_PROVIDER_MODEL_FALLBACK,
76
+ CODEX_REALTIME_PROVIDER_ARCHITECTURE_FALLBACK,
69
77
  CODEX_REFRESH_WINDOW_MS,
70
78
  CODEX_REFRESH_FALLBACK_MS,
71
79
  CODEX_RESPONSE_HEADERS_TIMEOUT_MS,
@@ -80,4 +88,4 @@ export {
80
88
  CODEX_APPS_STARTUP_TIMEOUT_MS,
81
89
  CODEX_APPS_REQUIRED_SCOPES
82
90
  };
83
- //# sourceMappingURL=chunk-HT463QWA.js.map
91
+ //# sourceMappingURL=chunk-UNB34NLA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/constants.ts"],"sourcesContent":["// Wire constants for the ChatGPT/Codex subscription backend.\n// Source: CODEX-SUBSCRIPTION-SPEC.md (verified against openai/codex codex-rs).\n\nexport const CODEX_ISSUER = \"https://auth.openai.com\";\nexport const CODEX_CLIENT_ID = \"app_EMoamEEZ73f0CkXaXp7hrann\"; // spec §1.1 (manager.rs:1444)\nexport const CODEX_AUTH_BASE = `${CODEX_ISSUER}/api/accounts`; // device endpoints (device_code_auth.rs:164)\nexport const CODEX_TOKEN_URL = `${CODEX_ISSUER}/oauth/token`; // exchange (form) + refresh (json)\nexport const CODEX_DEVICE_VERIFICATION_URL = `${CODEX_ISSUER}/codex/device`;\nexport const CODEX_DEVICE_REDIRECT_URI = `${CODEX_ISSUER}/deviceauth/callback`;\n\n// Model requests: base already includes /codex; client appends /responses, /models.\nexport const CODEX_RESPONSES_BASE = \"https://chatgpt.com/backend-api/codex\";\n// Usage lives on the WHAM base — NOT under /codex (verified, spec §1.8a).\nexport const CODEX_WHAM_BASE = \"https://chatgpt.com/backend-api\";\n\nexport const CODEX_ORIGINATOR = \"codex_cli_rs\"; // whitelisted originator (spec §1.2)\nexport const CODEX_ID_TOKEN_AUTH_CLAIM = \"https://api.openai.com/auth\";\n\n// Synthetic registry-provider identity. The provider's baseURL is the bare\n// /backend-api (NOT /codex) — codexSubscriptionFetch rewrites /responses ->\n// /codex/responses. Codex model ids are namespaced `codex/<slug>` so they never\n// collide with the built-in OpenAI provider's model ids; the fetch's resolveModel\n// strips the prefix before the slug reaches the backend.\nexport const CODEX_PROVIDER_ID = \"codex-subscription\";\nexport const CODEX_PROVIDER_BASE_URL = \"https://chatgpt.com/backend-api\";\nexport const CODEX_MODEL_ID_PREFIX = \"codex/\";\n\n// The only Codex subscription models OpenGeni exposes. The live GET /models\n// catalog must contain every exact slug; older or internal models never broaden\n// this product allowlist.\nexport const CODEX_FALLBACK_MODEL_SLUGS = [\"gpt-5.6-sol\", \"gpt-5.6-terra\", \"gpt-5.6-luna\"] as const;\n\n// Live Codex model-catalog values for every exposed gpt-5.6 subscription slug.\n// Verified 2026-07-18 against Codex CLI 0.144.6's freshly fetched\n// ~/.codex/models_cache.json and the matching openai/codex core derivations:\n// raw context window = 272,000\n// effective input window (95%) = 258,400\n// automatic compaction limit (90%) = 244,800\n// Keep all three explicit: the effective ceiling is a hard input guard while\n// the lower auto-compact limit is the proactive checkpoint trigger.\nexport const CODEX_MODEL_CONTEXT_WINDOW_TOKENS = 272_000;\nexport const CODEX_EFFECTIVE_CONTEXT_WINDOW_PERCENT = 95;\nexport const CODEX_MODEL_EFFECTIVE_CONTEXT_WINDOW_TOKENS = Math.floor(\n (CODEX_MODEL_CONTEXT_WINDOW_TOKENS * CODEX_EFFECTIVE_CONTEXT_WINDOW_PERCENT) / 100,\n);\nexport const CODEX_AUTO_COMPACTION_PERCENT = 90;\nexport const CODEX_MODEL_AUTO_COMPACT_TOKEN_LIMIT = Math.floor(\n (CODEX_MODEL_CONTEXT_WINDOW_TOKENS * CODEX_AUTO_COMPACTION_PERCENT) / 100,\n);\n\n// Sent as the `version` header and inside the User-Agent. Staging-proven on\n// 2026-07-09: 0.142.4 filtered every GPT-5.6 slug out of GET /models, while the\n// official Codex 0.144.0+ releases return all three exact slugs above. Keep\n// this pinned to the latest stable Codex release we have verified end-to-end.\nexport const CODEX_CLIENT_VERSION = \"0.145.0\";\n\n// Public OpenGeni selector for native ChatGPT/Codex subscription WebRTC. This\n// remains stable for persisted sessions; the provider's remotely configured\n// model is resolved separately before call creation.\nexport const CODEX_REALTIME_MODEL = \"gpt-live-1-boulder-alpha\";\nexport const CODEX_REALTIME_VERSION = \"v3\";\nexport const CODEX_REALTIME_DEFAULT_VOICE = \"cove\";\nexport const CODEX_REALTIME_CALL_TIMEOUT_MS = 15_000;\nexport const CODEX_REALTIME_CONFIG_TIMEOUT_MS = 5_000;\nexport const CODEX_REALTIME_CONFIG_ID = \"3566525122\";\n// Verified live on 2026-08-23. Used only when the authenticated remote config\n// is transiently unavailable or malformed; it is not the persisted model id.\nexport const CODEX_REALTIME_PROVIDER_MODEL_FALLBACK = \"gpt-live-1-codex\";\nexport const CODEX_REALTIME_PROVIDER_ARCHITECTURE_FALLBACK = \"avas\";\n\nexport const CODEX_REFRESH_WINDOW_MS = 5 * 60 * 1000; // proactive refresh when within 5 min of exp (spec §1.1)\nexport const CODEX_REFRESH_FALLBACK_MS = 8 * 24 * 60 * 60 * 1000; // 8 days when exp is unparseable\n\n// Codex Responses transport deadlines. The OpenAI SDK's own timeout only covers\n// the wait for response headers and erases the underlying timeout class into the\n// bare `Request timed out.` error. Keep the provider-specific budgets here so\n// the transport can enforce and durably report them without enabling the SDK's\n// blind request replay.\nexport const CODEX_RESPONSE_HEADERS_TIMEOUT_MS = 4 * 60_000;\nexport const CODEX_RESPONSE_STREAM_IDLE_TIMEOUT_MS = 5 * 60_000;\nexport const CODEX_RESPONSE_WHOLE_TIMEOUT_MS = 30 * 60_000;\n// Kept as a compatibility-shaped policy field, but automatic replay is disabled\n// until a provider-specific operation receipt can prove non-acceptance or resume\n// the same operation identity. An absent response does not prove that the\n// provider never accepted the request.\nexport const CODEX_RESPONSE_NO_BYTE_RETRIES = 0;\nexport const CODEX_RESPONSE_RETRY_BACKOFF_MS = 1_000;\n// Must exceed the transport-owned whole-response deadline. This SDK guard is a\n// last-resort envelope; the inner transport emits the typed/durable failure.\nexport const CODEX_RESPONSE_SDK_OUTER_TIMEOUT_MS = 35 * 60_000;\n\n// ── Apps / connectors MCP (spec §1.10, §E) ───────────────────────────────────\n// One server-side MCP exposes ALL the user's ChatGPT/Codex connectors\n// (gmail/github/linear/slack/sentry/drive/calendar/…). Streamable HTTP, always.\nexport const CODEX_APPS_MCP_SERVER_ID = \"codex_apps\"; // tools surface as mcp__codex_apps__<tool>\nexport const CODEX_APPS_MCP_SERVER_NAME = \"codex_apps\"; // MCP `name` — MUST equal the id so the SDK namespaces tools as mcp__codex_apps__*\nexport const CODEX_APPS_MCP_URL = \"https://chatgpt.com/backend-api/ps/mcp\"; // live URL (NOT /codex, NOT the legacy /wham/apps)\nexport const CODEX_APPS_STARTUP_TIMEOUT_MS = 30_000; // startup_timeout 30s (spec §1.10) — maps to timeoutMs on this server only\n// Connector scopes that the apps MCP requires. Present ONLY when granted at\n// browser-authorize time; the device-code path CANNOT be confirmed to grant\n// them, so treat connector availability as runtime-discovered (spec §1.10 / §E).\nexport const CODEX_APPS_REQUIRED_SCOPES = [\"api.connectors.read\", \"api.connectors.invoke\"] as const;\n"],"mappings":";AAGO,IAAM,eAAe;AACrB,IAAM,kBAAkB;AACxB,IAAM,kBAAkB,GAAG,YAAY;AACvC,IAAM,kBAAkB,GAAG,YAAY;AACvC,IAAM,gCAAgC,GAAG,YAAY;AACrD,IAAM,4BAA4B,GAAG,YAAY;AAGjD,IAAM,uBAAuB;AAE7B,IAAM,kBAAkB;AAExB,IAAM,mBAAmB;AACzB,IAAM,4BAA4B;AAOlC,IAAM,oBAAoB;AAC1B,IAAM,0BAA0B;AAChC,IAAM,wBAAwB;AAK9B,IAAM,6BAA6B,CAAC,eAAe,iBAAiB,cAAc;AAUlF,IAAM,oCAAoC;AAC1C,IAAM,yCAAyC;AAC/C,IAAM,8CAA8C,KAAK;AAAA,EAC7D,oCAAoC,yCAA0C;AACjF;AACO,IAAM,gCAAgC;AACtC,IAAM,uCAAuC,KAAK;AAAA,EACtD,oCAAoC,gCAAiC;AACxE;AAMO,IAAM,uBAAuB;AAK7B,IAAM,uBAAuB;AAC7B,IAAM,yBAAyB;AAC/B,IAAM,+BAA+B;AACrC,IAAM,iCAAiC;AACvC,IAAM,mCAAmC;AACzC,IAAM,2BAA2B;AAGjC,IAAM,yCAAyC;AAC/C,IAAM,gDAAgD;AAEtD,IAAM,0BAA0B,IAAI,KAAK;AACzC,IAAM,4BAA4B,IAAI,KAAK,KAAK,KAAK;AAOrD,IAAM,oCAAoC,IAAI;AAC9C,IAAM,wCAAwC,IAAI;AAClD,IAAM,kCAAkC,KAAK;AAK7C,IAAM,iCAAiC;AACvC,IAAM,kCAAkC;AAGxC,IAAM,sCAAsC,KAAK;AAKjD,IAAM,2BAA2B;AACjC,IAAM,6BAA6B;AACnC,IAAM,qBAAqB;AAC3B,IAAM,gCAAgC;AAItC,IAAM,6BAA6B,CAAC,uBAAuB,uBAAuB;","names":[]}
@@ -22,6 +22,10 @@ export declare const CODEX_REALTIME_MODEL = "gpt-live-1-boulder-alpha";
22
22
  export declare const CODEX_REALTIME_VERSION = "v3";
23
23
  export declare const CODEX_REALTIME_DEFAULT_VOICE = "cove";
24
24
  export declare const CODEX_REALTIME_CALL_TIMEOUT_MS = 15000;
25
+ export declare const CODEX_REALTIME_CONFIG_TIMEOUT_MS = 5000;
26
+ export declare const CODEX_REALTIME_CONFIG_ID = "3566525122";
27
+ export declare const CODEX_REALTIME_PROVIDER_MODEL_FALLBACK = "gpt-live-1-codex";
28
+ export declare const CODEX_REALTIME_PROVIDER_ARCHITECTURE_FALLBACK = "avas";
25
29
  export declare const CODEX_REFRESH_WINDOW_MS: number;
26
30
  export declare const CODEX_REFRESH_FALLBACK_MS: number;
27
31
  export declare const CODEX_RESPONSE_HEADERS_TIMEOUT_MS: number;
package/dist/constants.js CHANGED
@@ -22,8 +22,12 @@ import {
22
22
  CODEX_PROVIDER_BASE_URL,
23
23
  CODEX_PROVIDER_ID,
24
24
  CODEX_REALTIME_CALL_TIMEOUT_MS,
25
+ CODEX_REALTIME_CONFIG_ID,
26
+ CODEX_REALTIME_CONFIG_TIMEOUT_MS,
25
27
  CODEX_REALTIME_DEFAULT_VOICE,
26
28
  CODEX_REALTIME_MODEL,
29
+ CODEX_REALTIME_PROVIDER_ARCHITECTURE_FALLBACK,
30
+ CODEX_REALTIME_PROVIDER_MODEL_FALLBACK,
27
31
  CODEX_REALTIME_VERSION,
28
32
  CODEX_REFRESH_FALLBACK_MS,
29
33
  CODEX_REFRESH_WINDOW_MS,
@@ -36,7 +40,7 @@ import {
36
40
  CODEX_RESPONSE_WHOLE_TIMEOUT_MS,
37
41
  CODEX_TOKEN_URL,
38
42
  CODEX_WHAM_BASE
39
- } from "./chunk-HT463QWA.js";
43
+ } from "./chunk-UNB34NLA.js";
40
44
  export {
41
45
  CODEX_APPS_MCP_SERVER_ID,
42
46
  CODEX_APPS_MCP_SERVER_NAME,
@@ -61,8 +65,12 @@ export {
61
65
  CODEX_PROVIDER_BASE_URL,
62
66
  CODEX_PROVIDER_ID,
63
67
  CODEX_REALTIME_CALL_TIMEOUT_MS,
68
+ CODEX_REALTIME_CONFIG_ID,
69
+ CODEX_REALTIME_CONFIG_TIMEOUT_MS,
64
70
  CODEX_REALTIME_DEFAULT_VOICE,
65
71
  CODEX_REALTIME_MODEL,
72
+ CODEX_REALTIME_PROVIDER_ARCHITECTURE_FALLBACK,
73
+ CODEX_REALTIME_PROVIDER_MODEL_FALLBACK,
66
74
  CODEX_REALTIME_VERSION,
67
75
  CODEX_REFRESH_FALLBACK_MS,
68
76
  CODEX_REFRESH_WINDOW_MS,
package/dist/index.js CHANGED
@@ -22,8 +22,12 @@ import {
22
22
  CODEX_PROVIDER_BASE_URL,
23
23
  CODEX_PROVIDER_ID,
24
24
  CODEX_REALTIME_CALL_TIMEOUT_MS,
25
+ CODEX_REALTIME_CONFIG_ID,
26
+ CODEX_REALTIME_CONFIG_TIMEOUT_MS,
25
27
  CODEX_REALTIME_DEFAULT_VOICE,
26
28
  CODEX_REALTIME_MODEL,
29
+ CODEX_REALTIME_PROVIDER_ARCHITECTURE_FALLBACK,
30
+ CODEX_REALTIME_PROVIDER_MODEL_FALLBACK,
27
31
  CODEX_REALTIME_VERSION,
28
32
  CODEX_REFRESH_FALLBACK_MS,
29
33
  CODEX_REFRESH_WINDOW_MS,
@@ -36,7 +40,7 @@ import {
36
40
  CODEX_RESPONSE_WHOLE_TIMEOUT_MS,
37
41
  CODEX_TOKEN_URL,
38
42
  CODEX_WHAM_BASE
39
- } from "./chunk-HT463QWA.js";
43
+ } from "./chunk-UNB34NLA.js";
40
44
  import {
41
45
  CODEX_REALTIME_CONTEXT_APPEND_MAX_BYTES,
42
46
  CODEX_REALTIME_INITIAL_ITEMS_MAX_COUNT,
@@ -304,6 +308,9 @@ function normalizeCodexRequestBody(body, resolveModel) {
304
308
  if ("id" in record) {
305
309
  delete record.id;
306
310
  }
311
+ if ("status" in record) {
312
+ delete record.status;
313
+ }
307
314
  if (record.type === "tool_search_call" && typeof record.arguments === "string") {
308
315
  try {
309
316
  const parsed = JSON.parse(record.arguments);
@@ -335,7 +342,7 @@ function normalizedCodexRequestBody(body, resolveModel) {
335
342
  projected.input = body.input.map((item) => {
336
343
  if (!item || typeof item !== "object" || Array.isArray(item)) return item;
337
344
  const record = item;
338
- return "id" in record || record.type === "tool_search_call" && typeof record.arguments === "string" ? { ...record } : item;
345
+ return "id" in record || "status" in record || record.type === "tool_search_call" && typeof record.arguments === "string" ? { ...record } : item;
339
346
  });
340
347
  }
341
348
  return normalizeCodexRequestBody(projected, resolveModel);
@@ -2044,6 +2051,27 @@ function codexAppsSanitizingFetch(base = globalThis.fetch, namespaceSink) {
2044
2051
  var MODEL_TOOL_OUTPUT_OVERSIZED_IMAGE_CARD_DATA_URL = "data:image/png;base64,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";
2045
2052
 
2046
2053
  // src/model-output-truncation.ts
2054
+ function omitOutputOnlyHistoryItemFields(item) {
2055
+ if (!item || typeof item !== "object") {
2056
+ return item;
2057
+ }
2058
+ const providerData = item.providerData && typeof item.providerData === "object" ? item.providerData : null;
2059
+ const hasTopStatus = "status" in item;
2060
+ const hasNestedStatus = Boolean(providerData && "status" in providerData);
2061
+ if (!hasTopStatus && !hasNestedStatus) {
2062
+ return item;
2063
+ }
2064
+ const next = { ...item };
2065
+ if (hasTopStatus) delete next.status;
2066
+ if (hasNestedStatus && providerData) {
2067
+ const { status: _dropped, ...rest } = providerData;
2068
+ next.providerData = rest;
2069
+ }
2070
+ return next;
2071
+ }
2072
+ function canonicalizePersistedHistoryItem(item, policyTokens = DEFAULT_MODEL_TOOL_OUTPUT_TRUNCATION_TOKENS) {
2073
+ return boundModelToolOutputItem(omitOutputOnlyHistoryItemFields(item), policyTokens);
2074
+ }
2047
2075
  var CODEX_MODEL_TOOL_OUTPUT_TRUNCATION_TOKENS = 1e4;
2048
2076
  var CODEX_TOOL_OUTPUT_SERIALIZATION_ALLOWANCE = 1.2;
2049
2077
  var DEFAULT_MODEL_TOOL_OUTPUT_TRUNCATION_TOKENS = CODEX_MODEL_TOOL_OUTPUT_TRUNCATION_TOKENS;
@@ -2608,8 +2636,9 @@ function boundedErrorMessage(body) {
2608
2636
  }
2609
2637
 
2610
2638
  // src/realtime.ts
2611
- var CODEX_REALTIME_CALL_URL = `${CODEX_RESPONSES_BASE}/realtime/calls?intent=quicksilver&architecture=avas`;
2612
2639
  var MAX_REALTIME_SDP_BYTES = 1024 * 1024;
2640
+ var MAX_REALTIME_PROVIDER_VALUE_LENGTH = 128;
2641
+ var REALTIME_PROVIDER_VALUE = /^[a-z0-9][a-z0-9._-]*$/i;
2613
2642
  var REALTIME_CALL_ID = /^(?:rtc_.+|[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$/i;
2614
2643
  var CODEX_REALTIME_VOICES = [
2615
2644
  "juniper",
@@ -2630,15 +2659,99 @@ var CodexRealtimeError = class extends Error {
2630
2659
  this.name = "CodexRealtimeError";
2631
2660
  }
2632
2661
  };
2662
+ var FALLBACK_REALTIME_PROVIDER_CONFIG = {
2663
+ architecture: CODEX_REALTIME_PROVIDER_ARCHITECTURE_FALLBACK,
2664
+ model: CODEX_REALTIME_PROVIDER_MODEL_FALLBACK,
2665
+ version: CODEX_REALTIME_VERSION
2666
+ };
2667
+ async function fetchCodexRealtimeProviderConfig(auth, fetchImpl = fetch, options = {}) {
2668
+ if (options.signal?.aborted) {
2669
+ throw new CodexRealtimeError("cancelled", "Codex realtime request cancelled");
2670
+ }
2671
+ const controller = new AbortController();
2672
+ const timeoutMs = options.timeoutMs ?? CODEX_REALTIME_CONFIG_TIMEOUT_MS;
2673
+ const timeout = setTimeout(() => controller.abort(), timeoutMs);
2674
+ const onAbort = () => controller.abort(options.signal?.reason);
2675
+ options.signal?.addEventListener("abort", onAbort, { once: true });
2676
+ try {
2677
+ const response = await fetchImpl(`${CODEX_WHAM_BASE}/wham/statsig/bootstrap`, {
2678
+ method: "POST",
2679
+ headers: {
2680
+ ...codexSubscriptionHeaders(auth),
2681
+ "content-type": "application/json"
2682
+ },
2683
+ body: JSON.stringify({
2684
+ app_session_id: crypto.randomUUID(),
2685
+ app_version: auth.clientVersion,
2686
+ brand_name: "Codex",
2687
+ build_flavor: "stable",
2688
+ locale: "en-US",
2689
+ stable_id: auth.chatgptAccountId ?? "opengeni-server",
2690
+ system_name: "OpenGeni",
2691
+ system_version: "server",
2692
+ window_type: "local"
2693
+ }),
2694
+ signal: controller.signal
2695
+ });
2696
+ if (response.status === 401) {
2697
+ await response.body?.cancel().catch(() => void 0);
2698
+ throw new CodexRealtimeError(
2699
+ "authentication",
2700
+ "Codex subscription rejected authentication",
2701
+ response.status
2702
+ );
2703
+ }
2704
+ if (!response.ok) {
2705
+ await response.body?.cancel().catch(() => void 0);
2706
+ return FALLBACK_REALTIME_PROVIDER_CONFIG;
2707
+ }
2708
+ const outer = await response.json().catch(() => null);
2709
+ if (typeof outer?.statsigPayload !== "string") return FALLBACK_REALTIME_PROVIDER_CONFIG;
2710
+ const payload = JSON.parse(outer.statsigPayload);
2711
+ const value = payload.dynamic_configs?.[CODEX_REALTIME_CONFIG_ID]?.value;
2712
+ const version = value?.version;
2713
+ if (version !== void 0 && version !== CODEX_REALTIME_VERSION) {
2714
+ throw new CodexRealtimeError(
2715
+ "incompatible",
2716
+ `Codex realtime remote configuration requires ${String(version)}`
2717
+ );
2718
+ }
2719
+ const architecture = validProviderValue(value?.architecture) ? value.architecture : FALLBACK_REALTIME_PROVIDER_CONFIG.architecture;
2720
+ const model = validProviderValue(value?.model) ? value.model : FALLBACK_REALTIME_PROVIDER_CONFIG.model;
2721
+ return { architecture, model, version: CODEX_REALTIME_VERSION };
2722
+ } catch (error) {
2723
+ if (error instanceof CodexRealtimeError) throw error;
2724
+ if (options.signal?.aborted) {
2725
+ throw new CodexRealtimeError("cancelled", "Codex realtime request cancelled");
2726
+ }
2727
+ return FALLBACK_REALTIME_PROVIDER_CONFIG;
2728
+ } finally {
2729
+ clearTimeout(timeout);
2730
+ options.signal?.removeEventListener("abort", onAbort);
2731
+ }
2732
+ }
2633
2733
  async function createCodexRealtimeCall(auth, input, fetchImpl = fetch, options = {}) {
2634
2734
  validateRealtimeInput(input);
2635
2735
  const timeoutMs = options.timeoutMs ?? CODEX_REALTIME_CALL_TIMEOUT_MS;
2736
+ const providerConfig = options.providerConfig ?? FALLBACK_REALTIME_PROVIDER_CONFIG;
2636
2737
  if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {
2637
2738
  throw new CodexRealtimeError("invalid_request", "Codex realtime timeout must be positive");
2638
2739
  }
2639
2740
  if (options.signal?.aborted) {
2640
2741
  throw new CodexRealtimeError("cancelled", "Codex realtime request cancelled");
2641
2742
  }
2743
+ if (providerConfig.version !== CODEX_REALTIME_VERSION) {
2744
+ throw new CodexRealtimeError(
2745
+ "incompatible",
2746
+ `Codex realtime provider configuration requires ${providerConfig.version}`
2747
+ );
2748
+ }
2749
+ if (!validProviderValue(providerConfig.architecture) || !validProviderValue(providerConfig.model)) {
2750
+ throw new CodexRealtimeError(
2751
+ "invalid_request",
2752
+ "Codex realtime provider configuration is invalid"
2753
+ );
2754
+ }
2642
2755
  const controller = new AbortController();
2643
2756
  let timedOut = false;
2644
2757
  let timeout;
@@ -2659,40 +2772,43 @@ async function createCodexRealtimeCall(auth, input, fetchImpl = fetch, options =
2659
2772
  }, timeoutMs);
2660
2773
  });
2661
2774
  const request = (async () => {
2662
- const response = await fetchImpl(CODEX_REALTIME_CALL_URL, {
2663
- method: "POST",
2664
- headers: {
2665
- ...codexSubscriptionHeaders(auth),
2666
- "content-type": "application/json",
2667
- "openai-alpha": "quicksilver=v2",
2668
- "session-id": input.sessionId,
2669
- "thread-id": input.sessionId
2670
- },
2671
- body: JSON.stringify({
2672
- sdp: input.sdp,
2673
- session: {
2674
- instructions: input.instructions ?? "",
2675
- audio: {
2676
- output: { voice: input.voice ?? CODEX_REALTIME_DEFAULT_VOICE }
2677
- },
2678
- delegation: { type: "client" },
2679
- model: CODEX_REALTIME_MODEL,
2680
- ...input.initialItems?.length ? {
2681
- initial_items: input.initialItems.map((item) => ({
2682
- type: "message",
2683
- role: item.role,
2684
- content: [
2685
- {
2686
- type: item.role === "assistant" ? "output_text" : "input_text",
2687
- text: item.text
2688
- }
2689
- ]
2690
- }))
2691
- } : {}
2692
- }
2693
- }),
2694
- signal: controller.signal
2695
- });
2775
+ const response = await fetchImpl(
2776
+ `${CODEX_RESPONSES_BASE}/realtime/calls?intent=quicksilver&architecture=${encodeURIComponent(providerConfig.architecture)}`,
2777
+ {
2778
+ method: "POST",
2779
+ headers: {
2780
+ ...codexSubscriptionHeaders(auth),
2781
+ "content-type": "application/json",
2782
+ "openai-alpha": "quicksilver=v2",
2783
+ "session-id": input.sessionId,
2784
+ "thread-id": input.sessionId
2785
+ },
2786
+ body: JSON.stringify({
2787
+ sdp: input.sdp,
2788
+ session: {
2789
+ instructions: input.instructions ?? "",
2790
+ audio: {
2791
+ output: { voice: input.voice ?? CODEX_REALTIME_DEFAULT_VOICE }
2792
+ },
2793
+ delegation: { type: "client" },
2794
+ model: providerConfig.model,
2795
+ ...input.initialItems?.length ? {
2796
+ initial_items: input.initialItems.map((item) => ({
2797
+ type: "message",
2798
+ role: item.role,
2799
+ content: [
2800
+ {
2801
+ type: item.role === "assistant" ? "output_text" : "input_text",
2802
+ text: item.text
2803
+ }
2804
+ ]
2805
+ }))
2806
+ } : {}
2807
+ }
2808
+ }),
2809
+ signal: controller.signal
2810
+ }
2811
+ );
2696
2812
  if (!response.ok) {
2697
2813
  await response.body?.cancel().catch(() => void 0);
2698
2814
  throw providerHttpError(response.status);
@@ -2736,6 +2852,9 @@ async function createCodexRealtimeCall(auth, input, fetchImpl = fetch, options =
2736
2852
  options.signal?.removeEventListener("abort", onAbort);
2737
2853
  }
2738
2854
  }
2855
+ function validProviderValue(value) {
2856
+ return typeof value === "string" && value.length <= MAX_REALTIME_PROVIDER_VALUE_LENGTH && REALTIME_PROVIDER_VALUE.test(value);
2857
+ }
2739
2858
  function selectCodexCredentialId(args) {
2740
2859
  if (args.sessionPinnedCredentialId && args.connectedIds.has(args.sessionPinnedCredentialId)) {
2741
2860
  return args.sessionPinnedCredentialId;
@@ -2896,11 +3015,15 @@ export {
2896
3015
  CODEX_PROVIDER_ID,
2897
3016
  CODEX_RATE_LIMIT_RESET_OUTCOMES,
2898
3017
  CODEX_REALTIME_CALL_TIMEOUT_MS,
3018
+ CODEX_REALTIME_CONFIG_ID,
3019
+ CODEX_REALTIME_CONFIG_TIMEOUT_MS,
2899
3020
  CODEX_REALTIME_CONTEXT_APPEND_MAX_BYTES,
2900
3021
  CODEX_REALTIME_DEFAULT_VOICE,
2901
3022
  CODEX_REALTIME_INITIAL_ITEMS_MAX_COUNT,
2902
3023
  CODEX_REALTIME_INITIAL_ITEMS_MAX_TOKENS,
2903
3024
  CODEX_REALTIME_MODEL,
3025
+ CODEX_REALTIME_PROVIDER_ARCHITECTURE_FALLBACK,
3026
+ CODEX_REALTIME_PROVIDER_MODEL_FALLBACK,
2904
3027
  CODEX_REALTIME_V3_MAX_EVENT_BYTES,
2905
3028
  CODEX_REALTIME_V3_MAX_IDENTIFIER_BYTES,
2906
3029
  CODEX_REALTIME_V3_MAX_TEXT_BYTES,
@@ -2945,6 +3068,7 @@ export {
2945
3068
  boundModelToolOutputItems,
2946
3069
  buildCodexUsageWindowFromCache,
2947
3070
  buildModelResolver,
3071
+ canonicalizePersistedHistoryItem,
2948
3072
  classifyCodexEncryptedArtifactRejection,
2949
3073
  classifyCodexResponseTimeoutError,
2950
3074
  classifyCodexUsageLimitError,
@@ -2961,6 +3085,7 @@ export {
2961
3085
  exchangeDeviceCode,
2962
3086
  fetchCodexModels,
2963
3087
  fetchCodexRateLimitResetCredits,
3088
+ fetchCodexRealtimeProviderConfig,
2964
3089
  fetchCodexUsage,
2965
3090
  generateCodexSubscriptionImage,
2966
3091
  isCodexBilledModel,
@@ -2970,6 +3095,7 @@ export {
2970
3095
  normalizeCodexRequestBody,
2971
3096
  normalizeCodexUsage,
2972
3097
  normalizedCodexRequestBody,
3098
+ omitOutputOnlyHistoryItemFields,
2973
3099
  opaqueProviderArtifactFingerprint,
2974
3100
  opaqueProviderArtifactFingerprints,
2975
3101
  parseCodexRateLimitResetConsumeResponse,