Skip to content

WhatsApp & IA Conversacional

Visão Geral

O módulo WhatsApp (Domain/WhatsApp) integra o Decaelo com a Meta Cloud API (WhatsApp Business Platform) e o Laravel AI SDK para oferecer comunicação bidirecional inteligente entre igrejas e seus membros.

Funcionalidades principais:

  • Notificações outbound via templates aprovados pelo Meta
  • Chatbot conversacional com IA que responde de forma natural
  • Escalação automática para atendente humano
  • 3 níveis de acesso gateados por plano
  • Personalidade da IA customizável por igreja

Arquitetura

Fluxo Geral

Meta Cloud API ←→ Webhook Controller (central) ←→ Jobs (tenant-aware) ←→ WhatsAppAgent (Laravel AI SDK)
  • Webhook centralizado — rota pública fora do tenant middleware. Resolve o tenant pelo phone_number_id cadastrado em whatsapp_accounts
  • Filas dedicadaswhatsapp-inbound (processamento IA) e whatsapp-outbound (envio), workers Horizon separados
  • Agent do Laravel AI SDKWhatsAppAgent com Tools, Middleware e Failover entre provedores

Número por Igreja

Cada igreja (tenant) possui seu próprio número de WhatsApp registrado na Meta Cloud API. O número pode ser o que a igreja já utiliza. Isso garante:

  • Identidade própria — mensagens saem do número da igreja
  • Roteamento trivial — phone_number_id mapeia diretamente para o tenant
  • Sem conflito de rate limits entre igrejas

Modelo de Dados

Banco Central:

TabelaDescrição
whatsapp_accountsCredenciais Meta por tenant (phone_number_id, access_token criptografado)

Banco Tenant (isolado por igreja):

TabelaDescrição
whatsapp_conversationsConversas com status (active, escalated, closed, expired)
whatsapp_messagesMensagens com direção, tipo, sender_id, status de entrega, tokens IA usados
whatsapp_templatesTemplates aprovados pelo Meta para mensagens outbound
ai_prompt_configurationsPersonalidade da IA, system prompt, saudação, fallback
whatsapp_credit_usageControle mensal de cota e créditos extras

Integração com Módulos Existentes

  • CommunicationNotificationChannel::WhatsApp adicionado ao enum existente. SendNotificationAction estendido para despachar via WhatsApp respeitando preferências do membro
  • Feature Flagswhatsapp_basic, whatsapp_intermediate, whatsapp_complete, whatsapp_custom_prompt
  • Horizon — supervisor dedicado whatsapp com filas whatsapp-inbound e whatsapp-outbound
  • Reverb — broadcasting de conversas escaladas e status de mensagens para o painel admin
  • Auditing — todos os models do módulo são auditados automaticamente

Fluxo Inbound (Membro → Igreja)

1. Membro envia mensagem no WhatsApp
2. Meta POST /webhooks/whatsapp
3. WhatsAppWebhookController valida signature
4. Resolve tenant pelo phone_number_id
5. Dispatch ProcessInboundMessageJob (fila: whatsapp-inbound)
6. Job no contexto do tenant:
   a. Busca/cria conversa pelo telefone do remetente
   b. Vincula ao member (se encontrar pelo telefone)
   c. Salva mensagem
   d. Se conversa escalada → broadcast para painel do atendente
   e. Se conversa ativa → WhatsAppAgent processa com IA
7. Agent responde → dispatch SendOutboundMessageJob
8. Mensagem enviada via MetaCloudApiService

Áudio

Mensagens de áudio são baixadas via Meta API e transcritas usando o Laravel AI SDK (Transcription STT). O texto transcrito é processado como mensagem de texto normal.

Fluxo Outbound (Igreja → Membros)

Notificações via Template

Mensagens iniciadas pela igreja (fora da janela de 24h) exigem templates pré-aprovados pelo Meta.

1. Admin cria notificação no painel
2. SendNotificationAction verifica preferências do membro
3. Canal WhatsApp habilitado → dispatch SendWhatsAppTemplateJob
4. Job preenche placeholders do template com dados do membro/evento
5. MetaCloudApiService envia template

Janela de 24h

  • Membro envia mensagem → abre janela de 24h para respostas livres
  • Dentro da janela: IA e atendentes respondem livremente (free-form)
  • Fora da janela: apenas templates aprovados

IA Conversacional

Laravel AI SDK

O chatbot usa o WhatsAppAgent construído com o Laravel AI SDK:

