Configuración de LLM
Doggy ofrece un sistema de gestión de configuración de LLM con interfaz gráfica que admite una configuración flexible de múltiples proveedores, múltiples modelos y múltiples roles, con conmutación dinámica en tiempo de ejecución, proporcionando un soporte de modelos unificado para las funciones de IA.
Descripción general
El sistema de configuración de LLM se encuentra en src/Service/Platform/Llm/ y se inspira en el concepto de Platform del Symfony AI Bundle:
- Soporte de múltiples proveedores: OpenAI, Azure, Anthropic, Ollama, puerta de enlace personalizada compatible con OpenAI
- Gestión gráfica: sin configuración YAML, gestión dinámica desde la interfaz del panel
- Separación por rol: configuración y uso desacoplados, el rol vincula el modelo
- Cifrado de claves: almacenamiento cifrado de las API Key, el frontend nunca las ve
Modelo de datos
LlmProvider (configuración de proveedores)
| Campo | Tipo | Descripción |
|---|---|---|
| name | string | Nombre mostrado, p. ej. "GPT-4o" |
| provider | string | Identificador del proveedor: openai / anthropic / azure / ollama / custom |
| model | string | Nombre del modelo: gpt-4o / claude-3-5-sonnet / ... |
| apiKey | encrypted | API Key (almacenada cifrada) |
| apiEndpoint | string | Dirección de la interfaz (opcional) |
| options | JSON | Parámetros adicionales: temperature, max_tokens, top_p, etc. |
| isEnabled | boolean | Si está habilitado |
| sortOrder | int | Orden de clasificación |
LlmRole (rol/uso)
| Campo | Tipo | Descripción |
|---|---|---|
| code | string | Código de rol: view_editor / entity_generation / workflow_analysis / query_assistant / chat / coding |
| label | string | Nombre mostrado |
| providerId | UUID | Configuración de modelo vinculada |
| systemPrompt | text | Prompt del sistema de este rol |
| options | JSON | Sobrescritura de parámetros a nivel de rol |
| isEnabled | boolean | Si está habilitado |
Planificación de usos de los roles
| Rol code | Uso | Modelo recomendado |
|---|---|---|
| view_editor | Asistente IA del diseñador de vistas | gpt-4o / claude-3.5-sonnet |
| entity_generation | Generación de entidades asistida por IA | gpt-4o-mini |
| workflow_analysis | Análisis y recomendaciones de flujos de trabajo | gpt-4o |
| query_assistant | Lenguaje natural → consulta de datos | gpt-4o-mini |
| chat | Asistente de diálogo IA genérico | gpt-4o-mini |
| coding | Generación de código (Twig/JS/PHP) | gpt-4o / claude-3.5-sonnet |
Cadena de llamada
LlmRouter::chatByRole(roleCode, messages, opts)
├─ Consulta LlmRole(code) → obtiene el LlmProvider vinculado
├─ LlmGatewayFactory::create(provider) → instancia el adaptador
├─ Descifra la API Key (LlmEncryptor)
└─ Llama a la API del LLM (soporte de llamada a herramientas, respuestas en streaming)LlmGatewayFactory
Enruta automáticamente el adaptador según el campo LlmProvider.provider:
| provider | Adaptador | Descripción |
|---|---|---|
| openai | OpenAiGateway | Interfaz compatible con OpenAI |
| anthropic | AnthropicGateway | API de Anthropic Claude |
| azure | AzureGateway | Azure OpenAI |
| ollama | OllamaGateway | Ollama local |
| custom | CustomGateway | Puerta de enlace personalizada compatible con OpenAI |
Conmutación por error
LlmRouter admite chatByRoleWithFallback: cuando el proveedor principal falla, degrada automáticamente al modelo de respaldo.
Interfaz de administración
Entrada: Configuración del sistema → Configuración de LLM (/admin/platform/llm-config)
Página de lista
- Muestra los proveedores en forma de tarjetas; un proveedor puede tener múltiples variantes de modelo
- Muestra directamente los roles/usos vinculados a ese modelo
- Interruptores para habilitar/deshabilitar
- Ordenación por arrastrar y soltar
Formulario de edición
- Nombre, proveedor, modelo, API Key (almacenada cifrada), dirección de la interfaz
- Gestión de roles (LlmRoleType): código de rol, prompt del sistema, vinculación de modelo
Cifrado de claves
LlmEncryptor cifra y descifra las API Key con la clave de cifrado de la plataforma. Las claves se almacenan únicamente en el servidor y el frontend nunca accede a la clave original:
// Al almacenar
$encrypted = $llmEncryptor->encrypt($apiKey);
// Al llamar
$apiKey = $llmEncryptor->decrypt($provider->getApiKey());Integración con el Asistente IA
El Asistente IA (ver Asistente IA) reutiliza el sistema LlmRole/LlmProvider:
Frontend → POST /api/admin/ai/chat
→ LlmRouter.chatByRole(roleCode, messages)
→ Consulta LlmRole → LlmGatewayFactory → API del LLM- Las API Key solo residen en el servidor (almacenamiento cifrado en la base de datos)
- El cambio de modelo se realiza desde la interfaz de administración, sin necesidad de modificar código
- Los múltiples proveedores se enrutan automáticamente mediante LlmGatewayFactory
Archivos relacionados
| Archivo | Responsabilidad |
|---|---|
src/Service/Platform/Llm/LlmGatewayInterface.php | Interfaz de puerta de enlace |
src/Service/Platform/Llm/LlmGatewayFactory.php | Fábrica de adaptadores |
src/Service/Platform/Llm/LlmRouter.php | Enrutamiento por rol + conmutación por error |
src/Service/Platform/Llm/ModelRegistry.php | Registro de modelos |
src/Service/Platform/LlmEncryptor.php | Cifrado/descifrado de API Key |
src/Entity/Platform/LlmProvider.php | Entidad de configuración de proveedores |
src/Entity/Platform/LlmRole.php | Entidad de configuración de roles |
src/Controller/Admin/Platform/LlmConfigController.php | Controlador de la interfaz de administración |