LLM-Konfiguration
Doggy bietet ein grafisches LLM-Konfigurationsverwaltungssystem, das flexible Konfiguration und dynamisches Umschalten zur Laufzeit für mehrere Anbieter, mehrere Modelle und mehrere Rollen unterstützt und den KI-Funktionen eine einheitliche Modellbasis bietet.
Übersicht
Das LLM-Konfigurationssystem befindet sich unter src/Service/Platform/Llm/ und orientiert sich am Plattform-Design von Symfony AI Bundle:
- Mehrere Anbieter: OpenAI, Azure, Anthropic, Ollama, benutzerdefinierte OpenAI-kompatible Gateways
- Grafische Verwaltung: keine YAML-Konfiguration, dynamische Verwaltung über das Backend
- Rollen-Trennung: Konfiguration und Verwendungszweck entkoppelt, Rollen binden Modelle
- Schlüsselverschlüsselung: API-Keys werden verschlüsselt gespeichert, das Frontend kommt nicht damit in Kontakt
Datenmodell
LlmProvider (Anbieterkonfiguration)
| Feld | Typ | Beschreibung |
|---|---|---|
| name | string | Anzeigename, z. B. "GPT-4o" |
| provider | string | Anbieterkennung: openai / anthropic / azure / ollama / custom |
| model | string | Modellname: gpt-4o / claude-3-5-sonnet / ... |
| apiKey | encrypted | API-Key (verschlüsselt gespeichert) |
| apiEndpoint | string | Schnittstellenadresse (optional) |
| options | JSON | Zusätzliche Parameter: temperature, max_tokens, top_p usw. |
| isEnabled | boolean | Aktiviert oder nicht |
| sortOrder | int | Sortierung |
LlmRole (Rolle/Verwendungszweck)
| Feld | Typ | Beschreibung |
|---|---|---|
| code | string | Rollen-Code: view_editor / entity_generation / workflow_analysis / query_assistant / chat / coding |
| label | string | Anzeigename |
| providerId | UUID | Gebundene Modellkonfiguration |
| systemPrompt | text | System-Prompt der Rolle |
| options | JSON | Überschreibungen der Parameter auf Rollenebene |
| isEnabled | boolean | Aktiviert oder nicht |
Rollen-Planung
| Rollen-Code | Verwendungszweck | Empfohlenes Modell |
|---|---|---|
| view_editor | AI-Assistent des View-Designers | gpt-4o / claude-3.5-sonnet |
| entity_generation | KI-gestützte Entitätsgenerierung | gpt-4o-mini |
| workflow_analysis | Workflow-Analyse und -Vorschläge | gpt-4o |
| query_assistant | Natürliche Sprache → Datenabfrage | gpt-4o-mini |
| chat | Allgemeiner KI-Dialogassistent | gpt-4o-mini |
| coding | Codegenerierung (Twig/JS/PHP) | gpt-4o / claude-3.5-sonnet |
Aufrufkette
LlmRouter::chatByRole(roleCode, messages, opts)
├─ 查询 LlmRole(code) → 获取绑定的 LlmProvider
├─ LlmGatewayFactory::create(provider) → 实例化适配器
├─ 解密 API Key(LlmEncryptor)
└─ 调用 LLM API(支持工具调用、流式响应)LlmGatewayFactory
Leitet Adapter automatisch basierend auf dem Feld LlmProvider.provider weiter:
| provider | Adapter | Beschreibung |
|---|---|---|
| openai | OpenAiGateway | OpenAI-kompatible Schnittstelle |
| anthropic | AnthropicGateway | Anthropic-Claude-API |
| azure | AzureGateway | Azure OpenAI |
| ollama | OllamaGateway | Lokales Ollama |
| custom | CustomGateway | Benutzerdefiniertes OpenAI-kompatibles Gateway |
Failover
LlmRouter unterstützt chatByRoleWithFallback: Fällt der Hauptanbieter aus, wird automatisch auf ein Backup-Modell herabgestuft.
Verwaltungsoberfläche
Einstieg: Systemeinstellungen → LLM-Konfiguration (/admin/platform/llm-config)
Listenansicht
- Kartenförmige Darstellung der Anbieter, ein Anbieter kann mehrere Modellvarianten haben
- Zeigt direkt die Rollen/Verwendungszwecke an, die an das Modell gebunden sind
- Schalter zum Aktivieren/Deaktivieren
- Sortieren per Drag-and-Drop
Bearbeitungsformular
- Name, Anbieter, Modell, API-Key (verschlüsselt gespeichert), Schnittstellenadresse
- Rollenverwaltung (LlmRoleType): Rollen-Code, System-Prompt, Modellbindung
Schlüsselverschlüsselung
LlmEncryptor verwendet den Plattform-Verschlüsselungsschlüssel zum Ver- und Entschlüsseln von API-Keys. Der Schlüssel existiert nur serverseitig, das Frontend kommt nie mit dem rohen Key in Kontakt:
// 存储时
$encrypted = $llmEncryptor->encrypt($apiKey);
// 调用时
$apiKey = $llmEncryptor->decrypt($provider->getApiKey());Integration mit dem AI-Assistenten
Der AI-Assistent (siehe AI-Assistent) nutzt das LlmRole/LlmProvider-System wieder:
前端 → POST /api/admin/ai/chat
→ LlmRouter.chatByRole(roleCode, messages)
→ 查询 LlmRole → LlmGatewayFactory → LLM API- API-Keys existieren nur serverseitig (verschlüsselt in der Datenbank gespeichert)
- Der Modellwechsel erfolgt über die Verwaltungsoberfläche, ohne Codeänderungen
- Mehrere Anbieter werden automatisch von LlmGatewayFactory weitergeleitet
Zugehörige Dateien
| Datei | Verantwortung |
|---|---|
src/Service/Platform/Llm/LlmGatewayInterface.php | Gateway-Schnittstelle |
src/Service/Platform/Llm/LlmGatewayFactory.php | Adapter-Factory |
src/Service/Platform/Llm/LlmRouter.php | Rollen-Routing + Failover |
src/Service/Platform/Llm/ModelRegistry.php | Modell-Registry |
src/Service/Platform/LlmEncryptor.php | Ver-/Entschlüsselung von API-Keys |
src/Entity/Platform/LlmProvider.php | Anbieterkonfigurations-Entität |
src/Entity/Platform/LlmRole.php | Rollenkonfigurations-Entität |
src/Controller/Admin/Platform/LlmConfigController.php | Controller der Verwaltungsoberfläche |