@opengeni/codex 0.2.17 → 0.2.19-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.
- package/dist/{chunk-HT463QWA.js → chunk-UNB34NLA.js} +9 -1
- package/dist/chunk-UNB34NLA.js.map +1 -0
- package/dist/constants.d.ts +4 -0
- package/dist/constants.js +9 -1
- package/dist/index.js +163 -37
- package/dist/index.js.map +1 -1
- package/dist/model-output-truncation.d.ts +21 -0
- package/dist/realtime.d.ts +15 -0
- package/package.json +2 -2
- package/src/constants.ts +9 -2
- package/src/model-output-truncation.ts +61 -0
- package/src/normalize.ts +14 -2
- package/src/realtime.ts +169 -36
- package/dist/chunk-HT463QWA.js.map +0 -1
|
@@ -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-
|
|
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":[]}
|
package/dist/constants.d.ts
CHANGED
|
@@ -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-
|
|
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-
|
|
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(
|
|
2663
|
-
|
|
2664
|
-
|
|
2665
|
-
|
|
2666
|
-
|
|
2667
|
-
|
|
2668
|
-
|
|
2669
|
-
|
|
2670
|
-
|
|
2671
|
-
|
|
2672
|
-
|
|
2673
|
-
|
|
2674
|
-
|
|
2675
|
-
|
|
2676
|
-
|
|
2677
|
-
|
|
2678
|
-
|
|
2679
|
-
|
|
2680
|
-
|
|
2681
|
-
|
|
2682
|
-
|
|
2683
|
-
|
|
2684
|
-
|
|
2685
|
-
|
|
2686
|
-
|
|
2687
|
-
|
|
2688
|
-
|
|
2689
|
-
|
|
2690
|
-
|
|
2691
|
-
|
|
2692
|
-
|
|
2693
|
-
|
|
2694
|
-
|
|
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,
|