AIConfig.php

Code Hygiene Score: 100

Keine Issues gefunden.

Dependencies 2

Klassen 1

Funktionen 7

Verwendet von 1

Versionen 13

Code

<?php

declare(strict_types=1);

namespace Infrastructure\AI;

// @responsibility: Zentralisierte Konfiguration und Factory für AI-Services

use Infrastructure\Config\CredentialService;
use RuntimeException;

final readonly class AIConfig
{
    /**
     * Konstruiert eine neue AIConfig-Instanz.
     *
     * @param string $ollamaHost       Ollama API Host-URL
     * @param string $qdrantHost       Qdrant API Host-URL
     * @param string $anthropicApiKey  Anthropic API Key
     * @param string $embeddingModel   Embedding-Modell für Ollama
     * @param string $claudeModel      Claude-Modell für Anthropic
     * @param string $defaultCollection Standard-Collection für Qdrant
     */
    public function __construct(
        public string $ollamaHost,
        public string $qdrantHost,
        public string $anthropicApiKey,
        public string $embeddingModel,
        public string $claudeModel,
        public string $defaultCollection
    ) {
    }

    /**
     * Erstellt AIConfig aus Credentials-Datei mit Default-Werten.
     *
     * Lädt den Anthropic API Key aus der credentials.md Datei und
     * verwendet Default-Werte für alle anderen Konfigurationsparameter.
     *
     * @param string|null $credentialsPath Pfad zur credentials.md Datei (optional, verwendet Environment-Variable oder Default)
     *
     * @return self Konfigurierte AIConfig-Instanz
     *
     * @throws RuntimeException Wenn Credentials-Datei nicht existiert
     * @throws RuntimeException Wenn Credentials-Datei nicht gelesen werden kann
     * @throws RuntimeException Wenn Anthropic API Key nicht gefunden wird
     *
     * @example
     * $config = AIConfig::fromCredentialsFile();
     * $chatService = $config->createChatService();
     */
    public static function fromCredentialsFile(?string $credentialsPath = null): self
    {
        $anthropicApiKey = self::loadAnthropicApiKey($credentialsPath);

        return new self(
            ollamaHost: CredentialService::getOllamaHost(),
            qdrantHost: CredentialService::getQdrantHost(),
            anthropicApiKey: $anthropicApiKey,
            embeddingModel: 'mxbai-embed-large',
            claudeModel: 'claude-opus-4-5-20251101',
            defaultCollection: 'documents'
        );
    }

    /**
     * Erstellt einen konfigurierten ChatService.
     *
     * Erzeugt alle benötigten Dependencies (OllamaService, QdrantService, ClaudeService)
     * und liefert einen vollständig konfigurierten ChatService zurück.
     *
     * @return ChatService Konfigurierter ChatService
     *
     * @example
     * $config = AIConfig::fromCredentialsFile();
     * $chatService = $config->createChatService();
     * $result = $chatService->chat('Was ist systemisches Coaching?');
     */
    public function createChatService(): ChatService
    {
        return new ChatService(
            $this->createOllamaService(),
            $this->createQdrantService(),
            $this->createClaudeService(),
            new ScoringService()
        );
    }

    /**
     * Erstellt einen konfigurierten OllamaService.
     *
     * @return OllamaService Konfigurierter OllamaService
     *
     * @example
     * $config = AIConfig::fromCredentialsFile();
     * $ollama = $config->createOllamaService();
     * $embedding = $ollama->getEmbedding('Hello World');
     */
    public function createOllamaService(): OllamaService
    {
        return new OllamaService($this->ollamaHost);
    }

    /**
     * Erstellt einen konfigurierten QdrantService.
     *
     * @return QdrantService Konfigurierter QdrantService
     *
     * @example
     * $config = AIConfig::fromCredentialsFile();
     * $qdrant = $config->createQdrantService();
     * $results = $qdrant->search($vector, 'documents');
     */
    public function createQdrantService(): QdrantService
    {
        return new QdrantService($this->qdrantHost);
    }

    /**
     * Erstellt einen konfigurierten ClaudeService.
     *
     * @return ClaudeService Konfigurierter ClaudeService
     *
     * @example
     * $config = AIConfig::fromCredentialsFile();
     * $claude = $config->createClaudeService();
     * $result = $claude->ask('Explain quantum computing');
     */
    public function createClaudeService(): ClaudeService
    {
        return new ClaudeService();
    }

    /**
     * Lädt den Anthropic API Key aus der Credentials-Datei.
     *
     * @param string|null $credentialsPath Pfad zur credentials.md Datei (unused, kept for BC)
     *
     * @return string Der gefundene API Key
     *
     * @throws RuntimeException Wenn API Key nicht gefunden wird
     */
    private static function loadAnthropicApiKey(?string $credentialsPath): string
    {
        $apiKey = CredentialService::getAnthropicApiKey();

        if ($apiKey === '') {
            throw new RuntimeException('Anthropic API key not found in credentials file');
        }

        return $apiKey;
    }
}
← Übersicht Graph