191 lines
5.8 KiB
Markdown
191 lines
5.8 KiB
Markdown
# Handoff Webhook Implementation - Progress Log
|
|
|
|
## Data: 2026-01-11
|
|
|
|
### Objetivo
|
|
|
|
Implementar sistema de notificação via webhook quando o Captain AI escala conversas para atendimento humano, conforme Fase 1 do plano aprovado.
|
|
|
|
### Contexto
|
|
|
|
O usuário precisa notificar sistemas externos (CRM, telefonia, etc.) quando uma conversa é escalada. O webhook deve enviar:
|
|
|
|
- Dados do contato (nome, telefone, email)
|
|
- Contexto da escalação (motivo, sentimento, resumo)
|
|
- Informações da conversa e assistente
|
|
|
|
### Passos Executados
|
|
|
|
#### 1. Database Migration ✅
|
|
|
|
**Arquivo:** `db/migrate/20260111070000_add_handoff_webhook_config_to_captain_assistants.rb`
|
|
|
|
- Adicionou coluna `handoff_webhook_config` (JSONB) na tabela `captain_assistants`
|
|
- Permite armazenar configuração do webhook:
|
|
```json
|
|
{
|
|
"enabled": true,
|
|
"url": "https://...",
|
|
"headers": { "Authorization": "Bearer ..." },
|
|
"retry_attempts": 3,
|
|
"timeout_seconds": 5
|
|
}
|
|
```
|
|
|
|
#### 2. Backend Service ✅
|
|
|
|
**Arquivo:** `enterprise/app/services/captain/handoff_webhook_service.rb`
|
|
|
|
Funcionalidades implementadas:
|
|
|
|
- Validação de webhook habilitado
|
|
- Construção de payload completo
|
|
- Envio HTTP POST com timeout configurável
|
|
- Headers customizáveis para autenticação
|
|
- Logging estruturado de sucesso/falha
|
|
- Exception tracking integrado
|
|
|
|
**Payload enviado:**
|
|
|
|
```json
|
|
{
|
|
"event": "conversation.handoff",
|
|
"timestamp": "2026-01-11T...",
|
|
"conversation": {
|
|
"id": 123,
|
|
"display_id": 45,
|
|
"status": "open",
|
|
"inbox_id": 1,
|
|
"assignee_id": null,
|
|
"team_id": null
|
|
},
|
|
"contact": {
|
|
"id": 456,
|
|
"name": "João Silva",
|
|
"phone_number": "+5561999887766",
|
|
"email": "joao@example.com",
|
|
"additional_attributes": {...}
|
|
},
|
|
"handoff_context": {
|
|
"trigger": "sentiment|error|ai_decision",
|
|
"sentiment": "frustrated",
|
|
"reason": "...",
|
|
"last_message": "...",
|
|
"conversation_summary": "..."
|
|
},
|
|
"assistant": {
|
|
"id": 1,
|
|
"name": "Hotel Assistant"
|
|
}
|
|
}
|
|
```
|
|
|
|
#### 3. Integração com ResponseBuilderJob ✅
|
|
|
|
**Arquivo:** `enterprise/app/jobs/captain/conversation/response_builder_job.rb`
|
|
|
|
Mudanças aplicadas:
|
|
|
|
- Adicionado método `deliver_handoff_webhook` após `apply_handoff_side_effects`
|
|
- Método `determine_handoff_trigger` para identificar origem da escalação (sentimento, erro, ou decisão da IA)
|
|
- Método `build_conversation_summary` que prioriza insights do CRM ou concatena últimas 5 mensagens
|
|
- Integração automática no fluxo de handoff existente
|
|
|
|
#### 4. Frontend UI ✅
|
|
|
|
**Arquivo:** `app/javascript/dashboard/components-next/captain/pageComponents/assistant/settings/AssistantWebhookSettings.vue`
|
|
|
|
Componente Vue completo com:
|
|
|
|
- Toggle para habilitar/desabilitar webhook
|
|
- Input para URL do webhook (validação obrigatória)
|
|
- Lista dinâmica de headers customizados (usando `HeaderRow.vue` existente)
|
|
- Configuração de retry attempts (0-5)
|
|
- Configuração de timeout (1-30 segundos)
|
|
- Botão "Testar Webhook" (placeholder para futura implementação)
|
|
- Validação de formulário antes de submit
|
|
|
|
#### 5. Tradução (i18n) ✅
|
|
|
|
Adicionado keys em:
|
|
|
|
- `app/javascript/dashboard/i18n/locale/en/integrations.json`
|
|
- `app/javascript/dashboard/i18n/locale/pt_BR/integrations.json`
|
|
|
|
Keys criadas: `CAPTAIN.ASSISTANTS.WEBHOOK.*`
|
|
|
|
#### 6. Integração na Página de Configurações ✅
|
|
|
|
**Arquivo:** `app/javascript/dashboard/routes/dashboard/captain/assistants/settings/Settings.vue`
|
|
|
|
- Importado `AssistantWebhookSettings`
|
|
- Adicionado como nova seção entre "System Settings" e "Delete Assistant"
|
|
- Conectado ao handler `handleSubmit` existente para salvar configuração
|
|
|
|
### Arquivos Criados
|
|
|
|
1. `db/migrate/20260111070000_add_handoff_webhook_config_to_captain_assistants.rb`
|
|
2. `enterprise/app/services/captain/handoff_webhook_service.rb`
|
|
3. `app/javascript/dashboard/components-next/captain/pageComponents/assistant/settings/AssistantWebhookSettings.vue`
|
|
4. `progresso/2026-01-11_handoff_webhook_implementation.md` (este arquivo)
|
|
|
|
### Arquivos Modificados
|
|
|
|
1. `enterprise/app/jobs/captain/conversation/response_builder_job.rb`
|
|
2. `app/javascript/dashboard/i18n/locale/en/integrations.json`
|
|
3. `app/javascript/dashboard/i18n/locale/pt_BR/integrations.json`
|
|
4. `app/javascript/dashboard/routes/dashboard/captain/assistants/settings/Settings.vue`
|
|
|
|
### Como Usar (Para o Usuário)
|
|
|
|
1. **Ativar Migration:**
|
|
|
|
```bash
|
|
bundle exec rails db:migrate
|
|
```
|
|
|
|
2. **Configurar Webhook:**
|
|
|
|
- Acessar: Captain → Assistants → [Seu Assistant] → Settings
|
|
- Scroll até seção "Webhook de Escalação"
|
|
- Ativar toggle
|
|
- Inserir URL (ex: `https://api.seucrm.com/handoff`)
|
|
- (Opcional) Adicionar headers de autenticação:
|
|
- Header: `Authorization`
|
|
- Value: `Bearer SEU_TOKEN_AQUI`
|
|
- Ajustar retry/timeout se necessário
|
|
- Salvar
|
|
|
|
3. **Testar:**
|
|
- Criar conversa no Captain que vai escalar (ex: perguntar algo que a IA não sabe)
|
|
- Verificar logs do Rails para confirmar envio:
|
|
```
|
|
[HandoffWebhook] Sending to https://... for conversation 123
|
|
[HandoffWebhook] Success: 200 for conversation 123
|
|
```
|
|
- Verificar recebimento no endpoint externo
|
|
|
|
### Segurança Implementada
|
|
|
|
- ✅ Headers customizáveis para autenticação
|
|
- ✅ Timeout configurável (evita bloqueio infinito)
|
|
- ✅ Exception tracking (Sentry/similar)
|
|
- ✅ Validação de URL presente antes de enviar
|
|
- ✅ Logs estruturados com conversation_id para auditoria
|
|
|
|
### Pendências (Futuras PRs)
|
|
|
|
- [ ] Endpoint de teste de webhook (botão "Testar Webhook" atualmente só loga no console)
|
|
- [ ] Retry automático com Sidekiq (`Captain::HandoffWebhookRetryJob`)
|
|
- [ ] Dashboard de monitoramento de webhooks (taxa de sucesso, latência)
|
|
- [ ] Validação de URL (força HTTPS em produção)
|
|
- [ ] Rate limiting (máx 100 webhooks/min)
|
|
|
|
### Próxima Fase
|
|
|
|
Fase 2: Sistema de Notificações Internas Aprimoradas (ActionCable, Toasts, Badges, Sons)
|
|
|
|
---
|
|
|
|
**Status:** ✅ **FASE 1 COMPLETA**
|