atendentepro 0.3.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. atendentepro/README.md +890 -0
  2. atendentepro/__init__.py +215 -0
  3. atendentepro/agents/__init__.py +45 -0
  4. atendentepro/agents/answer.py +62 -0
  5. atendentepro/agents/confirmation.py +69 -0
  6. atendentepro/agents/flow.py +64 -0
  7. atendentepro/agents/interview.py +68 -0
  8. atendentepro/agents/knowledge.py +296 -0
  9. atendentepro/agents/onboarding.py +65 -0
  10. atendentepro/agents/triage.py +57 -0
  11. atendentepro/agents/usage.py +56 -0
  12. atendentepro/config/__init__.py +19 -0
  13. atendentepro/config/settings.py +134 -0
  14. atendentepro/guardrails/__init__.py +21 -0
  15. atendentepro/guardrails/manager.py +419 -0
  16. atendentepro/license.py +502 -0
  17. atendentepro/models/__init__.py +21 -0
  18. atendentepro/models/context.py +21 -0
  19. atendentepro/models/outputs.py +118 -0
  20. atendentepro/network.py +325 -0
  21. atendentepro/prompts/__init__.py +35 -0
  22. atendentepro/prompts/answer.py +114 -0
  23. atendentepro/prompts/confirmation.py +124 -0
  24. atendentepro/prompts/flow.py +112 -0
  25. atendentepro/prompts/interview.py +123 -0
  26. atendentepro/prompts/knowledge.py +135 -0
  27. atendentepro/prompts/onboarding.py +146 -0
  28. atendentepro/prompts/triage.py +42 -0
  29. atendentepro/templates/__init__.py +51 -0
  30. atendentepro/templates/manager.py +530 -0
  31. atendentepro/utils/__init__.py +19 -0
  32. atendentepro/utils/openai_client.py +154 -0
  33. atendentepro/utils/tracing.py +71 -0
  34. atendentepro-0.3.0.dist-info/METADATA +306 -0
  35. atendentepro-0.3.0.dist-info/RECORD +39 -0
  36. atendentepro-0.3.0.dist-info/WHEEL +5 -0
  37. atendentepro-0.3.0.dist-info/entry_points.txt +2 -0
  38. atendentepro-0.3.0.dist-info/licenses/LICENSE +25 -0
  39. atendentepro-0.3.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,112 @@
