From f8d731a134777b3d481df2cc6062c13404175703 Mon Sep 17 00:00:00 2001 From: Markus Ylisiurunen Date: Thu, 5 Mar 2026 21:17:55 +0200 Subject: [PATCH] fix codex context window and add a few tests --- packages/ai/src/models.generated.ts | 84 +++++++++++++++++-- packages/ai/test/openai-codex-stream.test.ts | 6 +- packages/ai/test/supports-xhigh.test.ts | 6 ++ .../coding-agent/test/model-resolver.test.ts | 5 ++ 4 files changed, 90 insertions(+), 11 deletions(-) diff --git a/packages/ai/src/models.generated.ts b/packages/ai/src/models.generated.ts index 4850e666..7b93c911 100644 --- a/packages/ai/src/models.generated.ts +++ b/packages/ai/src/models.generated.ts @@ -2287,6 +2287,23 @@ export const MODELS = { contextWindow: 128000, maxTokens: 32000, } satisfies Model<"azure-openai-responses">, + "gpt-5.4": { + id: "gpt-5.4", + name: "GPT-5.4", + api: "azure-openai-responses", + provider: "azure-openai-responses", + baseUrl: "", + reasoning: true, + input: ["text", "image"], + cost: { + input: 2.5, + output: 15, + cacheRead: 0.25, + cacheWrite: 0, + }, + contextWindow: 272000, + maxTokens: 128000, + } satisfies Model<"azure-openai-responses">, "o1": { id: "o1", name: "o1", @@ -5420,6 +5437,23 @@ export const MODELS = { contextWindow: 128000, maxTokens: 32000, } satisfies Model<"openai-responses">, + "gpt-5.4": { + id: "gpt-5.4", + name: "GPT-5.4", + api: "openai-responses", + provider: "openai", + baseUrl: "https://api.openai.com/v1", + reasoning: true, + input: ["text", "image"], + cost: { + input: 2.5, + output: 15, + cacheRead: 0.25, + cacheWrite: 0, + }, + contextWindow: 272000, + maxTokens: 128000, + } satisfies Model<"openai-responses">, "o1": { id: "o1", name: "o1", @@ -5677,6 +5711,23 @@ export const MODELS = { contextWindow: 128000, maxTokens: 128000, } satisfies Model<"openai-codex-responses">, + "gpt-5.4": { + id: "gpt-5.4", + name: "GPT-5.4", + api: "openai-codex-responses", + provider: "openai-codex", + baseUrl: "https://chatgpt.com/backend-api", + reasoning: true, + input: ["text", "image"], + cost: { + input: 2.5, + output: 15, + cacheRead: 0.25, + cacheWrite: 0, + }, + contextWindow: 272000, + maxTokens: 128000, + } satisfies Model<"openai-codex-responses">, }, "opencode": { "big-pickle": { @@ -6104,6 +6155,23 @@ export const MODELS = { contextWindow: 400000, maxTokens: 128000, } satisfies Model<"openai-responses">, + "gpt-5.3-codex-spark": { + id: "gpt-5.3-codex-spark", + name: "GPT-5.3 Codex Spark", + api: "openai-responses", + provider: "opencode", + baseUrl: "https://opencode.ai/zen/v1", + reasoning: true, + input: ["text"], + cost: { + input: 1.75, + output: 14, + cacheRead: 0.175, + cacheWrite: 0, + }, + contextWindow: 128000, + maxTokens: 128000, + } satisfies Model<"openai-responses">, "gpt-5.4": { id: "gpt-5.4", name: "GPT-5.4", @@ -6118,7 +6186,7 @@ export const MODELS = { cacheRead: 0.25, cacheWrite: 0, }, - contextWindow: 1050000, + contextWindow: 272000, maxTokens: 128000, } satisfies Model<"openai-responses">, "kimi-k2.5": { @@ -7987,13 +8055,13 @@ export const MODELS = { reasoning: true, input: ["text", "image"], cost: { - input: 0.41, - output: 2.06, - cacheRead: 0.07, + input: 0.44999999999999996, + output: 2.2, + cacheRead: 0.22499999999999998, cacheWrite: 0, }, contextWindow: 262144, - maxTokens: 4096, + maxTokens: 65535, } satisfies Model<"openai-completions">, "nex-agi/deepseek-v3.1-nex-n1": { id: "nex-agi/deepseek-v3.1-nex-n1", @@ -10333,9 +10401,9 @@ export const MODELS = { reasoning: true, input: ["text"], cost: { - input: 0.6, - output: 1.9, - cacheRead: 0.119, + input: 0.7999999999999999, + output: 2.56, + cacheRead: 0.16, cacheWrite: 0, }, contextWindow: 202752, diff --git a/packages/ai/test/openai-codex-stream.test.ts b/packages/ai/test/openai-codex-stream.test.ts index 8f7685cf..2220c398 100644 --- a/packages/ai/test/openai-codex-stream.test.ts +++ b/packages/ai/test/openai-codex-stream.test.ts @@ -231,7 +231,7 @@ describe("openai-codex streaming", () => { await streamResult.result(); }); - it("clamps gpt-5.3-codex minimal reasoning effort to low", async () => { + it.each(["gpt-5.3-codex", "gpt-5.4"])("clamps %s minimal reasoning effort to low", async (modelId) => { const tempDir = mkdtempSync(join(tmpdir(), "pi-codex-stream-")); process.env.PI_CODING_AGENT_DIR = tempDir; @@ -303,8 +303,8 @@ describe("openai-codex streaming", () => { global.fetch = fetchMock as typeof fetch; const model: Model<"openai-codex-responses"> = { - id: "gpt-5.3-codex", - name: "GPT-5.3 Codex", + id: modelId, + name: modelId, api: "openai-codex-responses", provider: "openai-codex", baseUrl: "https://chatgpt.com/backend-api", diff --git a/packages/ai/test/supports-xhigh.test.ts b/packages/ai/test/supports-xhigh.test.ts index d740e778..e7bc5aa6 100644 --- a/packages/ai/test/supports-xhigh.test.ts +++ b/packages/ai/test/supports-xhigh.test.ts @@ -14,6 +14,12 @@ describe("supportsXhigh", () => { expect(supportsXhigh(model!)).toBe(false); }); + it("returns true for GPT-5.4 models", () => { + const model = getModel("openai-codex", "gpt-5.4"); + expect(model).toBeDefined(); + expect(supportsXhigh(model!)).toBe(true); + }); + it("returns false for OpenRouter Opus 4.6 (openai-completions API)", () => { const model = getModel("openrouter", "anthropic/claude-opus-4.6"); expect(model).toBeDefined(); diff --git a/packages/coding-agent/test/model-resolver.test.ts b/packages/coding-agent/test/model-resolver.test.ts index 3f3ab977..70eeb7bd 100644 --- a/packages/coding-agent/test/model-resolver.test.ts +++ b/packages/coding-agent/test/model-resolver.test.ts @@ -373,6 +373,11 @@ describe("resolveCliModel", () => { }); describe("default model selection", () => { + test("openai defaults are gpt-5.4", () => { + expect(defaultModelPerProvider.openai).toBe("gpt-5.4"); + expect(defaultModelPerProvider["openai-codex"]).toBe("gpt-5.4"); + }); + test("ai-gateway default is opus 4.6", () => { expect(defaultModelPerProvider["vercel-ai-gateway"]).toBe("anthropic/claude-opus-4-6"); });