diff --git a/src/Nalu.Api/Validators/validate_full_name.md b/src/Nalu.Api/Validators/validate_full_name.md index 620f860..5ef83ae 100644 --- a/src/Nalu.Api/Validators/validate_full_name.md +++ b/src/Nalu.Api/Validators/validate_full_name.md @@ -1,15 +1,15 @@ # 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 - type: extraction -- version: 1.0 +- 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 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 @@ -19,6 +19,8 @@ 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+(.+)$ @@ -35,16 +37,22 @@ bom dia, boa tarde, boa noite, olá, oi, tudo bem, e aí, fala, eae, opa ## 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: -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: +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 (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. 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}} @@ -56,6 +64,7 @@ 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" } @@ -64,52 +73,102 @@ Responda SOMENTE com JSON válido, sem markdown, sem explicação: ### 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"} +- 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, "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 - 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"} +- 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, "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 -- agent_input: Qual seu nome? +- agent_input: Qual seu nome completo? - 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 - 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"} +- 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, "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 - 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"} +- 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, "reasoning": "Nome completo humano reconhecido"} +- 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, "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 - capitalize_proper_name @@ -121,13 +180,25 @@ Responda SOMENTE com JSON válido, sem markdown, sem explicação: ## suggestions ### 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 -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 -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 (sem sugestão — agente segue o fluxo) diff --git a/src/Nalu.Web/Validators/validate_full_name.md b/src/Nalu.Web/Validators/validate_full_name.md index 2373615..5ef83ae 100644 --- a/src/Nalu.Web/Validators/validate_full_name.md +++ b/src/Nalu.Web/Validators/validate_full_name.md @@ -1,15 +1,15 @@ # 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 - type: extraction -- version: 1.0 +- 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 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 @@ -19,8 +19,15 @@ 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 @@ -30,16 +37,22 @@ bom dia, boa tarde, boa noite, olá, oi, tudo bem, e aí, fala, eae, opa ## 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: -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: +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 (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. 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}} @@ -51,6 +64,7 @@ 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" } @@ -59,62 +73,102 @@ Responda SOMENTE com JSON válido, sem markdown, sem explicação: ### 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"} +- 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, "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 - 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"} +- 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, "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 -- agent_input: Qual seu nome? +- agent_input: Qual seu nome completo? - 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 - 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"} +- 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, "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 - 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"} +- 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, "reasoning": "Nome completo humano reconhecido"} +- 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, "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? -- 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"} +- 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 +### 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: Me chamo Ana Banana -- output: {"extracted_value": "Ana Banana", "certain": false, "reasoning": "Banana é substantivo comum, não sobrenome reconhecido"} +- 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 @@ -126,13 +180,25 @@ Responda SOMENTE com JSON válido, sem markdown, sem explicação: ## suggestions ### 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 -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 -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 (sem sugestão — agente segue o fluxo)