feat: validate_full_name v1.1 — sobrenome obrigatório + situation field
All checks were successful
NALU Deployment Pipeline / Run Tests (push) Successful in 1m8s
NALU Deployment Pipeline / PR Validation (push) Has been skipped
NALU Deployment Pipeline / Build and Push Image (push) Successful in 2m9s
NALU Deployment Pipeline / Deploy naluai.dev (push) Successful in 44s
NALU Deployment Pipeline / Cleanup Old Resources (push) Successful in 12s

- Exige ao menos duas palavras (nome + sobrenome)
- Adiciona campo situation: name_provided/question/escalation/refused/evasive
- Reject patterns para pedidos de atendente e recusas explícitas
- Novos exemplos: frustração, escalation, pergunta, nome só
- Novas suggestions: when_null_question, when_null_refused, when_null_escalation, when_uncertain_single_name

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Ricardo Carneiro 2026-05-15 22:47:43 -03:00
parent 72ad41c529
commit 12591d90f9
2 changed files with 187 additions and 50 deletions

View File

@ -1,15 +1,15 @@
# validate_full_name # validate_full_name
Extrai o nome completo do usuário (com sobrenome) a partir do diálogo. Extrai o nome completo do usuário (nome + sobrenome obrigatório) a partir do diálogo.
## config ## config
- type: extraction - type: extraction
- version: 1.0 - version: 1.1
- languages: pt-BR, es-ES, en-US - languages: pt-BR, es-ES, en-US
- endpoint: /v1/extract/full-name - endpoint: /v1/extract/full-name
- mcp_tool: nalu_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. - 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 ## deterministic_rules
@ -19,6 +19,8 @@ bom dia, boa tarde, boa noite, olá, oi, tudo bem, e aí, fala, eae, opa
### reject_patterns ### reject_patterns
- ^(não|nao|sei la|sei lá|tanto faz|qualquer|nenhum|nada)$ - ^(não|nao|sei la|sei lá|tanto faz|qualquer|nenhum|nada)$
- ^\d+$ - ^\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 ### accept_patterns
- (?i)^me chamo\s+(.+)$ - (?i)^me chamo\s+(.+)$
@ -35,16 +37,22 @@ bom dia, boa tarde, boa noite, olá, oi, tudo bem, e aí, fala, eae, opa
## prompt ## 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. 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: Regras:
1. Se o usuário respondeu apenas com saudação (bom dia, oi, etc.) sem dizer o nome, retorne extracted_value: null. 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 requer ao menos um sobrenome (duas palavras ou mais). Se só informou primeiro nome, retorne com o nome mas certain: false. 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 completo e avalie: 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: 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, ou frase ambígua entre nome e recusa. - 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. 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). 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: Diálogo:
Agente: {{agent_input}} Agente: {{agent_input}}
@ -56,6 +64,7 @@ Responda SOMENTE com JSON válido, sem markdown, sem explicação:
{ {
"extracted_value": "nome extraído ou null", "extracted_value": "nome extraído ou null",
"certain": true/false, "certain": true/false,
"situation": "name_provided|question|escalation|refused|evasive",
"reasoning": "explicação curta de 1 linha" "reasoning": "explicação curta de 1 linha"
} }
@ -64,52 +73,102 @@ Responda SOMENTE com JSON válido, sem markdown, sem explicação:
### example 1 ### example 1
- agent_input: Bom dia! Qual seu nome completo? - agent_input: Bom dia! Qual seu nome completo?
- user_input: Bom dia! - user_input: Bom dia!
- output: {"extracted_value": null, "certain": false, "reasoning": "Usuário respondeu com saudação, não informou o nome"} - output: {"extracted_value": null, "certain": false, "situation": "evasive", "reasoning": "Usuário respondeu com saudação, não informou o nome"}
### example 2 ### example 2
- agent_input: Qual seu nome completo? - agent_input: Qual seu nome completo?
- user_input: Carlos - user_input: Carlos
- output: {"extracted_value": "Carlos", "certain": false, "reasoning": "Apenas primeiro nome, falta o sobrenome"} - output: {"extracted_value": "Carlos", "certain": false, "situation": "name_provided", "reasoning": "Apenas primeiro nome, falta o sobrenome obrigatório"}
### example 3 ### example 3
- agent_input: Para continuar, preciso do seu nome completo. - agent_input: Para continuar, preciso do seu nome completo.
- user_input: Maria Silva dos Santos - user_input: Maria Silva dos Santos
- output: {"extracted_value": "Maria Silva dos Santos", "certain": true, "reasoning": "Nome completo humano reconhecido"} - output: {"extracted_value": "Maria Silva dos Santos", "certain": true, "situation": "name_provided", "reasoning": "Nome completo humano reconhecido"}
### example 4 ### example 4
- agent_input: Qual seu nome completo? - agent_input: Qual seu nome completo?
- user_input: Ricardo Carneiro - user_input: Ricardo Carneiro
- output: {"extracted_value": "Ricardo Carneiro", "certain": true, "reasoning": "Nome completo humano reconhecido em PT"} - output: {"extracted_value": "Ricardo Carneiro", "certain": true, "situation": "name_provided", "reasoning": "Nome completo humano reconhecido em PT"}
### example 5 ### example 5
- agent_input: Qual seu nome? - agent_input: Qual seu nome completo?
- user_input: sei la - user_input: sei la
- output: {"extracted_value": null, "certain": false, "reasoning": "Usuário foi evasivo, não informou nome"} - output: {"extracted_value": null, "certain": false, "situation": "evasive", "reasoning": "Evasão sem pergunta nem recusa"}
### example 6 ### example 6
- agent_input: Qual seu nome completo? - agent_input: Qual seu nome completo?
- user_input: Meu nome é segredo. - user_input: Meu nome é segredo.
- output: {"extracted_value": "Segredo", "certain": false, "reasoning": "Ambíguo: recusa ou nome? Segredo é substantivo comum"} - 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 ### example 7
- agent_input: Qual seu nome completo? - agent_input: Qual seu nome completo?
- user_input: Segredo da Silva - user_input: Segredo da Silva
- output: {"extracted_value": "Segredo da Silva", "certain": false, "reasoning": "Segredo é substantivo comum, não antropônimo"} - output: {"extracted_value": "Segredo da Silva", "certain": false, "situation": "name_provided", "reasoning": "Segredo é substantivo comum, não antropônimo"}
### example 8 ### example 8
- agent_input: What's your full name? - agent_input: What's your full name?
- user_input: Piano Smith - user_input: Piano Smith
- output: {"extracted_value": "Piano Smith", "certain": false, "reasoning": "Piano is an instrument, not a human first name"} - output: {"extracted_value": "Piano Smith", "certain": false, "situation": "name_provided", "reasoning": "Piano is an instrument, not a human first name"}
### example 9 ### example 9
- agent_input: Qual seu nome completo? - agent_input: Qual seu nome completo?
- user_input: Carlos Eduardo Santos - user_input: Carlos Eduardo Santos
- output: {"extracted_value": "Carlos Eduardo Santos", "certain": true, "reasoning": "Nome completo humano reconhecido"} - output: {"extracted_value": "Carlos Eduardo Santos", "certain": true, "situation": "name_provided", "reasoning": "Nome completo humano reconhecido"}
### example 10 ### example 10
- agent_input: Seu nome completo é Segredo da Silva? - agent_input: Seu nome completo é Segredo da Silva?
- user_input: Sim, pode registrar assim. - user_input: Sim, pode registrar assim.
- output: {"extracted_value": "Segredo da Silva", "certain": true, "reasoning": "Usuário confirmou o nome após questionamento"} - 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 ## post_processors
- capitalize_proper_name - capitalize_proper_name
@ -121,13 +180,25 @@ Responda SOMENTE com JSON válido, sem markdown, sem explicação:
## suggestions ## suggestions
### when_null_greeting ### when_null_greeting
{{greeting_response}} Mas preciso do seu nome completo para continuar. Pode me dizer? {{greeting_response}} Mas preciso do seu nome completo (nome e sobrenome) para continuar. Pode me dizer?
### when_null_evasive ### when_null_evasive
Sem problemas, mas preciso do seu nome para prosseguir. Qual seu nome completo? 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 ### when_uncertain
Seu nome é {{extracted_value}}? Pode confirmar que posso registrá-lo assim? Seu nome completo é {{extracted_value}}? Pode confirmar que posso registrá-lo assim?
### when_certain ### when_certain
(sem sugestão — agente segue o fluxo) (sem sugestão — agente segue o fluxo)