php
class WhatsAppAgent implements Agent, Conversational, HasMiddleware
{
    use Promptable, RemembersConversations;

    public function tools(): iterable
    {
        return match ($this->accessLevel) {
            AiAccessLevel::Basic => $this->basicTools(),
            AiAccessLevel::Intermediate => $this->intermediateTools(),
            AiAccessLevel::Complete => $this->completeTools(),
        };
    }
}

Níveis de Acesso

Básico — informações públicas da igreja:

ToolDescrição
ConsultarHorariosCultoHorários de cultos e missas
ConsultarEventosProximosPróximos eventos públicos
ConsultarInfoIgrejaEndereço, telefone, redes sociais
ConsultarAvisosGeraisAvisos da liderança

Intermediário — dados do próprio membro:

ToolDescrição
ConsultarMeusDadosDados cadastrais do membro
ConsultarMeusCelulasCélulas/grupos que participa
ConsultarMinhasContribuicoesResumo de dízimos/ofertas
ConsultarMeusEventosEventos inscritos

Completo — ações executáveis:

ToolDescrição
RegistrarPedidoOracaoCria pedido no mural de oração
InscreverEmEventoInscreve em evento
ConfirmarPresencaConfirma presença
SolicitarAtestadoSolicita declaração de membro
EscalarParaHumanoTransfere para atendente

Middleware do Agent

MiddlewareFunção
InjectChurchPersonalityCarrega system prompt da igreja (template ou customizado)
CheckCreditQuotaVerifica e decrementa cota mensal
FilterByAccessLevelRemove tools fora do nível do plano
LogAiUsageRegistra tokens, provider, tempo de resposta

Personalidade da IA

  • Templates (plano menor): perfis prontos — Formal, Acolhedor, Jovem
  • System prompt customizável (plano premium): admin configura tom, saudação, nome do bot, informações da denominação

Failover

php
$response = $agent->prompt($message, provider: [Lab::OpenAI, Lab::Anthropic]);

Se o provider principal falhar (rate limit, timeout), o SDK automaticamente tenta o próximo.

Providers por Ambiente

AmbienteProviderModelo
Dev/TestOpenAIgpt-4o-mini
ProduçãoOpenAI (fallback: Anthropic)gpt-4o-mini (fallback: claude-haiku)

Escalação para Humano

1. IA não consegue resolver → chama tool EscalarParaHumano
2. Conversa marcada como 'escalated'
3. Notificação via Reverb → sino no painel admin
4. Atendente vê conversa com histórico completo
5. Atendente responde pelo painel → mensagem enviada via WhatsApp
6. Timeout (configurável, default 15min):
   → Ninguém respondeu → mensagem ao membro informando retorno
   → Cria tarefa interna de follow-up
7. Atendente pode "Devolver para IA" → conversa volta para status 'active'

Segurança

Webhook

  • Validação X-Hub-Signature-256 com HMAC SHA-256
  • Rate limiting no endpoint
  • verify_token para handshake inicial do Meta

Dados

  • access_token criptografado no banco (encrypted cast)
  • Mensagens isoladas por tenant (banco separado)
  • Áudio descartado após transcrição

Proteção contra Prompt Injection

  • Tools acessam dados APENAS do membro identificado pelo telefone
  • FilterByAccessLevel remove tools antes do provider — restrição estrutural, não por prompt
  • Tools de ação retornam intent → Action valida e executa

Identificação do Membro

  • Vinculação automática por telefone
  • Primeiro acesso a dados pessoais exige confirmação (últimos 4 dígitos do CPF ou data de nascimento)
  • Confirmação válida por 30 dias

Feature Flags

FlagDescrição
whatsapp_basicNotificações + IA nível básico
whatsapp_intermediateIA com acesso a dados do membro
whatsapp_completeIA com ações executáveis
whatsapp_custom_promptSystem prompt customizável

Páginas do Painel Admin

PáginaRotaDescrição
Conversas/whatsapp/conversationsLista de conversas com filtro por status
Chat/whatsapp/conversations/{ulid}Chat em tempo real (atendente)
Templates/whatsapp/templatesGestão de templates Meta
Configuração IA/whatsapp/configurationPersonalidade, prompts, saudação
Créditos/whatsapp/creditsUso mensal e compra de créditos extras

Permissões

PermissãoDescrição
whatsapp.viewVisualizar conversas
whatsapp.replyResponder como atendente
whatsapp.manageGerenciar templates e configuração IA
whatsapp.creditsVisualizar e comprar créditos