From 8c9436407cc46f6d0c0ddfe10bcb2027ae1f740b Mon Sep 17 00:00:00 2001 From: Vegard Stikbakke Date: Wed, 1 Jul 2026 10:53:09 +0200 Subject: [PATCH] fix(ai): remove stale model metadata fallbacks --- packages/ai/scripts/generate-models.ts | 210 ------------------ .../ai/src/providers/amazon-bedrock.models.ts | 8 +- 2 files changed, 4 insertions(+), 214 deletions(-) diff --git a/packages/ai/scripts/generate-models.ts b/packages/ai/scripts/generate-models.ts index fcb52690..74a70c8d 100644 --- a/packages/ai/scripts/generate-models.ts +++ b/packages/ai/scripts/generate-models.ts @@ -68,8 +68,6 @@ const KIMI_STATIC_HEADERS = { "User-Agent": "KimiCLI/1.5", } as const; -const MOONSHOT_CN_MIRRORED_MODEL_IDS = new Set(["kimi-k2.7-code", "kimi-k2.7-code-highspeed"]); - const TOGETHER_BASE_URL = "https://api.together.ai/v1"; const TOGETHER_BASE_COMPAT: OpenAICompletionsCompat = { supportsStore: false, @@ -1502,16 +1500,6 @@ async function loadModelsDevData(): Promise[]> { "moonshotai-cn": getMoonshotProviderModels("moonshotai-cn"), }; - // models.dev can lag the CN catalog while the global Moonshot catalog already - // has the model. Mirror selected current model IDs into moonshotai-cn until - // upstream CN metadata catches up. - for (const modelId of MOONSHOT_CN_MIRRORED_MODEL_IDS) { - const model = moonshotModels.moonshotai[modelId]; - if (model && !moonshotModels["moonshotai-cn"][modelId]) { - moonshotModels["moonshotai-cn"][modelId] = model; - } - } - for (const { key, provider, baseUrl } of moonshotVariants) { for (const [modelId, m] of Object.entries(moonshotModels[key])) { if (m.tool_call !== true) continue; @@ -1604,20 +1592,8 @@ async function generateModels() { !((model.provider === "opencode" || model.provider === "opencode-go") && model.id === "gpt-5.3-codex-spark"), ); - // Fix incorrect cache pricing for Claude Opus 4.5 from models.dev - // models.dev has 3x the correct pricing (1.5/18.75 instead of 0.5/6.25) - const opus45 = allModels.find(m => m.provider === "anthropic" && m.id === "claude-opus-4-5"); - if (opus45) { - opus45.cost.cacheRead = 0.5; - opus45.cost.cacheWrite = 6.25; - } - // Temporary overrides until upstream model metadata is corrected. for (const candidate of allModels) { - if (candidate.provider === "amazon-bedrock" && candidate.id.includes("anthropic.claude-opus-4-6-v1")) { - candidate.cost.cacheRead = 0.5; - candidate.cost.cacheWrite = 6.25; - } if ( (candidate.provider === "anthropic" || candidate.provider === "opencode" || @@ -1678,132 +1654,6 @@ async function generateModels() { } - // Add missing EU Opus 4.6 profile - if (!allModels.some((m) => m.provider === "amazon-bedrock" && m.id === "eu.anthropic.claude-opus-4-6-v1")) { - allModels.push({ - id: "eu.anthropic.claude-opus-4-6-v1", - name: "Claude Opus 4.6 (EU)", - api: "bedrock-converse-stream", - provider: "amazon-bedrock", - baseUrl: getBedrockBaseUrl("eu.anthropic.claude-opus-4-6-v1"), - reasoning: true, - input: ["text", "image"], - cost: { - input: 5, - output: 25, - cacheRead: 0.5, - cacheWrite: 6.25, - }, - contextWindow: 200000, - maxTokens: 128000, - }); - } - - // Add missing Claude Opus 4.6 - if (!allModels.some(m => m.provider === "anthropic" && m.id === "claude-opus-4-6")) { - allModels.push({ - id: "claude-opus-4-6", - name: "Claude Opus 4.6", - api: "anthropic-messages", - baseUrl: "https://api.anthropic.com", - provider: "anthropic", - reasoning: true, - input: ["text", "image"], - cost: { - input: 5, - output: 25, - cacheRead: 0.5, - cacheWrite: 6.25, - }, - contextWindow: 1000000, - maxTokens: 128000, - }); - } - - // Add missing Claude Opus 4.7 - if (!allModels.some(m => m.provider === "anthropic" && m.id === "claude-opus-4-7")) { - allModels.push({ - id: "claude-opus-4-7", - name: "Claude Opus 4.7", - api: "anthropic-messages", - baseUrl: "https://api.anthropic.com", - provider: "anthropic", - reasoning: true, - input: ["text", "image"], - cost: { - input: 5, - output: 25, - cacheRead: 0.5, - cacheWrite: 6.25, - }, - contextWindow: 1000000, - maxTokens: 128000, - }); - } - - // Add missing Claude Opus 4.8 - if (!allModels.some(m => m.provider === "anthropic" && m.id === "claude-opus-4-8")) { - allModels.push({ - id: "claude-opus-4-8", - name: "Claude Opus 4.8", - api: "anthropic-messages", - baseUrl: "https://api.anthropic.com", - provider: "anthropic", - reasoning: true, - input: ["text", "image"], - cost: { - input: 5, - output: 25, - cacheRead: 0.5, - cacheWrite: 6.25, - }, - contextWindow: 1000000, - maxTokens: 128000, - }); - } - - // Add missing Claude Sonnet 4.6 - if (!allModels.some(m => m.provider === "anthropic" && m.id === "claude-sonnet-4-6")) { - allModels.push({ - id: "claude-sonnet-4-6", - name: "Claude Sonnet 4.6", - api: "anthropic-messages", - baseUrl: "https://api.anthropic.com", - provider: "anthropic", - reasoning: true, - input: ["text", "image"], - cost: { - input: 3, - output: 15, - cacheRead: 0.3, - cacheWrite: 3.75, - }, - contextWindow: 1000000, - maxTokens: 64000, - }); - } - - // Add missing Gemini 3.1 Flash Lite Preview until models.dev includes it. - if (!allModels.some((m) => m.provider === "google" && m.id === "gemini-3.1-flash-lite-preview")) { - allModels.push({ - id: "gemini-3.1-flash-lite-preview", - name: "Gemini 3.1 Flash Lite Preview", - api: "google-generative-ai", - baseUrl: "https://generativelanguage.googleapis.com/v1beta", - provider: "google", - reasoning: true, - input: ["text", "image"], - cost: { - input: 0, - output: 0, - cacheRead: 0, - cacheWrite: 0, - }, - contextWindow: 1048576, - maxTokens: 65536, - }); - } - // Add missing gpt models if (!allModels.some(m => m.provider === "openai" && m.id === "gpt-5-chat-latest")) { allModels.push({ @@ -1825,66 +1675,6 @@ async function generateModels() { }); } - if (!allModels.some(m => m.provider === "openai" && m.id === "gpt-5.1-codex")) { - allModels.push({ - id: "gpt-5.1-codex", - name: "GPT-5.1 Codex", - api: "openai-responses", - baseUrl: "https://api.openai.com/v1", - provider: "openai", - reasoning: true, - input: ["text", "image"], - cost: { - input: 1.25, - output: 5, - cacheRead: 0.125, - cacheWrite: 1.25, - }, - contextWindow: 400000, - maxTokens: 128000, - }); - } - - if (!allModels.some(m => m.provider === "openai" && m.id === "gpt-5.1-codex-max")) { - allModels.push({ - id: "gpt-5.1-codex-max", - name: "GPT-5.1 Codex Max", - api: "openai-responses", - baseUrl: "https://api.openai.com/v1", - provider: "openai", - reasoning: true, - input: ["text", "image"], - cost: { - input: 1.25, - output: 10, - cacheRead: 0.125, - cacheWrite: 0, - }, - contextWindow: 400000, - maxTokens: 128000, - }); - } - - if (!allModels.some(m => m.provider === "openai" && m.id === "gpt-5.3-codex-spark")) { - allModels.push({ - id: "gpt-5.3-codex-spark", - name: "GPT-5.3 Codex Spark", - api: "openai-responses", - baseUrl: "https://api.openai.com/v1", - provider: "openai", - reasoning: true, - input: ["text"], - cost: { - input: 0, - output: 0, - cacheRead: 0, - cacheWrite: 0, - }, - contextWindow: 128000, - maxTokens: 16384, - }); - } - // Add missing GitHub Copilot Claude Sonnet 5 until models.dev includes it. const anthropicSonnet5 = allModels.find((m) => m.provider === "anthropic" && m.id === "claude-sonnet-5"); if (anthropicSonnet5 && !allModels.some((m) => m.provider === "github-copilot" && m.id === "claude-sonnet-5")) { diff --git a/packages/ai/src/providers/amazon-bedrock.models.ts b/packages/ai/src/providers/amazon-bedrock.models.ts index 9cd20c7d..4c47ca40 100644 --- a/packages/ai/src/providers/amazon-bedrock.models.ts +++ b/packages/ai/src/providers/amazon-bedrock.models.ts @@ -257,8 +257,8 @@ export const AMAZON_BEDROCK_MODELS = { cost: { input: 16.5, output: 82.5, - cacheRead: 0.5, - cacheWrite: 6.25, + cacheRead: 1.65, + cacheWrite: 20.625, }, contextWindow: 1000000, maxTokens: 128000, @@ -447,8 +447,8 @@ export const AMAZON_BEDROCK_MODELS = { cost: { input: 5.5, output: 27.5, - cacheRead: 0.5, - cacheWrite: 6.25, + cacheRead: 0.55, + cacheWrite: 6.875, }, contextWindow: 1000000, maxTokens: 128000,