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}