























@@ -56,13 +56,15 @@ const OPENAI_CODEX_GPT_54_MODEL_ID = "gpt-5.4";
5656const OPENAI_CODEX_GPT_54_LEGACY_MODEL_ID = "gpt-5.4-codex";
5757const OPENAI_CODEX_GPT_54_MINI_MODEL_ID = "gpt-5.4-mini";
5858const OPENAI_CODEX_GPT_54_PRO_MODEL_ID = "gpt-5.4-pro";
59+const OPENAI_CODEX_GPT_53_SPARK_MODEL_ID = "gpt-5.3-codex-spark";
5960const OPENAI_CODEX_GPT_55_CODEX_CONTEXT_TOKENS = 400_000;
6061const OPENAI_CODEX_GPT_55_DEFAULT_RUNTIME_CONTEXT_TOKENS = 272_000;
6162const OPENAI_CODEX_GPT_55_PRO_NATIVE_CONTEXT_TOKENS = 1_000_000;
6263const OPENAI_CODEX_GPT_55_PRO_DEFAULT_CONTEXT_TOKENS = 272_000;
6364const OPENAI_CODEX_GPT_54_NATIVE_CONTEXT_TOKENS = 1_050_000;
6465const OPENAI_CODEX_GPT_54_DEFAULT_CONTEXT_TOKENS = 272_000;
6566const OPENAI_CODEX_GPT_54_MINI_NATIVE_CONTEXT_TOKENS = 400_000;
67+const OPENAI_CODEX_GPT_53_SPARK_CONTEXT_TOKENS = 128_000;
6668const OPENAI_CODEX_GPT_54_MAX_TOKENS = 128_000;
6769const OPENAI_CODEX_GPT_55_PRO_COST = {
6870input: 30,
@@ -105,6 +107,14 @@ const OPENAI_CODEX_MODERN_MODEL_IDS = [
105107OPENAI_CODEX_GPT_54_MODEL_ID,
106108OPENAI_CODEX_GPT_54_PRO_MODEL_ID,
107109OPENAI_CODEX_GPT_54_MINI_MODEL_ID,
110+OPENAI_CODEX_GPT_53_SPARK_MODEL_ID,
111+] as const;
112+const OPENAI_CODEX_IMAGE_CAPABLE_MODEL_IDS = [
113+OPENAI_CODEX_GPT_55_MODEL_ID,
114+OPENAI_CODEX_GPT_55_PRO_MODEL_ID,
115+OPENAI_CODEX_GPT_54_MODEL_ID,
116+OPENAI_CODEX_GPT_54_PRO_MODEL_ID,
117+OPENAI_CODEX_GPT_54_MINI_MODEL_ID,
108118] as const;
109119110120function isOpenAIOrLegacyCodexProvider(provider: string | undefined): boolean {
@@ -150,13 +160,13 @@ function hasImageInput(input: unknown): boolean {
150160function matchesOpenAICodexImageCapableModel(modelId: string, modelName?: string): boolean {
151161return [modelId, modelName]
152162.filter((value): value is string => typeof value === "string")
153-.some((candidate) => matchesExactOrPrefix(candidate, OPENAI_CODEX_MODERN_MODEL_IDS));
163+.some((candidate) => matchesExactOrPrefix(candidate, OPENAI_CODEX_IMAGE_CAPABLE_MODEL_IDS));
154164}
155165156166/**
157167 * Restore native `["text", "image"]` input capability on resolved Codex rows
158- * for the known modern model IDs (gpt-5.4, gpt-5.4-mini, gpt-5.4-pro, gpt-5.5,
159- * gpt-5.5-pro). Persisted/configured model rows can omit the `input` field
168+ * for known image-capable modern model IDs (gpt-5.4, gpt-5.4-mini,
169+ * gpt-5.4-pro, gpt-5.5, gpt-5.5-pro). Persisted/configured model rows can omit the `input` field
160170 * entirely when they were written by older OpenClaw versions. When that row wins
161171 * the catalog merge, `modelSupportsInput(entry, "image")` returns false and the
162172 * gateway's `chat.send` handler offloads inbound images as `media://inbound/<id>`
@@ -279,6 +289,15 @@ function resolveCodexForwardCompatModel(ctx: ProviderResolveDynamicModelContext)
279289maxTokens: OPENAI_CODEX_GPT_54_MAX_TOKENS,
280290cost: OPENAI_CODEX_GPT_54_MINI_COST,
281291};
292+} else if (lower === OPENAI_CODEX_GPT_53_SPARK_MODEL_ID) {
293+templateIds = OPENAI_CODEX_GPT_54_CATALOG_SYNTH_TEMPLATE_MODEL_IDS;
294+patch = {
295+input: ["text"],
296+contextWindow: OPENAI_CODEX_GPT_53_SPARK_CONTEXT_TOKENS,
297+contextTokens: OPENAI_CODEX_GPT_53_SPARK_CONTEXT_TOKENS,
298+maxTokens: OPENAI_CODEX_GPT_54_MAX_TOKENS,
299+cost: OPENAI_CODEX_GPT_54_MINI_COST,
300+};
282301} else {
283302return undefined;
284303}
@@ -312,7 +331,7 @@ function resolveCodexForwardCompatModel(ctx: ProviderResolveDynamicModelContext)
312331provider: PROVIDER_ID,
313332baseUrl: synthBaseUrl,
314333reasoning: true,
315-input: ["text", "image"],
334+input: patch?.input ?? ["text", "image"],
316335cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
317336contextWindow: patch?.contextWindow ?? DEFAULT_CONTEXT_TOKENS,
318337contextTokens: patch?.contextTokens,
@@ -583,6 +602,7 @@ export function buildOpenAICodexProviderHooks(): Pick<
583602OPENAI_CODEX_GPT_54_MODEL_ID,
584603OPENAI_CODEX_GPT_54_PRO_MODEL_ID,
585604OPENAI_CODEX_GPT_54_MINI_MODEL_ID,
605+OPENAI_CODEX_GPT_53_SPARK_MODEL_ID,
586606].includes(id);
587607},
588608 ...buildOpenAIResponsesProviderHooks(),
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。