# validate_full_name

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

## config

- type: extraction
- version: 1.0
- 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 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+$

### accept_patterns

### 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 (com sobrenome) 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.
2. Nome completo requer ao menos um sobrenome (duas palavras ou mais). Se só informou primeiro nome, retorne com o nome mas certain: false.
3. Extraia o nome completo 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 (Segredo Silva, Piano Souza), marca (Xerox Santos), instrumento/objeto (Xilofone Ninguém), palavra ofensiva/zueira, composto de palavras comuns que parecem apelido (BraçoCurto, PéDuro, MãoFria), ou frase ambígua entre nome e recusa.
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).

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,
  "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, "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, "reasoning": "Apenas primeiro nome, falta o sobrenome"}

### 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, "reasoning": "Nome completo humano reconhecido"}

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

### example 5
- agent_input: Qual seu nome?
- user_input: sei la
- output: {"extracted_value": null, "certain": false, "reasoning": "Usuário foi evasivo, não informou nome"}

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

### example 7
- agent_input: Qual seu nome completo?
- user_input: Segredo da Silva
- output: {"extracted_value": "Segredo da Silva", "certain": false, "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, "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, "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, "reasoning": "Usuário confirmou o nome após questionamento"}

### example 11
- agent_input: Qual seu nome completo?
- user_input: Sou o Ricardo BraçoCurto
- output: {"extracted_value": "Ricardo BraçoCurto", "certain": false, "reasoning": "BraçoCurto é um composto de palavras comuns (braço+curto), não um sobrenome reconhecido"}

### example 12
- agent_input: Qual seu nome completo?
- user_input: Me chamo Ana Banana
- output: {"extracted_value": "Ana Banana", "certain": false, "reasoning": "Banana é substantivo comum, não sobrenome reconhecido"}

## post_processors
- capitalize_proper_name
- remove_titles

## enrichment
(nenhum)

## suggestions

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

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

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

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