main
1import { ModelInfo, Provider, ProviderConfig } from "../config.js";
2import { LLMProvider } from "./types.js";
3import { AnthropicProvider } from "./anthropic.js";
4import { GoogleProvider } from "./google.js";
5import { OpenAIProvider } from "./openai.js";
6import { OllamaProvider } from "./ollama.js";
7
8export type { LLMProvider, Message, ToolDefinition, LLMResponse } from "./types.js";
9
10export function createProvider(
11 modelInfo: ModelInfo,
12 providerConfig: ProviderConfig
13): LLMProvider {
14 const { provider, model } = modelInfo;
15
16 switch (provider) {
17 case "anthropic": {
18 const config = providerConfig.anthropic;
19 if (!config) {
20 throw new Error("Anthropic API key not configured");
21 }
22 return new AnthropicProvider(config.apiKey, model);
23 }
24
25 case "google": {
26 const config = providerConfig.google;
27 if (!config) {
28 throw new Error("Google API key not configured");
29 }
30 return new GoogleProvider(config.apiKey, model);
31 }
32
33 case "openai": {
34 const config = providerConfig.openai;
35 if (!config) {
36 throw new Error("OpenAI API key not configured");
37 }
38 return new OpenAIProvider(config.apiKey, model);
39 }
40
41 case "github": {
42 const config = providerConfig.github;
43 if (!config) {
44 throw new Error("GitHub token not configured");
45 }
46 // GitHub Copilot uses OpenAI-compatible API
47 return new OpenAIProvider(
48 config.token,
49 model,
50 "https://api.githubcopilot.com"
51 );
52 }
53
54 case "ollama": {
55 const config = providerConfig.ollama;
56 const baseUrl = config?.baseUrl || "http://localhost:11434";
57 return new OllamaProvider(baseUrl, model);
58 }
59
60 case "groq": {
61 const config = providerConfig.groq;
62 if (!config) {
63 throw new Error("Groq API key not configured");
64 }
65 return new OpenAIProvider(
66 config.apiKey,
67 model,
68 "https://api.groq.com/openai/v1"
69 );
70 }
71
72 case "mistral": {
73 const config = providerConfig.mistral;
74 if (!config) {
75 throw new Error("Mistral API key not configured");
76 }
77 return new OpenAIProvider(
78 config.apiKey,
79 model,
80 "https://api.mistral.ai/v1"
81 );
82 }
83
84 case "openrouter": {
85 const config = providerConfig.openrouter;
86 if (!config) {
87 throw new Error("OpenRouter API key not configured");
88 }
89 return new OpenAIProvider(
90 config.apiKey,
91 model,
92 "https://openrouter.ai/api/v1"
93 );
94 }
95
96 default:
97 throw new Error(`Unknown provider: ${provider}`);
98 }
99}