UNPKG

@oliverlessa/gemini-agent-lib

Version:

Uma biblioteca NodeJS para criar agentes de IA com Gemini LLM

670 lines (518 loc) 26.7 kB
# Documentação do ChatAgent ## Visão Geral O `ChatAgent` é uma classe especializada que estende a classe `Agent` base, adicionando funcionalidades para manter o histórico de conversa entre interações com o usuário. Esta classe é ideal para criar chatbots e assistentes conversacionais que precisam lembrar do contexto das interações anteriores. A classe `ChatAgent` está agora oficialmente implementada na biblioteca `gemini-chain-lib` e pode ser importada diretamente: ```javascript const { ChatAgent } = require('gemini-chain-lib'); ``` ## Características Principais 1. **Gerenciamento de Histórico de Conversa**: - Mantém um registro completo de todas as mensagens trocadas entre o usuário e o modelo - Permite que o agente se lembre de informações mencionadas anteriormente - Possibilita respostas contextualizadas com base no histórico da conversa 2. **Suporte a Ferramentas (Function Calling)**: - Integração com ferramentas externas através do mecanismo de function calling - Processamento de resultados de ferramentas e incorporação no fluxo da conversa - Manutenção do contexto mesmo após o uso de ferramentas 3. **Controle de Contexto**: - Capacidade de limpar o histórico quando necessário - Formatação adequada do histórico para o LLM - Gerenciamento de mensagens do sistema, usuário e modelo ## Arquitetura O `ChatAgent` interage com uma instância de LLM (como `VertexAILLM` ou `GenerativeAILLM`) configurada no modo "chat" para manter o estado da conversa. A arquitetura é composta por: 1. **Histórico de Conversa**: Array de objetos que armazenam cada mensagem com seu papel (role) e conteúdo 2. **Processador de Mensagens**: Métodos para processar mensagens do usuário e gerar respostas 3. **Gerenciador de Ferramentas**: Funcionalidades para executar ferramentas e processar seus resultados 4. **Formatador de Histórico**: Conversão do histórico interno para o formato esperado pelo LLM ## Como Utilizar ### Inicialização Básica O `ChatAgent` é flexível e pode ser inicializado de três maneiras principais: 1. **Com uma instância LLM personalizada:** Você pode fornecer sua própria instância de um LLM compatível (como `VertexAILLM` ou `GenerativeAILLM`), garantindo que ela esteja configurada no modo `"chat"`. 2. **Com LLM padrão (automático):** Se nenhum LLM for fornecido, o agente criará automaticamente uma instância padrão do `VertexAILLM`. 3. **Com configuração de memória e/ou delegação:** Recursos adicionais como memória e delegação podem ser configurados na inicialização. #### 1. Inicialização com LLM Personalizado Você pode usar diferentes classes de LLM, como `VertexAILLM` ou `GenerativeAILLM`. É **crucial** que a instância LLM fornecida esteja configurada com `mode: "chat"`. **Exemplo com `VertexAILLM`:** ```javascript // Inicializa o LLM no modo chat const llm = new VertexAILLM({ projectId: process.env.GOOGLE_CLOUD_PROJECT_ID, credentialsPath: process.env.GOOGLE_APPLICATION_CREDENTIALS, modelName: "gemini-2.0-flash-001", mode: "chat", generationConfig: { maxOutputTokens: 2048, temperature: 0.2 } }); // Cria uma instância do ChatAgent com o LLM personalizado const chatAgent = new ChatAgent({ role: "Assistente Pessoal", objective: "Ajudar o usuário com suas perguntas e tarefas", context: "Você é um assistente pessoal útil e amigável chamado GeminiBot.", llm: llm }); ``` **Exemplo com `GenerativeAILLM`:** ```javascript // Importa a classe GenerativeAILLM const { GenerativeAILLM } = require('gemini-agent-lib'); // Ajuste o caminho se necessário // Inicializa o GenerativeAILLM no modo chat const geminiLlm = new GenerativeAILLM({ apiKey: process.env.GEMINI_API_KEY, // Necessário para GenerativeAILLM modelName: "gemini-1.5-flash-latest", // Ou outro modelo Gemini mode: "chat", // Importante para ChatAgent generationConfig: { maxOutputTokens: 2048, temperature: 0.2 } }); // Cria uma instância do ChatAgent com o LLM GenerativeAI const chatAgentGemini = new ChatAgent({ role: "Assistente Gemini", objective: "Conversar usando o modelo Gemini", context: "Você é um assistente conversacional baseado no Gemini.", llm: geminiLlm // Passa a instância do GenerativeAILLM }); ``` #### 2. Inicialização com LLM Padrão (Automático) ```javascript // Cria uma instância do ChatAgent sem fornecer um LLM // Um VertexAILLM padrão será instanciado automaticamente const chatAgent = new ChatAgent({ role: "Assistente Pessoal", objective: "Ajudar o usuário com suas perguntas e tarefas", context: "Você é um assistente pessoal útil e amigável chamado GeminiBot." }); ``` Quando não é fornecido um LLM, o `ChatAgent` cria automaticamente uma instância do `VertexAILLM` com a seguinte configuração padrão: ```javascript const llm = new VertexAILLM({ projectId: process.env.GOOGLE_CLOUD_PROJECT_ID, credentialsPath: process.env.GOOGLE_APPLICATION_CREDENTIALS, modelName: "gemini-2.0-flash-001", mode: "chat", generationConfig: { maxOutputTokens: 2048, temperature: 0.2 } }); ``` > **Nota**: A inicialização automática **sempre** cria uma instância do `VertexAILLM`. Para que funcione, as variáveis de ambiente `GOOGLE_CLOUD_PROJECT_ID` e `GOOGLE_APPLICATION_CREDENTIALS` devem estar configuradas. Se você pretende usar `GenerativeAILLM`, **deve** instanciá-lo manualmente e passá-lo no construtor, garantindo que a variável `GEMINI_API_KEY` esteja definida. ### Processamento de Mensagens ```javascript // Processa uma mensagem do usuário const resposta = await chatAgent.processUserMessage("Olá! Quem é você?"); console.log(resposta.text); // Processa uma segunda mensagem (mantém o contexto) const resposta2 = await chatAgent.processUserMessage("Qual é o seu propósito?"); console.log(resposta2.text); ``` ### Uso com Ferramentas ```javascript // Define uma ferramenta const weatherTool = { name: "obter_previsao_tempo", description: "Obtém a previsão do tempo para uma cidade", parameters: { type: "OBJECT", properties: { cidade: { type: "STRING", description: "Nome da cidade" } }, required: ["cidade"] }, function: async (args) => { // Implementação da função return { cidade: args.cidade, temperatura: "25°C", condicao: "Ensolarado" }; } }; // Adiciona a ferramenta ao agente chatAgent.tools = [weatherTool]; // Processa uma mensagem que pode acionar a ferramenta // O método processUserMessage agora processa automaticamente as function calls const resposta = await chatAgent.processUserMessage("Como está o tempo em São Paulo hoje?"); console.log(resposta.text); // Não é mais necessário verificar e processar manualmente a function call // O método processUserMessage já faz isso automaticamente, incluindo: // 1. Detectar a function call // 2. Encontrar e executar a ferramenta correspondente // 3. Processar o resultado e enviá-lo de volta ao LLM // 4. Gerar uma resposta final com base no resultado // 5. Atualizar o histórico de conversa com todas as interações ``` #### Uso com Orquestradores como Ferramentas O `ChatAgent` também pode utilizar orquestradores (como `SequentialAgentChain`, `HierarchicalAgentOrchestrator` e `AutoGenOrchestrator`) como ferramentas, permitindo delegar tarefas complexas para sistemas de orquestração especializados. ```javascript // Importações necessárias const { createOrchestratorTool } = require('gemini-agent-lib/lib/orchestrator-tool-factory'); const OrchestratorRegistry = require('gemini-agent-lib/lib/orchestrator-registry'); // Configurar o OrchestratorRegistry const orchestratorRegistry = new OrchestratorRegistry({ 'sequential_market_research': { type: 'SequentialAgentChain', agents: [marketAnalystAgent, reportGeneratorAgent] } }); // Criar a ferramenta de orquestração const marketResearchTool = createOrchestratorTool( 'sequential_market_research', 'perform_market_research', 'Executa uma pesquisa de mercado completa sobre um tópico específico.', { type: FunctionDeclarationSchemaType.OBJECT, properties: { research_topic: { type: FunctionDeclarationSchemaType.STRING, description: "O tópico principal da pesquisa de mercado." } }, required: ["research_topic"] }, orchestratorRegistry ); // Adicionar a ferramenta ao ChatAgent chatAgent.tools = [weatherTool, marketResearchTool]; ``` Para mais detalhes sobre como utilizar orquestradores como ferramentas, consulte a [documentação específica](./orchestrator-tool-factory.md). ### Gerenciamento de Histórico ```javascript // Limpa o histórico de conversa chatAgent.clearHistory(); // Inicia uma nova conversa const resposta = await chatAgent.processUserMessage("Olá novamente!"); ``` ## Fluxo de Processamento 1. **Recebimento da Mensagem**: - O usuário envia uma mensagem para o agente - A mensagem é armazenada como a tarefa atual do agente - A mensagem do usuário é adicionada ao histórico 2. **Preparação do Contexto**: - O histórico de conversa é formatado para o LLM - As ferramentas disponíveis são preparadas 3. **Geração da Resposta**: - O LLM processa a mensagem com base no histórico e contexto - A resposta é gerada e pode incluir uma function call 4. **Processamento de Function Calls (Loop Automático)**: - Se houver uma function call na resposta: - A resposta com a function call é adicionada ao histórico - A ferramenta correspondente é encontrada e executada - O resultado da ferramenta é adicionado ao histórico - O resultado é enviado de volta ao LLM para gerar uma nova resposta - Este processo se repete enquanto houver function calls nas respostas - Se não houver function call, o processo continua normalmente 5. **Finalização**: - A resposta final (sem function call) é adicionada ao histórico - A resposta é retornada ao chamador do método ## Considerações Técnicas 1. **Modo Chat do LLM**: - O `ChatAgent` foi projetado para funcionar com LLMs configurados no modo `"chat"`. Esta configuração é essencial para que o agente gerencie corretamente o histórico de conversas internamente. - Se você fornecer uma instância LLM que não tenha `mode: "chat"`, o `ChatAgent` exibirá um aviso (`console.warn`), pois o comportamento esperado do histórico pode não ser garantido. - O LLM padrão (`VertexAILLM`), quando instanciado automaticamente, já é configurado no modo `"chat"`. - Ao usar `GenerativeAILLM`, certifique-se de configurá-lo explicitamente com `mode: "chat"` ao criar a instância. 2. **Gerenciamento de Memória**: - O histórico de conversa cresce a cada interação - Para conversas muito longas, pode ser necessário implementar uma estratégia de resumo ou truncamento 3. **Segurança**: - Ao implementar ferramentas, especialmente aquelas que executam código (como a calculadora de exemplo), é importante considerar aspectos de segurança - O uso de `eval()` no exemplo da calculadora é apenas para demonstração e não deve ser usado em produção 4. **Integração com Outros Componentes**: - O `ChatAgent` pode ser integrado com outros componentes do sistema, como bancos de dados para persistência de histórico - Pode ser estendido para incluir funcionalidades adicionais, como análise de sentimento ou detecção de intenção - Para gerenciar múltiplos usuários e sessões, utilize o componente `ChatManager` que permite criar e gerenciar várias instâncias de `ChatAgent` com históricos isolados (veja a documentação do `ChatManager` para mais detalhes) ## Exemplo de Uso Completo A biblioteca inclui dois exemplos de uso do `ChatAgent`: ### Exemplo Completo O arquivo `test-chat-agent.js` contém um exemplo completo de uso do `ChatAgent`, demonstrando: 1. Inicialização do agente 2. Processamento de mensagens simples 3. Manutenção de contexto entre mensagens 4. Uso de ferramentas (previsão do tempo e calculadora) 5. Gerenciamento de histórico (limpeza e reinício) Para executar o exemplo: ```bash node test-chat-agent.js ``` ### Exemplo Simplificado O arquivo `test-chat-agent-simple.js` contém um exemplo mais simples e direto: 1. Inicialização do LLM no modo chat 2. Criação do ChatAgent 3. Processamento de mensagens básicas 4. Uso de uma ferramenta simples (calculadora) 5. Limpeza de histórico Para executar o exemplo simplificado: ```bash node test-chat-agent-simple.js ``` ## Delegação para Agentes Especialistas O `ChatAgent` agora suporta a delegação de tarefas para agentes especialistas, permitindo que o agente principal encaminhe solicitações específicas para agentes especializados em determinados domínios. ### Visão Geral da Delegação A funcionalidade de delegação permite que o `ChatAgent` atue como um "roteador" que: 1. Mantém a conversa principal com o usuário 2. Identifica quando uma solicitação requer conhecimento ou ação especializada 3. Delega a tarefa para um agente especialista apropriado 4. Recebe a resposta do especialista e a integra na conversa Esta abordagem permite criar um sistema de conversação mais robusto e escalável, onde cada agente especialista pode se concentrar em um domínio específico. ### Componentes da Delegação A implementação da delegação envolve dois componentes principais: 1. **AgentRegistry**: Uma classe que gerencia a criação e configuração de agentes especialistas 2. **Ferramenta de Delegação**: Uma ferramenta especial (`delegate_task_to_specialist`) que o LLM pode invocar para delegar tarefas ### Inicialização com Delegação ```javascript // Configuração dos agentes especialistas const specialistAgentsConfig = { "Tradutor EN-PT": { objective: "Traduzir textos do inglês para o português brasileiro.", context: "Você é um tradutor especializado. Traduza o texto fornecido do inglês para o português brasileiro de forma precisa e natural.", llmMode: 'oneshot' }, "Pesquisador Financeiro": { objective: "Fornecer análises e informações sobre mercados financeiros.", context: "Você é um pesquisador financeiro especializado. Forneça análises claras e objetivas.", enableGoogleSearch: true, llmMode: 'oneshot' } }; // Cria uma instância do ChatAgent com delegação habilitada const chatAgent = new ChatAgent({ role: "Assistente Virtual", objective: "Ajudar o usuário com suas dúvidas e tarefas", context: "Você é um assistente virtual inteligente que pode delegar tarefas para especialistas.", llm: llm, tools: [minhaFerramenta1, minhaFerramenta2], enableSpecialistDelegation: true, // Habilita a delegação specialistAgentsConfig: specialistAgentsConfig // Configuração dos especialistas }); ``` ### Gerenciamento de Especialistas O `ChatAgent` fornece métodos para gerenciar os agentes especialistas: ```javascript // Registrar um novo especialista chatAgent.registerSpecialist("Analista de Dados", { objective: "Analisar dados e gerar insights estatísticos.", context: "Você é um analista de dados especializado em estatística e visualização de dados.", llmMode: 'oneshot' }); // Remover um especialista chatAgent.unregisterSpecialist("Analista de Dados"); // Obter a lista de especialistas disponíveis const availableRoles = chatAgent.getAvailableSpecialistRoles(); console.log(`Especialistas disponíveis: ${availableRoles.join(', ')}`); // Habilitar/desabilitar a delegação dinamicamente chatAgent.disableSpecialistDelegation(); chatAgent.enableSpecialistDelegation(novaConfiguracao); ``` ### Fluxo de Delegação Quando o `ChatAgent` recebe uma mensagem do usuário: 1. O LLM analisa a mensagem e decide se deve responder diretamente ou delegar 2. Se decidir delegar, invoca a ferramenta `delegate_task_to_specialist` com: - `specialist_role`: O papel do especialista a ser consultado - `task_for_specialist`: A descrição da tarefa para o especialista 3. O `ChatAgent` obtém o agente especialista do `AgentRegistry` 4. O agente especialista executa a tarefa e retorna uma resposta 5. O `ChatAgent` integra a resposta do especialista na conversa 6. O LLM gera uma resposta final para o usuário ### Uso Avançado: AgentRegistry Compartilhado Para cenários mais complexos, é possível compartilhar um `AgentRegistry` entre múltiplos `ChatAgent`: ```javascript // Criar um registry compartilhado const sharedRegistry = new AgentRegistry(specialistAgentsConfig); // Criar múltiplos ChatAgents que compartilham o mesmo registry const chatAgent1 = new ChatAgent({ role: "Assistente 1", llm: llm1, enableSpecialistDelegation: true, agentRegistry: sharedRegistry }); const chatAgent2 = new ChatAgent({ role: "Assistente 2", llm: llm2, enableSpecialistDelegation: true, agentRegistry: sharedRegistry }); // Adicionar um novo especialista (afeta ambos os agentes) sharedRegistry.registerSpecialist("Novo Especialista", { /* configuração */ }); ``` ### Exemplo Completo A biblioteca inclui um exemplo completo de uso do `ChatAgent` com delegação: ```bash node examples/exemplo-chat-agent-com-delegacao.js ``` Este exemplo demonstra: 1. Configuração de agentes especialistas 2. Inicialização do ChatAgent com delegação 3. Registro e gerenciamento de especialistas 4. Processamento de mensagens com delegação 5. Diferentes formas de configurar a delegação ### Considerações sobre Delegação 1. **Desempenho**: Cada agente especialista usa sua própria instância de LLM, o que pode aumentar o uso de recursos 2. **Contexto**: Os agentes especialistas não têm acesso ao histórico completo da conversa, apenas à tarefa delegada 3. **Configuração do LLM**: Cada especialista pode usar um modelo e configurações diferentes, otimizados para sua tarefa 4. **Ferramentas Específicas**: Cada especialista pode ter suas próprias ferramentas específicas ## Sistema de Memória O `ChatAgent` agora suporta um sistema de memória avançado que permite não apenas armazenar o histórico de conversas, mas também fatos discretos e resumos de conversas. Este sistema é composto por três tipos de memória: 1. **ConversationMemory**: Armazena o histórico completo da conversa (já implementado anteriormente) 2. **FactMemory**: Armazena fatos discretos (pares chave-valor) extraídos da conversa 3. **SummaryMemory**: Armazena resumos da conversa que capturam os pontos principais ### Inicialização com Sistema de Memória ```javascript // Importa as classes de memória const { ConversationMemory, FactMemory, SummaryMemory, SQLiteConversationMemoryAdapter, SQLiteFactMemoryAdapter, SQLiteSummaryMemoryAdapter } = require('gemini-chain-lib'); // Cria instâncias de memória com adaptadores SQLite const conversationMemory = new ConversationMemory({ adapter: new SQLiteConversationMemoryAdapter({ dbPath: './conversation.db' }) }); const factMemory = new FactMemory({ adapter: new SQLiteFactMemoryAdapter({ dbPath: './facts.db' }) }); const summaryMemory = new SummaryMemory({ adapter: new SQLiteSummaryMemoryAdapter({ dbPath: './summaries.db' }) }); // Cria uma instância do ChatAgent com o sistema de memória completo const chatAgent = new ChatAgent({ role: "Assistente Pessoal", objective: "Ajudar o usuário com suas perguntas e tarefas", context: "Você é um assistente pessoal útil e amigável.", llm: llm, conversationMemory: conversationMemory, factMemory: factMemory, summaryMemory: summaryMemory, autoManageFactMemory: true, // Habilita o gerenciamento automático de fatos autoManageSummaryMemory: true, // Habilita o gerenciamento automático de resumos chatId: "usuario123" // ID opcional para a conversa (útil para integração com sistemas externos) }); ``` ### Uso de ID de Conversa Personalizado O `ChatAgent` permite o uso de um ID de conversa personalizado através do parâmetro `chatId`. Isso é especialmente útil para integração com sistemas externos que já possuem seus próprios identificadores de conversa. ```javascript // Cria um ChatAgent com um ID de conversa personalizado const chatAgent = new ChatAgent({ // Outras configurações... conversationMemory: conversationMemory, factMemory: factMemory, summaryMemory: summaryMemory, chatId: "usuario_123_sessao_456" // ID personalizado para a conversa }); ``` #### Comportamento do chatId - Se `chatId` for fornecido como uma string não vazia, ele será usado como identificador para todas as operações de memória. - Se `chatId` não for fornecido (ou for uma string vazia) e algum tipo de memória estiver configurado, um UUID será gerado automaticamente. - Se nenhuma memória estiver configurada, o `chatId` será `null`, pois não é necessário. Este mecanismo permite: 1. **Integração com sistemas existentes**: Use IDs de usuário, sessão ou conversa do seu sistema. 2. **Continuidade entre sessões**: Retome conversas anteriores fornecendo o mesmo `chatId`. 3. **Gerenciamento de múltiplos usuários**: Mantenha históricos separados para diferentes usuários. ```javascript // Exemplo: Retomando uma conversa anterior const chatId = "usuario_123"; // ID armazenado no seu sistema // Cria um ChatAgent com o ID da conversa anterior const chatAgent = new ChatAgent({ // Configurações básicas... conversationMemory: conversationMemory, chatId: chatId }); // O histórico da conversa anterior será carregado automaticamente // e o agente poderá continuar a conversa de onde parou ``` ### Gerenciamento Manual de Memória O sistema de memória pode ser gerenciado manualmente através dos métodos: ```javascript // Gerenciamento de fatos await chatAgent.setFact('nome_usuario', 'João Silva'); const nome = await chatAgent.getFact('nome_usuario'); const todosFatos = await chatAgent.getAllFacts(); // Gerenciamento de resumos await chatAgent.addSummary('O usuário perguntou sobre o clima e discutimos suas preferências de viagem.'); const ultimoResumo = await chatAgent.getLatestSummary(); const todosResumos = await chatAgent.getAllSummaries(5); // Limita a 5 resumos ``` ### Gerenciamento Automático de Memória O `ChatAgent` agora suporta o gerenciamento automático de memórias de fatos e resumos. Quando habilitado, o agente: 1. Analisa automaticamente cada interação da conversa após a resposta ser gerada 2. Extrai fatos relevantes e os armazena na `FactMemory` 3. Gera ou atualiza resumos na `SummaryMemory` quando apropriado Para habilitar o gerenciamento automático: ```javascript const chatAgent = new ChatAgent({ // Outras configurações... factMemory: factMemory, summaryMemory: summaryMemory, autoManageFactMemory: true, // Habilita o gerenciamento automático de fatos autoManageSummaryMemory: true // Habilita o gerenciamento automático de resumos }); ``` #### Como Funciona o Gerenciamento Automático 1. Após cada interação (mensagem do usuário + resposta do agente), o sistema: - Faz uma chamada adicional ao LLM com um prompt especializado - Solicita a extração de fatos relevantes e/ou a geração de resumos - Processa a resposta e atualiza as memórias correspondentes 2. Para extração de fatos: - O LLM identifica informações discretas importantes - Cada fato é representado como um par chave-valor - Os fatos são armazenados na `FactMemory` para uso futuro 3. Para geração de resumos: - O LLM avalia se a interação atual justifica uma atualização do resumo - Se necessário, gera um novo resumo ou atualiza o existente - O resumo é armazenado na `SummaryMemory` #### Coexistência de Gerenciamento Manual e Automático O gerenciamento automático não impede o gerenciamento manual. Mesmo com `autoManageFactMemory` e `autoManageSummaryMemory` habilitados, você ainda pode: - Adicionar fatos manualmente com `setFact()` - Adicionar resumos manualmente com `addSummary()` - Recuperar fatos e resumos com os métodos correspondentes Isso proporciona flexibilidade para combinar a extração automática com a adição manual de informações específicas. ### Exemplo de Uso do Sistema de Memória ```javascript // Inicializa o ChatAgent com sistema de memória completo const chatAgent = new ChatAgent({ // Configurações básicas... conversationMemory: conversationMemory, factMemory: factMemory, summaryMemory: summaryMemory, autoManageFactMemory: true, autoManageSummaryMemory: true }); // Processa uma mensagem do usuário await chatAgent.processUserMessage("Olá! Meu nome é Maria e moro em São Paulo."); // O sistema automaticamente extrai e armazena fatos como: // - nome_usuario: "Maria" // - cidade_usuario: "São Paulo" // Processa outra mensagem await chatAgent.processUserMessage("Estou planejando uma viagem para o Rio de Janeiro no próximo mês."); // O sistema extrai mais fatos e possivelmente gera um resumo // Recupera fatos armazenados para uso na aplicação const nome = await chatAgent.getFact('nome_usuario'); console.log(`Nome do usuário: ${nome}`); // Recupera o resumo mais recente const resumo = await chatAgent.getLatestSummary(); console.log(`Resumo da conversa: ${resumo}`); // Adiciona um fato manualmente (coexiste com o gerenciamento automático) await chatAgent.setFact('preferencia_clima', 'quente'); ``` ## Extensões Possíveis 1. **Aprimoramento do Sistema de Memória**: - Implementar mecanismos de priorização de fatos - Adicionar expiração de fatos baseada em tempo ou relevância - Desenvolver estratégias de resolução de conflitos para fatos contraditórios 2. **Análise de Sentimento**: - Adicionar análise de sentimento para adaptar o tom das respostas - Detectar frustração ou satisfação do usuário 3. **Integração com Interfaces**: - Conectar o agente a interfaces de chat (web, mobile, etc.) - Implementar webhooks para plataformas de mensageria 4. **Aprimoramento da Delegação**: - Implementar mecanismos de feedback para melhorar as decisões de delegação - Adicionar capacidade de delegação em cascata (especialistas delegando para sub-especialistas) - Desenvolver especialistas que mantêm seu próprio histórico interno