# validate_full_name

Extrai o nome completo do usuário (nome + sobrenome obrigatório) a partir do diálogo.

## config

- type: extraction
- version: 1.1
- languages: pt-BR, es-ES, en-US
- endpoint: /v1/extract/full-name
- mcp_tool: nalu_extract_full_name
- mcp_description: Extrai o nome completo do usuário (nome + sobrenome). Use quando o agente precisa do nome completo para cadastro, contrato ou triagem. Retorna o nome extraído, nível de certeza, situação e sugestão de fala. Se certain=true, aceite o valor. Se certain=false e suggestion_to_agent não é null, use a sugestão como próxima mensagem. Se obtained=false, use a sugestão para re-pedir o dado.

## deterministic_rules

### stop_words
bom dia, boa tarde, boa noite, olá, oi, tudo bem, e aí, fala, eae, opa

### reject_patterns
- ^(não|nao|sei la|sei lá|tanto faz|qualquer|nenhum|nada)$
- ^\d+$
- (?i)(quero falar|me passa|falar com|atendente|atendimento|humano|pessoa real|ser humano|supervisor|gerente|operador)
- (?i)(não vou|nao vou|prefiro não|prefiro nao|não quero|nao quero|não interessa|nao interessa|não te interessa|nao te interessa)

### accept_patterns
- (?i)^me chamo\s+(.+)$
- (?i)^meu nome completo é\s+(.+)$
- (?i)^my name is\s+(.+)$
- (?i)^me llamo\s+(.+)$
- ^([A-ZÁÉÍÓÚÀÂÊÔÃÕÇÜÑ][a-záéíóúàâêôãõçüñ'ã-]+(?:\s+(?:de|da|do|dos|das|e|[A-ZÁÉÍÓÚÀÂÊÔÃÕÇÜÑ][a-záéíóúàâêôãõçüñ'ã-]+)){1,})$

### constraints
- min_length: 2
- must_have_alpha: true
- must_have_space: true
- max_length: 120

## prompt

Você é um extrator de nomes completos. Dado o diálogo abaixo entre um agente e um usuário, extraia o nome completo que o usuário informou.

Regras:
1. Se o usuário respondeu apenas com saudação (bom dia, oi, etc.) sem dizer o nome, retorne extracted_value: null, situation: "evasive".
2. Nome completo SEMPRE requer ao menos duas palavras separadas por espaço (primeiro nome + sobrenome). Se o usuário informou apenas um nome, retorne o nome com certain: false e situation: "name_provided".
3. Extraia o nome e avalie:
   - certain: true → nome + sobrenome claramente humanos em PT, EN ou ES (ex: "Maria Silva", "Carlos Eduardo Santos", "Michael Johnson", "Paulo da Silva").
   - certain: false → qualquer parte não é claramente humana (substantivo comum, marca, instrumento, palavra ofensiva/zueira), ou apenas um nome sem sobrenome foi informado.
4. Se o usuário confirmou o nome após o agente perguntar, retorne certain: true mesmo se incomum.
5. Normalize: primeira letra maiúscula em cada palavra, exceto preposições (de/da/do/dos/das/e).
6. Campo "situation" — obrigatório:
   - "name_provided" → o usuário informou um nome (extracted_value não é null)
   - "question" → o usuário fez uma pergunta em vez de responder (ex: "por que você quer saber?", "o que vai fazer com meu nome?")
   - "escalation" → o usuário quer falar com humano/atendente/supervisor (ex: "quero falar com uma pessoa", "me passa um atendente")
   - "refused" → recusa explícita (ex: "não quero dizer", "não te interessa", "prefiro não informar")
   - "evasive" → evasão sem pergunta nem recusa clara (ex: "sei lá", "tanto faz", saudação sem nome)

Diálogo:
Agente: {{agent_input}}
Usuário: {{user_input}}

Contexto do agente: {{agent_context}}

Responda SOMENTE com JSON válido, sem markdown, sem explicação:
{
  "extracted_value": "nome extraído ou null",
  "certain": true/false,
  "situation": "name_provided|question|escalation|refused|evasive",
  "reasoning": "explicação curta de 1 linha"
}

## few_shot_examples

### example 1
- agent_input: Bom dia! Qual seu nome completo?
- user_input: Bom dia!
- output: {"extracted_value": null, "certain": false, "situation": "evasive", "reasoning": "Usuário respondeu com saudação, não informou o nome"}

### example 2
- agent_input: Qual seu nome completo?
- user_input: Carlos
- output: {"extracted_value": "Carlos", "certain": false, "situation": "name_provided", "reasoning": "Apenas primeiro nome, falta o sobrenome obrigatório"}

### example 3
- agent_input: Para continuar, preciso do seu nome completo.
- user_input: Maria Silva dos Santos
- output: {"extracted_value": "Maria Silva dos Santos", "certain": true, "situation": "name_provided", "reasoning": "Nome completo humano reconhecido"}

### example 4
- agent_input: Qual seu nome completo?
- user_input: Ricardo Carneiro
- output: {"extracted_value": "Ricardo Carneiro", "certain": true, "situation": "name_provided", "reasoning": "Nome completo humano reconhecido em PT"}

