Padrões recomendados para encadear validadores em conversas reais.
Padrão para chatbots de cadastro: nome → CPF → telefone → email.
1. POST /v1/extract/name → obtained: true → salvar, seguir para CPF → obtained: false → usar suggestion_to_agent, perguntar de novo 2. POST /v1/extract/cpf → obtained: true, certain: true → salvar, seguir para telefone → obtained: true, certain: false → confirmar com usuário → obtained: false → usar suggestion_to_agent 3. POST /v1/extract/phone → obtained: true → salvar, seguir para email → obtained: false → suggestion_to_agent 4. POST /v1/extract/email → obtained: true → cadastro completo ✓ → obtained: false → suggestion_to_agent Custo total por cadastro: 12 créditos (4 × 3 cr.)
Resolve o "bug das 48 parcelas" usando validate_reply para interpretar contrapropostas.
1. Agente oferece: "Posso parcelar em 20x de R$100. Topa?"
2. POST /v1/extract/reply
{ agent_message: "...", user_reply: "Bora em 48?" }
→ reply_type: "counter_proposal"
→ extracted_value: "48", value_type: "quantity"
→ agente avalia se pode oferecer 48x
→ reply_type: "confirmation"
→ prosseguir com fechamento
→ reply_type: "rejection"
→ oferecer alternativa
→ reply_type: "handoff"
→ POST /v1/extract/handoff para confirmar urgência
→ transferir para humano
→ reply_type: "cancel"
→ POST /v1/extract/cancel-intent para classificar
→ acionar fluxo de retenção
Custo: 5 créditos por análise de resposta
Use um nó HTTP Request apontando para o endpoint desejado.
# n8n — nó "HTTP Request"
Method: POST
URL: https://api.naluai.dev/v1/extract/cpf
Headers:
Authorization: Bearer {{ $env.NALU_API_KEY }}
Content-Type: application/json
Body (JSON):
{
"agent_input": "{{ $json.agent_question }}",
"user_input": "{{ $json.user_message }}",
"language": "pt-BR"
}
# Próximo nó: IF
# Condição: {{ $json.obtained }} === true
# → ramo OK: salvar extracted_value
# → ramo NOK: enviar suggestion_to_agent ao usuário
Como usar suggestion_to_agent corretamente.
MAX_RETRIES = 3
retries = 0
loop:
response = POST /v1/extract/{validator}
{ agent_input, user_input: coleta_atual, agent_context }
if response.obtained:
→ usar extracted_value, sair do loop
retries++
if retries >= MAX_RETRIES:
→ escalar para humano ou abandonar coleta
# Usar sugestão do NaLU como próxima mensagem do agente
proxima_mensagem = response.suggestion_to_agent
coleta_atual = aguardar_resposta_usuario(proxima_mensagem)
agent_context — melhora muito as sugestões contextuaiscertain: false para pedir confirmação, não para bloquear o fluxo