Spec - Integração de Interface de Chat (Twilio & Evolution API)
1. Visão Geral
Esta especificação define a implementação da camada de comunicação via WhatsApp do Amon Claw, utilizando webhooks do FastAPI para recebimento e clients abstratos para envio de mensagens.
2. Arquitetura
2.1. Endpoints de Webhook (Presentation)
Criar roteamento separado para cada provedor para facilitar a validação e o parsing:
POST /v1/webhooks/twilio/{tenant_id}- Content-Type:
application/x-www-form-urlencoded - Campos:
From,Body,MessageSid - Segurança: Validar
X-Twilio-Signature(opcional v1, recomendado v2) POST /v1/webhooks/evolution/{tenant_id}- Content-Type:
application/json - Campos:
event(filtrarmessages.upsert),data.key.fromMe(filtrarfalse),data.message(extrair texto) - Segurança: Validar
apikeyno header (configurável por tenant)
2.2. Camada de Infraestrutura (Messaging Clients)
Utilizar o padrão Strategy com uma classe base abstrata.
BaseMessagingClient (ABC):
- async send_text(to: str, text: str, config: dict) -> bool
- async send_image(to: str, url: str, caption: str, config: dict) -> bool
Implementações:
1. TwilioMessagingClient: Usa httpx para POST https://api.twilio.com/2010-04-01/Accounts/{AccountSid}/Messages.json.
2. EvolutionMessagingClient: Usa httpx para POST {base_url}/message/sendText/{instance}.
2.3. Modelagem de Dados (Tenant Config)
O modelo de Tenant deve incluir configurações de mensageria:
class MessagingProvider(str, Enum):
TWILIO = "twilio"
EVOLUTION = "evolution"
class TenantMessagingConfig(BaseModel):
provider: MessagingProvider
# Twilio fields
twilio_account_sid: Optional[str]
twilio_auth_token: Optional[str]
twilio_phone_number: Optional[str]
# Evolution fields
evolution_base_url: Optional[str]
evolution_instance: Optional[str]
evolution_apikey: Optional[str]
3. Fluxo de Processamento
- Webhook Recebido:
- Extrai
tenant_idda URL. - Extrai
sender_numberemessage_text. - Orquestração (Application):
- Busca
Tenantno MongoDB. - Instancia o Grafo do LangGraph usando o
sender_numbercomothread_id. - O Grafo processa e retorna uma resposta.
- Resposta:
- O Grafo (ou um Use Case de saída) utiliza o
MessagingFactorypara obter o client correto do Tenant e enviar a mensagem de volta.
4. Próximos Passos (Plano)
- Atualizar entidade
Tenante seu Schema/Model para incluirmessaging_config. - Implementar
BaseMessagingCliente os clients concretos. - Criar os roteadores de webhook no FastAPI.
- Integrar o recebimento com a chamada do
sdr_assistant(LangGraph).