Providers LLM
Configure suas API Keys e defina o provider padrão global. Quando um número tiver um Assistente ativo, ele terá prioridade — este provider é usado apenas como fallback.
Embedding para RAG
Escolha o provedor que gera os vetores semânticos usados na busca por similaridade.
No Docker? Use http://host.docker.internal:11434
Assistentes
Configure um assistente personalizado para cada número WhatsApp ativo no GoWA.
Números WhatsApp
Todos os números registrados no GoWA. Atribua assistentes e visualize o histórico de mensagens de cada número.
Base de Conhecimento (RAG)
Alimente o cérebro dos seus robôs subindo arquivos PDF, DOCX, Markdown, HTML ou Texto para o Supabase.
Novo Documento
Use esta mesma tag na configuração do Assistente.
Arquivos na Nuvem (Supabase)
Informações Relevantes
Defina as categorias de dados que serão extraídas automaticamente das conversas. Visualize e edite o perfil de cada contato.
—
Conversas WhatsApp
Espelhamento das conversas armazenadas no GoWA. Selecione um dispositivo para visualizar os chats.
| Nome | Tipo | JID | Última Mensagem | Ações |
|---|---|---|---|---|
| Selecione um dispositivo para carregar as conversas. | ||||
Dicas e Uso
Histórico de melhorias aplicadas ao agente e documentação técnica das funcionalidades implementadas.
app/services/agent_service.py
Tool call perdia o contexto do assistente na resposta final
Quando a LLM chamava uma ferramenta (ex: search_knowledge_base), a resposta final era gerada com o system prompt genérico padrão — descartando o system prompt configurado no assistente, o contexto do RAG e o perfil do contato. O método _handle_tool_calls agora recebe e utiliza o system prompt completo construído para aquela interação.
app/services/agent_service.py
Flag needs_rag era ignorada antes da busca vetorial
O serviço de intenção (intent_service) detectava corretamente que mensagens simples (saudações, agradecimentos) não precisavam de busca na base de conhecimento, retornando needs_rag: false. No entanto, o código realizava a busca de embeddings no Supabase de qualquer forma, gerando chamadas de API desnecessárias. A verificação da flag agora ocorre antes da chamada ao Supabase, pulando completamente a busca vetorial quando não é necessária.
tools.py · agent_service.py
Sistema de tools unificado com ToolRegistry
O tools.py foi completamente reescrito como sistema unificado onde cada tool define seu próprio schema (enviado ao LLM) e lógica de execução na mesma classe. O agent_service.py foi migrado para usar o ToolRegistry, eliminando o dicionário de handlers avulsos. Novas tools podem ser adicionadas criando uma subclasse de BaseTool sem tocar no agent_service.
app/services/agent_service.py
RAG Agêntico — LLM decide quando buscar na base de conhecimento
Anteriormente o sistema sempre pré-buscava no RAG antes de chamar o LLM, injetando o resultado no system prompt independentemente da necessidade. Agora o RAG é uma tool disponível ao LLM: ele mesmo decide se e quando buscar, com qual query, podendo inclusive realizar múltiplas buscas durante a resposta. Isso elimina o intent_service como etapa obrigatória e reduz latência e custo em conversas que não precisam de conhecimento externo.
app/services/tools.py
search_knowledge_base agora filtra por namespace do assistente
A tool de busca na base de conhecimento agora recebe os rag_namespaces configurados no assistente via contexto de execução. Um bot de vendas só consultará documentos do namespace de vendas, e um bot de suporte só acessará sua própria base — sem cruzamento indevido entre bases de conhecimento de diferentes assistentes.
app/services/tools.py
Tools reais: send_image, schedule_callback e transfer_to_human
send_image: a LLM pode enviar uma imagem diretamente ao usuário no WhatsApp a partir de uma URL pública — útil para catálogos, fotos de produtos e diagramas. schedule_callback: agenda um retorno de contato com data, horário e assunto, persistindo a entrada no Redis com status pending para processamento futuro. transfer_to_human: encerra o atendimento automático e registra a solicitação de transferência com motivo e prioridade.
Buffer de Mensagens e Pausa Humana (Human-in-the-loop)
Para evitar que a IA responda imediatamente após o usuário enviar múltiplas mensagens fracionadas, o sistema utiliza um buffer baseado em Redis. Ao receber uma mensagem (webhook), aguarda um período de silêncio (ex: 8 segundos) e consolida todas as mensagens em um único contexto antes de acionar a IA. Se o webhook detectar que a mensagem foi enviada pelo próprio número do bot (is_from_me = true), o agente é silenciado automaticamente por 15 minutos, inferindo que um humano assumiu o controle.
Envio Fragmentado e Simulação de Digitação
As respostas da LLM passam pela classe MessageSender, que divide a resposta em balões menores a cada parágrafo separado por dupla quebra de linha. Para cada fragmento, o sistema calcula um atraso proporcional à quantidade de caracteres (~50ms/caractere) e dispara o indicador Escrevendo... nativo do WhatsApp antes de enviar cada pedaço.
Processamento de Áudio e Imagens com Fallbacks
Áudio (Whisper): transcrição via OpenAI como prioridade; em caso de erro, fallback automático para Groq. Imagens (Vision): análise via GPT-4o Vision como prioridade; fallback para Gemini 1.5 Flash Vision. Ambos os fluxos são transparentes para a LLM — ela recebe o conteúdo já transcrito ou descrito como texto.
Roteamento de Multimídia via Prompt (Regex + MessageSender)
A LLM é instruída via System Prompt a emitir URLs de mídia (.mp4, .jpg, .pdf) em texto claro quando precisar compartilhar arquivos. O MessageSender detecta essas URLs por Regex e aciona automaticamente os métodos corretos da API GoWA (send_image / send_video).
Base de Conhecimento Granular com RAG (Supabase / pgvector)
Sistema de Retrieval-Augmented Generation (RAG) nativo com upload de documentos pelo painel. Suporta PDF, DOCX, Markdown, HTML e TXT. Cada documento é associado a um namespace — o assistente consulta apenas os namespaces configurados para ele. Embeddings via OpenAI (v3) como padrão, com suporte a Groq e Ollama para controle de custo. Painel inclui SQL Helper e links diretos ao Supabase para diagnóstico.
Memória Adaptativa e Extração de Perfis de Contato
Em segundo plano, a IA analisa cada turno da conversa e extrai informações conforme as categorias definidas na aba "Informações Relevantes" (ex: nome, produto de interesse, orçamento). O perfil extraído é injetado automaticamente no System Prompt a cada nova mensagem do contato — a IA lembra do contexto sem precisar reler todo o histórico. O perfil evolui continuamente: se o cliente mudar de interesse, o campo é atualizado automaticamente no banco de dados.