fix(ai): restore Codex context limits
This commit is contained in:
@@ -2,6 +2,10 @@
|
|||||||
|
|
||||||
## [Unreleased]
|
## [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
|
## [0.79.2] - 2026-06-12
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|||||||
@@ -1367,7 +1367,7 @@ async function generateModels() {
|
|||||||
candidate.maxTokens = 128000;
|
candidate.maxTokens = 128000;
|
||||||
}
|
}
|
||||||
if (candidate.provider === "openai" && (candidate.id === "gpt-5.4" || candidate.id === "gpt-5.5")) {
|
if (candidate.provider === "openai" && (candidate.id === "gpt-5.4" || candidate.id === "gpt-5.5")) {
|
||||||
candidate.contextWindow = 1050000;
|
candidate.contextWindow = 272000;
|
||||||
candidate.maxTokens = 128000;
|
candidate.maxTokens = 128000;
|
||||||
}
|
}
|
||||||
// models.dev reports gpt-5-pro output as 272000 (a duplicate of the input sub-limit);
|
// 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,
|
cacheRead: 0.25,
|
||||||
cacheWrite: 0,
|
cacheWrite: 0,
|
||||||
},
|
},
|
||||||
contextWindow: 1050000,
|
contextWindow: 272000,
|
||||||
maxTokens: 128000,
|
maxTokens: 128000,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -1761,9 +1761,9 @@ async function generateModels() {
|
|||||||
|
|
||||||
// OpenAI Codex (ChatGPT OAuth) models
|
// OpenAI Codex (ChatGPT OAuth) models
|
||||||
// NOTE: These are not fetched from models.dev; we keep a small, explicit list to avoid aliases.
|
// 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_BASE_URL = "https://chatgpt.com/backend-api";
|
||||||
const CODEX_GPT_54_CONTEXT = 1000000;
|
const CODEX_CONTEXT = 272000;
|
||||||
const CODEX_STANDARD_CONTEXT = 400000;
|
|
||||||
const CODEX_SPARK_CONTEXT = 128000;
|
const CODEX_SPARK_CONTEXT = 128000;
|
||||||
const CODEX_MAX_TOKENS = 128000;
|
const CODEX_MAX_TOKENS = 128000;
|
||||||
const codexModels: Model<"openai-codex-responses">[] = [
|
const codexModels: Model<"openai-codex-responses">[] = [
|
||||||
@@ -1788,7 +1788,7 @@ async function generateModels() {
|
|||||||
reasoning: true,
|
reasoning: true,
|
||||||
input: ["text", "image"],
|
input: ["text", "image"],
|
||||||
cost: { input: 2.5, output: 15, cacheRead: 0.25, cacheWrite: 0 },
|
cost: { input: 2.5, output: 15, cacheRead: 0.25, cacheWrite: 0 },
|
||||||
contextWindow: CODEX_GPT_54_CONTEXT,
|
contextWindow: CODEX_CONTEXT,
|
||||||
maxTokens: CODEX_MAX_TOKENS,
|
maxTokens: CODEX_MAX_TOKENS,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -1800,7 +1800,7 @@ async function generateModels() {
|
|||||||
reasoning: true,
|
reasoning: true,
|
||||||
input: ["text", "image"],
|
input: ["text", "image"],
|
||||||
cost: { input: 0.75, output: 4.5, cacheRead: 0.075, cacheWrite: 0 },
|
cost: { input: 0.75, output: 4.5, cacheRead: 0.075, cacheWrite: 0 },
|
||||||
contextWindow: CODEX_STANDARD_CONTEXT,
|
contextWindow: CODEX_CONTEXT,
|
||||||
maxTokens: CODEX_MAX_TOKENS,
|
maxTokens: CODEX_MAX_TOKENS,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -1812,7 +1812,7 @@ async function generateModels() {
|
|||||||
reasoning: true,
|
reasoning: true,
|
||||||
input: ["text", "image"],
|
input: ["text", "image"],
|
||||||
cost: { input: 5, output: 30, cacheRead: 0.5, cacheWrite: 0 },
|
cost: { input: 5, output: 30, cacheRead: 0.5, cacheWrite: 0 },
|
||||||
contextWindow: CODEX_STANDARD_CONTEXT,
|
contextWindow: CODEX_CONTEXT,
|
||||||
maxTokens: CODEX_MAX_TOKENS,
|
maxTokens: CODEX_MAX_TOKENS,
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -3945,24 +3945,6 @@ export const MODELS = {
|
|||||||
contextWindow: 131072,
|
contextWindow: 131072,
|
||||||
maxTokens: 32768,
|
maxTokens: 32768,
|
||||||
} satisfies Model<"anthropic-messages">,
|
} 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": {
|
"accounts/fireworks/models/kimi-k2p6": {
|
||||||
id: "accounts/fireworks/models/kimi-k2p6",
|
id: "accounts/fireworks/models/kimi-k2p6",
|
||||||
name: "Kimi K2.6",
|
name: "Kimi K2.6",
|
||||||
@@ -3981,23 +3963,23 @@ export const MODELS = {
|
|||||||
contextWindow: 262000,
|
contextWindow: 262000,
|
||||||
maxTokens: 262000,
|
maxTokens: 262000,
|
||||||
} satisfies Model<"anthropic-messages">,
|
} satisfies Model<"anthropic-messages">,
|
||||||
"accounts/fireworks/models/minimax-m2p5": {
|
"accounts/fireworks/models/kimi-k2p7-code": {
|
||||||
id: "accounts/fireworks/models/minimax-m2p5",
|
id: "accounts/fireworks/models/kimi-k2p7-code",
|
||||||
name: "MiniMax-M2.5",
|
name: "Kimi K2.7 Code",
|
||||||
api: "anthropic-messages",
|
api: "anthropic-messages",
|
||||||
provider: "fireworks",
|
provider: "fireworks",
|
||||||
baseUrl: "https://api.fireworks.ai/inference",
|
baseUrl: "https://api.fireworks.ai/inference",
|
||||||
compat: {"sendSessionAffinityHeaders":true,"supportsEagerToolInputStreaming":false,"supportsCacheControlOnTools":false,"supportsLongCacheRetention":false},
|
compat: {"sendSessionAffinityHeaders":true,"supportsEagerToolInputStreaming":false,"supportsCacheControlOnTools":false,"supportsLongCacheRetention":false},
|
||||||
reasoning: true,
|
reasoning: true,
|
||||||
input: ["text"],
|
input: ["text", "image"],
|
||||||
cost: {
|
cost: {
|
||||||
input: 0.3,
|
input: 0.95,
|
||||||
output: 1.2,
|
output: 4,
|
||||||
cacheRead: 0.03,
|
cacheRead: 0.19,
|
||||||
cacheWrite: 0,
|
cacheWrite: 0,
|
||||||
},
|
},
|
||||||
contextWindow: 196608,
|
contextWindow: 262000,
|
||||||
maxTokens: 196608,
|
maxTokens: 262000,
|
||||||
} satisfies Model<"anthropic-messages">,
|
} satisfies Model<"anthropic-messages">,
|
||||||
"accounts/fireworks/models/minimax-m2p7": {
|
"accounts/fireworks/models/minimax-m2p7": {
|
||||||
id: "accounts/fireworks/models/minimax-m2p7",
|
id: "accounts/fireworks/models/minimax-m2p7",
|
||||||
@@ -4017,9 +3999,27 @@ export const MODELS = {
|
|||||||
contextWindow: 196608,
|
contextWindow: 196608,
|
||||||
maxTokens: 196608,
|
maxTokens: 196608,
|
||||||
} satisfies Model<"anthropic-messages">,
|
} satisfies Model<"anthropic-messages">,
|
||||||
"accounts/fireworks/models/qwen3p6-plus": {
|
"accounts/fireworks/models/minimax-m3": {
|
||||||
id: "accounts/fireworks/models/qwen3p6-plus",
|
id: "accounts/fireworks/models/minimax-m3",
|
||||||
name: "Qwen 3.6 Plus",
|
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",
|
api: "anthropic-messages",
|
||||||
provider: "fireworks",
|
provider: "fireworks",
|
||||||
baseUrl: "https://api.fireworks.ai/inference",
|
baseUrl: "https://api.fireworks.ai/inference",
|
||||||
@@ -4027,9 +4027,9 @@ export const MODELS = {
|
|||||||
reasoning: true,
|
reasoning: true,
|
||||||
input: ["text", "image"],
|
input: ["text", "image"],
|
||||||
cost: {
|
cost: {
|
||||||
input: 0.5,
|
input: 0.4,
|
||||||
output: 3,
|
output: 1.6,
|
||||||
cacheRead: 0.1,
|
cacheRead: 0.08,
|
||||||
cacheWrite: 0,
|
cacheWrite: 0,
|
||||||
},
|
},
|
||||||
contextWindow: 262144,
|
contextWindow: 262144,
|
||||||
@@ -4089,6 +4089,24 @@ export const MODELS = {
|
|||||||
contextWindow: 262000,
|
contextWindow: 262000,
|
||||||
maxTokens: 262000,
|
maxTokens: 262000,
|
||||||
} satisfies Model<"anthropic-messages">,
|
} 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": {
|
"github-copilot": {
|
||||||
"claude-fable-5": {
|
"claude-fable-5": {
|
||||||
@@ -7382,7 +7400,7 @@ export const MODELS = {
|
|||||||
cacheRead: 0.25,
|
cacheRead: 0.25,
|
||||||
cacheWrite: 0,
|
cacheWrite: 0,
|
||||||
},
|
},
|
||||||
contextWindow: 1050000,
|
contextWindow: 272000,
|
||||||
maxTokens: 128000,
|
maxTokens: 128000,
|
||||||
} satisfies Model<"openai-responses">,
|
} satisfies Model<"openai-responses">,
|
||||||
"gpt-5.4-mini": {
|
"gpt-5.4-mini": {
|
||||||
@@ -7454,7 +7472,7 @@ export const MODELS = {
|
|||||||
cacheRead: 0.5,
|
cacheRead: 0.5,
|
||||||
cacheWrite: 0,
|
cacheWrite: 0,
|
||||||
},
|
},
|
||||||
contextWindow: 1050000,
|
contextWindow: 272000,
|
||||||
maxTokens: 128000,
|
maxTokens: 128000,
|
||||||
} satisfies Model<"openai-responses">,
|
} satisfies Model<"openai-responses">,
|
||||||
"gpt-5.5-pro": {
|
"gpt-5.5-pro": {
|
||||||
@@ -7646,7 +7664,7 @@ export const MODELS = {
|
|||||||
cacheRead: 0.25,
|
cacheRead: 0.25,
|
||||||
cacheWrite: 0,
|
cacheWrite: 0,
|
||||||
},
|
},
|
||||||
contextWindow: 1000000,
|
contextWindow: 272000,
|
||||||
maxTokens: 128000,
|
maxTokens: 128000,
|
||||||
} satisfies Model<"openai-codex-responses">,
|
} satisfies Model<"openai-codex-responses">,
|
||||||
"gpt-5.4-mini": {
|
"gpt-5.4-mini": {
|
||||||
@@ -7664,7 +7682,7 @@ export const MODELS = {
|
|||||||
cacheRead: 0.075,
|
cacheRead: 0.075,
|
||||||
cacheWrite: 0,
|
cacheWrite: 0,
|
||||||
},
|
},
|
||||||
contextWindow: 400000,
|
contextWindow: 272000,
|
||||||
maxTokens: 128000,
|
maxTokens: 128000,
|
||||||
} satisfies Model<"openai-codex-responses">,
|
} satisfies Model<"openai-codex-responses">,
|
||||||
"gpt-5.5": {
|
"gpt-5.5": {
|
||||||
@@ -7682,7 +7700,7 @@ export const MODELS = {
|
|||||||
cacheRead: 0.5,
|
cacheRead: 0.5,
|
||||||
cacheWrite: 0,
|
cacheWrite: 0,
|
||||||
},
|
},
|
||||||
contextWindow: 400000,
|
contextWindow: 272000,
|
||||||
maxTokens: 128000,
|
maxTokens: 128000,
|
||||||
} satisfies Model<"openai-codex-responses">,
|
} satisfies Model<"openai-codex-responses">,
|
||||||
},
|
},
|
||||||
@@ -7705,25 +7723,6 @@ export const MODELS = {
|
|||||||
contextWindow: 200000,
|
contextWindow: 200000,
|
||||||
maxTokens: 32000,
|
maxTokens: 32000,
|
||||||
} satisfies Model<"openai-completions">,
|
} 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": {
|
"claude-haiku-4-5": {
|
||||||
id: "claude-haiku-4-5",
|
id: "claude-haiku-4-5",
|
||||||
name: "Claude Haiku 4.5",
|
name: "Claude Haiku 4.5",
|
||||||
@@ -13082,6 +13081,25 @@ export const MODELS = {
|
|||||||
contextWindow: 202752,
|
contextWindow: 202752,
|
||||||
maxTokens: 131072,
|
maxTokens: 131072,
|
||||||
} satisfies Model<"openai-completions">,
|
} 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": {
|
"Qwen/Qwen2.5-7B-Instruct-Turbo": {
|
||||||
id: "Qwen/Qwen2.5-7B-Instruct-Turbo",
|
id: "Qwen/Qwen2.5-7B-Instruct-Turbo",
|
||||||
name: "Qwen 2.5 7B Instruct Turbo",
|
name: "Qwen 2.5 7B Instruct Turbo",
|
||||||
@@ -13791,25 +13809,6 @@ export const MODELS = {
|
|||||||
contextWindow: 200000,
|
contextWindow: 200000,
|
||||||
maxTokens: 8192,
|
maxTokens: 8192,
|
||||||
} satisfies Model<"anthropic-messages">,
|
} 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": {
|
"anthropic/claude-haiku-4.5": {
|
||||||
id: "anthropic/claude-haiku-4.5",
|
id: "anthropic/claude-haiku-4.5",
|
||||||
name: "Claude Haiku 4.5",
|
name: "Claude Haiku 4.5",
|
||||||
|
|||||||
@@ -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);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
Reference in New Issue
Block a user