*/ private array $providers = []; private string $defaultProvider = 'claude'; public function __construct() { $this->registerProviders(); } /** * Get an AI provider by name. */ public function provider(?string $name = null): AgenticProviderInterface { $name = $name ?? $this->defaultProvider; if (! isset($this->providers[$name])) { throw new InvalidArgumentException("Unknown AI provider: {$name}"); } return $this->providers[$name]; } /** * Get the Claude provider. */ public function claude(): ClaudeService { return $this->providers['claude']; } /** * Get the Gemini provider. */ public function gemini(): GeminiService { return $this->providers['gemini']; } /** * Get the OpenAI provider. */ public function openai(): OpenAIService { return $this->providers['openai']; } /** * Get all available providers. * * @return array */ public function availableProviders(): array { return array_filter( $this->providers, fn (AgenticProviderInterface $provider) => $provider->isAvailable() ); } /** * Check if a provider is available. */ public function isAvailable(string $name): bool { return isset($this->providers[$name]) && $this->providers[$name]->isAvailable(); } /** * Set the default provider. */ public function setDefault(string $name): void { if (! isset($this->providers[$name])) { throw new InvalidArgumentException("Unknown AI provider: {$name}"); } $this->defaultProvider = $name; } /** * Register all AI providers. */ private function registerProviders(): void { // Use null coalescing since config() returns null for missing env vars $this->providers['claude'] = new ClaudeService( apiKey: config('services.anthropic.api_key') ?? '', model: config('services.anthropic.model') ?? 'claude-sonnet-4-20250514', ); $this->providers['gemini'] = new GeminiService( apiKey: config('services.google.ai_api_key') ?? '', model: config('services.google.ai_model') ?? 'gemini-2.0-flash', ); $this->providers['openai'] = new OpenAIService( apiKey: config('services.openai.api_key') ?? '', model: config('services.openai.model') ?? 'gpt-4o-mini', ); } }