2026-01-27 00:28:29 +00:00
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
declare(strict_types=1);
|
|
|
|
|
|
2026-01-27 16:12:58 +00:00
|
|
|
namespace Core\Mod\Agentic\Services;
|
2026-01-27 00:28:29 +00:00
|
|
|
|
|
|
|
|
use InvalidArgumentException;
|
|
|
|
|
|
|
|
|
|
class AgenticManager
|
|
|
|
|
{
|
|
|
|
|
/** @var array<string, AgenticProviderInterface> */
|
|
|
|
|
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<string, AgenticProviderInterface>
|
|
|
|
|
*/
|
|
|
|
|
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',
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
}
|