Skip to content

Integração IA

O Doggy integra capacidades de IA de forma aprofundada através do Symfony AI Bundle, com suporte para múltiplos fornecedores de modelos e invocação através de uma interface unificada.

Visão geral

O núcleo do sistema de IA localiza-se em src/Service/AI/:

src/Service/AI/
├── AiManager.php                    # Gestor de IA (interface de invocação unificada)
├── AgentManager.php                 # Gestor de Agent (Facade)
├── Agent/
│   ├── CodingAgent.php              # Assistente de codificação
│   ├── NaturalLanguageQueryAgent.php # Consulta em linguagem natural
│   ├── VisionAgent.php              # Reconhecimento visual
│   └── PasswordPolicyAgent.php      # Agent de política de palavras-passe
├── Runtime/                         # Runtime de IA (motor de Agent)
│   ├── AiAssistant.php              # Fábrica de Agent genérica (ReAct)
│   ├── AiContextRegistry.php        # Registo de contextos
│   ├── LlmRouterPlatform.php        # Ponte PlatformInterface
│   └── ChatResultConverter.php      # Conversão de formatos de resposta
├── Context/                         # Fornecedores de contexto de página
│   └── ViewEditorAiContext.php      # Contexto do editor de vistas
├── Orchestrator/                    # Orquestração de IA (intenções + subagentes)
│   ├── IntentAgent.php              # Agent principal de reconhecimento de intenções
│   └── SubAgent/                    # 6 subagentes de cenário
├── Tool/                            # Chamadas de ferramentas
│   ├── ViewEditorToolProvider.php   # Ferramentas do editor de vistas
│   ├── ViewFileToolProvider.php     # Ferramentas de ficheiros de vista
│   └── ChromeDevToolsToolProvider.php # Ferramentas de browser CDP
└── Provider/
    └── AbstractOpenAiProvider.php   # Abstração da API OpenAI

Fornecedores de modelo

AiManager suporta vários fornecedores, alternados através da variável de ambiente AI_PROVIDER:

FornecedorServiço de plataformaConfiguração
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)%'

Configuração

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

Invocar a 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',  // substituição opcional do modelo predefinido
        ]);
    }
}

AiManager trata automaticamente de:

  • Seleção do fornecedor (com base em AI_PROVIDER)
  • Resposta em streaming (modo stream, suporta modelos de raciocínio como qwq-32b)
  • Fusão da configuração do modelo

Sistema de configuração LLM

Para além da invocação direta via AiManager, o framework também fornece um sistema de configuração LLM gráfico, que suporta:

  • Vários fornecedores: OpenAI, Azure, Anthropic, Ollama, gateways personalizados
  • Roteamento por papel: LlmRole ligado a modelos, alternância dinâmica consoante a utilização
  • Criptografia de chaves: armazenamento encriptado das API Key
  • Failover: degradação automática quando o fornecedor principal falha

Runtime de IA

Runtime de Agent construído sobre symfony/ai-agent (ver Assistente IA):

  • Ciclo ReAct: raciocínio + chamadas de ferramentas até retornar um resultado
  • Registo de contexto: as páginas registam contexto através de window.__AI_CONTEXT__
  • Chamadas de ferramentas: métodos de ferramenta declarados com a anotação #[AsTool]

Alternância rápida de modelo

NaturalLanguageQueryAgent suporta a configuração de um modelo rápido para consultas NL (evitando respostas lentas de modelos de raciocínio):

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

Código aberto sob MIT | Copyright © 2026 Doggy