@@ -9,107 +9,74 @@ import {
99} from "./pricing.ts" ;
1010
1111describe ( "generateLookupCandidates" , ( ) => {
12- describe ( "openrouter provider (slash format)" , ( ) => {
13- it ( "should generate candidates for openrouter/anthropic/model" , ( ) => {
14- const candidates = generateLookupCandidates (
15- "openrouter/anthropic/claude-sonnet-4" ,
16- ) ;
17- expect ( candidates ) . toContain ( "openrouter/anthropic/claude-sonnet-4" ) ;
18- expect ( candidates ) . toContain ( "anthropic/claude-sonnet-4" ) ;
19- expect ( candidates ) . toContain ( "claude-sonnet-4" ) ;
20- } ) ;
21-
22- it ( "should generate candidates for openrouter/openai/model" , ( ) => {
23- const candidates = generateLookupCandidates ( "openrouter/openai/gpt-4o" ) ;
24- expect ( candidates ) . toContain ( "openrouter/openai/gpt-4o" ) ;
25- expect ( candidates ) . toContain ( "openai/gpt-4o" ) ;
26- expect ( candidates ) . toContain ( "gpt-4o" ) ;
27- } ) ;
28-
29- it ( "should handle openrouter with simple model name" , ( ) => {
30- const candidates = generateLookupCandidates ( "openrouter/some-model" ) ;
31- expect ( candidates ) . toContain ( "openrouter/some-model" ) ;
32- expect ( candidates ) . toContain ( "some-model" ) ;
33- } ) ;
34- } ) ;
35-
36- describe ( "anthropic provider (slash format)" , ( ) => {
37- it ( "should generate candidates for anthropic/model" , ( ) => {
38- const candidates = generateLookupCandidates ( "anthropic/claude-haiku-4-5" ) ;
39- expect ( candidates ) . toContain ( "anthropic/claude-haiku-4-5" ) ;
40- expect ( candidates ) . toContain ( "claude-haiku-4-5" ) ;
41- } ) ;
42- } ) ;
43-
44- describe ( "Vercel AI Gateway format (colon separator)" , ( ) => {
45- it ( "should generate candidates for anthropic:model" , ( ) => {
46- const candidates = generateLookupCandidates ( "anthropic:claude-sonnet-4" ) ;
47- expect ( candidates ) . toContain ( "anthropic:claude-sonnet-4" ) ;
48- expect ( candidates ) . toContain ( "anthropic/claude-sonnet-4" ) ;
49- expect ( candidates ) . toContain ( "claude-sonnet-4" ) ;
12+ describe ( "Vercel AI Gateway format (provider/model)" , ( ) => {
13+ it ( "should generate candidates for alibaba/qwen-3-14b" , ( ) => {
14+ const candidates = generateLookupCandidates ( "alibaba/qwen-3-14b" ) ;
15+ expect ( candidates ) . toEqual ( [
16+ "vercel_ai_gateway/alibaba/qwen-3-14b" ,
17+ "alibaba/qwen-3-14b" ,
18+ "qwen-3-14b" ,
19+ ] ) ;
5020 } ) ;
5121
52- it ( "should generate candidates for openai:model" , ( ) => {
53- const candidates = generateLookupCandidates ( "openai:gpt-4o" ) ;
54- expect ( candidates ) . toContain ( "openai:gpt-4o" ) ;
55- expect ( candidates ) . toContain ( "openai/gpt-4o" ) ;
56- expect ( candidates ) . toContain ( "gpt-4o" ) ;
22+ it ( "should generate candidates for anthropic/claude-sonnet-4" , ( ) => {
23+ const candidates = generateLookupCandidates ( "anthropic/claude-sonnet-4" ) ;
24+ expect ( candidates ) . toEqual ( [
25+ "vercel_ai_gateway/anthropic/claude-sonnet-4" ,
26+ "anthropic/claude-sonnet-4" ,
27+ "claude-sonnet-4" ,
28+ ] ) ;
5729 } ) ;
5830
59- it ( "should generate candidates for google:model" , ( ) => {
60- const candidates = generateLookupCandidates ( "google:gemini-2.0-flash" ) ;
61- expect ( candidates ) . toContain ( "google:gemini-2.0-flash" ) ;
62- expect ( candidates ) . toContain ( "google/gemini-2.0-flash" ) ;
63- expect ( candidates ) . toContain ( "gemini-2.0-flash" ) ;
64- } ) ;
65-
66- it ( "should generate candidates for x-ai:model" , ( ) => {
67- const candidates = generateLookupCandidates ( "x-ai:grok-2" ) ;
68- expect ( candidates ) . toContain ( "x-ai:grok-2" ) ;
69- expect ( candidates ) . toContain ( "x-ai/grok-2" ) ;
70- expect ( candidates ) . toContain ( "grok-2" ) ;
71- } ) ;
72- } ) ;
73-
74- describe ( "openai provider (slash format)" , ( ) => {
75- it ( "should generate candidates for openai/model" , ( ) => {
31+ it ( "should generate candidates for openai/gpt-4o" , ( ) => {
7632 const candidates = generateLookupCandidates ( "openai/gpt-4o" ) ;
77- expect ( candidates ) . toContain ( "openai/gpt-4o" ) ;
78- expect ( candidates ) . toContain ( "gpt-4o" ) ;
33+ expect ( candidates ) . toEqual ( [
34+ "vercel_ai_gateway/openai/gpt-4o" ,
35+ "openai/gpt-4o" ,
36+ "gpt-4o" ,
37+ ] ) ;
7938 } ) ;
8039
81- it ( "should handle openai/gpt-4o-mini" , ( ) => {
82- const candidates = generateLookupCandidates ( "openai/gpt-4o-mini" ) ;
83- expect ( candidates ) . toContain ( "openai/gpt-4o-mini" ) ;
84- expect ( candidates ) . toContain ( "gpt-4o-mini" ) ;
40+ it ( "should generate candidates for google/gemini-2.0-flash" , ( ) => {
41+ const candidates = generateLookupCandidates ( "google/gemini-2.0-flash" ) ;
42+ expect ( candidates ) . toEqual ( [
43+ "vercel_ai_gateway/google/gemini-2.0-flash" ,
44+ "google/gemini-2.0-flash" ,
45+ "gemini-2.0-flash" ,
46+ ] ) ;
8547 } ) ;
86- } ) ;
8748
88- describe ( "lmstudio provider" , ( ) => {
89- it ( "should generate candidates for lmstudio/model" , ( ) => {
90- const candidates = generateLookupCandidates ( "lmstudio/llama-3-8b" ) ;
91- expect ( candidates ) . toContain ( "lmstudio/llama-3-8b" ) ;
92- expect ( candidates ) . toContain ( "llama-3-8b" ) ;
49+ it ( "should generate candidates for x-ai/grok-2" , ( ) => {
50+ const candidates = generateLookupCandidates ( "x-ai/grok-2" ) ;
51+ expect ( candidates ) . toEqual ( [
52+ "vercel_ai_gateway/x-ai/grok-2" ,
53+ "x-ai/grok-2" ,
54+ "grok-2" ,
55+ ] ) ;
9356 } ) ;
9457 } ) ;
9558
96- describe ( "unknown provider" , ( ) => {
97- it ( "should return only the original string for unknown provider" , ( ) => {
98- const candidates = generateLookupCandidates ( "unknown/some-model" ) ;
99- expect ( candidates ) . toEqual ( [ "unknown/some-model" ] ) ;
100- } ) ;
101-
102- it ( "should handle unknown provider with colon format" , ( ) => {
103- const candidates = generateLookupCandidates ( "unknown:some-model" ) ;
104- expect ( candidates ) . toContain ( "unknown:some-model" ) ;
105- expect ( candidates ) . toContain ( "unknown/some-model" ) ;
59+ describe ( "nested paths (openrouter style)" , ( ) => {
60+ it ( "should handle openrouter/anthropic/claude-sonnet-4" , ( ) => {
61+ const candidates = generateLookupCandidates (
62+ "openrouter/anthropic/claude-sonnet-4" ,
63+ ) ;
64+ expect ( candidates ) . toEqual ( [
65+ "vercel_ai_gateway/openrouter/anthropic/claude-sonnet-4" ,
66+ "openrouter/anthropic/claude-sonnet-4" ,
67+ "anthropic/claude-sonnet-4" ,
68+ "claude-sonnet-4" ,
69+ ] ) ;
10670 } ) ;
10771 } ) ;
10872
10973 describe ( "no provider prefix" , ( ) => {
110- it ( "should return only the original string when no separator" , ( ) => {
74+ it ( "should return only the original string with gateway prefix when no separator" , ( ) => {
11175 const candidates = generateLookupCandidates ( "claude-sonnet-4" ) ;
112- expect ( candidates ) . toEqual ( [ "claude-sonnet-4" ] ) ;
76+ expect ( candidates ) . toEqual ( [
77+ "vercel_ai_gateway/claude-sonnet-4" ,
78+ "claude-sonnet-4" ,
79+ ] ) ;
11380 } ) ;
11481 } ) ;
11582} ) ;
0 commit comments