/** * Factory utilities for creating AI providers. */ import { ClaudeProvider, type ClaudeConfig } from '../providers/claude.js'; import { OpenAIProvider, type OpenAIConfig } from '../providers/openai.js'; import { GeminiProvider, type GeminiConfig } from '../providers/gemini.js'; import { OpenWebUIProvider, type OpenWebUIConfig } from '../providers/openwebui.js'; import { ClaudeCodeProvider, type ClaudeCodeConfig } from '../providers/claude-code.js'; import { BaseAIProvider } from '../providers/base.js'; export const PROVIDER_REGISTRY = { claude: ClaudeProvider, openai: OpenAIProvider, gemini: GeminiProvider, openwebui: OpenWebUIProvider, 'claude-code': ClaudeCodeProvider } as const; export type ProviderType = keyof typeof PROVIDER_REGISTRY; export interface ProviderConfigMap { claude: ClaudeConfig; openai: OpenAIConfig; gemini: GeminiConfig; openwebui: OpenWebUIConfig; 'claude-code': ClaudeCodeConfig; } export function createProvider( type: T, config: ProviderConfigMap[T] ): BaseAIProvider { const ProviderClass = PROVIDER_REGISTRY[type]; if (!ProviderClass) { throw new Error(`Unsupported provider type: ${type}`); } return new ProviderClass(config as any); } export function createClaudeProvider( apiKey: string, options: Partial> = {} ): ClaudeProvider { return new ClaudeProvider({ apiKey, ...options }); } export function createOpenAIProvider( apiKey: string, options: Partial> = {} ): OpenAIProvider { return new OpenAIProvider({ apiKey, ...options }); } export function createGeminiProvider( apiKey: string, options: Partial> = {} ): GeminiProvider { return new GeminiProvider({ apiKey, ...options }); } export function createOpenWebUIProvider(config: OpenWebUIConfig): OpenWebUIProvider { return new OpenWebUIProvider(config); } export function createClaudeCodeProvider( options: Partial = {} ): ClaudeCodeProvider { return new ClaudeCodeProvider(options); }