Skip to content

Integración IA

Doggy integra de forma profunda las capacidades de IA mediante Symfony AI Bundle, con soporte para múltiples proveedores de modelos y una interfaz de llamada unificada.

Descripción general

El núcleo del sistema de IA se encuentra en src/Service/AI/:

src/Service/AI/
├── AiManager.php                    # Gestor de IA (interfaz de llamada unificada)
├── AgentManager.php                 # Gestor de Agentes (Facade)
├── Agent/
│   ├── CodingAgent.php              # Asistente de codificación
│   ├── NaturalLanguageQueryAgent.php # Consulta en lenguaje natural
│   ├── VisionAgent.php              # Reconocimiento visual
│   └── PasswordPolicyAgent.php      # Agente de política de contraseñas
├── Runtime/                         # Runtime de IA (motor de Agentes)
│   ├── AiAssistant.php              # Fábrica de Agentes genérica (ReAct)
│   ├── AiContextRegistry.php        # Registro de contextos
│   ├── LlmRouterPlatform.php        # Puente de PlatformInterface
│   └── ChatResultConverter.php      # Conversión del formato de respuesta
├── Context/                         # Proveedores de contexto de página
│   └── ViewEditorAiContext.php      # Contexto del editor de vistas
├── Orchestrator/                    # Orquestación de IA (reconocimiento de intenciones + sub-agentes)
│   ├── IntentAgent.php              # Agente principal de reconocimiento de intenciones
│   └── SubAgent/                    # 6 sub-agentes de escenario
├── Tool/                            # Llamada a herramientas
│   ├── ViewEditorToolProvider.php   # Herramientas del editor de vistas
│   ├── ViewFileToolProvider.php     # Herramientas de archivos de vista
│   └── ChromeDevToolsToolProvider.php # Herramientas de navegador CDP
└── Provider/
    └── AbstractOpenAiProvider.php   # Abstracción de la API OpenAI

Proveedores de modelos

AiManager admite varios proveedores, conmutables mediante la variable de entorno AI_PROVIDER:

ProveedorServicio de plataformaConfiguración
Alibaba Bailianai.platform.generic.aliyunALIYUN_MODEL_ID
LM Studioai.platform.generic.lmstudioLM_STUDIO_MODEL_ID
yaml
# config/packages/ai.yaml
ai:
  providers:
    alibaba:
      type: alibaba_bailian
      api_key: '%env(ALIBABA_AI_KEY)%'

Configuración

bash
# .env
AI_PROVIDER=aliyun
ALIYUN_MODEL_ID=qwq-32b
ALIYUN_FAST_MODEL_ID=qwen-plus
LM_STUDIO_MODEL_ID=deepseek/deepseek-r1-0528-qwen3-8b

Llamar a la IA

php
use App\Service\AI\AiManager;

class SomeService
{
    public function __construct(private AiManager $aiManager) {}

    public function ask(): string
    {
        return $this->aiManager->chat([
            ['role' => 'system', 'content' => 'You are a helpful assistant.'],
            ['role' => 'user', 'content' => 'Hello!'],
        ], [
            'temperature' => 0.7,
            'model' => 'qwen-plus',  // Opcional: sobrescribe el modelo por defecto
        ]);
    }
}

AiManager gestiona automáticamente:

  • La selección del proveedor (según AI_PROVIDER)
  • Las respuestas en streaming (modo stream, compatible con modelos de razonamiento como qwq-32b)
  • La combinación de la configuración de modelos

Sistema de configuración de LLM

Además de la llamada directa a través de AiManager, el framework ofrece el sistema de configuración de LLM con interfaz gráfica, que admite:

  • Múltiples proveedores: OpenAI, Azure, Anthropic, Ollama, puerta de enlace personalizada
  • Enrutamiento por rol: LlmRole vincula modelos y conmuta dinámicamente según el uso
  • Cifrado de claves: almacenamiento cifrado de las API Key
  • Conmutación por error: degradación automática cuando el proveedor principal falla

Runtime de IA

Runtime de Agentes construido sobre symfony/ai-agent (ver Asistente IA):

  • Bucle ReAct: razonamiento + llamada a herramientas hasta devolver un resultado
  • Registro de contexto: las páginas registran su contexto mediante window.__AI_CONTEXT__
  • Llamada a herramientas: anotación #[AsTool] para declarar métodos de herramienta

Cambio rápido de modelo

NaturalLanguageQueryAgent admite la configuración de un modelo rápido para las consultas NL (para evitar respuestas lentas con modelos de razonamiento):

php
if ($this->provider === 'aliyun' && $this->aliyunFastModelId) {
    $options['model'] = $this->aliyunFastModelId;
}

Código abierto bajo MIT | Copyright © 2026 Doggy