diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index 754e1edd..0b0e1e16 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -2,6 +2,10 @@ ## [Unreleased] +### Fixed + +- Restored OpenAI GPT-5.4/GPT-5.5 and OpenAI Codex GPT-5.4/GPT-5.4 mini/GPT-5.5 context window metadata to the observed 272k-token Codex backend limit, avoiding a billing hazard from sending prompts above Codex's accepted limit (reported by [@trethore](https://github.com/trethore)). + ## [0.79.2] - 2026-06-12 ### Added diff --git a/packages/ai/scripts/generate-models.ts b/packages/ai/scripts/generate-models.ts index c74a6afc..1eaf9fe1 100644 --- a/packages/ai/scripts/generate-models.ts +++ b/packages/ai/scripts/generate-models.ts @@ -1367,7 +1367,7 @@ async function generateModels() { candidate.maxTokens = 128000; } if (candidate.provider === "openai" && (candidate.id === "gpt-5.4" || candidate.id === "gpt-5.5")) { - candidate.contextWindow = 1050000; + candidate.contextWindow = 272000; candidate.maxTokens = 128000; } // models.dev reports gpt-5-pro output as 272000 (a duplicate of the input sub-limit); @@ -1634,7 +1634,7 @@ async function generateModels() { cacheRead: 0.25, cacheWrite: 0, }, - contextWindow: 1050000, + contextWindow: 272000, maxTokens: 128000, }); } @@ -1761,9 +1761,9 @@ async function generateModels() { // OpenAI Codex (ChatGPT OAuth) models // NOTE: These are not fetched from models.dev; we keep a small, explicit list to avoid aliases. + // Context window is based on observed server limits (400s above ~272k), not marketing numbers. const CODEX_BASE_URL = "https://chatgpt.com/backend-api"; - const CODEX_GPT_54_CONTEXT = 1000000; - const CODEX_STANDARD_CONTEXT = 400000; + const CODEX_CONTEXT = 272000; const CODEX_SPARK_CONTEXT = 128000; const CODEX_MAX_TOKENS = 128000; const codexModels: Model<"openai-codex-responses">[] = [ @@ -1788,7 +1788,7 @@ async function generateModels() { reasoning: true, input: ["text", "image"], cost: { input: 2.5, output: 15, cacheRead: 0.25, cacheWrite: 0 }, - contextWindow: CODEX_GPT_54_CONTEXT, + contextWindow: CODEX_CONTEXT, maxTokens: CODEX_MAX_TOKENS, }, { @@ -1800,7 +1800,7 @@ async function generateModels() { reasoning: true, input: ["text", "image"], cost: { input: 0.75, output: 4.5, cacheRead: 0.075, cacheWrite: 0 }, - contextWindow: CODEX_STANDARD_CONTEXT, + contextWindow: CODEX_CONTEXT, maxTokens: CODEX_MAX_TOKENS, }, { @@ -1812,7 +1812,7 @@ async function generateModels() { reasoning: true, input: ["text", "image"], cost: { input: 5, output: 30, cacheRead: 0.5, cacheWrite: 0 }, - contextWindow: CODEX_STANDARD_CONTEXT, + contextWindow: CODEX_CONTEXT, maxTokens: CODEX_MAX_TOKENS, }, ]; diff --git a/packages/ai/src/models.generated.ts b/packages/ai/src/models.generated.ts index aa587f10..0b59d572 100644 --- a/packages/ai/src/models.generated.ts +++ b/packages/ai/src/models.generated.ts @@ -3945,24 +3945,6 @@ export const MODELS = { contextWindow: 131072, maxTokens: 32768, } satisfies Model<"anthropic-messages">, - "accounts/fireworks/models/kimi-k2p5": { - id: "accounts/fireworks/models/kimi-k2p5", - name: "Kimi K2.5", - api: "anthropic-messages", - provider: "fireworks", - baseUrl: "https://api.fireworks.ai/inference", - compat: {"sendSessionAffinityHeaders":true,"supportsEagerToolInputStreaming":false,"supportsCacheControlOnTools":false,"supportsLongCacheRetention":false}, - reasoning: true, - input: ["text", "image"], - cost: { - input: 0.6, - output: 3, - cacheRead: 0.1, - cacheWrite: 0, - }, - contextWindow: 256000, - maxTokens: 256000, - } satisfies Model<"anthropic-messages">, "accounts/fireworks/models/kimi-k2p6": { id: "accounts/fireworks/models/kimi-k2p6", name: "Kimi K2.6", @@ -3981,23 +3963,23 @@ export const MODELS = { contextWindow: 262000, maxTokens: 262000, } satisfies Model<"anthropic-messages">, - "accounts/fireworks/models/minimax-m2p5": { - id: "accounts/fireworks/models/minimax-m2p5", - name: "MiniMax-M2.5", + "accounts/fireworks/models/kimi-k2p7-code": { + id: "accounts/fireworks/models/kimi-k2p7-code", + name: "Kimi K2.7 Code", api: "anthropic-messages", provider: "fireworks", baseUrl: "https://api.fireworks.ai/inference", compat: {"sendSessionAffinityHeaders":true,"supportsEagerToolInputStreaming":false,"supportsCacheControlOnTools":false,"supportsLongCacheRetention":false}, reasoning: true, - input: ["text"], + input: ["text", "image"], cost: { - input: 0.3, - output: 1.2, - cacheRead: 0.03, + input: 0.95, + output: 4, + cacheRead: 0.19, cacheWrite: 0, }, - contextWindow: 196608, - maxTokens: 196608, + contextWindow: 262000, + maxTokens: 262000, } satisfies Model<"anthropic-messages">, "accounts/fireworks/models/minimax-m2p7": { id: "accounts/fireworks/models/minimax-m2p7", @@ -4017,9 +3999,27 @@ export const MODELS = { contextWindow: 196608, maxTokens: 196608, } satisfies Model<"anthropic-messages">, - "accounts/fireworks/models/qwen3p6-plus": { - id: "accounts/fireworks/models/qwen3p6-plus", - name: "Qwen 3.6 Plus", + "accounts/fireworks/models/minimax-m3": { + id: "accounts/fireworks/models/minimax-m3", + name: "MiniMax-M3", + api: "anthropic-messages", + provider: "fireworks", + baseUrl: "https://api.fireworks.ai/inference", + compat: {"sendSessionAffinityHeaders":true,"supportsEagerToolInputStreaming":false,"supportsCacheControlOnTools":false,"supportsLongCacheRetention":false}, + reasoning: true, + input: ["text"], + cost: { + input: 0.3, + output: 1.2, + cacheRead: 0.06, + cacheWrite: 0, + }, + contextWindow: 512000, + maxTokens: 512000, + } satisfies Model<"anthropic-messages">, + "accounts/fireworks/models/qwen3p7-plus": { + id: "accounts/fireworks/models/qwen3p7-plus", + name: "Qwen 3.7 Plus", api: "anthropic-messages", provider: "fireworks", baseUrl: "https://api.fireworks.ai/inference", @@ -4027,9 +4027,9 @@ export const MODELS = { reasoning: true, input: ["text", "image"], cost: { - input: 0.5, - output: 3, - cacheRead: 0.1, + input: 0.4, + output: 1.6, + cacheRead: 0.08, cacheWrite: 0, }, contextWindow: 262144, @@ -4089,6 +4089,24 @@ export const MODELS = { contextWindow: 262000, maxTokens: 262000, } satisfies Model<"anthropic-messages">, + "accounts/fireworks/routers/kimi-k2p7-code-fast": { + id: "accounts/fireworks/routers/kimi-k2p7-code-fast", + name: "Kimi K2.7 Code Fast", + api: "anthropic-messages", + provider: "fireworks", + baseUrl: "https://api.fireworks.ai/inference", + compat: {"sendSessionAffinityHeaders":true,"supportsEagerToolInputStreaming":false,"supportsCacheControlOnTools":false,"supportsLongCacheRetention":false}, + reasoning: true, + input: ["text", "image"], + cost: { + input: 2, + output: 8, + cacheRead: 0.38, + cacheWrite: 0, + }, + contextWindow: 262000, + maxTokens: 262000, + } satisfies Model<"anthropic-messages">, }, "github-copilot": { "claude-fable-5": { @@ -7382,7 +7400,7 @@ export const MODELS = { cacheRead: 0.25, cacheWrite: 0, }, - contextWindow: 1050000, + contextWindow: 272000, maxTokens: 128000, } satisfies Model<"openai-responses">, "gpt-5.4-mini": { @@ -7454,7 +7472,7 @@ export const MODELS = { cacheRead: 0.5, cacheWrite: 0, }, - contextWindow: 1050000, + contextWindow: 272000, maxTokens: 128000, } satisfies Model<"openai-responses">, "gpt-5.5-pro": { @@ -7646,7 +7664,7 @@ export const MODELS = { cacheRead: 0.25, cacheWrite: 0, }, - contextWindow: 1000000, + contextWindow: 272000, maxTokens: 128000, } satisfies Model<"openai-codex-responses">, "gpt-5.4-mini": { @@ -7664,7 +7682,7 @@ export const MODELS = { cacheRead: 0.075, cacheWrite: 0, }, - contextWindow: 400000, + contextWindow: 272000, maxTokens: 128000, } satisfies Model<"openai-codex-responses">, "gpt-5.5": { @@ -7682,7 +7700,7 @@ export const MODELS = { cacheRead: 0.5, cacheWrite: 0, }, - contextWindow: 400000, + contextWindow: 272000, maxTokens: 128000, } satisfies Model<"openai-codex-responses">, }, @@ -7705,25 +7723,6 @@ export const MODELS = { contextWindow: 200000, maxTokens: 32000, } satisfies Model<"openai-completions">, - "claude-fable-5": { - id: "claude-fable-5", - name: "Claude Fable 5", - api: "anthropic-messages", - provider: "opencode", - baseUrl: "https://opencode.ai/zen", - compat: {"forceAdaptiveThinking":true}, - reasoning: true, - thinkingLevelMap: {"off":null,"xhigh":"xhigh"}, - input: ["text", "image"], - cost: { - input: 10, - output: 50, - cacheRead: 1, - cacheWrite: 12.5, - }, - contextWindow: 1000000, - maxTokens: 128000, - } satisfies Model<"anthropic-messages">, "claude-haiku-4-5": { id: "claude-haiku-4-5", name: "Claude Haiku 4.5", @@ -13082,6 +13081,25 @@ export const MODELS = { contextWindow: 202752, maxTokens: 131072, } satisfies Model<"openai-completions">, + "MiniMaxAI/MiniMax-M3": { + id: "MiniMaxAI/MiniMax-M3", + name: "MiniMax-M3", + api: "openai-completions", + provider: "together", + baseUrl: "https://api.together.ai/v1", + compat: {"supportsStore":false,"supportsDeveloperRole":false,"supportsReasoningEffort":false,"maxTokensField":"max_tokens","supportsStrictMode":false,"supportsLongCacheRetention":false,"thinkingFormat":"together"}, + reasoning: true, + thinkingLevelMap: {"minimal":null,"low":null,"medium":null}, + input: ["text", "image"], + cost: { + input: 0.3, + output: 1.2, + cacheRead: 0.06, + cacheWrite: 0, + }, + contextWindow: 524288, + maxTokens: 250000, + } satisfies Model<"openai-completions">, "Qwen/Qwen2.5-7B-Instruct-Turbo": { id: "Qwen/Qwen2.5-7B-Instruct-Turbo", name: "Qwen 2.5 7B Instruct Turbo", @@ -13791,25 +13809,6 @@ export const MODELS = { contextWindow: 200000, maxTokens: 8192, } satisfies Model<"anthropic-messages">, - "anthropic/claude-fable-5": { - id: "anthropic/claude-fable-5", - name: "Claude Fable 5", - api: "anthropic-messages", - provider: "vercel-ai-gateway", - baseUrl: "https://ai-gateway.vercel.sh", - compat: {"forceAdaptiveThinking":true}, - reasoning: true, - thinkingLevelMap: {"off":null,"xhigh":"xhigh"}, - input: ["text", "image"], - cost: { - input: 10, - output: 50, - cacheRead: 1, - cacheWrite: 12.5, - }, - contextWindow: 1000000, - maxTokens: 128000, - } satisfies Model<"anthropic-messages">, "anthropic/claude-haiku-4.5": { id: "anthropic/claude-haiku-4.5", name: "Claude Haiku 4.5", diff --git a/packages/ai/test/openai-model-metadata.test.ts b/packages/ai/test/openai-model-metadata.test.ts deleted file mode 100644 index 64c593e1..00000000 --- a/packages/ai/test/openai-model-metadata.test.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { describe, expect, it } from "vitest"; -import { getModel } from "../src/models.ts"; - -describe("OpenAI model metadata", () => { - it("uses current GPT-5.4 and GPT-5.5 API context windows", () => { - expect(getModel("openai", "gpt-5.4").contextWindow).toBe(1050000); - expect(getModel("openai", "gpt-5.5").contextWindow).toBe(1050000); - }); - - it("uses current OpenAI Codex context windows", () => { - expect(getModel("openai-codex", "gpt-5.4").contextWindow).toBe(1000000); - expect(getModel("openai-codex", "gpt-5.4-mini").contextWindow).toBe(400000); - expect(getModel("openai-codex", "gpt-5.5").contextWindow).toBe(400000); - }); -});