Fix stale model references in AI tests after model regeneration

- Update GitHub Copilot tests to use available models (claude-haiku-4.5, gemini-2.5-pro)
- Update OpenRouter tests to use available models (google/gemini-2.5-flash, deepseek/deepseek-chat)
- Fix over-broad sed that incorrectly renamed OpenAI Responses gpt-4o test
- Remove nvidia.md from repo root
- Update packages/ai/CHANGELOG.md
This commit is contained in:
Mario Zechner
2026-06-02 11:37:32 +02:00
parent 7c531d0518
commit 7c08227019
9 changed files with 369 additions and 209 deletions

View File

@@ -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 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 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 ## [0.78.0] - 2026-05-29

View File

@@ -3855,7 +3855,7 @@ export const MODELS = {
"github-copilot": { "github-copilot": {
"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 (latest)",
api: "anthropic-messages", api: "anthropic-messages",
provider: "github-copilot", provider: "github-copilot",
baseUrl: "https://api.individual.githubcopilot.com", baseUrl: "https://api.individual.githubcopilot.com",
@@ -3864,17 +3864,17 @@ export const MODELS = {
reasoning: true, reasoning: true,
input: ["text", "image"], input: ["text", "image"],
cost: { cost: {
input: 0, input: 1,
output: 0, output: 5,
cacheRead: 0, cacheRead: 0.1,
cacheWrite: 0, cacheWrite: 1.25,
}, },
contextWindow: 200000, contextWindow: 200000,
maxTokens: 64000, maxTokens: 64000,
} satisfies Model<"anthropic-messages">, } satisfies Model<"anthropic-messages">,
"claude-opus-4.5": { "claude-opus-4.5": {
id: "claude-opus-4.5", id: "claude-opus-4.5",
name: "Claude Opus 4.5", name: "Claude Opus 4.5 (latest)",
api: "anthropic-messages", api: "anthropic-messages",
provider: "github-copilot", provider: "github-copilot",
baseUrl: "https://api.individual.githubcopilot.com", baseUrl: "https://api.individual.githubcopilot.com",
@@ -3882,10 +3882,10 @@ export const MODELS = {
reasoning: true, reasoning: true,
input: ["text", "image"], input: ["text", "image"],
cost: { cost: {
input: 0, input: 5,
output: 0, output: 25,
cacheRead: 0, cacheRead: 0.5,
cacheWrite: 0, cacheWrite: 6.25,
}, },
contextWindow: 200000, contextWindow: 200000,
maxTokens: 32000, maxTokens: 32000,
@@ -3902,10 +3902,10 @@ export const MODELS = {
thinkingLevelMap: {"xhigh":"max"}, thinkingLevelMap: {"xhigh":"max"},
input: ["text", "image"], input: ["text", "image"],
cost: { cost: {
input: 0, input: 5,
output: 0, output: 25,
cacheRead: 0, cacheRead: 0.5,
cacheWrite: 0, cacheWrite: 6.25,
}, },
contextWindow: 1000000, contextWindow: 1000000,
maxTokens: 32000, maxTokens: 32000,
@@ -3922,10 +3922,10 @@ export const MODELS = {
thinkingLevelMap: {"xhigh":"xhigh"}, thinkingLevelMap: {"xhigh":"xhigh"},
input: ["text", "image"], input: ["text", "image"],
cost: { cost: {
input: 0, input: 5,
output: 0, output: 25,
cacheRead: 0, cacheRead: 0.5,
cacheWrite: 0, cacheWrite: 6.25,
}, },
contextWindow: 200000, contextWindow: 200000,
maxTokens: 32000, maxTokens: 32000,
@@ -3942,17 +3942,17 @@ export const MODELS = {
thinkingLevelMap: {"xhigh":"xhigh"}, thinkingLevelMap: {"xhigh":"xhigh"},
input: ["text", "image"], input: ["text", "image"],
cost: { cost: {
input: 0, input: 5,
output: 0, output: 25,
cacheRead: 0, cacheRead: 0.5,
cacheWrite: 0, cacheWrite: 6.25,
}, },
contextWindow: 200000, contextWindow: 200000,
maxTokens: 64000, maxTokens: 64000,
} satisfies Model<"anthropic-messages">, } satisfies Model<"anthropic-messages">,
"claude-sonnet-4.5": { "claude-sonnet-4": {
id: "claude-sonnet-4.5", id: "claude-sonnet-4",
name: "Claude Sonnet 4.5", name: "Claude Sonnet 4 (latest)",
api: "anthropic-messages", api: "anthropic-messages",
provider: "github-copilot", provider: "github-copilot",
baseUrl: "https://api.individual.githubcopilot.com", baseUrl: "https://api.individual.githubcopilot.com",
@@ -3961,10 +3961,29 @@ export const MODELS = {
reasoning: true, reasoning: true,
input: ["text", "image"], input: ["text", "image"],
cost: { cost: {
input: 0, input: 3,
output: 0, output: 15,
cacheRead: 0, cacheRead: 0.3,
cacheWrite: 0, 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, contextWindow: 200000,
maxTokens: 32000, maxTokens: 32000,
@@ -3980,10 +3999,10 @@ export const MODELS = {
reasoning: true, reasoning: true,
input: ["text", "image"], input: ["text", "image"],
cost: { cost: {
input: 0, input: 3,
output: 0, output: 15,
cacheRead: 0, cacheRead: 0.3,
cacheWrite: 0, cacheWrite: 3.75,
}, },
contextWindow: 1000000, contextWindow: 1000000,
maxTokens: 32000, maxTokens: 32000,
@@ -3996,12 +4015,12 @@ export const MODELS = {
baseUrl: "https://api.individual.githubcopilot.com", 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"}, 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}, compat: {"supportsStore":false,"supportsDeveloperRole":false,"supportsReasoningEffort":false},
reasoning: false, reasoning: true,
input: ["text", "image"], input: ["text", "image"],
cost: { cost: {
input: 0, input: 1.25,
output: 0, output: 10,
cacheRead: 0, cacheRead: 0.125,
cacheWrite: 0, cacheWrite: 0,
}, },
contextWindow: 128000, contextWindow: 128000,
@@ -4009,7 +4028,7 @@ export const MODELS = {
} satisfies Model<"openai-completions">, } satisfies Model<"openai-completions">,
"gemini-3-flash-preview": { "gemini-3-flash-preview": {
id: "gemini-3-flash-preview", id: "gemini-3-flash-preview",
name: "Gemini 3 Flash", name: "Gemini 3 Flash Preview",
api: "openai-completions", api: "openai-completions",
provider: "github-copilot", provider: "github-copilot",
baseUrl: "https://api.individual.githubcopilot.com", baseUrl: "https://api.individual.githubcopilot.com",
@@ -4018,9 +4037,9 @@ export const MODELS = {
reasoning: true, reasoning: true,
input: ["text", "image"], input: ["text", "image"],
cost: { cost: {
input: 0, input: 0.5,
output: 0, output: 3,
cacheRead: 0, cacheRead: 0.05,
cacheWrite: 0, cacheWrite: 0,
}, },
contextWindow: 128000, contextWindow: 128000,
@@ -4037,9 +4056,9 @@ export const MODELS = {
reasoning: true, reasoning: true,
input: ["text", "image"], input: ["text", "image"],
cost: { cost: {
input: 0, input: 2,
output: 0, output: 12,
cacheRead: 0, cacheRead: 0.2,
cacheWrite: 0, cacheWrite: 0,
}, },
contextWindow: 200000, contextWindow: 200000,
@@ -4056,9 +4075,9 @@ export const MODELS = {
reasoning: true, reasoning: true,
input: ["text", "image"], input: ["text", "image"],
cost: { cost: {
input: 0, input: 1.5,
output: 0, output: 9,
cacheRead: 0, cacheRead: 0.15,
cacheWrite: 0, cacheWrite: 0,
}, },
contextWindow: 200000, contextWindow: 200000,
@@ -4075,36 +4094,17 @@ export const MODELS = {
reasoning: false, reasoning: false,
input: ["text", "image"], input: ["text", "image"],
cost: { cost: {
input: 0, input: 2,
output: 0, output: 8,
cacheRead: 0, cacheRead: 0.5,
cacheWrite: 0, cacheWrite: 0,
}, },
contextWindow: 128000, contextWindow: 128000,
maxTokens: 16384, maxTokens: 16384,
} satisfies Model<"openai-completions">, } 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": { "gpt-5-mini": {
id: "gpt-5-mini", id: "gpt-5-mini",
name: "GPT-5-mini", name: "GPT-5 Mini",
api: "openai-responses", api: "openai-responses",
provider: "github-copilot", provider: "github-copilot",
baseUrl: "https://api.individual.githubcopilot.com", baseUrl: "https://api.individual.githubcopilot.com",
@@ -4113,9 +4113,9 @@ export const MODELS = {
thinkingLevelMap: {"off":null,"minimal":"low"}, thinkingLevelMap: {"off":null,"minimal":"low"},
input: ["text", "image"], input: ["text", "image"],
cost: { cost: {
input: 0, input: 0.25,
output: 0, output: 2,
cacheRead: 0, cacheRead: 0.025,
cacheWrite: 0, cacheWrite: 0,
}, },
contextWindow: 264000, contextWindow: 264000,
@@ -4132,9 +4132,9 @@ export const MODELS = {
thinkingLevelMap: {"off":null,"minimal":"low","xhigh":"xhigh"}, thinkingLevelMap: {"off":null,"minimal":"low","xhigh":"xhigh"},
input: ["text", "image"], input: ["text", "image"],
cost: { cost: {
input: 0, input: 1.75,
output: 0, output: 14,
cacheRead: 0, cacheRead: 0.175,
cacheWrite: 0, cacheWrite: 0,
}, },
contextWindow: 400000, contextWindow: 400000,
@@ -4142,7 +4142,7 @@ export const MODELS = {
} satisfies Model<"openai-responses">, } satisfies Model<"openai-responses">,
"gpt-5.2-codex": { "gpt-5.2-codex": {
id: "gpt-5.2-codex", id: "gpt-5.2-codex",
name: "GPT-5.2-Codex", name: "GPT-5.2 Codex",
api: "openai-responses", api: "openai-responses",
provider: "github-copilot", provider: "github-copilot",
baseUrl: "https://api.individual.githubcopilot.com", baseUrl: "https://api.individual.githubcopilot.com",
@@ -4151,9 +4151,9 @@ export const MODELS = {
thinkingLevelMap: {"off":null,"minimal":"low","xhigh":"xhigh"}, thinkingLevelMap: {"off":null,"minimal":"low","xhigh":"xhigh"},
input: ["text", "image"], input: ["text", "image"],
cost: { cost: {
input: 0, input: 1.75,
output: 0, output: 14,
cacheRead: 0, cacheRead: 0.175,
cacheWrite: 0, cacheWrite: 0,
}, },
contextWindow: 400000, contextWindow: 400000,
@@ -4161,7 +4161,7 @@ export const MODELS = {
} satisfies Model<"openai-responses">, } satisfies Model<"openai-responses">,
"gpt-5.3-codex": { "gpt-5.3-codex": {
id: "gpt-5.3-codex", id: "gpt-5.3-codex",
name: "GPT-5.3-Codex", name: "GPT-5.3 Codex",
api: "openai-responses", api: "openai-responses",
provider: "github-copilot", provider: "github-copilot",
baseUrl: "https://api.individual.githubcopilot.com", baseUrl: "https://api.individual.githubcopilot.com",
@@ -4170,9 +4170,9 @@ export const MODELS = {
thinkingLevelMap: {"off":null,"minimal":"low","xhigh":"xhigh"}, thinkingLevelMap: {"off":null,"minimal":"low","xhigh":"xhigh"},
input: ["text", "image"], input: ["text", "image"],
cost: { cost: {
input: 0, input: 1.75,
output: 0, output: 14,
cacheRead: 0, cacheRead: 0.175,
cacheWrite: 0, cacheWrite: 0,
}, },
contextWindow: 400000, contextWindow: 400000,
@@ -4189,9 +4189,9 @@ export const MODELS = {
thinkingLevelMap: {"off":null,"minimal":"low","xhigh":"xhigh"}, thinkingLevelMap: {"off":null,"minimal":"low","xhigh":"xhigh"},
input: ["text", "image"], input: ["text", "image"],
cost: { cost: {
input: 0, input: 2.5,
output: 0, output: 15,
cacheRead: 0, cacheRead: 0.25,
cacheWrite: 0, cacheWrite: 0,
}, },
contextWindow: 400000, contextWindow: 400000,
@@ -4199,7 +4199,7 @@ export const MODELS = {
} satisfies Model<"openai-responses">, } satisfies Model<"openai-responses">,
"gpt-5.4-mini": { "gpt-5.4-mini": {
id: "gpt-5.4-mini", id: "gpt-5.4-mini",
name: "GPT-5.4 Mini", name: "GPT-5.4 mini",
api: "openai-responses", api: "openai-responses",
provider: "github-copilot", provider: "github-copilot",
baseUrl: "https://api.individual.githubcopilot.com", baseUrl: "https://api.individual.githubcopilot.com",
@@ -4208,9 +4208,28 @@ export const MODELS = {
thinkingLevelMap: {"off":null,"minimal":"low","xhigh":"xhigh"}, thinkingLevelMap: {"off":null,"minimal":"low","xhigh":"xhigh"},
input: ["text", "image"], input: ["text", "image"],
cost: { cost: {
input: 0, input: 0.75,
output: 0, output: 4.5,
cacheRead: 0, 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, cacheWrite: 0,
}, },
contextWindow: 400000, contextWindow: 400000,
@@ -4227,32 +4246,32 @@ export const MODELS = {
thinkingLevelMap: {"off":null,"minimal":"low","xhigh":"xhigh"}, thinkingLevelMap: {"off":null,"minimal":"low","xhigh":"xhigh"},
input: ["text", "image"], input: ["text", "image"],
cost: { cost: {
input: 0, input: 5,
output: 0, output: 30,
cacheRead: 0, cacheRead: 0.5,
cacheWrite: 0, cacheWrite: 0,
}, },
contextWindow: 400000, contextWindow: 400000,
maxTokens: 128000, maxTokens: 128000,
} satisfies Model<"openai-responses">, } satisfies Model<"openai-responses">,
"grok-code-fast-1": { "raptor-mini": {
id: "grok-code-fast-1", id: "raptor-mini",
name: "Grok Code Fast 1", name: "Raptor mini",
api: "openai-completions", api: "openai-completions",
provider: "github-copilot", provider: "github-copilot",
baseUrl: "https://api.individual.githubcopilot.com", 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"}, 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}, compat: {"supportsStore":false,"supportsDeveloperRole":false,"supportsReasoningEffort":false},
reasoning: true, reasoning: true,
input: ["text"], input: ["text", "image"],
cost: { cost: {
input: 0, input: 0.25,
output: 0, output: 2,
cacheRead: 0, cacheRead: 0.025,
cacheWrite: 0, cacheWrite: 0,
}, },
contextWindow: 128000, contextWindow: 400000,
maxTokens: 64000, maxTokens: 128000,
} satisfies Model<"openai-completions">, } satisfies Model<"openai-completions">,
}, },
"google": { "google": {
@@ -7863,6 +7882,23 @@ export const MODELS = {
contextWindow: 204800, contextWindow: 204800,
maxTokens: 131072, maxTokens: 131072,
} satisfies Model<"openai-completions">, } 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": { "nemotron-3-super-free": {
id: "nemotron-3-super-free", id: "nemotron-3-super-free",
name: "Nemotron 3 Super Free", name: "Nemotron 3 Super Free",
@@ -8092,6 +8128,23 @@ export const MODELS = {
contextWindow: 204800, contextWindow: 204800,
maxTokens: 131072, maxTokens: 131072,
} satisfies Model<"openai-completions">, } 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": { "qwen3.6-plus": {
id: "qwen3.6-plus", id: "qwen3.6-plus",
name: "Qwen3.6 Plus", name: "Qwen3.6 Plus",
@@ -8688,8 +8741,8 @@ export const MODELS = {
reasoning: false, reasoning: false,
input: ["text"], input: ["text"],
cost: { cost: {
input: 0.2288, input: 0.20020000000000002,
output: 0.9144, output: 0.8000999999999999,
cacheRead: 0, cacheRead: 0,
cacheWrite: 0, cacheWrite: 0,
}, },
@@ -8790,13 +8843,13 @@ export const MODELS = {
reasoning: true, reasoning: true,
input: ["text"], input: ["text"],
cost: { cost: {
input: 0.252, input: 0.2288,
output: 0.378, output: 0.3432,
cacheRead: 0.0252, cacheRead: 0,
cacheWrite: 0, cacheWrite: 0,
}, },
contextWindow: 131072, contextWindow: 131072,
maxTokens: 65536, maxTokens: 64000,
} satisfies Model<"openai-completions">, } satisfies Model<"openai-completions">,
"deepseek/deepseek-v3.2-exp": { "deepseek/deepseek-v3.2-exp": {
id: "deepseek/deepseek-v3.2-exp", id: "deepseek/deepseek-v3.2-exp",
@@ -8870,40 +8923,6 @@ export const MODELS = {
contextWindow: 32768, contextWindow: 32768,
maxTokens: 4096, maxTokens: 4096,
} satisfies Model<"openai-completions">, } 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": { "google/gemini-2.5-flash": {
id: "google/gemini-2.5-flash", id: "google/gemini-2.5-flash",
name: "Google: Gemini 2.5 Flash", name: "Google: Gemini 2.5 Flash",
@@ -9492,13 +9511,30 @@ export const MODELS = {
reasoning: true, reasoning: true,
input: ["text"], input: ["text"],
cost: { cost: {
input: 0.26, input: 0.27899999999999997,
output: 1.2, output: 1.2,
cacheRead: 0, cacheRead: 0,
cacheWrite: 0, cacheWrite: 0,
}, },
contextWindow: 204800, 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">, } satisfies Model<"openai-completions">,
"mistralai/codestral-2508": { "mistralai/codestral-2508": {
id: "mistralai/codestral-2508", id: "mistralai/codestral-2508",
@@ -11291,13 +11327,13 @@ export const MODELS = {
reasoning: false, reasoning: false,
input: ["text"], input: ["text"],
cost: { cost: {
input: 0.09, input: 0.0428,
output: 0.3, output: 0.1716,
cacheRead: 0, cacheRead: 0,
cacheWrite: 0, cacheWrite: 0,
}, },
contextWindow: 262144, contextWindow: 131072,
maxTokens: 262144, maxTokens: 32000,
} satisfies Model<"openai-completions">, } satisfies Model<"openai-completions">,
"qwen/qwen3-30b-a3b-thinking-2507": { "qwen/qwen3-30b-a3b-thinking-2507": {
id: "qwen/qwen3-30b-a3b-thinking-2507", id: "qwen/qwen3-30b-a3b-thinking-2507",
@@ -12334,7 +12370,7 @@ export const MODELS = {
cacheWrite: 0, cacheWrite: 0,
}, },
contextWindow: 202752, contextWindow: 202752,
maxTokens: 4096, maxTokens: 16384,
} satisfies Model<"openai-completions">, } satisfies Model<"openai-completions">,
"z-ai/glm-5-turbo": { "z-ai/glm-5-turbo": {
id: "z-ai/glm-5-turbo", id: "z-ai/glm-5-turbo",
@@ -12368,7 +12404,7 @@ export const MODELS = {
cacheWrite: 0, cacheWrite: 0,
}, },
contextWindow: 202752, contextWindow: 202752,
maxTokens: 4096, maxTokens: 131072,
} satisfies Model<"openai-completions">, } satisfies Model<"openai-completions">,
"z-ai/glm-5v-turbo": { "z-ai/glm-5v-turbo": {
id: "z-ai/glm-5v-turbo", id: "z-ai/glm-5v-turbo",
@@ -12889,7 +12925,7 @@ export const MODELS = {
api: "anthropic-messages", api: "anthropic-messages",
provider: "vercel-ai-gateway", provider: "vercel-ai-gateway",
baseUrl: "https://ai-gateway.vercel.sh", baseUrl: "https://ai-gateway.vercel.sh",
reasoning: false, reasoning: true,
input: ["text"], input: ["text"],
cost: { cost: {
input: 0.22, input: 0.22,
@@ -12974,7 +13010,7 @@ export const MODELS = {
api: "anthropic-messages", api: "anthropic-messages",
provider: "vercel-ai-gateway", provider: "vercel-ai-gateway",
baseUrl: "https://ai-gateway.vercel.sh", baseUrl: "https://ai-gateway.vercel.sh",
reasoning: false, reasoning: true,
input: ["text"], input: ["text"],
cost: { cost: {
input: 1.5, input: 1.5,
@@ -13008,7 +13044,7 @@ export const MODELS = {
api: "anthropic-messages", api: "anthropic-messages",
provider: "vercel-ai-gateway", provider: "vercel-ai-gateway",
baseUrl: "https://ai-gateway.vercel.sh", baseUrl: "https://ai-gateway.vercel.sh",
reasoning: false, reasoning: true,
input: ["text"], input: ["text"],
cost: { cost: {
input: 0.5, input: 0.5,
@@ -13087,6 +13123,40 @@ export const MODELS = {
contextWindow: 256000, contextWindow: 256000,
maxTokens: 65536, maxTokens: 65536,
} satisfies Model<"anthropic-messages">, } 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": { "alibaba/qwen3-vl-thinking": {
id: "alibaba/qwen3-vl-thinking", id: "alibaba/qwen3-vl-thinking",
name: "Qwen3 VL 235B A22B Thinking", name: "Qwen3 VL 235B A22B Thinking",
@@ -13189,6 +13259,23 @@ export const MODELS = {
contextWindow: 991000, contextWindow: 991000,
maxTokens: 64000, maxTokens: 64000,
} satisfies Model<"anthropic-messages">, } 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": { "anthropic/claude-3-haiku": {
id: "anthropic/claude-3-haiku", id: "anthropic/claude-3-haiku",
name: "Claude 3 Haiku", name: "Claude 3 Haiku",
@@ -13542,8 +13629,8 @@ export const MODELS = {
api: "anthropic-messages", api: "anthropic-messages",
provider: "vercel-ai-gateway", provider: "vercel-ai-gateway",
baseUrl: "https://ai-gateway.vercel.sh", baseUrl: "https://ai-gateway.vercel.sh",
reasoning: false, reasoning: true,
input: ["text"], input: ["text", "image"],
cost: { cost: {
input: 0.28, input: 0.28,
output: 0.42, output: 0.42,
@@ -13559,8 +13646,8 @@ export const MODELS = {
api: "anthropic-messages", api: "anthropic-messages",
provider: "vercel-ai-gateway", provider: "vercel-ai-gateway",
baseUrl: "https://ai-gateway.vercel.sh", baseUrl: "https://ai-gateway.vercel.sh",
reasoning: false, reasoning: true,
input: ["text"], input: ["text", "image"],
cost: { cost: {
input: 0.62, input: 0.62,
output: 1.85, output: 1.85,
@@ -13577,7 +13664,7 @@ export const MODELS = {
provider: "vercel-ai-gateway", provider: "vercel-ai-gateway",
baseUrl: "https://ai-gateway.vercel.sh", baseUrl: "https://ai-gateway.vercel.sh",
reasoning: true, reasoning: true,
input: ["text"], input: ["text", "image"],
cost: { cost: {
input: 0.14, input: 0.14,
output: 0.28, output: 0.28,
@@ -13594,7 +13681,7 @@ export const MODELS = {
provider: "vercel-ai-gateway", provider: "vercel-ai-gateway",
baseUrl: "https://ai-gateway.vercel.sh", baseUrl: "https://ai-gateway.vercel.sh",
reasoning: true, reasoning: true,
input: ["text"], input: ["text", "image"],
cost: { cost: {
input: 0.435, input: 0.435,
output: 0.87, output: 0.87,
@@ -13797,12 +13884,12 @@ export const MODELS = {
api: "anthropic-messages", api: "anthropic-messages",
provider: "vercel-ai-gateway", provider: "vercel-ai-gateway",
baseUrl: "https://ai-gateway.vercel.sh", baseUrl: "https://ai-gateway.vercel.sh",
reasoning: false, reasoning: true,
input: ["text", "image"], input: ["text", "image"],
cost: { cost: {
input: 0.13, input: 0.15,
output: 0.39999999999999997, output: 0.6,
cacheRead: 0, cacheRead: 0.015,
cacheWrite: 0, cacheWrite: 0,
}, },
contextWindow: 262144, contextWindow: 262144,
@@ -14087,7 +14174,7 @@ export const MODELS = {
provider: "vercel-ai-gateway", provider: "vercel-ai-gateway",
baseUrl: "https://ai-gateway.vercel.sh", baseUrl: "https://ai-gateway.vercel.sh",
reasoning: true, reasoning: true,
input: ["text"], input: ["text", "image"],
cost: { cost: {
input: 0.6, input: 0.6,
output: 2.4, output: 2.4,
@@ -14131,6 +14218,23 @@ export const MODELS = {
contextWindow: 204800, contextWindow: 204800,
maxTokens: 131100, maxTokens: 131100,
} satisfies Model<"anthropic-messages">, } 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": { "mistral/codestral": {
id: "mistral/codestral", id: "mistral/codestral",
name: "Mistral Codestral", name: "Mistral Codestral",
@@ -14267,6 +14371,23 @@ export const MODELS = {
contextWindow: 256000, contextWindow: 256000,
maxTokens: 256000, maxTokens: 256000,
} satisfies Model<"anthropic-messages">, } 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": { "mistral/mistral-small": {
id: "mistral/mistral-small", id: "mistral/mistral-small",
name: "Mistral Small", name: "Mistral Small",
@@ -14420,6 +14541,23 @@ export const MODELS = {
contextWindow: 262000, contextWindow: 262000,
maxTokens: 262000, maxTokens: 262000,
} satisfies Model<"anthropic-messages">, } 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": { "nvidia/nemotron-nano-12b-v2-vl": {
id: "nvidia/nemotron-nano-12b-v2-vl", id: "nvidia/nemotron-nano-12b-v2-vl",
name: "Nvidia Nemotron Nano 12B V2 VL", name: "Nvidia Nemotron Nano 12B V2 VL",
@@ -14597,7 +14735,7 @@ export const MODELS = {
provider: "vercel-ai-gateway", provider: "vercel-ai-gateway",
baseUrl: "https://ai-gateway.vercel.sh", baseUrl: "https://ai-gateway.vercel.sh",
reasoning: true, reasoning: true,
input: ["text"], input: ["text", "image"],
cost: { cost: {
input: 1.25, input: 1.25,
output: 10, output: 10,
@@ -14959,6 +15097,23 @@ export const MODELS = {
contextWindow: 1000000, contextWindow: 1000000,
maxTokens: 128000, maxTokens: 128000,
} satisfies Model<"anthropic-messages">, } 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": { "openai/gpt-oss-20b": {
id: "openai/gpt-oss-20b", id: "openai/gpt-oss-20b",
name: "GPT OSS 20B", name: "GPT OSS 20B",
@@ -15441,7 +15596,7 @@ export const MODELS = {
api: "anthropic-messages", api: "anthropic-messages",
provider: "vercel-ai-gateway", provider: "vercel-ai-gateway",
baseUrl: "https://ai-gateway.vercel.sh", baseUrl: "https://ai-gateway.vercel.sh",
reasoning: false, reasoning: true,
input: ["text", "image"], input: ["text", "image"],
cost: { cost: {
input: 0.6, input: 0.6,
@@ -15595,7 +15750,7 @@ export const MODELS = {
provider: "vercel-ai-gateway", provider: "vercel-ai-gateway",
baseUrl: "https://ai-gateway.vercel.sh", baseUrl: "https://ai-gateway.vercel.sh",
reasoning: true, reasoning: true,
input: ["text"], input: ["text", "image"],
cost: { cost: {
input: 1.4, input: 1.4,
output: 4.4, output: 4.4,

View File

@@ -120,15 +120,15 @@ describe("Context overflow error handling", () => {
// ============================================================================= // =============================================================================
// GitHub Copilot (OAuth) // GitHub Copilot (OAuth)
// Tests both OpenAI and Anthropic models via Copilot // Tests both Google and Anthropic models via Copilot
// ============================================================================= // =============================================================================
describe("GitHub Copilot (OAuth)", () => { describe("GitHub Copilot (OAuth)", () => {
// OpenAI model via Copilot // Google model via Copilot
it.skipIf(!githubCopilotToken)( it.skipIf(!githubCopilotToken)(
"gpt-4o - should detect overflow via isContextOverflow", "gemini-2.5-pro - should detect overflow via isContextOverflow",
async () => { async () => {
const model = getModel("github-copilot", "gpt-4o"); const model = getModel("github-copilot", "gemini-2.5-pro");
const result = await testContextOverflow(model, githubCopilotToken!); const result = await testContextOverflow(model, githubCopilotToken!);
logResult(result); logResult(result);

View File

@@ -630,37 +630,37 @@ describe("AI Providers Empty Message Tests", () => {
describe("GitHub Copilot Provider Empty Messages", () => { describe("GitHub Copilot Provider Empty Messages", () => {
it.skipIf(!githubCopilotToken)( it.skipIf(!githubCopilotToken)(
"gpt-4o - should handle empty content array", "claude-haiku-4.5 - should handle empty content array",
{ retry: 3, timeout: 30000 }, { retry: 3, timeout: 30000 },
async () => { async () => {
const llm = getModel("github-copilot", "gpt-4o"); const llm = getModel("github-copilot", "claude-haiku-4.5");
await testEmptyMessage(llm, { apiKey: githubCopilotToken }); await testEmptyMessage(llm, { apiKey: githubCopilotToken });
}, },
); );
it.skipIf(!githubCopilotToken)( it.skipIf(!githubCopilotToken)(
"gpt-4o - should handle empty string content", "claude-haiku-4.5 - should handle empty string content",
{ retry: 3, timeout: 30000 }, { retry: 3, timeout: 30000 },
async () => { async () => {
const llm = getModel("github-copilot", "gpt-4o"); const llm = getModel("github-copilot", "claude-haiku-4.5");
await testEmptyStringMessage(llm, { apiKey: githubCopilotToken }); await testEmptyStringMessage(llm, { apiKey: githubCopilotToken });
}, },
); );
it.skipIf(!githubCopilotToken)( it.skipIf(!githubCopilotToken)(
"gpt-4o - should handle whitespace-only content", "claude-haiku-4.5 - should handle whitespace-only content",
{ retry: 3, timeout: 30000 }, { retry: 3, timeout: 30000 },
async () => { async () => {
const llm = getModel("github-copilot", "gpt-4o"); const llm = getModel("github-copilot", "claude-haiku-4.5");
await testWhitespaceOnlyMessage(llm, { apiKey: githubCopilotToken }); await testWhitespaceOnlyMessage(llm, { apiKey: githubCopilotToken });
}, },
); );
it.skipIf(!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 }, { retry: 3, timeout: 30000 },
async () => { async () => {
const llm = getModel("github-copilot", "gpt-4o"); const llm = getModel("github-copilot", "claude-haiku-4.5");
await testEmptyAssistantMessage(llm, { apiKey: githubCopilotToken }); await testEmptyAssistantMessage(llm, { apiKey: githubCopilotToken });
}, },
); );

View File

@@ -443,19 +443,19 @@ describe("Tool Results with Images", () => {
describe("GitHub Copilot Provider", () => { describe("GitHub Copilot Provider", () => {
it.skipIf(!githubCopilotToken)( 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 }, { retry: 3, timeout: 30000 },
async () => { async () => {
const llm = getModel("github-copilot", "gpt-4o"); const llm = getModel("github-copilot", "claude-haiku-4.5");
await handleToolWithImageResult(llm, { apiKey: githubCopilotToken }); await handleToolWithImageResult(llm, { apiKey: githubCopilotToken });
}, },
); );
it.skipIf(!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 }, { retry: 3, timeout: 30000 },
async () => { async () => {
const llm = getModel("github-copilot", "gpt-4o"); const llm = getModel("github-copilot", "claude-haiku-4.5");
await handleToolWithTextAndImageResult(llm, { apiKey: githubCopilotToken }); await handleToolWithTextAndImageResult(llm, { apiKey: githubCopilotToken });
}, },
); );

View File

@@ -295,10 +295,10 @@ describe("Token Statistics on Abort", () => {
describe("GitHub Copilot Provider", () => { describe("GitHub Copilot Provider", () => {
it.skipIf(!githubCopilotToken)( 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 }, { retry: 3, timeout: 30000 },
async () => { async () => {
const llm = getModel("github-copilot", "gpt-4o"); const llm = getModel("github-copilot", "claude-haiku-4.5");
await testTokensOnAbort(llm, { apiKey: githubCopilotToken }); await testTokensOnAbort(llm, { apiKey: githubCopilotToken });
}, },
); );

View File

@@ -297,10 +297,10 @@ describe("Tool Call Without Result Tests", () => {
describe("GitHub Copilot Provider", () => { describe("GitHub Copilot Provider", () => {
it.skipIf(!githubCopilotToken)( 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 }, { retry: 3, timeout: 30000 },
async () => { async () => {
const model = getModel("github-copilot", "gpt-4o"); const model = getModel("github-copilot", "claude-haiku-4.5");
await testToolCallWithoutResult(model, { apiKey: githubCopilotToken }); await testToolCallWithoutResult(model, { apiKey: githubCopilotToken });
}, },
); );

View File

@@ -178,18 +178,22 @@ describe("totalTokens field", () => {
}); });
describe.skipIf(!process.env.OPENAI_API_KEY)("OpenAI Responses", () => { 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 () => { it(
const llm = getModel("openai", "gpt-4o"); "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}:`); console.log(`\nOpenAI Responses / ${llm.id}:`);
const { first, second } = await testTotalTokensWithCache(llm); const { first, second } = await testTotalTokensWithCache(llm);
logUsage("First request", first); logUsage("First request", first);
logUsage("Second request", second); logUsage("Second request", second);
assertTotalTokensEqualsComponents(first); assertTotalTokensEqualsComponents(first);
assertTotalTokensEqualsComponents(second); assertTotalTokensEqualsComponents(second);
}); },
);
}); });
describe.skipIf(!hasAzureOpenAICredentials())("Azure OpenAI Responses", () => { describe.skipIf(!hasAzureOpenAICredentials())("Azure OpenAI Responses", () => {
@@ -666,10 +670,10 @@ describe("totalTokens field", () => {
); );
it( 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 }, { retry: 3, timeout: 60000 },
async () => { 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}:`); console.log(`\nOpenRouter / ${llm.id}:`);
const { first, second } = await testTotalTokensWithCache(llm, { apiKey: process.env.OPENROUTER_API_KEY }); const { first, second } = await testTotalTokensWithCache(llm, { apiKey: process.env.OPENROUTER_API_KEY });
@@ -683,10 +687,10 @@ describe("totalTokens field", () => {
); );
it( 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 }, { retry: 3, timeout: 60000 },
async () => { async () => {
const llm = getModel("openrouter", "meta-llama/llama-4-scout"); const llm = getModel("openrouter", "deepseek/deepseek-chat");
console.log(`\nOpenRouter / ${llm.id}:`); console.log(`\nOpenRouter / ${llm.id}:`);
const { first, second } = await testTotalTokensWithCache(llm, { apiKey: process.env.OPENROUTER_API_KEY }); const { first, second } = await testTotalTokensWithCache(llm, { apiKey: process.env.OPENROUTER_API_KEY });
@@ -706,10 +710,10 @@ describe("totalTokens field", () => {
describe("GitHub Copilot (OAuth)", () => { describe("GitHub Copilot (OAuth)", () => {
it.skipIf(!githubCopilotToken)( 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 }, { retry: 3, timeout: 60000 },
async () => { async () => {
const llm = getModel("github-copilot", "gpt-4o"); const llm = getModel("github-copilot", "claude-haiku-4.5");
console.log(`\nGitHub Copilot / ${llm.id}:`); console.log(`\nGitHub Copilot / ${llm.id}:`);
const { first, second } = await testTotalTokensWithCache(llm, { apiKey: githubCopilotToken }); const { first, second } = await testTotalTokensWithCache(llm, { apiKey: githubCopilotToken });

View File

@@ -396,28 +396,28 @@ describe("AI Providers Unicode Surrogate Pair Tests", () => {
describe("GitHub Copilot Provider Unicode Handling", () => { describe("GitHub Copilot Provider Unicode Handling", () => {
it.skipIf(!githubCopilotToken)( 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 }, { retry: 3, timeout: 30000 },
async () => { async () => {
const llm = getModel("github-copilot", "gpt-4o"); const llm = getModel("github-copilot", "claude-haiku-4.5");
await testEmojiInToolResults(llm, { apiKey: githubCopilotToken }); await testEmojiInToolResults(llm, { apiKey: githubCopilotToken });
}, },
); );
it.skipIf(!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 }, { retry: 3, timeout: 30000 },
async () => { async () => {
const llm = getModel("github-copilot", "gpt-4o"); const llm = getModel("github-copilot", "claude-haiku-4.5");
await testRealWorldLinkedInData(llm, { apiKey: githubCopilotToken }); await testRealWorldLinkedInData(llm, { apiKey: githubCopilotToken });
}, },
); );
it.skipIf(!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 }, { retry: 3, timeout: 30000 },
async () => { async () => {
const llm = getModel("github-copilot", "gpt-4o"); const llm = getModel("github-copilot", "claude-haiku-4.5");
await testUnpairedHighSurrogate(llm, { apiKey: githubCopilotToken }); await testUnpairedHighSurrogate(llm, { apiKey: githubCopilotToken });
}, },
); );