feat(models): add Vercel AI Gateway provider

This commit is contained in:
William Valentin
2026-02-15 10:52:03 -08:00
parent a8307012f5
commit 87e942b4c5
4 changed files with 38 additions and 1 deletions
+10
View File
@@ -169,6 +169,16 @@ describe('configSchema — models auth_mode', () => {
});
}).toThrow(/auth_mode/i);
});
it('accepts vercel provider id', () => {
const result = configSchema.parse({
...minimalConfig,
models: {
default: { provider: 'vercel', model: 'openai/gpt-4.1', endpoint: 'https://ai-gateway.vercel.sh/v1', api_key: 'test-key' },
},
});
expect(result.models.default.provider).toBe('vercel');
});
});
describe('configSchema — skills watcher', () => {
+1 -1
View File
@@ -39,7 +39,7 @@ const serverSchema = z.object({
});
/** All supported model provider identifiers. Used by the config schema and TUI autocompletion. */
export const MODEL_PROVIDERS = ['anthropic', 'openai', 'gemini', 'ollama', 'llamacpp', 'openrouter', 'bedrock', 'github', 'zhipuai', 'xai', 'synthetic'] as const;
export const MODEL_PROVIDERS = ['anthropic', 'openai', 'gemini', 'ollama', 'llamacpp', 'openrouter', 'vercel', 'bedrock', 'github', 'zhipuai', 'xai', 'synthetic'] as const;
export type ModelProvider = (typeof MODEL_PROVIDERS)[number];
+21
View File
@@ -103,6 +103,27 @@ describe('createClientFromConfig', () => {
expect(client.constructor.name).toBe('OpenAIClient');
});
it('creates OpenAIClient for vercel provider', async () => {
const prev = process.env.AI_GATEWAY_API_KEY;
process.env.AI_GATEWAY_API_KEY = 'test-key';
try {
const { createClientFromConfig } = await loadFactory();
const client = createClientFromConfig({
provider: 'vercel',
model: 'openai/gpt-4.1',
endpoint: 'https://ai-gateway.vercel.sh/v1',
});
expect(client.constructor.name).toBe('OpenAIClient');
} finally {
if (prev === undefined) {
delete process.env.AI_GATEWAY_API_KEY;
} else {
process.env.AI_GATEWAY_API_KEY = prev;
}
}
});
it('creates OpenAIClient with Zhipu AI baseURL for zhipuai provider', async () => {
const { createClientFromConfig } = await loadFactory();
const client = createClientFromConfig({
+6
View File
@@ -190,6 +190,12 @@ export function createClientFromConfig(cfg: ModelConfig): ModelClient {
apiKey: requireApiKey(cfg, 'OPENROUTER_API_KEY'),
baseURL: cfg.endpoint ?? 'https://openrouter.ai/api/v1',
});
case 'vercel':
return new OpenAIClient({
model: cfg.model,
apiKey: requireApiKey(cfg, 'AI_GATEWAY_API_KEY'),
baseURL: cfg.endpoint ?? 'https://ai-gateway.vercel.sh/v1',
});
case 'zhipuai':
if (cfg.use_oauth) {
const apiKey = getZaiApiKey();