View File

@ -1,15 +1,15 @@
# validate_full_name # validate_full_name
Extrai o nome completo do usuário (com sobrenome) a partir do diálogo. Extrai o nome completo do usuário (nome + sobrenome obrigatório) a partir do diálogo.
## config ## config
- type: extraction - type: extraction
- version: 1.0 - version: 1.1
- languages: pt-BR, es-ES, en-US - languages: pt-BR, es-ES, en-US
- endpoint: /v1/extract/full-name - endpoint: /v1/extract/full-name
- mcp_tool: nalu_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. - 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 ## deterministic_rules
@ -19,8 +19,15 @@ bom dia, boa tarde, boa noite, olá, oi, tudo bem, e aí, fala, eae, opa
### reject_patterns ### reject_patterns
- ^(não|nao|sei la|sei lá|tanto faz|qualquer|nenhum|nada)$ - ^(não|nao|sei la|sei lá|tanto faz|qualquer|nenhum|nada)$
- ^\d+$ - ^\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 ### 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 ### constraints
- min_length: 2 - min_length: 2
@ -30,16 +37,22 @@ bom dia, boa tarde, boa noite, olá, oi, tudo bem, e aí, fala, eae, opa
## prompt ## 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. 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: Regras:
1. Se o usuário respondeu apenas com saudação (bom dia, oi, etc.) sem dizer o nome, retorne extracted_value: null. 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 requer ao menos um sobrenome (duas palavras ou mais). Se só informou primeiro nome, retorne com o nome mas certain: false. 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 completo e avalie: 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: 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. - 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. 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). 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: Diálogo:
Agente: {{agent_input}} Agente: {{agent_input}}
@ -51,6 +64,7 @@ Responda SOMENTE com JSON válido, sem markdown, sem explicação:
{ {
"extracted_value": "nome extraído ou null", "extracted_value": "nome extraído ou null",
"certain": true/false, "certain": true/false,
"situation": "name_provided|question|escalation|refused|evasive",
"reasoning": "explicação curta de 1 linha" "reasoning": "explicação curta de 1 linha"
} }
@ -59,62 +73,102 @@ Responda SOMENTE com JSON válido, sem markdown, sem explicação:
### example 1 ### example 1
- agent_input: Bom dia! Qual seu nome completo? - agent_input: Bom dia! Qual seu nome completo?
- user_input: Bom dia! - user_input: Bom dia!
- output: {"extracted_value": null, "certain": false, "reasoning": "Usuário respondeu com saudação, não informou o nome"} - output: {"extracted_value": null, "certain": false, "situation": "evasive", "reasoning": "Usuário respondeu com saudação, não informou o nome"}
### example 2 ### example 2
- agent_input: Qual seu nome completo? - agent_input: Qual seu nome completo?
- user_input: Carlos - user_input: Carlos
- output: {"extracted_value": "Carlos", "certain": false, "reasoning": "Apenas primeiro nome, falta o sobrenome"} - output: {"extracted_value": "Carlos", "certain": false, "situation": "name_provided", "reasoning": "Apenas primeiro nome, falta o sobrenome obrigatório"}
### example 3 ### example 3
- agent_input: Para continuar, preciso do seu nome completo. - agent_input: Para continuar, preciso do seu nome completo.
- user_input: Maria Silva dos Santos - user_input: Maria Silva dos Santos
- output: {"extracted_value": "Maria Silva dos Santos", "certain": true, "reasoning": "Nome completo humano reconhecido"} - output: {"extracted_value": "Maria Silva dos Santos", "certain": true, "situation": "name_provided", "reasoning": "Nome completo humano reconhecido"}
### example 4 ### example 4
- agent_input: Qual seu nome completo? - agent_input: Qual seu nome completo?
- user_input: Ricardo Carneiro - user_input: Ricardo Carneiro
- output: {"extracted_value": "Ricardo Carneiro", "certain": true, "reasoning": "Nome completo humano reconhecido em PT"} - output: {"extracted_value": "Ricardo Carneiro", "certain": true, "situation": "name_provided", "reasoning": "Nome completo humano reconhecido em PT"}
### example 5 ### example 5
- agent_input: Qual seu nome? - agent_input: Qual seu nome completo?
- user_input: sei la - user_input: sei la
- output: {"extracted_value": null, "certain": false, "reasoning": "Usuário foi evasivo, não informou nome"} - output: {"extracted_value": null, "certain": false, "situation": "evasive", "reasoning": "Evasão sem pergunta nem recusa"}
### example 6 ### example 6
- agent_input: Qual seu nome completo? - agent_input: Qual seu nome completo?
- user_input: Meu nome é segredo. - user_input: Meu nome é segredo.
- output: {"extracted_value": "Segredo", "certain": false, "reasoning": "Ambíguo: recusa ou nome? Segredo é substantivo comum"} - 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 ### example 7
- agent_input: Qual seu nome completo? - agent_input: Qual seu nome completo?
- user_input: Segredo da Silva - user_input: Segredo da Silva
- output: {"extracted_value": "Segredo da Silva", "certain": false, "reasoning": "Segredo é substantivo comum, não antropônimo"} - output: {"extracted_value": "Segredo da Silva", "certain": false, "situation": "name_provided", "reasoning": "Segredo é substantivo comum, não antropônimo"}
### example 8 ### example 8
- agent_input: What's your full name? - agent_input: What's your full name?
- user_input: Piano Smith - user_input: Piano Smith
- output: {"extracted_value": "Piano Smith", "certain": false, "reasoning": "Piano is an instrument, not a human first name"} - output: {"extracted_value": "Piano Smith", "certain": false, "situation": "name_provided", "reasoning": "Piano is an instrument, not a human first name"}
### example 9 ### example 9
- agent_input: Qual seu nome completo? - agent_input: Qual seu nome completo?
- user_input: Carlos Eduardo Santos - user_input: Carlos Eduardo Santos
- output: {"extracted_value": "Carlos Eduardo Santos", "certain": true, "reasoning": "Nome completo humano reconhecido"} - output: {"extracted_value": "Carlos Eduardo Santos", "certain": true, "situation": "name_provided", "reasoning": "Nome completo humano reconhecido"}
### example 10 ### example 10
- agent_input: Seu nome completo é Segredo da Silva? - agent_input: Seu nome completo é Segredo da Silva?
- user_input: Sim, pode registrar assim. - user_input: Sim, pode registrar assim.
- output: {"extracted_value": "Segredo da Silva", "certain": true, "reasoning": "Usuário confirmou o nome após questionamento"} - output: {"extracted_value": "Segredo da Silva", "certain": true, "situation": "name_provided", "reasoning": "Usuário confirmou o nome após questionamento"}
### example 11 ### example 11 — question
- agent_input: Qual seu nome completo? - agent_input: Qual seu nome completo?
- user_input: Sou o Ricardo BraçoCurto - user_input: Por que você precisa do meu nome?
- output: {"extracted_value": "Ricardo BraçoCurto", "certain": false, "reasoning": "BraçoCurto é um composto de palavras comuns (braço+curto), não um sobrenome reconhecido"} - output: {"extracted_value": null, "certain": false, "situation": "question", "reasoning": "Usuário fez contrapergunta, não informou nome"}
### example 12 ### 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? - agent_input: Qual seu nome completo?
- user_input: Me chamo Ana Banana - user_input: Quero falar com uma pessoa de verdade
- output: {"extracted_value": "Ana Banana", "certain": false, "reasoning": "Banana é substantivo comum, não sobrenome reconhecido"} - 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 ## post_processors
- capitalize_proper_name - capitalize_proper_name
@ -126,13 +180,25 @@ Responda SOMENTE com JSON válido, sem markdown, sem explicação:
## suggestions ## suggestions
### when_null_greeting ### when_null_greeting
{{greeting_response}} Mas preciso do seu nome completo para continuar. Pode me dizer? {{greeting_response}} Mas preciso do seu nome completo (nome e sobrenome) para continuar. Pode me dizer?
### when_null_evasive ### when_null_evasive
Sem problemas, mas preciso do seu nome para prosseguir. Qual seu nome completo? 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 ### when_uncertain
Seu nome é {{extracted_value}}? Pode confirmar que posso registrá-lo assim? Seu nome completo é {{extracted_value}}? Pode confirmar que posso registrá-lo assim?
### when_certain ### when_certain
(sem sugestão — agente segue o fluxo) (sem sugestão — agente segue o fluxo)