@opengeni/codex 0.2.16 → 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.
- 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 +178 -39
- package/dist/index.js.map +1 -1
- package/dist/model-output-truncation.d.ts +21 -0
- package/dist/realtime.d.ts +15 -0
- package/dist/request-context.d.ts +3 -0
- package/package.json +2 -2
- package/src/constants.ts +9 -2
- package/src/fetch.ts +21 -2
- package/src/model-output-truncation.ts +61 -0
- package/src/normalize.ts +14 -2
- package/src/realtime.ts +169 -36
- package/src/request-context.ts +7 -0
- 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);
|
|
@@ -821,6 +828,12 @@ function opaqueProviderArtifactFingerprints(input) {
|
|
|
821
828
|
}
|
|
822
829
|
|
|
823
830
|
// src/fetch.ts
|
|
831
|
+
function emitRequestPreparationDiagnostic(ctx, phase) {
|
|
832
|
+
try {
|
|
833
|
+
ctx.onRequestPreparationDiagnostic?.(phase);
|
|
834
|
+
} catch {
|
|
835
|
+
}
|
|
836
|
+
}
|
|
824
837
|
var CODEX_TRANSPORT_ERROR_HEADER = "x-opengeni-codex-transport-error";
|
|
825
838
|
var CODEX_REQUEST_BODY_NORMALIZED_HEADER = "x-opengeni-request-body-normalized";
|
|
826
839
|
var REPLAYABLE_REQUEST_BODY_FACTORY = Symbol.for("opengeni.replayable-request-body-factory");
|
|
@@ -1230,6 +1243,7 @@ function codexSubscriptionFetch(base = globalThis.fetch) {
|
|
|
1230
1243
|
if (!ctx) {
|
|
1231
1244
|
return base(input, init);
|
|
1232
1245
|
}
|
|
1246
|
+
emitRequestPreparationDiagnostic(ctx, "transport_entry");
|
|
1233
1247
|
const rawUrl = typeof input === "string" ? input : input instanceof URL ? input.toString() : input.url;
|
|
1234
1248
|
const rewritten = rawUrl.replace(/(?<!\/codex)\/responses(\b|$)/, "/codex/responses$1");
|
|
1235
1249
|
const policy = resolveCodexResponseTimeoutPolicy(ctx.responseTimeoutPolicy);
|
|
@@ -1293,7 +1307,10 @@ function codexSubscriptionFetch(base = globalThis.fetch) {
|
|
|
1293
1307
|
throw new Error("Model request could not be prepared");
|
|
1294
1308
|
}
|
|
1295
1309
|
if (!bodyAlreadyNormalized) {
|
|
1296
|
-
ctx.onRequestOpaqueArtifacts?.({
|
|
1310
|
+
ctx.onRequestOpaqueArtifacts?.({
|
|
1311
|
+
requestId,
|
|
1312
|
+
fingerprints: requestOpaqueArtifacts
|
|
1313
|
+
});
|
|
1297
1314
|
}
|
|
1298
1315
|
headers.set(
|
|
1299
1316
|
"Idempotency-Key",
|
|
@@ -1319,6 +1336,7 @@ function codexSubscriptionFetch(base = globalThis.fetch) {
|
|
|
1319
1336
|
policy,
|
|
1320
1337
|
terminalOutcome: null
|
|
1321
1338
|
};
|
|
1339
|
+
emitRequestPreparationDiagnostic(ctx, "wire_request_ready");
|
|
1322
1340
|
await emitRequestEvent(audit, {
|
|
1323
1341
|
phase: "started",
|
|
1324
1342
|
responseObserved: false
|
|
@@ -1394,7 +1412,9 @@ function codexSubscriptionFetch(base = globalThis.fetch) {
|
|
|
1394
1412
|
return res;
|
|
1395
1413
|
};
|
|
1396
1414
|
try {
|
|
1397
|
-
|
|
1415
|
+
const token = await ctx.getToken();
|
|
1416
|
+
emitRequestPreparationDiagnostic(ctx, "credential_ready");
|
|
1417
|
+
let res = await attempt(token, 0);
|
|
1398
1418
|
if (res.status === 401) {
|
|
1399
1419
|
res = await attempt(await ctx.refresh(), 1);
|
|
1400
1420
|
}
|
|
@@ -2031,6 +2051,27 @@ function codexAppsSanitizingFetch(base = globalThis.fetch, namespaceSink) {
|
|
|
2031
2051
|
var MODEL_TOOL_OUTPUT_OVERSIZED_IMAGE_CARD_DATA_URL = "data:image/png;base64,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";
|
|
2032
2052
|
|
|
2033
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
|
+
}
|
|
2034
2075
|
var CODEX_MODEL_TOOL_OUTPUT_TRUNCATION_TOKENS = 1e4;
|
|
2035
2076
|
var CODEX_TOOL_OUTPUT_SERIALIZATION_ALLOWANCE = 1.2;
|
|
2036
2077
|
var DEFAULT_MODEL_TOOL_OUTPUT_TRUNCATION_TOKENS = CODEX_MODEL_TOOL_OUTPUT_TRUNCATION_TOKENS;
|
|
@@ -2595,8 +2636,9 @@ function boundedErrorMessage(body) {
|
|
|
2595
2636
|
}
|
|
2596
2637
|
|
|
2597
2638
|
// src/realtime.ts
|
|
2598
|
-
var CODEX_REALTIME_CALL_URL = `${CODEX_RESPONSES_BASE}/realtime/calls?intent=quicksilver&architecture=avas`;
|
|
2599
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;
|
|
2600
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;
|
|
2601
2643
|
var CODEX_REALTIME_VOICES = [
|
|
2602
2644
|
"juniper",
|
|
@@ -2617,15 +2659,99 @@ var CodexRealtimeError = class extends Error {
|
|
|
2617
2659
|
this.name = "CodexRealtimeError";
|
|
2618
2660
|
}
|
|
2619
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
|
+
}
|
|
2620
2733
|
async function createCodexRealtimeCall(auth, input, fetchImpl = fetch, options = {}) {
|
|
2621
2734
|
validateRealtimeInput(input);
|
|
2622
2735
|
const timeoutMs = options.timeoutMs ?? CODEX_REALTIME_CALL_TIMEOUT_MS;
|
|
2736
|
+
const providerConfig = options.providerConfig ?? FALLBACK_REALTIME_PROVIDER_CONFIG;
|
|
2623
2737
|
if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {
|
|
2624
2738
|
throw new CodexRealtimeError("invalid_request", "Codex realtime timeout must be positive");
|
|
2625
2739
|
}
|
|
2626
2740
|
if (options.signal?.aborted) {
|
|
2627
2741
|
throw new CodexRealtimeError("cancelled", "Codex realtime request cancelled");
|
|
2628
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
|
+
}
|
|
2629
2755
|
const controller = new AbortController();
|
|
2630
2756
|
let timedOut = false;
|
|
2631
2757
|
let timeout;
|
|
@@ -2646,40 +2772,43 @@ async function createCodexRealtimeCall(auth, input, fetchImpl = fetch, options =
|
|
|
2646
2772
|
}, timeoutMs);
|
|
2647
2773
|
});
|
|
2648
2774
|
const request = (async () => {
|
|
2649
|
-
const response = await fetchImpl(
|
|
2650
|
-
|
|
2651
|
-
|
|
2652
|
-
|
|
2653
|
-
|
|
2654
|
-
|
|
2655
|
-
|
|
2656
|
-
|
|
2657
|
-
|
|
2658
|
-
|
|
2659
|
-
|
|
2660
|
-
|
|
2661
|
-
|
|
2662
|
-
|
|
2663
|
-
|
|
2664
|
-
|
|
2665
|
-
|
|
2666
|
-
|
|
2667
|
-
|
|
2668
|
-
|
|
2669
|
-
|
|
2670
|
-
|
|
2671
|
-
|
|
2672
|
-
|
|
2673
|
-
|
|
2674
|
-
|
|
2675
|
-
|
|
2676
|
-
|
|
2677
|
-
|
|
2678
|
-
|
|
2679
|
-
|
|
2680
|
-
|
|
2681
|
-
|
|
2682
|
-
|
|
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
|
+
);
|
|
2683
2812
|
if (!response.ok) {
|
|
2684
2813
|
await response.body?.cancel().catch(() => void 0);
|
|
2685
2814
|
throw providerHttpError(response.status);
|
|
@@ -2723,6 +2852,9 @@ async function createCodexRealtimeCall(auth, input, fetchImpl = fetch, options =
|
|
|
2723
2852
|
options.signal?.removeEventListener("abort", onAbort);
|
|
2724
2853
|
}
|
|
2725
2854
|
}
|
|
2855
|
+
function validProviderValue(value) {
|
|
2856
|
+
return typeof value === "string" && value.length <= MAX_REALTIME_PROVIDER_VALUE_LENGTH && REALTIME_PROVIDER_VALUE.test(value);
|
|
2857
|
+
}
|
|
2726
2858
|
function selectCodexCredentialId(args) {
|
|
2727
2859
|
if (args.sessionPinnedCredentialId && args.connectedIds.has(args.sessionPinnedCredentialId)) {
|
|
2728
2860
|
return args.sessionPinnedCredentialId;
|
|
@@ -2883,11 +3015,15 @@ export {
|
|
|
2883
3015
|
CODEX_PROVIDER_ID,
|
|
2884
3016
|
CODEX_RATE_LIMIT_RESET_OUTCOMES,
|
|
2885
3017
|
CODEX_REALTIME_CALL_TIMEOUT_MS,
|
|
3018
|
+
CODEX_REALTIME_CONFIG_ID,
|
|
3019
|
+
CODEX_REALTIME_CONFIG_TIMEOUT_MS,
|
|
2886
3020
|
CODEX_REALTIME_CONTEXT_APPEND_MAX_BYTES,
|
|
2887
3021
|
CODEX_REALTIME_DEFAULT_VOICE,
|
|
2888
3022
|
CODEX_REALTIME_INITIAL_ITEMS_MAX_COUNT,
|
|
2889
3023
|
CODEX_REALTIME_INITIAL_ITEMS_MAX_TOKENS,
|
|
2890
3024
|
CODEX_REALTIME_MODEL,
|
|
3025
|
+
CODEX_REALTIME_PROVIDER_ARCHITECTURE_FALLBACK,
|
|
3026
|
+
CODEX_REALTIME_PROVIDER_MODEL_FALLBACK,
|
|
2891
3027
|
CODEX_REALTIME_V3_MAX_EVENT_BYTES,
|
|
2892
3028
|
CODEX_REALTIME_V3_MAX_IDENTIFIER_BYTES,
|
|
2893
3029
|
CODEX_REALTIME_V3_MAX_TEXT_BYTES,
|
|
@@ -2932,6 +3068,7 @@ export {
|
|
|
2932
3068
|
boundModelToolOutputItems,
|
|
2933
3069
|
buildCodexUsageWindowFromCache,
|
|
2934
3070
|
buildModelResolver,
|
|
3071
|
+
canonicalizePersistedHistoryItem,
|
|
2935
3072
|
classifyCodexEncryptedArtifactRejection,
|
|
2936
3073
|
classifyCodexResponseTimeoutError,
|
|
2937
3074
|
classifyCodexUsageLimitError,
|
|
@@ -2948,6 +3085,7 @@ export {
|
|
|
2948
3085
|
exchangeDeviceCode,
|
|
2949
3086
|
fetchCodexModels,
|
|
2950
3087
|
fetchCodexRateLimitResetCredits,
|
|
3088
|
+
fetchCodexRealtimeProviderConfig,
|
|
2951
3089
|
fetchCodexUsage,
|
|
2952
3090
|
generateCodexSubscriptionImage,
|
|
2953
3091
|
isCodexBilledModel,
|
|
@@ -2957,6 +3095,7 @@ export {
|
|
|
2957
3095
|
normalizeCodexRequestBody,
|
|
2958
3096
|
normalizeCodexUsage,
|
|
2959
3097
|
normalizedCodexRequestBody,
|
|
3098
|
+
omitOutputOnlyHistoryItemFields,
|
|
2960
3099
|
opaqueProviderArtifactFingerprint,
|
|
2961
3100
|
opaqueProviderArtifactFingerprints,
|
|
2962
3101
|
parseCodexRateLimitResetConsumeResponse,
|