Gatilhos Generativos
Gatilhos são ações que o LLM pode chamar automaticamente durante uma conversa. Eles conectam o assistente a sistemas externos — APIs, CRMs, calendários, plataformas de saúde — sem que o usuário precise perceber.
Como Funciona
Usuário: "Quero agendar para amanhã às 14h"
↓
LLM analisa a mensagem
LLM identifica: "preciso chamar agendar_consulta"
↓
Platform executa o gatilho
(ex: Google Calendar API)
↓
Resposta da integração volta para o LLM
↓
LLM (se InterpretResponse=true): "Sua consulta foi agendada!"
LLM (se InterpretResponse=false): action executada silenciosamenteO LLM decide quando e se chamar um gatilho com base na descrição fornecida e no contexto da conversa.
Estrutura de um Gatilho
Function Calling
Cada gatilho expõe uma função para o LLM via JSON Schema:
{
"name": "consultar_status_pedido",
"description": "Consulta o status atual de um pedido pelo número. Use quando o cliente perguntar sobre o andamento, localização ou previsão de entrega de um pedido.",
"parameters": {
"type": "object",
"properties": {
"numero_pedido": {
"type": "string",
"description": "Número do pedido, geralmente no formato ORD-XXXXX"
},
"incluir_historico": {
"type": "boolean",
"description": "Se deve incluir o histórico completo de movimentações"
}
},
"required": ["numero_pedido"]
}
}Campos do FunctionCalling
| Campo | Obrigatório | Descrição |
|---|---|---|
name |
✅ | Identificador da função (sem espaços, use _) |
description |
✅ | Crucial: explica QUANDO o LLM deve chamar. Máx 350 chars |
parameters |
➖ | JSON Schema dos argumentos que o LLM deve extrair |
A Importância da Descrição
A description é o que o LLM usa para decidir se deve ou não chamar o gatilho. Uma descrição ruim leva a chamadas incorretas ou ausentes.
Descrição ruim:
"Agenda consultas"Descrição boa:
"Agenda uma consulta médica no sistema Feegow. Use quando o paciente
confirmar que deseja agendar, após já ter escolhido o médico, data e horário.
NÃO use para apenas verificar disponibilidade."Dicas para uma boa descrição:
- Indique quando usar (contexto)
- Indique quando NÃO usar (evita falsos positivos)
- Use verbos de ação no imperativo
- Mencione o que o LLM precisa extrair do usuário antes de chamar
Parâmetros e Extração Automática
O LLM extrai automaticamente os parâmetros definidos do contexto da conversa. Você não precisa pedir explicitamente cada dado — o LLM sabe o que precisa coletar.
{
"name": "criar_lead_crm",
"parameters": {
"properties": {
"nome": { "type": "string", "description": "Nome completo do cliente" },
"email": { "type": "string", "description": "E-mail do cliente" },
"empresa": { "type": "string", "description": "Nome da empresa onde trabalha" },
"interesse": {
"type": "string",
"enum": ["basico", "pro", "enterprise"],
"description": "Plano de interesse do cliente"
}
},
"required": ["nome", "email"]
}
}Se nome e email já foram mencionados na conversa, o LLM os usa diretamente. Se não, pode perguntar ao usuário antes de chamar.
`MaxInteractions`
Define quantas vezes o LLM pode chamar gatilhos em sequência numa única mensagem do usuário.
| Valor | Comportamento |
|---|---|
1 |
Chama no máximo 1 gatilho por resposta |
2 (padrão) |
Pode chamar 1 gatilho, receber a resposta e chamar mais 1 |
3-10 |
Permite fluxos mais complexos com múltiplas etapas |
Exemplo com MaxInteractions = 3:
Usuário: "Agende para o Lucas, CPF 123.456.789-00"
↓
LLM chama: buscar_paciente(cpf="123.456.789-00")
↓
Sistema retorna: {id: "pac_42", nome: "Lucas Silva", ...}
↓
LLM chama: verificar_disponibilidade(paciente_id="pac_42")
↓
Sistema retorna: ["14h", "15h", "16h de amanhã"]
↓
LLM pergunta: "Lucas, tenho horários disponíveis amanhã: 14h, 15h ou 16h. Qual prefere?"`InterpretResponse`
Controla se o LLM lê e interpreta a resposta da integração para formular uma resposta ao usuário.
| Valor | Comportamento |
|---|---|
true |
LLM recebe a resposta do gatilho e decide o que dizer ao usuário |
false |
A ação é executada silenciosamente; o LLM responde sem ver o resultado |
Quando usar false:
- Ações de log/analytics (Meta Pixel, registro de evento)
- Ações que não afetam a resposta (atualização de CRM em background)
- Quando você quer controlar a mensagem de confirmação via
responseDirective
`CopilotOnly`
Marca o gatilho para ser usado exclusivamente no modo copilot. Em sessões normais, este gatilho é ignorado.
Útil para:
- Ações internas de backoffice que o usuário final não deve acionar
- Integrações de análise e BI
- Ferramentas de moderação/supervisão
Ações Disponíveis por Gatilho
Cada gatilho está associado a uma ação de integração. Veja as opções:
| Ação | Subtipo | Descrição |
|---|---|---|
WEBHOOK |
— | HTTP customizado (GET, POST, PUT, DELETE) |
NATIVE |
SEND_TEXT, SEND_BUTTON, SEND_LIST... | Mensagens WhatsApp avançadas |
CRM |
UPSERT_CONTACT | Criação/atualização de contato |
GOOGLE_CALENDAR |
CHECK, LIST, SCHEDULE | Agendamento |
KNOWLEDGE |
SEARCH | Busca na base de conhecimento |
META_ADS |
SEND_EVENT | Pixel de conversão |
CHAT_INTEGRATION |
CHANGE_STATUS, SUMMARIZE | Atendimento humano |
CATALOG |
SEARCH, ADD_CART... | Catálogo de produtos |
FEEGOW |
24 subtipos | Gestão clínica |
Z_API / MY_ZAP / EVOLUTION |
SET_TAG, RESET_SESSION... | Gerenciamento WhatsApp |
Exemplo Completo: Assistente de Vendas
{
"triggers": [
{
"name": "qualificar_lead",
"description": "Registra um lead qualificado no CRM após coletar nome, e-mail e interesse. Use quando o cliente demonstrar interesse genuíno no produto.",
"parameters": {
"properties": {
"nome": { "type": "string" },
"email": { "type": "string" },
"interesse": {
"type": "string",
"enum": ["demo", "proposta", "informacoes"]
}
},
"required": ["nome", "email", "interesse"]
},
"action": { "type": "CRM", "subtype": "UPSERT_CONTACT" },
"interpretResponse": false
},
{
"name": "agendar_demo",
"description": "Agenda uma demonstração no Google Calendar. Use APENAS após o lead confirmar nome, e-mail e ter escolhido uma data/hora específica.",
"parameters": {
"properties": {
"nome": { "type": "string" },
"email": { "type": "string" },
"data_hora": { "type": "string", "description": "Data e hora no formato ISO 8601" }
},
"required": ["nome", "email", "data_hora"]
},
"action": { "type": "GOOGLE_CALENDAR", "subtype": "SCHEDULE" },
"interpretResponse": true
}
]
}