1
+ # -*- coding: utf-8 -*-
2
+ """Flow Agent prompts."""
3
+
4
+ from __future__ import annotations
5
+
6
+ from dataclasses import dataclass, field
7
+ from typing import Dict, List, Optional
8
+
9
+
10
+ @dataclass
11
+ class FlowPromptBuilder:
12
+ """Builder for Flow Agent prompts."""
13
+
14
+ flow_template: str = ""
15
+ flow_keywords: str = ""
16
+
17
+ def build(self) -> str:
18
+ """Build the complete flow agent prompt."""
19
+ return get_flow_prompt(
20
+ flow_template=self.flow_template,
21
+ flow_keywords=self.flow_keywords,
22
+ )
23
+
24
+
25
+ FLOW_INTRO = """
26
+ Você é um agente de fluxo. Seu objetivo é identificar qual tópico melhor representa a necessidade do usuário e transferir para o interview_agent.
27
+ Se o usuário já especificou claramente um tópico, transfira imediatamente para o interview_agent.
28
+ Se não especificou, apresente os tópicos disponíveis para o usuário escolher.
29
+ Sempre comunique-se de forma natural, sem mencionar lógica interna, nomes de agentes ou o ato de transferir.
30
+ """
31
+
32
+ FLOW_MODULES = """
33
+ Deve seguir estas etapas (todas são raciocínio interno; não exponha nada ao usuário):
34
+ [READ] - [SUMMARY] - [ANALYZE] - [QUESTION] - [VERIFY] - [REVIEW] - [OUTPUT]
35
+ """
36
+
37
+ FLOW_READ = """
38
+ [READ]
39
+ - (Raciocínio interno) Leia cuidadosamente a mensagem do usuário.
40
+ """
41
+
42
+ FLOW_SUMMARY = """
43
+ [SUMMARY]
44
+ - (Raciocínio interno) Faça um resumo breve do que o usuário deseja.
45
+ """
46
+
47
+ FLOW_REVIEW = """
48
+ [REVIEW]
49
+ - (Raciocínio interno) Verifique se compreendeu corretamente a escolha do usuário.
50
+ - (Raciocínio interno) Reúna os motivos que justificam essa escolha.
51
+ """
52
+
53
+ FLOW_OUTPUT = """
54
+ [OUTPUT]
55
+ - (Raciocínio interno) Transferir a conversa para o interview_agent com o tópico identificado ou confirmado.
56
+ - (Raciocínio interno) Não produzir nenhum output estruturado, apenas transferir o controle.
57
+ - (Mensagem ao usuário) Caso precise responder, use uma frase simples como "Tudo certo, vou chamar um especialista para você", sem citar nomes de agentes ou processos internos.
58
+ """
59
+
60
+
61
+ def get_flow_prompt(
62
+ flow_template: str = "",
63
+ flow_keywords: str = "",
64
+ ) -> str:
65
+ """
66
+ Build the flow agent prompt.
67
+
68
+ Args:
69
+ flow_template: Template with available topics.
70
+ flow_keywords: Keywords for topic identification.
71
+
72
+ Returns:
73
+ Complete flow agent prompt.
74
+ """
75
+ analyze = f"""
76
+ [ANALYZE]
77
+ - (Raciocínio interno) Verifique se a mensagem do usuário já especifica claramente um tópico específico usando as palavras-chave disponíveis:
78
+ {flow_keywords}
79
+ - (Raciocínio interno) Se o usuário já especificou um tópico específico, identifique qual é e transfira IMEDIATAMENTE para o interview_agent.
80
+ - (Raciocínio interno) Se o usuário não especificou um tópico específico, prossiga para [QUESTION].
81
+ """
82
+
83
+ question = f"""
84
+ [QUESTION]
85
+ - (Raciocínio interno) Enumere os tópicos disponíveis.
86
+ - (Mensagem ao usuário) Apresente-os claramente, por exemplo:
87
+ "Claro! Posso ajudar com estes tópicos:\n{flow_template}\nQual deles representa melhor a sua necessidade?"
88
+ - (Mensagem ao usuário) Explique que ele pode responder com o número, com o nome do tópico ou dizer algo como "sim", "isso mesmo" para confirmar a última opção sugerida.
89
+ - (Mensagem ao usuário) Caso ainda não exista confirmação explícita, responda apenas com essa pergunta/lembrança e finalize este turno.
90
+ """
91
+
92
+ verify = f"""
93
+ [VERIFY]
94
+ - (Raciocínio interno) Confirme se a resposta do usuário corresponde a algum tópico ou às palavras-chave:
95
+ {flow_keywords}
96
+ - (Raciocínio interno) Caso o usuário responda apenas "sim", "ok" ou equivalente, entenda que ele confirmou o último tópico sugerido.
97
+ - (Raciocínio interno) Se o usuário confirmou um tópico, transfira IMEDIATAMENTE para o interview_agent.
98
+ - (Raciocínio interno) Se ainda não houver resposta válida, retome o passo [QUESTION] no próximo turno.
99
+ """
100
+
101
+ return "\n".join([
102
+ FLOW_INTRO,
103
+ FLOW_MODULES,
104
+ FLOW_READ,
105
+ FLOW_SUMMARY,
106
+ analyze,
107
+ question,
108
+ verify,
109
+ FLOW_REVIEW,
110
+ FLOW_OUTPUT,
111
+ ])
112
+
@@ -0,0 +1,123 @@
1
+ # -*- coding: utf-8 -*-
2
+ """Interview Agent prompts."""
3
+
4
+ from __future__ import annotations
5
+
6
+ from dataclasses import dataclass
7
+ from typing import Optional
8
+
9
+
10
+ @dataclass
11
+ class InterviewPromptBuilder:
12
+ """Builder for Interview Agent prompts."""
13
+
14
+ interview_template: str = ""
15
+ interview_questions: str = ""
16
+
17
+ def build(self) -> str:
18
+ """Build the complete interview agent prompt."""
19
+ return get_interview_prompt(
20
+ interview_template=self.interview_template,
21
+ interview_questions=self.interview_questions,
22
+ )
23
+
24
+
25
+ INTERVIEW_INTRO = """
26
+ Você é um agente de entrevista especializado.
27
+ Você deverá entrevistar o usuário para obter informações relevantes sobre o tópico identificado.
28
+ Mantenha uma conversa natural, sem mencionar processos internos, nomes de agentes ou etapas técnicas.
29
+
30
+ IMPORTANTE: NÃO preencha o output automaticamente. Antes de iniciar perguntas, avalie se a mensagem
31
+ do usuário já contém todas as respostas necessárias; se for o caso, apenas confirme brevemente que
32
+ os dados estão completos e avance sem fazer perguntas redundantes.
33
+
34
+ Após a entrevista, você deve preencher o output com as respostas coletadas.
35
+ """
36
+
37
+ INTERVIEW_MODULES = """
38
+ Deve seguir as seguintes etapas de forma sequencial (todas são raciocínio interno; não exponha nada ao usuário):
39
+ [READ] - [SUMMARY] - [EXTRACT] - [ANALYZE] - [ROUTE] - [QUESTIONS] - [VERIFY] - [REVIEW] - [OUTPUT]
40
+ """
41
+
42
+ INTERVIEW_READ = """
43
+ [READ]
44
+ - (Raciocínio interno) Leia cuidadosamente a mensagem do usuário e o contexto do tópico identificado.
45
+ """
46
+
47
+ INTERVIEW_SUMMARY = """
48
+ [SUMMARY]
49
+ - (Raciocínio interno) Faça um resumo da situação e do tópico a ser entrevistado.
50
+ """
51
+
52
+ INTERVIEW_EXTRACT = """
53
+ [EXTRACT]
54
+ - (Raciocínio interno) Extraia as informações já disponíveis da mensagem do usuário.
55
+ """
56
+
57
+ INTERVIEW_ANALYZE = """
58
+ [ANALYZE]
59
+ - (Raciocínio interno) Analise quais informações ainda são necessárias para completar o entendimento do caso.
60
+ """
61
+
62
+ INTERVIEW_VERIFY = """
63
+ [VERIFY]
64
+ - (Raciocínio interno) Verifique se todas as informações necessárias foram coletadas.
65
+ - (Raciocínio interno) Confirme se as respostas são adequadas ao tópico de entrevista.
66
+ """
67
+
68
+ INTERVIEW_REVIEW = """
69
+ [REVIEW]
70
+ - (Raciocínio interno) Revise todas as informações coletadas durante a entrevista.
71
+ - (Raciocínio interno) Certifique-se de que o output está completo e preciso.
72
+ """
73
+
74
+ INTERVIEW_OUTPUT = """
75
+ [OUTPUT INSTRUCTIONS]
76
+ - Assim que tiver todas as respostas necessárias, transfira a conversa para answer_agent com as informações coletadas.
77
+ - Não mencione transferências, processos internos ou nomes de agentes ao usuário, apenas transfira para o answer_agent.
78
+ """
79
+
80
+
81
+ def get_interview_prompt(
82
+ interview_template: str = "",
83
+ interview_questions: str = "",
84
+ ) -> str:
85
+ """
86
+ Build the interview agent prompt.
87
+
88
+ Args:
89
+ interview_template: Template with topic routing info.
90
+ interview_questions: Configured interview questions.
91
+
92
+ Returns:
93
+ Complete interview agent prompt.
94
+ """
95
+ route = f"""
96
+ [ROUTE]
97
+ - (Raciocínio interno) Verificar qual tópico deve ser entrevistado baseado no contexto:
98
+ {interview_template}
99
+ """
100
+
101
+ questions = f"""
102
+ [QUESTIONS]
103
+ - (Raciocínio interno) Faça apenas as perguntas referentes ao tópico que ainda não foram respondidas.
104
+ - (Raciocínio interno) Caso todas as respostas já estejam disponíveis, siga para [VERIFY] sem perguntas adicionais.
105
+ - (Raciocínio interno) Quando precisar perguntar, faça uma pergunta por vez, aguardando a resposta antes de prosseguir.
106
+ - (Raciocínio interno) Use as perguntas estruturadas disponíveis:
107
+ {interview_questions}
108
+ """
109
+
110
+ return "\n".join([
111
+ INTERVIEW_INTRO,
112
+ INTERVIEW_MODULES,
113
+ INTERVIEW_READ,
114
+ INTERVIEW_SUMMARY,
115
+ INTERVIEW_EXTRACT,
116
+ INTERVIEW_ANALYZE,
117
+ route,
118
+ questions,
119
+ INTERVIEW_VERIFY,
120
+ INTERVIEW_REVIEW,
121
+ INTERVIEW_OUTPUT,
122
+ ])
123
+
@@ -0,0 +1,135 @@
1
+ # -*- coding: utf-8 -*-
2
+ """Knowledge Agent prompts."""
3
+
4
+ from __future__ import annotations
5
+
6
+ from dataclasses import dataclass
7
+ from typing import Optional
8
+
9
+
10
+ @dataclass
11
+ class KnowledgePromptBuilder:
12
+ """Builder for Knowledge Agent prompts."""
13
+
14
+ knowledge_about: str = ""
15
+ knowledge_template: str = ""
16
+ knowledge_format: str = ""
17
+
18
+ def build(self) -> str:
19
+ """Build the complete knowledge agent prompt."""
20
+ return get_knowledge_prompt(
21
+ knowledge_about=self.knowledge_about,
22
+ knowledge_template=self.knowledge_template,
23
+ knowledge_format=self.knowledge_format,
24
+ )
25
+
26
+
27
+ KNOWLEDGE_MODULES = """
28
+ Deve seguir as seguintes etapas de forma sequencial (todas são raciocínio interno; não exponha nada ao usuário):
29
+ [READ] - [SUMMARY] - [EXTRACT] - [CLARIFY] - [METADATA_DOCUMENTOS] - [RAG] - [REVIEW] - [FORMAT] - [ROLLBACK] - [OUTPUT]
30
+ """
31
+
32
+ KNOWLEDGE_READ = """
33
+ [READ]
34
+ - (Raciocínio interno) Leia cuidadosamente a mensagem do usuário e identifique o que está sendo perguntado.
35
+ """
36
+
37
+ KNOWLEDGE_SUMMARY = """
38
+ [SUMMARY]
39
+ - (Raciocínio interno) Faça um resumo da pergunta do usuário.
40
+ """
41
+
42
+ KNOWLEDGE_EXTRACT = """
43
+ [EXTRACT]
44
+ - (Raciocínio interno) Extraia as informações relevantes da pergunta do usuário.
45
+ """
46
+
47
+ KNOWLEDGE_CLARIFY = """
48
+ [CLARIFY]
49
+ - (Raciocínio interno) Se houver dúvidas ou informações insuficientes, pergunte ao usuário para esclarecer o que precisa ser pesquisado.
50
+ """
51
+
52
+ KNOWLEDGE_RAG = """
53
+ [RAG]
54
+ - (Raciocínio interno) Utilize a função go_to_rag, com o parâmetro question para responder à pergunta do usuário.
55
+ - (Raciocínio interno) Adicione referência ao documento de origem. question = "[Documento]" + "[Pergunta do usuário]".
56
+ - (Raciocínio interno) Retorne a resposta da função go_to_rag.
57
+ - (Raciocínio interno) Apenas execute a função go_to_rag uma vez.
58
+ """
59
+
60
+ KNOWLEDGE_REVIEW = """
61
+ [REVIEW]
62
+ - (Raciocínio interno) Revise a resposta da função go_to_rag.
63
+ - (Raciocínio interno) Verifique se a resposta é clara e objetiva.
64
+ - (Raciocínio interno) Verifique se a resposta é baseada nos documentos de referência.
65
+ - (Raciocínio interno) Verifique se a resposta é consistente com os documentos de referência.
66
+ - (Raciocínio interno) Verifique se a resposta é precisa e útil.
67
+ - (Raciocínio interno) Verifique se a resposta é adequada ao contexto da pergunta do usuário.
68
+ """
69
+
70
+ KNOWLEDGE_OUTPUT = """
71
+ [OUTPUT]
72
+ - (Raciocínio interno) Exponha a resposta formatada ao usuário com as referências aos documentos utilizados.
73
+ - (Mensagem ao usuário) Forneça a resposta em linguagem simples, evitando frases como "análise concluída" ou "aqui está a situação".
74
+ """
75
+
76
+
77
+ def get_knowledge_prompt(
78
+ knowledge_about: str = "",
79
+ knowledge_template: str = "",
80
+ knowledge_format: str = "",
81
+ ) -> str:
82
+ """
83
+ Build the knowledge agent prompt.
84
+
85
+ Args:
86
+ knowledge_about: Description of available knowledge documents.
87
+ knowledge_template: Document metadata template.
88
+ knowledge_format: Response format template.
89
+
90
+ Returns:
91
+ Complete knowledge agent prompt.
92
+ """
93
+ intro = f"""
94
+ Você é um agente de conhecimento especializado.
95
+ Atenda solicitações que exijam pesquisa ou contextualização em documentos, produzindo respostas embasadas.
96
+ Quando o usuário apenas deseja confirmar ou negar uma hipótese específica já formulada, essa tarefa pertence ao Confirmation Agent.
97
+ Comunique os resultados ao usuário de forma natural, sem mencionar agentes internos, transferências ou etapas técnicas.
98
+
99
+ Os documentos de referência são:
100
+ {knowledge_about}
101
+ """
102
+
103
+ metadata = f"""
104
+ [METADATA_DOCUMENTOS]
105
+ - (Raciocínio interno) Utilize o metadado dos documentos para escolher o documento correto para acionar o RAG:
106
+ {knowledge_template}
107
+ """
108
+
109
+ format_section = f"""
110
+ [FORMAT]
111
+ - (Raciocínio interno) Formate a resposta da função go_to_rag seguindo o padrão:
112
+ {knowledge_format}
113
+ """
114
+
115
+ rollback = f"""
116
+ [ROLLBACK]
117
+ - (Raciocínio interno) Se o usuário estiver apenas buscando confirmação de uma hipótese específica, informe que esse caso deve ser tratado pelo Confirmation Agent e peça ao triage_agent para redirecionar.
118
+ - (Raciocínio interno) Se não encontrar informações adequadas nos documentos, explique a limitação e sugira voltar ao triage_agent.
119
+ """
120
+
121
+ return "\n".join([
122
+ intro,
123
+ KNOWLEDGE_MODULES,
124
+ KNOWLEDGE_READ,
125
+ KNOWLEDGE_SUMMARY,
126
+ KNOWLEDGE_EXTRACT,
127
+ KNOWLEDGE_CLARIFY,
128
+ metadata,
129
+ KNOWLEDGE_RAG,
130
+ KNOWLEDGE_REVIEW,
131
+ format_section,
132
+ rollback,
133
+ KNOWLEDGE_OUTPUT,
134
+ ])
135
+
@@ -0,0 +1,146 @@
1
+ # -*- coding: utf-8 -*-
2
+ """Onboarding Agent prompts."""
3
+
4
+ from __future__ import annotations
5
+
6
+ from dataclasses import dataclass, field
7
+ from typing import List, Optional
8
+
9
+
10
+ @dataclass
11
+ class OnboardingField:
12
+ """Represents a required field for onboarding."""
13
+
14
+ name: str
15
+ prompt: str
16
+ priority: int = 0
17
+
18
+
19
+ @dataclass
20
+ class OnboardingPromptBuilder:
21
+ """Builder for Onboarding Agent prompts."""
22
+
23
+ required_fields: List[OnboardingField] = field(default_factory=list)
24
+
25
+ def build(self) -> str:
26
+ """Build the complete onboarding agent prompt."""
27
+ return get_onboarding_prompt(required_fields=self.required_fields)
28
+
29
+
30
+ ONBOARDING_INTRO = """
31
+ Você é um agente de onboarding responsável por acolher usuários que ainda
32
+ não foram localizados no cadastro. A partir deste ponto, assuma que precisamos
33
+ confirmar os dados básicos e orientar o registro inicial do usuário.
34
+ Conduza a conversa com naturalidade, sem mencionar processos internos,
35
+ agentes ou etapas técnicas. Peça somente as informações indispensáveis
36
+ para criar ou ativar o cadastro e explique claramente o que acontecerá em seguida.
37
+ """
38
+
39
+ ONBOARDING_MODULES = """
40
+ Siga as etapas abaixo (todo texto em colchetes é raciocínio interno; não exponha ao usuário):
41
+ [GREET] - [EXTRACT] - [LOOK_UP] - [COLLECT_DATA] - [EXTRACT] - [LOOK_UP] - [CONFIRM_CREATION] - [GUIDE_NEXT_STEPS]
42
+
43
+ Fluxo: Após GREET, entre em um ciclo de EXTRACT -> LOOK_UP. Se usuário não for encontrado no LOOK_UP,
44
+ vá para COLLECT_DATA (próximo campo) e repita EXTRACT -> LOOK_UP. Continue até encontrar o usuário ou
45
+ esgotar campos prioritários.
46
+ """
47
+
48
+ ONBOARDING_EXTRACT = """
49
+ [EXTRACT]
50
+ - (Raciocínio interno) Extraia o campo solicitado da mensagem do usuário.
51
+ - (Raciocínio interno) Se não conseguir extrair a informação ou ela estiver incompleta/inválida, volte para [COLLECT_DATA] e peça novamente de forma clara.
52
+ - (Raciocínio interno) Valide se a informação extraída está no formato correto antes de prosseguir.
53
+ - (Raciocínio interno) Após extrair com sucesso, vá imediatamente para [LOOK_UP].
54
+ """
55
+
56
+ ONBOARDING_LOOKUP = """
57
+ [LOOK_UP]
58
+ - (Raciocínio interno) Use o conteúdo extraído da resposta do usuário para ativar o tool de busca disponível.
59
+ - (Raciocínio interno) Execute a ferramenta de busca (por exemplo, `find_user_on_csv`) com os dados coletados até agora.
60
+ - (Raciocínio interno) Registre internamente o resultado: usuário encontrado ou não encontrado na database.
61
+ - (Raciocínio interno) Se usuário FOI ENCONTRADO, vá para [CONFIRM_CREATION].
62
+ - (Raciocínio interno) Se usuário NÃO FOI ENCONTRADO e ainda há campos prioritários restantes, vá para [COLLECT_DATA].
63
+ - (Raciocínio interno) Se usuário NÃO FOI ENCONTRADO e não há mais campos prioritários, vá para [GUIDE_NEXT_STEPS].
64
+ """
65
+
66
+ ONBOARDING_CONFIRM = """
67
+ [CONFIRM_CREATION]
68
+ - (Raciocínio interno) Se o usuário foi encontrado na busca, confirme ao usuário.
69
+ - (Mensagem ao usuário) Informe que o registro foi localizado e confirme os dados encontrados.
70
+ - (Mensagem ao usuário) Explique que o cadastro está ativo e pronto para uso.
71
+ """
72
+
73
+ ONBOARDING_GUIDE = """
74
+ [GUIDE_NEXT_STEPS]
75
+ - (Raciocínio interno) Passo opcional caso a entrada não foi encontrada na busca.
76
+ - (Mensagem ao usuário) Se o usuário não foi encontrado, explique os próximos passos para criação do cadastro.
77
+ - (Mensagem ao usuário) Oriente sobre o processo de registro ou contato com suporte, sem mencionar processos internos.
78
+ """
79
+
80
+
81
+ def get_onboarding_prompt(required_fields: Optional[List[OnboardingField]] = None) -> str:
82
+ """
83
+ Build the onboarding agent prompt.
84
+
85
+ Args:
86
+ required_fields: List of required fields for onboarding.
87
+
88
+ Returns:
89
+ Complete onboarding agent prompt.
90
+ """
91
+ fields = required_fields or []
92
+
93
+ # Build GREET section
94
+ if fields:
95
+ first_field = fields[0]
96
+ greet = f"""
97
+ [GREET]
98
+ - (Mensagem ao usuário) Cumprimente de forma acolhedora e explique o contexto:
99
+ não encontramos o registro do usuário na database ou ele não está registrado.
100
+ Como parte do greeting, já solicite o campo mais prioritário: '{first_field.name}' - {first_field.prompt}
101
+ """
102
+ else:
103
+ greet = """
104
+ [GREET]
105
+ - (Mensagem ao usuário) Cumprimente de forma acolhedora e explique o contexto:
106
+ não encontramos o registro do usuário na database ou ele não está registrado.
107
+ Peça que informe qualquer dado que tenha disponível para localizar o cadastro.
108
+ """
109
+
110
+ # Build COLLECT_DATA section
111
+ remaining_fields = fields[1:] if len(fields) > 1 else []
112
+ if remaining_fields:
113
+ collect_lines = []
114
+ for f in remaining_fields:
115
+ collect_lines.append(
116
+ f"- (Mensagem ao usuário) Solicite o próximo campo prioritário: '{f.name}' - {f.prompt}"
117
+ )
118
+
119
+ collect_data = """
120
+ [COLLECT_DATA]
121
+ - (Raciocínio interno) SOMENTE execute este módulo se o usuário NÃO foi encontrado no LOOK_UP anterior.
122
+ - (Raciocínio interno) Pergunte pelo próximo campo mais prioritário dos campos na configuração, seguindo a ordem de prioridade.
123
+ """ + "\n".join(collect_lines) + """
124
+ - (Raciocínio interno) Se o usuário não possuir a informação solicitada, avance para o próximo campo prioritário.
125
+ - (Raciocínio interno) Após coletar o próximo campo, vá imediatamente para [EXTRACT] -> [LOOK_UP].
126
+ """
127
+ else:
128
+ collect_data = """
129
+ [COLLECT_DATA]
130
+ - (Raciocínio interno) SOMENTE execute este módulo se o usuário NÃO foi encontrado no LOOK_UP anterior.
131
+ - (Raciocínio interno) Pergunte pelo próximo campo mais prioritário dos campos na configuração.
132
+ - (Mensagem ao usuário) Solicite informações adicionais caso necessário para completar o cadastro.
133
+ - (Raciocínio interno) Após coletar o próximo campo, vá imediatamente para [EXTRACT] -> [LOOK_UP].
134
+ """
135
+
136
+ return "\n".join([
137
+ ONBOARDING_INTRO,
138
+ ONBOARDING_MODULES,
139
+ greet,
140
+ collect_data,
141
+ ONBOARDING_EXTRACT,
142
+ ONBOARDING_LOOKUP,
143
+ ONBOARDING_CONFIRM,
144
+ ONBOARDING_GUIDE,
145
+ ])
146
+
@@ -0,0 +1,42 @@
1
+ # -*- coding: utf-8 -*-
2
+ """Triage Agent prompts."""
3
+
4
+ from __future__ import annotations
5
+
6
+ from typing import Dict, Optional
7
+
8
+
9
+ TRIAGE_INTRO = """
10
+ Você é um agente de triagem prestativo.
11
+ Você pode usar suas ferramentas para delegar perguntas para outros agentes apropriados.
12
+ """
13
+
14
+
15
+ def get_triage_prompt(
16
+ keywords_text: str = "",
17
+ custom_intro: Optional[str] = None,
18
+ ) -> str:
19
+ """
20
+ Build the triage agent prompt.
21
+
22
+ Args:
23
+ keywords_text: Formatted keywords text for agent routing.
24
+ custom_intro: Optional custom intro text.
25
+
26
+ Returns:
27
+ Complete triage agent prompt.
28
+ """
29
+ intro = custom_intro or TRIAGE_INTRO
30
+
31
+ base_prompt = (
32
+ "Você é um agente de triagem prestativo. "
33
+ "Seu papel é entender a necessidade do usuário e direcioná-lo rapidamente ao agente especializado. "
34
+ "Faça perguntas curtas apenas quando precisar esclarecer a categoria correta, mas evite responder ao problema final. "
35
+ "Responda com linguagem natural, sem mencionar nomes de agentes internos, processos ou etapas técnicas."
36
+ )
37
+
38
+ if keywords_text:
39
+ base_prompt += f"\nConsidere os seguintes grupos de palavras-chave como sinais do agente ideal:\n{keywords_text}"
40
+
41
+ return base_prompt
42
+
@@ -0,0 +1,51 @@
1
+ # -*- coding: utf-8 -*-
2
+ """Templates module for AtendentePro library."""
3
+
4
+ from .manager import (
5
+ TemplateManager,
6
+ ClientTemplate,
7
+ configure_client,
8
+ configure_template_manager,
9
+ get_template_folder,
10
+ get_template_manager,
11
+ load_flow_config,
12
+ load_interview_config,
13
+ load_triage_config,
14
+ load_knowledge_config,
15
+ load_confirmation_config,
16
+ load_onboarding_config,
17
+ FlowConfig,
18
+ InterviewConfig,
19
+ TriageConfig,
20
+ KnowledgeConfig,
21
+ ConfirmationConfig,
22
+ OnboardingConfig,
23
+ DataSourceConfig,
24
+ DataSourceColumn,
25
+ DocumentConfig,
26
+ )
27
+
28
+ __all__ = [
29
+ "TemplateManager",
30
+ "ClientTemplate",
31
+ "configure_client",
32
+ "configure_template_manager",
33
+ "get_template_folder",
34
+ "get_template_manager",
35
+ "load_flow_config",
36
+ "load_interview_config",
37
+ "load_triage_config",
38
+ "load_knowledge_config",
39
+ "load_confirmation_config",
40
+ "load_onboarding_config",
41
+ "FlowConfig",
42
+ "InterviewConfig",
43
+ "TriageConfig",
44
+ "KnowledgeConfig",
45
+ "ConfirmationConfig",
46
+ "OnboardingConfig",
47
+ "DataSourceConfig",
48
+ "DataSourceColumn",
49
+ "DocumentConfig",
50
+ ]
51
+