Community Integration: WhatsApp via Evolution API — agent tools + auto-reply bot #4356
m0tekferreira-code
started this conversation in
Show and tell
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
O que esta integração adiciona
Implementei suporte nativo a WhatsApp no Odysseus usando a Evolution API como gateway. O agente ganha 4 novas tools (
whatsapp_send_message,whatsapp_list_chats,whatsapp_read_messages,whatsapp_search) e um bot de auto-resposta que processa mensagens WhatsApp recebidas através do loop completo do Odysseus.data/whatsapp.dbpara busca e históricoArquitetura
Arquivos modificados / criados
Novo:
routes/whatsapp_routes.py(~270 linhas)Config via env vars:
Endpoints registrados:
POST/api/whatsapp/webhookGET/api/whatsapp/chatsGET/api/whatsapp/messages/{jid}POST/api/whatsapp/sendGET/api/whatsapp/statusGET/POST/api/whatsapp/configGET/api/whatsapp/modelsModificado:
app.pyModificado:
src/tool_schemas.py4 schemas adicionados ao
FUNCTION_TOOL_SCHEMAS:{"type": "function", "function": { "name": "whatsapp_list_chats", "description": "List recent WhatsApp conversations.", "parameters": {"type": "object", "properties": { "limit": {"type": "integer", "description": "Max chats (default 30)"} }} }}, {"type": "function", "function": { "name": "whatsapp_read_messages", "description": "Read messages from a WhatsApp conversation by JID or phone number.", "parameters": {"type": "object", "properties": { "jid": {"type": "string"}, "limit": {"type": "integer"} }, "required": ["jid"] } }}, {"type": "function", "function": { "name": "whatsapp_send_message", "description": "Send a WhatsApp message to a contact.", "parameters": {"type": "object", "properties": { "jid": {"type": "string"}, "message": {"type": "string"} }, "required": ["jid", "message"] } }}, {"type": "function", "function": { "name": "whatsapp_search", "description": "Search WhatsApp messages by keyword across all conversations.", "parameters": {"type": "object", "properties": { "query": {"type": "string"}, "limit": {"type": "integer"} }, "required": ["query"] } }},Modificado:
src/tool_implementations.pyModificado:
src/tool_execution.pyModificado:
src/agent_tools/__init__.pyModificado:
src/tool_index.pyModificado:
src/agent_loop.pyModificado:
src/tool_policy.pyVariáveis de ambiente
SQLite schema
Lições aprendidas — registrar tool em 7 lugares
Ao adicionar uma nova tool no Odysseus, registre em todos estes pontos ou ela ficará invisível ao agente:
FUNCTION_TOOL_SCHEMAS— schema JSON para function callingTOOL_TAGS— reconhecimento em fenced-block parsingtool_execution.pydispatcher — execuçãoBUILTIN_TOOL_DESCRIPTIONS— indexação no ChromaDB (RAG)_KEYWORD_HINTS— fallback por keywords_DOMAIN_TOOL_MAP— injeção determinística por domínio_DOMAIN_RULES— prompt de instruções do domínio_COMMON_TOOL_NAMES— pool de tools conhecidas na policy_analyze_intent()— sem issolow_signal=Truee o RAG é puladoPonto crítico: se
low_signal=True(nenhum domínio detectado), o Odysseus usa apenas{ask_user, manage_memory, update_plan}e ignora o RAG completamente. A detecção de intent (item 9) é o gatilho de tudo.Integração desenvolvida por Edson Ferreira. Testado no Odysseus (commit Jun 2026) com Evolution API v2 e modelos GLM-5.1 / GLM-4.7-flash.
All reactions