### example 5
- agent_input: Qual seu nome completo?
- user_input: sei la
- output: {"extracted_value": null, "certain": false, "situation": "evasive", "reasoning": "Evasão sem pergunta nem recusa"}

### example 6
- agent_input: Qual seu nome completo?
- user_input: Meu nome é segredo.
- output: {"extracted_value": "Segredo", "certain": false, "situation": "name_provided", "reasoning": "Ambíguo: recusa ou nome? Segredo é substantivo comum e só tem uma palavra"}

### example 7
- agent_input: Qual seu nome completo?
- user_input: Segredo da Silva
- output: {"extracted_value": "Segredo da Silva", "certain": false, "situation": "name_provided", "reasoning": "Segredo é substantivo comum, não antropônimo"}

### example 8
- agent_input: What's your full name?
- user_input: Piano Smith
- output: {"extracted_value": "Piano Smith", "certain": false, "situation": "name_provided", "reasoning": "Piano is an instrument, not a human first name"}

### example 9
- agent_input: Qual seu nome completo?
- user_input: Carlos Eduardo Santos
- output: {"extracted_value": "Carlos Eduardo Santos", "certain": true, "situation": "name_provided", "reasoning": "Nome completo humano reconhecido"}

### example 10
- agent_input: Seu nome completo é Segredo da Silva?
- user_input: Sim, pode registrar assim.
- output: {"extracted_value": "Segredo da Silva", "certain": true, "situation": "name_provided", "reasoning": "Usuário confirmou o nome após questionamento"}

### example 11 — question
- agent_input: Qual seu nome completo?
- user_input: Por que você precisa do meu nome?
- output: {"extracted_value": null, "certain": false, "situation": "question", "reasoning": "Usuário fez contrapergunta, não informou nome"}

### example 12 — question
- agent_input: Preciso do seu nome completo.
- user_input: O que você vai fazer com isso?
- output: {"extracted_value": null, "certain": false, "situation": "question", "reasoning": "Usuário questiona o uso da informação"}

### example 13 — escalation
- agent_input: Qual seu nome completo?
- user_input: Quero falar com uma pessoa de verdade
- output: {"extracted_value": null, "certain": false, "situation": "escalation", "reasoning": "Usuário quer atendimento humano"}

### example 14 — escalation
- agent_input: Preciso do seu nome completo.
- user_input: Me passa um atendente
- output: {"extracted_value": null, "certain": false, "situation": "escalation", "reasoning": "Usuário solicita transferência para atendente"}

### example 15 — escalation (frustrado)
- agent_input: Qual seu nome completo?
- user_input: Chega! Quero falar com um supervisor agora
- output: {"extracted_value": null, "certain": false, "situation": "escalation", "reasoning": "Usuário frustrado pedindo escalação"}

### example 16 — refused
- agent_input: Qual seu nome completo?
- user_input: Não te interessa
- output: {"extracted_value": null, "certain": false, "situation": "refused", "reasoning": "Recusa direta e hostil"}

### example 17 — refused
- agent_input: Preciso do seu nome completo.
- user_input: Não quero informar meu nome
- output: {"extracted_value": null, "certain": false, "situation": "refused", "reasoning": "Recusa explícita por privacidade"}

### example 18 — nome composto com preposição
- agent_input: Qual seu nome completo?
- user_input: Ana de Oliveira
- output: {"extracted_value": "Ana de Oliveira", "certain": true, "situation": "name_provided", "reasoning": "Nome completo humano reconhecido com preposição"}

### example 19 — nome em inglês
- agent_input: What's your full name?
- user_input: My name is Michael Johnson
- output: {"extracted_value": "Michael Johnson", "certain": true, "situation": "name_provided", "reasoning": "Full human name recognized in EN"}

### example 20 — evasive frustrado
- agent_input: Qual seu nome completo?
- user_input: Para com isso!
- output: {"extracted_value": null, "certain": false, "situation": "evasive", "reasoning": "Irritação sem fornecer nome e sem pedir atendente"}

## post_processors
- capitalize_proper_name
- remove_titles

## enrichment
(nenhum)

## suggestions

### when_null_greeting
{{greeting_response}} Mas preciso do seu nome completo (nome e sobrenome) para continuar. Pode me dizer?

### when_null_evasive
Sem problemas, mas preciso do seu nome completo para prosseguir. Qual seu nome e sobrenome?

### when_null_question
Entendo sua dúvida! Precisamos do nome completo para {{agent_context}}. Pode me informar seu nome e sobrenome?

### when_null_refused
Compreendo. Caso mude de ideia, estou aqui para ajudar. Sem o nome completo, não consigo prosseguir com o cadastro.

### when_null_escalation
(transferir para atendente humano)

### when_uncertain_single_name
Só consegui capturar "{{extracted_value}}". Preciso do nome completo — nome e sobrenome. Pode me informar?

### when_uncertain
Seu nome completo é {{extracted_value}}? Pode confirmar que posso registrá-lo assim?

### when_certain
(sem sugestão — agente segue o fluxo)
