diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index 98922700..af63cdc4 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -6,6 +6,7 @@ - Fixed Amazon Bedrock requests to replace blank required user/tool-result text with a placeholder and skip blank replay text blocks ([#4975](https://github.com/earendil-works/pi/issues/4975)). - Fixed OpenAI GPT-5.5 generated metadata to omit unsupported minimal thinking ([#5243](https://github.com/earendil-works/pi/issues/5243)). +- Fixed GitHub Copilot and OpenRouter test model references that became stale after model regeneration. ## [0.78.0] - 2026-05-29 diff --git a/packages/ai/src/models.generated.ts b/packages/ai/src/models.generated.ts index e1a2facc..8e83c580 100644 --- a/packages/ai/src/models.generated.ts +++ b/packages/ai/src/models.generated.ts @@ -3855,7 +3855,7 @@ export const MODELS = { "github-copilot": { "claude-haiku-4.5": { id: "claude-haiku-4.5", - name: "Claude Haiku 4.5", + name: "Claude Haiku 4.5 (latest)", api: "anthropic-messages", provider: "github-copilot", baseUrl: "https://api.individual.githubcopilot.com", @@ -3864,17 +3864,17 @@ export const MODELS = { reasoning: true, input: ["text", "image"], cost: { - input: 0, - output: 0, - cacheRead: 0, - cacheWrite: 0, + input: 1, + output: 5, + cacheRead: 0.1, + cacheWrite: 1.25, }, contextWindow: 200000, maxTokens: 64000, } satisfies Model<"anthropic-messages">, "claude-opus-4.5": { id: "claude-opus-4.5", - name: "Claude Opus 4.5", + name: "Claude Opus 4.5 (latest)", api: "anthropic-messages", provider: "github-copilot", baseUrl: "https://api.individual.githubcopilot.com", @@ -3882,10 +3882,10 @@ export const MODELS = { reasoning: true, input: ["text", "image"], cost: { - input: 0, - output: 0, - cacheRead: 0, - cacheWrite: 0, + input: 5, + output: 25, + cacheRead: 0.5, + cacheWrite: 6.25, }, contextWindow: 200000, maxTokens: 32000, @@ -3902,10 +3902,10 @@ export const MODELS = { thinkingLevelMap: {"xhigh":"max"}, input: ["text", "image"], cost: { - input: 0, - output: 0, - cacheRead: 0, - cacheWrite: 0, + input: 5, + output: 25, + cacheRead: 0.5, + cacheWrite: 6.25, }, contextWindow: 1000000, maxTokens: 32000, @@ -3922,10 +3922,10 @@ export const MODELS = { thinkingLevelMap: {"xhigh":"xhigh"}, input: ["text", "image"], cost: { - input: 0, - output: 0, - cacheRead: 0, - cacheWrite: 0, + input: 5, + output: 25, + cacheRead: 0.5, + cacheWrite: 6.25, }, contextWindow: 200000, maxTokens: 32000, @@ -3942,17 +3942,17 @@ export const MODELS = { thinkingLevelMap: {"xhigh":"xhigh"}, input: ["text", "image"], cost: { - input: 0, - output: 0, - cacheRead: 0, - cacheWrite: 0, + input: 5, + output: 25, + cacheRead: 0.5, + cacheWrite: 6.25, }, contextWindow: 200000, maxTokens: 64000, } satisfies Model<"anthropic-messages">, - "claude-sonnet-4.5": { - id: "claude-sonnet-4.5", - name: "Claude Sonnet 4.5", + "claude-sonnet-4": { + id: "claude-sonnet-4", + name: "Claude Sonnet 4 (latest)", api: "anthropic-messages", provider: "github-copilot", baseUrl: "https://api.individual.githubcopilot.com", @@ -3961,10 +3961,29 @@ export const MODELS = { reasoning: true, input: ["text", "image"], cost: { - input: 0, - output: 0, - cacheRead: 0, - cacheWrite: 0, + input: 3, + output: 15, + cacheRead: 0.3, + cacheWrite: 3.75, + }, + contextWindow: 216000, + maxTokens: 16000, + } satisfies Model<"anthropic-messages">, + "claude-sonnet-4.5": { + id: "claude-sonnet-4.5", + name: "Claude Sonnet 4.5 (latest)", + api: "anthropic-messages", + provider: "github-copilot", + baseUrl: "https://api.individual.githubcopilot.com", + headers: {"User-Agent":"GitHubCopilotChat/0.35.0","Editor-Version":"vscode/1.107.0","Editor-Plugin-Version":"copilot-chat/0.35.0","Copilot-Integration-Id":"vscode-chat"}, + compat: {"supportsEagerToolInputStreaming":false}, + reasoning: true, + input: ["text", "image"], + cost: { + input: 3, + output: 15, + cacheRead: 0.3, + cacheWrite: 3.75, }, contextWindow: 200000, maxTokens: 32000, @@ -3980,10 +3999,10 @@ export const MODELS = { reasoning: true, input: ["text", "image"], cost: { - input: 0, - output: 0, - cacheRead: 0, - cacheWrite: 0, + input: 3, + output: 15, + cacheRead: 0.3, + cacheWrite: 3.75, }, contextWindow: 1000000, maxTokens: 32000, @@ -3996,12 +4015,12 @@ export const MODELS = { baseUrl: "https://api.individual.githubcopilot.com", headers: {"User-Agent":"GitHubCopilotChat/0.35.0","Editor-Version":"vscode/1.107.0","Editor-Plugin-Version":"copilot-chat/0.35.0","Copilot-Integration-Id":"vscode-chat"}, compat: {"supportsStore":false,"supportsDeveloperRole":false,"supportsReasoningEffort":false}, - reasoning: false, + reasoning: true, input: ["text", "image"], cost: { - input: 0, - output: 0, - cacheRead: 0, + input: 1.25, + output: 10, + cacheRead: 0.125, cacheWrite: 0, }, contextWindow: 128000, @@ -4009,7 +4028,7 @@ export const MODELS = { } satisfies Model<"openai-completions">, "gemini-3-flash-preview": { id: "gemini-3-flash-preview", - name: "Gemini 3 Flash", + name: "Gemini 3 Flash Preview", api: "openai-completions", provider: "github-copilot", baseUrl: "https://api.individual.githubcopilot.com", @@ -4018,9 +4037,9 @@ export const MODELS = { reasoning: true, input: ["text", "image"], cost: { - input: 0, - output: 0, - cacheRead: 0, + input: 0.5, + output: 3, + cacheRead: 0.05, cacheWrite: 0, }, contextWindow: 128000, @@ -4037,9 +4056,9 @@ export const MODELS = { reasoning: true, input: ["text", "image"], cost: { - input: 0, - output: 0, - cacheRead: 0, + input: 2, + output: 12, + cacheRead: 0.2, cacheWrite: 0, }, contextWindow: 200000, @@ -4056,9 +4075,9 @@ export const MODELS = { reasoning: true, input: ["text", "image"], cost: { - input: 0, - output: 0, - cacheRead: 0, + input: 1.5, + output: 9, + cacheRead: 0.15, cacheWrite: 0, }, contextWindow: 200000, @@ -4075,36 +4094,17 @@ export const MODELS = { reasoning: false, input: ["text", "image"], cost: { - input: 0, - output: 0, - cacheRead: 0, + input: 2, + output: 8, + cacheRead: 0.5, cacheWrite: 0, }, contextWindow: 128000, maxTokens: 16384, } satisfies Model<"openai-completions">, - "gpt-4o": { - id: "gpt-4o", - name: "GPT-4o", - api: "openai-completions", - provider: "github-copilot", - baseUrl: "https://api.individual.githubcopilot.com", - headers: {"User-Agent":"GitHubCopilotChat/0.35.0","Editor-Version":"vscode/1.107.0","Editor-Plugin-Version":"copilot-chat/0.35.0","Copilot-Integration-Id":"vscode-chat"}, - compat: {"supportsStore":false,"supportsDeveloperRole":false,"supportsReasoningEffort":false}, - reasoning: false, - input: ["text", "image"], - cost: { - input: 0, - output: 0, - cacheRead: 0, - cacheWrite: 0, - }, - contextWindow: 128000, - maxTokens: 4096, - } satisfies Model<"openai-completions">, "gpt-5-mini": { id: "gpt-5-mini", - name: "GPT-5-mini", + name: "GPT-5 Mini", api: "openai-responses", provider: "github-copilot", baseUrl: "https://api.individual.githubcopilot.com", @@ -4113,9 +4113,9 @@ export const MODELS = { thinkingLevelMap: {"off":null,"minimal":"low"}, input: ["text", "image"], cost: { - input: 0, - output: 0, - cacheRead: 0, + input: 0.25, + output: 2, + cacheRead: 0.025, cacheWrite: 0, }, contextWindow: 264000, @@ -4132,9 +4132,9 @@ export const MODELS = { thinkingLevelMap: {"off":null,"minimal":"low","xhigh":"xhigh"}, input: ["text", "image"], cost: { - input: 0, - output: 0, - cacheRead: 0, + input: 1.75, + output: 14, + cacheRead: 0.175, cacheWrite: 0, }, contextWindow: 400000, @@ -4142,7 +4142,7 @@ export const MODELS = { } satisfies Model<"openai-responses">, "gpt-5.2-codex": { id: "gpt-5.2-codex", - name: "GPT-5.2-Codex", + name: "GPT-5.2 Codex", api: "openai-responses", provider: "github-copilot", baseUrl: "https://api.individual.githubcopilot.com", @@ -4151,9 +4151,9 @@ export const MODELS = { thinkingLevelMap: {"off":null,"minimal":"low","xhigh":"xhigh"}, input: ["text", "image"], cost: { - input: 0, - output: 0, - cacheRead: 0, + input: 1.75, + output: 14, + cacheRead: 0.175, cacheWrite: 0, }, contextWindow: 400000, @@ -4161,7 +4161,7 @@ export const MODELS = { } satisfies Model<"openai-responses">, "gpt-5.3-codex": { id: "gpt-5.3-codex", - name: "GPT-5.3-Codex", + name: "GPT-5.3 Codex", api: "openai-responses", provider: "github-copilot", baseUrl: "https://api.individual.githubcopilot.com", @@ -4170,9 +4170,9 @@ export const MODELS = { thinkingLevelMap: {"off":null,"minimal":"low","xhigh":"xhigh"}, input: ["text", "image"], cost: { - input: 0, - output: 0, - cacheRead: 0, + input: 1.75, + output: 14, + cacheRead: 0.175, cacheWrite: 0, }, contextWindow: 400000, @@ -4189,9 +4189,9 @@ export const MODELS = { thinkingLevelMap: {"off":null,"minimal":"low","xhigh":"xhigh"}, input: ["text", "image"], cost: { - input: 0, - output: 0, - cacheRead: 0, + input: 2.5, + output: 15, + cacheRead: 0.25, cacheWrite: 0, }, contextWindow: 400000, @@ -4199,7 +4199,7 @@ export const MODELS = { } satisfies Model<"openai-responses">, "gpt-5.4-mini": { id: "gpt-5.4-mini", - name: "GPT-5.4 Mini", + name: "GPT-5.4 mini", api: "openai-responses", provider: "github-copilot", baseUrl: "https://api.individual.githubcopilot.com", @@ -4208,9 +4208,28 @@ export const MODELS = { thinkingLevelMap: {"off":null,"minimal":"low","xhigh":"xhigh"}, input: ["text", "image"], cost: { - input: 0, - output: 0, - cacheRead: 0, + input: 0.75, + output: 4.5, + cacheRead: 0.075, + cacheWrite: 0, + }, + contextWindow: 400000, + maxTokens: 128000, + } satisfies Model<"openai-responses">, + "gpt-5.4-nano": { + id: "gpt-5.4-nano", + name: "GPT-5.4 nano", + api: "openai-responses", + provider: "github-copilot", + baseUrl: "https://api.individual.githubcopilot.com", + headers: {"User-Agent":"GitHubCopilotChat/0.35.0","Editor-Version":"vscode/1.107.0","Editor-Plugin-Version":"copilot-chat/0.35.0","Copilot-Integration-Id":"vscode-chat"}, + reasoning: true, + thinkingLevelMap: {"off":null,"minimal":"low","xhigh":"xhigh"}, + input: ["text", "image"], + cost: { + input: 0.2, + output: 1.25, + cacheRead: 0.02, cacheWrite: 0, }, contextWindow: 400000, @@ -4227,32 +4246,32 @@ export const MODELS = { thinkingLevelMap: {"off":null,"minimal":"low","xhigh":"xhigh"}, input: ["text", "image"], cost: { - input: 0, - output: 0, - cacheRead: 0, + input: 5, + output: 30, + cacheRead: 0.5, cacheWrite: 0, }, contextWindow: 400000, maxTokens: 128000, } satisfies Model<"openai-responses">, - "grok-code-fast-1": { - id: "grok-code-fast-1", - name: "Grok Code Fast 1", + "raptor-mini": { + id: "raptor-mini", + name: "Raptor mini", api: "openai-completions", provider: "github-copilot", baseUrl: "https://api.individual.githubcopilot.com", headers: {"User-Agent":"GitHubCopilotChat/0.35.0","Editor-Version":"vscode/1.107.0","Editor-Plugin-Version":"copilot-chat/0.35.0","Copilot-Integration-Id":"vscode-chat"}, compat: {"supportsStore":false,"supportsDeveloperRole":false,"supportsReasoningEffort":false}, reasoning: true, - input: ["text"], + input: ["text", "image"], cost: { - input: 0, - output: 0, - cacheRead: 0, + input: 0.25, + output: 2, + cacheRead: 0.025, cacheWrite: 0, }, - contextWindow: 128000, - maxTokens: 64000, + contextWindow: 400000, + maxTokens: 128000, } satisfies Model<"openai-completions">, }, "google": { @@ -7863,6 +7882,23 @@ export const MODELS = { contextWindow: 204800, maxTokens: 131072, } satisfies Model<"openai-completions">, + "minimax-m3-free": { + id: "minimax-m3-free", + name: "MiniMax M3 Free", + api: "anthropic-messages", + provider: "opencode", + baseUrl: "https://opencode.ai/zen", + reasoning: true, + input: ["text", "image"], + cost: { + input: 0, + output: 0, + cacheRead: 0, + cacheWrite: 0, + }, + contextWindow: 200000, + maxTokens: 32000, + } satisfies Model<"anthropic-messages">, "nemotron-3-super-free": { id: "nemotron-3-super-free", name: "Nemotron 3 Super Free", @@ -8092,6 +8128,23 @@ export const MODELS = { contextWindow: 204800, maxTokens: 131072, } satisfies Model<"openai-completions">, + "minimax-m3": { + id: "minimax-m3", + name: "MiniMax M3", + api: "anthropic-messages", + provider: "opencode-go", + baseUrl: "https://opencode.ai/zen/go", + reasoning: true, + input: ["text", "image"], + cost: { + input: 0.6, + output: 2.4, + cacheRead: 0.12, + cacheWrite: 0, + }, + contextWindow: 512000, + maxTokens: 131072, + } satisfies Model<"anthropic-messages">, "qwen3.6-plus": { id: "qwen3.6-plus", name: "Qwen3.6 Plus", @@ -8688,8 +8741,8 @@ export const MODELS = { reasoning: false, input: ["text"], cost: { - input: 0.2288, - output: 0.9144, + input: 0.20020000000000002, + output: 0.8000999999999999, cacheRead: 0, cacheWrite: 0, }, @@ -8790,13 +8843,13 @@ export const MODELS = { reasoning: true, input: ["text"], cost: { - input: 0.252, - output: 0.378, - cacheRead: 0.0252, + input: 0.2288, + output: 0.3432, + cacheRead: 0, cacheWrite: 0, }, contextWindow: 131072, - maxTokens: 65536, + maxTokens: 64000, } satisfies Model<"openai-completions">, "deepseek/deepseek-v3.2-exp": { id: "deepseek/deepseek-v3.2-exp", @@ -8870,40 +8923,6 @@ export const MODELS = { contextWindow: 32768, maxTokens: 4096, } satisfies Model<"openai-completions">, - "google/gemini-2.0-flash-001": { - id: "google/gemini-2.0-flash-001", - name: "Google: Gemini 2.0 Flash", - api: "openai-completions", - provider: "openrouter", - baseUrl: "https://openrouter.ai/api/v1", - reasoning: false, - input: ["text", "image"], - cost: { - input: 0.09999999999999999, - output: 0.39999999999999997, - cacheRead: 0.024999999999999998, - cacheWrite: 0.08333333333333334, - }, - contextWindow: 1048576, - maxTokens: 8192, - } satisfies Model<"openai-completions">, - "google/gemini-2.0-flash-lite-001": { - id: "google/gemini-2.0-flash-lite-001", - name: "Google: Gemini 2.0 Flash Lite", - api: "openai-completions", - provider: "openrouter", - baseUrl: "https://openrouter.ai/api/v1", - reasoning: false, - input: ["text", "image"], - cost: { - input: 0.075, - output: 0.3, - cacheRead: 0, - cacheWrite: 0, - }, - contextWindow: 1048576, - maxTokens: 8192, - } satisfies Model<"openai-completions">, "google/gemini-2.5-flash": { id: "google/gemini-2.5-flash", name: "Google: Gemini 2.5 Flash", @@ -9492,13 +9511,30 @@ export const MODELS = { reasoning: true, input: ["text"], cost: { - input: 0.26, + input: 0.27899999999999997, output: 1.2, cacheRead: 0, cacheWrite: 0, }, contextWindow: 204800, - maxTokens: 4096, + maxTokens: 131072, + } satisfies Model<"openai-completions">, + "minimax/minimax-m3": { + id: "minimax/minimax-m3", + name: "MiniMax: MiniMax M3", + api: "openai-completions", + provider: "openrouter", + baseUrl: "https://openrouter.ai/api/v1", + reasoning: true, + input: ["text", "image"], + cost: { + input: 0.3, + output: 1.2, + cacheRead: 0.06, + cacheWrite: 0, + }, + contextWindow: 1048576, + maxTokens: 512000, } satisfies Model<"openai-completions">, "mistralai/codestral-2508": { id: "mistralai/codestral-2508", @@ -11291,13 +11327,13 @@ export const MODELS = { reasoning: false, input: ["text"], cost: { - input: 0.09, - output: 0.3, + input: 0.0428, + output: 0.1716, cacheRead: 0, cacheWrite: 0, }, - contextWindow: 262144, - maxTokens: 262144, + contextWindow: 131072, + maxTokens: 32000, } satisfies Model<"openai-completions">, "qwen/qwen3-30b-a3b-thinking-2507": { id: "qwen/qwen3-30b-a3b-thinking-2507", @@ -12334,7 +12370,7 @@ export const MODELS = { cacheWrite: 0, }, contextWindow: 202752, - maxTokens: 4096, + maxTokens: 16384, } satisfies Model<"openai-completions">, "z-ai/glm-5-turbo": { id: "z-ai/glm-5-turbo", @@ -12368,7 +12404,7 @@ export const MODELS = { cacheWrite: 0, }, contextWindow: 202752, - maxTokens: 4096, + maxTokens: 131072, } satisfies Model<"openai-completions">, "z-ai/glm-5v-turbo": { id: "z-ai/glm-5v-turbo", @@ -12889,7 +12925,7 @@ export const MODELS = { api: "anthropic-messages", provider: "vercel-ai-gateway", baseUrl: "https://ai-gateway.vercel.sh", - reasoning: false, + reasoning: true, input: ["text"], cost: { input: 0.22, @@ -12974,7 +13010,7 @@ export const MODELS = { api: "anthropic-messages", provider: "vercel-ai-gateway", baseUrl: "https://ai-gateway.vercel.sh", - reasoning: false, + reasoning: true, input: ["text"], cost: { input: 1.5, @@ -13008,7 +13044,7 @@ export const MODELS = { api: "anthropic-messages", provider: "vercel-ai-gateway", baseUrl: "https://ai-gateway.vercel.sh", - reasoning: false, + reasoning: true, input: ["text"], cost: { input: 0.5, @@ -13087,6 +13123,40 @@ export const MODELS = { contextWindow: 256000, maxTokens: 65536, } satisfies Model<"anthropic-messages">, + "alibaba/qwen3-next-80b-a3b-instruct": { + id: "alibaba/qwen3-next-80b-a3b-instruct", + name: "Qwen3 Next 80B A3B Instruct", + api: "anthropic-messages", + provider: "vercel-ai-gateway", + baseUrl: "https://ai-gateway.vercel.sh", + reasoning: false, + input: ["text"], + cost: { + input: 0.15, + output: 1.2, + cacheRead: 0, + cacheWrite: 0, + }, + contextWindow: 131072, + maxTokens: 32768, + } satisfies Model<"anthropic-messages">, + "alibaba/qwen3-next-80b-a3b-thinking": { + id: "alibaba/qwen3-next-80b-a3b-thinking", + name: "Qwen3 Next 80B A3B Thinking", + api: "anthropic-messages", + provider: "vercel-ai-gateway", + baseUrl: "https://ai-gateway.vercel.sh", + reasoning: true, + input: ["text"], + cost: { + input: 0.15, + output: 1.2, + cacheRead: 0, + cacheWrite: 0, + }, + contextWindow: 131072, + maxTokens: 32768, + } satisfies Model<"anthropic-messages">, "alibaba/qwen3-vl-thinking": { id: "alibaba/qwen3-vl-thinking", name: "Qwen3 VL 235B A22B Thinking", @@ -13189,6 +13259,23 @@ export const MODELS = { contextWindow: 991000, maxTokens: 64000, } satisfies Model<"anthropic-messages">, + "alibaba/qwen3.7-plus": { + id: "alibaba/qwen3.7-plus", + name: "Qwen 3.7 Plus", + api: "anthropic-messages", + provider: "vercel-ai-gateway", + baseUrl: "https://ai-gateway.vercel.sh", + reasoning: true, + input: ["text", "image"], + cost: { + input: 0.39999999999999997, + output: 1.5999999999999999, + cacheRead: 0.08, + cacheWrite: 0.5, + }, + contextWindow: 1000000, + maxTokens: 64000, + } satisfies Model<"anthropic-messages">, "anthropic/claude-3-haiku": { id: "anthropic/claude-3-haiku", name: "Claude 3 Haiku", @@ -13542,8 +13629,8 @@ export const MODELS = { api: "anthropic-messages", provider: "vercel-ai-gateway", baseUrl: "https://ai-gateway.vercel.sh", - reasoning: false, - input: ["text"], + reasoning: true, + input: ["text", "image"], cost: { input: 0.28, output: 0.42, @@ -13559,8 +13646,8 @@ export const MODELS = { api: "anthropic-messages", provider: "vercel-ai-gateway", baseUrl: "https://ai-gateway.vercel.sh", - reasoning: false, - input: ["text"], + reasoning: true, + input: ["text", "image"], cost: { input: 0.62, output: 1.85, @@ -13577,7 +13664,7 @@ export const MODELS = { provider: "vercel-ai-gateway", baseUrl: "https://ai-gateway.vercel.sh", reasoning: true, - input: ["text"], + input: ["text", "image"], cost: { input: 0.14, output: 0.28, @@ -13594,7 +13681,7 @@ export const MODELS = { provider: "vercel-ai-gateway", baseUrl: "https://ai-gateway.vercel.sh", reasoning: true, - input: ["text"], + input: ["text", "image"], cost: { input: 0.435, output: 0.87, @@ -13797,12 +13884,12 @@ export const MODELS = { api: "anthropic-messages", provider: "vercel-ai-gateway", baseUrl: "https://ai-gateway.vercel.sh", - reasoning: false, + reasoning: true, input: ["text", "image"], cost: { - input: 0.13, - output: 0.39999999999999997, - cacheRead: 0, + input: 0.15, + output: 0.6, + cacheRead: 0.015, cacheWrite: 0, }, contextWindow: 262144, @@ -14087,7 +14174,7 @@ export const MODELS = { provider: "vercel-ai-gateway", baseUrl: "https://ai-gateway.vercel.sh", reasoning: true, - input: ["text"], + input: ["text", "image"], cost: { input: 0.6, output: 2.4, @@ -14131,6 +14218,23 @@ export const MODELS = { contextWindow: 204800, maxTokens: 131100, } satisfies Model<"anthropic-messages">, + "minimax/minimax-m3": { + id: "minimax/minimax-m3", + name: "MiniMax M3", + api: "anthropic-messages", + provider: "vercel-ai-gateway", + baseUrl: "https://ai-gateway.vercel.sh", + reasoning: true, + input: ["text", "image"], + cost: { + input: 0.3, + output: 1.2, + cacheRead: 0.06, + cacheWrite: 0, + }, + contextWindow: 1000000, + maxTokens: 1000000, + } satisfies Model<"anthropic-messages">, "mistral/codestral": { id: "mistral/codestral", name: "Mistral Codestral", @@ -14267,6 +14371,23 @@ export const MODELS = { contextWindow: 256000, maxTokens: 256000, } satisfies Model<"anthropic-messages">, + "mistral/mistral-nemo": { + id: "mistral/mistral-nemo", + name: "Mistral Nemo 12B", + api: "anthropic-messages", + provider: "vercel-ai-gateway", + baseUrl: "https://ai-gateway.vercel.sh", + reasoning: false, + input: ["text"], + cost: { + input: 0.02, + output: 0.04, + cacheRead: 0, + cacheWrite: 0, + }, + contextWindow: 131072, + maxTokens: 131072, + } satisfies Model<"anthropic-messages">, "mistral/mistral-small": { id: "mistral/mistral-small", name: "Mistral Small", @@ -14420,6 +14541,23 @@ export const MODELS = { contextWindow: 262000, maxTokens: 262000, } satisfies Model<"anthropic-messages">, + "nvidia/nemotron-3-super-120b-a12b": { + id: "nvidia/nemotron-3-super-120b-a12b", + name: "NVIDIA Nemotron 3 Super 120B A12B", + api: "anthropic-messages", + provider: "vercel-ai-gateway", + baseUrl: "https://ai-gateway.vercel.sh", + reasoning: true, + input: ["text"], + cost: { + input: 0.15, + output: 0.65, + cacheRead: 0, + cacheWrite: 0, + }, + contextWindow: 256000, + maxTokens: 32000, + } satisfies Model<"anthropic-messages">, "nvidia/nemotron-nano-12b-v2-vl": { id: "nvidia/nemotron-nano-12b-v2-vl", name: "Nvidia Nemotron Nano 12B V2 VL", @@ -14597,7 +14735,7 @@ export const MODELS = { provider: "vercel-ai-gateway", baseUrl: "https://ai-gateway.vercel.sh", reasoning: true, - input: ["text"], + input: ["text", "image"], cost: { input: 1.25, output: 10, @@ -14959,6 +15097,23 @@ export const MODELS = { contextWindow: 1000000, maxTokens: 128000, } satisfies Model<"anthropic-messages">, + "openai/gpt-oss-120b": { + id: "openai/gpt-oss-120b", + name: "GPT OSS 120B", + api: "anthropic-messages", + provider: "vercel-ai-gateway", + baseUrl: "https://ai-gateway.vercel.sh", + reasoning: true, + input: ["text"], + cost: { + input: 0.35, + output: 0.75, + cacheRead: 0.25, + cacheWrite: 0, + }, + contextWindow: 131072, + maxTokens: 131000, + } satisfies Model<"anthropic-messages">, "openai/gpt-oss-20b": { id: "openai/gpt-oss-20b", name: "GPT OSS 20B", @@ -15441,7 +15596,7 @@ export const MODELS = { api: "anthropic-messages", provider: "vercel-ai-gateway", baseUrl: "https://ai-gateway.vercel.sh", - reasoning: false, + reasoning: true, input: ["text", "image"], cost: { input: 0.6, @@ -15595,7 +15750,7 @@ export const MODELS = { provider: "vercel-ai-gateway", baseUrl: "https://ai-gateway.vercel.sh", reasoning: true, - input: ["text"], + input: ["text", "image"], cost: { input: 1.4, output: 4.4, diff --git a/packages/ai/test/context-overflow.test.ts b/packages/ai/test/context-overflow.test.ts index c5594989..9f021a41 100644 --- a/packages/ai/test/context-overflow.test.ts +++ b/packages/ai/test/context-overflow.test.ts @@ -120,15 +120,15 @@ describe("Context overflow error handling", () => { // ============================================================================= // GitHub Copilot (OAuth) - // Tests both OpenAI and Anthropic models via Copilot + // Tests both Google and Anthropic models via Copilot // ============================================================================= describe("GitHub Copilot (OAuth)", () => { - // OpenAI model via Copilot + // Google model via Copilot it.skipIf(!githubCopilotToken)( - "gpt-4o - should detect overflow via isContextOverflow", + "gemini-2.5-pro - should detect overflow via isContextOverflow", async () => { - const model = getModel("github-copilot", "gpt-4o"); + const model = getModel("github-copilot", "gemini-2.5-pro"); const result = await testContextOverflow(model, githubCopilotToken!); logResult(result); diff --git a/packages/ai/test/empty.test.ts b/packages/ai/test/empty.test.ts index 7df7de2c..a8453dcc 100644 --- a/packages/ai/test/empty.test.ts +++ b/packages/ai/test/empty.test.ts @@ -630,37 +630,37 @@ describe("AI Providers Empty Message Tests", () => { describe("GitHub Copilot Provider Empty Messages", () => { it.skipIf(!githubCopilotToken)( - "gpt-4o - should handle empty content array", + "claude-haiku-4.5 - should handle empty content array", { retry: 3, timeout: 30000 }, async () => { - const llm = getModel("github-copilot", "gpt-4o"); + const llm = getModel("github-copilot", "claude-haiku-4.5"); await testEmptyMessage(llm, { apiKey: githubCopilotToken }); }, ); it.skipIf(!githubCopilotToken)( - "gpt-4o - should handle empty string content", + "claude-haiku-4.5 - should handle empty string content", { retry: 3, timeout: 30000 }, async () => { - const llm = getModel("github-copilot", "gpt-4o"); + const llm = getModel("github-copilot", "claude-haiku-4.5"); await testEmptyStringMessage(llm, { apiKey: githubCopilotToken }); }, ); it.skipIf(!githubCopilotToken)( - "gpt-4o - should handle whitespace-only content", + "claude-haiku-4.5 - should handle whitespace-only content", { retry: 3, timeout: 30000 }, async () => { - const llm = getModel("github-copilot", "gpt-4o"); + const llm = getModel("github-copilot", "claude-haiku-4.5"); await testWhitespaceOnlyMessage(llm, { apiKey: githubCopilotToken }); }, ); it.skipIf(!githubCopilotToken)( - "gpt-4o - should handle empty assistant message in conversation", + "claude-haiku-4.5 - should handle empty assistant message in conversation", { retry: 3, timeout: 30000 }, async () => { - const llm = getModel("github-copilot", "gpt-4o"); + const llm = getModel("github-copilot", "claude-haiku-4.5"); await testEmptyAssistantMessage(llm, { apiKey: githubCopilotToken }); }, ); diff --git a/packages/ai/test/image-tool-result.test.ts b/packages/ai/test/image-tool-result.test.ts index 542b2385..a752b7ce 100644 --- a/packages/ai/test/image-tool-result.test.ts +++ b/packages/ai/test/image-tool-result.test.ts @@ -443,19 +443,19 @@ describe("Tool Results with Images", () => { describe("GitHub Copilot Provider", () => { it.skipIf(!githubCopilotToken)( - "gpt-4o - should handle tool result with only image", + "claude-haiku-4.5 - should handle tool result with only image", { retry: 3, timeout: 30000 }, async () => { - const llm = getModel("github-copilot", "gpt-4o"); + const llm = getModel("github-copilot", "claude-haiku-4.5"); await handleToolWithImageResult(llm, { apiKey: githubCopilotToken }); }, ); it.skipIf(!githubCopilotToken)( - "gpt-4o - should handle tool result with text and image", + "claude-haiku-4.5 - should handle tool result with text and image", { retry: 3, timeout: 30000 }, async () => { - const llm = getModel("github-copilot", "gpt-4o"); + const llm = getModel("github-copilot", "claude-haiku-4.5"); await handleToolWithTextAndImageResult(llm, { apiKey: githubCopilotToken }); }, ); diff --git a/packages/ai/test/tokens.test.ts b/packages/ai/test/tokens.test.ts index df548163..676f5a29 100644 --- a/packages/ai/test/tokens.test.ts +++ b/packages/ai/test/tokens.test.ts @@ -295,10 +295,10 @@ describe("Token Statistics on Abort", () => { describe("GitHub Copilot Provider", () => { it.skipIf(!githubCopilotToken)( - "gpt-4o - should include token stats when aborted mid-stream", + "claude-haiku-4.5 - should include token stats when aborted mid-stream", { retry: 3, timeout: 30000 }, async () => { - const llm = getModel("github-copilot", "gpt-4o"); + const llm = getModel("github-copilot", "claude-haiku-4.5"); await testTokensOnAbort(llm, { apiKey: githubCopilotToken }); }, ); diff --git a/packages/ai/test/tool-call-without-result.test.ts b/packages/ai/test/tool-call-without-result.test.ts index 2b1950b9..11b832f3 100644 --- a/packages/ai/test/tool-call-without-result.test.ts +++ b/packages/ai/test/tool-call-without-result.test.ts @@ -297,10 +297,10 @@ describe("Tool Call Without Result Tests", () => { describe("GitHub Copilot Provider", () => { it.skipIf(!githubCopilotToken)( - "gpt-4o - should filter out tool calls without corresponding tool results", + "claude-haiku-4.5 - should filter out tool calls without corresponding tool results", { retry: 3, timeout: 30000 }, async () => { - const model = getModel("github-copilot", "gpt-4o"); + const model = getModel("github-copilot", "claude-haiku-4.5"); await testToolCallWithoutResult(model, { apiKey: githubCopilotToken }); }, ); diff --git a/packages/ai/test/total-tokens.test.ts b/packages/ai/test/total-tokens.test.ts index bd782c2c..972913a7 100644 --- a/packages/ai/test/total-tokens.test.ts +++ b/packages/ai/test/total-tokens.test.ts @@ -178,18 +178,22 @@ describe("totalTokens field", () => { }); describe.skipIf(!process.env.OPENAI_API_KEY)("OpenAI Responses", () => { - it("gpt-4o - should return totalTokens equal to sum of components", { retry: 3, timeout: 60000 }, async () => { - const llm = getModel("openai", "gpt-4o"); + it( + "claude-haiku-4.5 - should return totalTokens equal to sum of components", + { retry: 3, timeout: 60000 }, + async () => { + const llm = getModel("openai", "gpt-4o"); - console.log(`\nOpenAI Responses / ${llm.id}:`); - const { first, second } = await testTotalTokensWithCache(llm); + console.log(`\nOpenAI Responses / ${llm.id}:`); + const { first, second } = await testTotalTokensWithCache(llm); - logUsage("First request", first); - logUsage("Second request", second); + logUsage("First request", first); + logUsage("Second request", second); - assertTotalTokensEqualsComponents(first); - assertTotalTokensEqualsComponents(second); - }); + assertTotalTokensEqualsComponents(first); + assertTotalTokensEqualsComponents(second); + }, + ); }); describe.skipIf(!hasAzureOpenAICredentials())("Azure OpenAI Responses", () => { @@ -666,10 +670,10 @@ describe("totalTokens field", () => { ); it( - "google/gemini-2.0-flash-001 - should return totalTokens equal to sum of components", + "google/gemini-2.5-flash - should return totalTokens equal to sum of components", { retry: 3, timeout: 60000 }, async () => { - const llm = getModel("openrouter", "google/gemini-2.0-flash-001"); + const llm = getModel("openrouter", "google/gemini-2.5-flash"); console.log(`\nOpenRouter / ${llm.id}:`); const { first, second } = await testTotalTokensWithCache(llm, { apiKey: process.env.OPENROUTER_API_KEY }); @@ -683,10 +687,10 @@ describe("totalTokens field", () => { ); it( - "meta-llama/llama-4-scout - should return totalTokens equal to sum of components", + "deepseek/deepseek-chat - should return totalTokens equal to sum of components", { retry: 3, timeout: 60000 }, async () => { - const llm = getModel("openrouter", "meta-llama/llama-4-scout"); + const llm = getModel("openrouter", "deepseek/deepseek-chat"); console.log(`\nOpenRouter / ${llm.id}:`); const { first, second } = await testTotalTokensWithCache(llm, { apiKey: process.env.OPENROUTER_API_KEY }); @@ -706,10 +710,10 @@ describe("totalTokens field", () => { describe("GitHub Copilot (OAuth)", () => { it.skipIf(!githubCopilotToken)( - "gpt-4o - should return totalTokens equal to sum of components", + "claude-haiku-4.5 - should return totalTokens equal to sum of components", { retry: 3, timeout: 60000 }, async () => { - const llm = getModel("github-copilot", "gpt-4o"); + const llm = getModel("github-copilot", "claude-haiku-4.5"); console.log(`\nGitHub Copilot / ${llm.id}:`); const { first, second } = await testTotalTokensWithCache(llm, { apiKey: githubCopilotToken }); diff --git a/packages/ai/test/unicode-surrogate.test.ts b/packages/ai/test/unicode-surrogate.test.ts index afe48d5c..9cdddefa 100644 --- a/packages/ai/test/unicode-surrogate.test.ts +++ b/packages/ai/test/unicode-surrogate.test.ts @@ -396,28 +396,28 @@ describe("AI Providers Unicode Surrogate Pair Tests", () => { describe("GitHub Copilot Provider Unicode Handling", () => { it.skipIf(!githubCopilotToken)( - "gpt-4o - should handle emoji in tool results", + "claude-haiku-4.5 - should handle emoji in tool results", { retry: 3, timeout: 30000 }, async () => { - const llm = getModel("github-copilot", "gpt-4o"); + const llm = getModel("github-copilot", "claude-haiku-4.5"); await testEmojiInToolResults(llm, { apiKey: githubCopilotToken }); }, ); it.skipIf(!githubCopilotToken)( - "gpt-4o - should handle real-world LinkedIn comment data with emoji", + "claude-haiku-4.5 - should handle real-world LinkedIn comment data with emoji", { retry: 3, timeout: 30000 }, async () => { - const llm = getModel("github-copilot", "gpt-4o"); + const llm = getModel("github-copilot", "claude-haiku-4.5"); await testRealWorldLinkedInData(llm, { apiKey: githubCopilotToken }); }, ); it.skipIf(!githubCopilotToken)( - "gpt-4o - should handle unpaired high surrogate (0xD83D) in tool results", + "claude-haiku-4.5 - should handle unpaired high surrogate (0xD83D) in tool results", { retry: 3, timeout: 30000 }, async () => { - const llm = getModel("github-copilot", "gpt-4o"); + const llm = getModel("github-copilot", "claude-haiku-4.5"); await testUnpairedHighSurrogate(llm, { apiKey: githubCopilotToken }); }, );