drguilhermeapolinario commited on
Commit
a2416f8
·
verified ·
1 Parent(s): 7df3320

Update views/pdf_chat.py

Browse files
Files changed (1) hide show
  1. views/pdf_chat.py +278 -296
views/pdf_chat.py CHANGED
@@ -8,312 +8,294 @@ from streamlit_option_menu import option_menu
8
 
9
  # Função principal
10
  def main():
11
- st.set_page_config(page_title="Utilidades", layout="wide")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12
 
13
- st.title("Utilidades")
 
14
 
15
- main_menu = ["Auxílio clínico", "Calculadoras", "Sobre"]
16
- main_choice = st.sidebar.selectbox("Menu Principal", main_menu)
17
-
18
- if main_choice == "Auxílio clínico":
19
- st.title("Auxílio clínico")
20
- st.write("Bem-vindo à página inicial!")
21
-
22
- elif main_choice == "Calculadoras":
23
- st.title("Calculadoras")
24
-
25
- # Menu aninhado usando streamlit-option-menu na horizontal
26
- nested_menu = option_menu(
27
- menu_title=None,
28
- options=[
29
- "Incidências radiológicas", "RAG", "Geral"
30
- ],
31
- icons=['lungs', 'gear', 'envelope'],
32
- menu_icon="cast",
33
- default_index=0,
34
- orientation="horizontal",
35
- )
36
-
37
- # Conteúdo das subpáginas
38
- if nested_menu == "Incidências radiológicas":
39
- st.header("Apoio clínico na solicitação de radiografias!")
40
-
41
- c1, c2, c3, c4 = st.columns([1, 3, 3, 1])
42
-
43
- with c1:
44
- st.markdown("")
45
-
46
- with c2:
47
- st.header(":blue[Incidências Radiográficas] ☢️")
48
-
49
- with c3:
50
- st.image("icons/rx2.svg", width=400)
51
- with c4:
52
- st.markdown("")
53
-
54
- add_vertical_space()
55
- # # Descrição com estilo e emojis
56
- st.markdown("""
57
- ##### ✅ **Vamos melhorar a visualização das incidências médicas!**
58
- """)
59
-
60
- # Função para exibir regiões e incidências
61
- def exibir_incidencias(regiao, incidencias):
62
- st.markdown(f"## {regiao}")
63
- for incidencia in incidencias:
64
- st.markdown(f"- {incidencia}")
65
-
66
- add_vertical_space(3)
67
-
68
- st.markdown("### 🧍‍♂️ Selecione a Região do Corpo:")
69
-
70
- incidencias_radiograficas = {
71
- "👨‍⚕️ Tórax e Vias Aéreas": [
72
- "👨‍⚕️ Tórax - PA e Lateral",
73
- "🦴 Esterno – OAD e Lateral",
74
- "🦴 Art. Esterno-Clavicular – PA, OAD e OAE",
75
- "🦴 Costelas Posteriores – AP, OPD e OPE",
76
- "🦴 Costelas Anteriores – PA, OAD e OPE",
77
- "👃 Vias aéreas superiores - AP e Lateral",
78
- ],
79
- "💢 Abdome e Pelve": [
80
- "💢 Abdome - AP em Decúbito Dorsal",
81
- "💢 RAA - Tórax PA, Abdome em Decúbito Dorsal e Abdome em AP Ortostrica",
82
- "🦵 Pelves (Bacia) - AP e AP perna de Rã, para traumatismo apenas AP",
83
- "🦵 Quadril - AP e Axial Lateral",
84
- "🦴 Art. Sacro-Ilíaca – Axial AP e Oblíquas",
85
- ],
86
- "✋ Membros Superiores": [
87
- "✋ Dedos da mão do 2º ao 5º - PA, Lateral e Oblíqua",
88
- "👍 Polegar - AP, Lateral e Oblíqua",
89
- "🖐️ Mão - PA, Lateral e Oblíqua",
90
- "✊ Mão e Punho para Idade Óssea - PA Comparativa",
91
- "✊ Punho - PA, Lateral e Oblíqua",
92
- "🦴 Antebraço - AP e Lateral",
93
- "🦴 Cotovelo - AP e Lateral",
94
- "🦴 Úmero - AP e Lateral",
95
- "💪 Ombro - AP com rotação externa e interna",
96
- "💪 Ombro em traumatismo - AP com rotação neutra, Lateral escapular ou Transtorácica",
97
- "🦴 Clavícula - AP e AP Axial",
98
- "🦴 Art. Acromioclavicular - AP Bilateral com e sem estresse",
99
- "🦴 Escápula - AP e Lateral",
100
- ],
101
- "🦵 Membros Inferiores": [
102
- "🦶 Dedos dos pés - AP, Lateral e Oblíqua",
103
- "🦶 Pé - AP, Lateral e Oblíqua",
104
- "🦶 Calcâneo - Axial e Lateral",
105
- "🦵 Tornozelo - AP, AP do encaixe, Lateral e Oblíqua",
106
- "🦿 Joelho - AP, Lateral e Oblíqua",
107
- "🦿 Patela - PA, Lateral e Tangencial",
108
- "🦿 Perna - AP e Lateral",
109
- "🦿 Fêmur ��� AP e Lateral",
110
- ],
111
- "🦴 Coluna Vertebral": [
112
- "🦴 Coluna Cervical - Axial AP, Transoral, Lateral e Oblíqua",
113
- "🦴 Coluna Dorsal ou Torácica - AP e Lateral",
114
- "🦴 Coluna Lombar - AP, Lateral e Oblíqua",
115
- "🦴 Sacro e Cóccix - Axial AP e Lateral",
116
- "🦴 Rotina para Escoliose – AP e Lateral",
117
- "🦴 Rotina para Fusão Vertebral – AP com inclinação Esquerda e Direita Lateral com Hiperextensão e Hiperflexão",
118
- ],
119
- "🦷 Cabeça e Face": [
120
- "👤 Crânio - AP Axial, PA e Lateral",
121
- "👃 Ossos da Face - Caldwell, Waters e Lateral",
122
- "👂 Ossos Nasais - Waters e Lateral",
123
- "👄 Mandíbula - Axial Lateral, PA e Axial AP",
124
- "🧠 Seios da Face - Caldwell, Waters e Lateral",
125
- "👂 Arcos Zigomáticos – Axial AP Submentovertice e Tangencial",
126
- "👂 Pirâmide – Rhêse, Caldwell e Waters",
127
- "🦴 ATM's – Axial Lateral e Oblíqua Axial Lateral",
128
- "🦴 Mastoides – Oblíqua Axial Lateral, Oblíqua Axial Anterior e Axial AP",
129
- "🦴 Sela Turcica – Axial AP e Lateral",
130
- ]
131
- }
132
-
133
- cx1, cx2 = st.columns([1, 1])
134
-
135
- with cx1:
136
- st.markdown("")
137
- regioes = list(incidencias_radiograficas.keys())
138
- regiao_escolhida = st.radio("", regioes)
139
-
140
- with cx2:
141
- if regiao_escolhida:
142
- exibir_incidencias(
143
- regiao_escolhida,
144
- incidencias_radiograficas[regiao_escolhida])
145
-
146
- st.markdown("""
147
- ---
148
- Feito com ❤️ e ☕ por **[Dr. Guilherme]**
149
- """)
150
-
151
- elif nested_menu == "RAG":
152
- st.header("RAG")
153
- my_secret = os.environ['GROQ_API_KEY']
154
- client = Groq(api_key=my_secret)
155
 
156
- if "messages" not in st.session_state:
157
- st.session_state.messages = []
 
158
 
159
- col1, col2 = st.columns(2)
160
- with col1:
161
- st.write('')
162
- with col2:
163
- st.markdown("### 📚 - Documentos, pesquisas e temas gerais!")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
164
 
165
- prompt_model = """
166
- Você é um assistente virtual especializado em trabalhar na Unidade Básica
167
- de Saúde (UBS) chamada UBS Flamengo, em Contagem, Minas Gerais, Brasil. Sua
168
- principal função é auxiliar profissionais de saúde e funcionários
169
- administrativos com várias tarefas, sempre se comunicando em português
170
- formal do Brasil.
171
-
172
- Inicie cada interação perguntando o nome do usuário. Use o seguinte formato:
173
- Olá! Bem-vindo(a) à UBS Flamengo. Meu nome é Zé Flamengo.
174
- Como posso te chamar?
175
-
176
- Dirija-se ao usuário respeitosamente, usando o nome dele durante toda a
177
- conversa. Mantenha um tom profissional, cortês e empático em todas as
178
- interações. Adapte o nível de linguagem ao do usuário, sempre mantendo-se
179
- claro e compreensível. Evite usar termos técnicos excessivos, a menos que
180
- solicitados ou apropriados ao contexto.
181
-
182
- Gere uma resposta com base nas seguintes diretrizes:
183
- 1. Se a consulta for sobre a preparação de relatórios, ofereça ajuda
184
- para estruturar o relatório, sugerindo pontos-chave a serem incluídos
185
- e fornecendo dicas para uma redação clara e concisa.
186
- 2. Para perguntas sobre diretrizes de saúde ou notas técnicas, explique
187
- o conteúdo de forma simples, dividindo informações complexas em partes
188
- facilmente digestíveis.
189
- 3. Ao resumir textos relacionados à saúde, forneça uma visão geral concisa
190
- seguida de pontos-chave, usando marcadores para maior clareza.
191
- 4. Se for solicitado um insight ou análise, baseie sua resposta em
192
- informações atualizadas e confiáveis, deixando claro que as informações
193
- devem ser verificadas com fontes oficiais.
194
- 5. Para perguntas sobre procedimentos padrão da UBS, forneça explicações
195
- passo a passo, usando listas numeradas quando apropriado.
196
- 6. Se a consulta estiver além de seu conhecimento ou exigir experiência
197
- médica, explique educadamente suas limitações e sugira que o usuário
198
- consulte um profissional de saúde qualificado.
199
- 7. Em caso de perguntas relacionadas a emergências, enfatize a importância
200
- de procurar ajuda médica imediata e forneça informações básicas sobre como
201
- entrar em contato com os serviços de emergência.
202
-
203
- Formate suas respostas da seguinte maneira:
204
- - Use frases completas e estruturadas.
205
- - Empregue marcadores ou numeração para listas ou instruções passo a passo.
206
- - Para tópicos complexos, comece com uma visão geral breve seguida de
207
- informações mais detalhadas.
208
- - Use exemplos práticos ou analogias para explicar conceitos difíceis, quando
209
- relevante.
210
-
211
- Lembre-se destes pontos importantes:
212
- - Nunca forneça diagnósticos médicos nem substitua o conselho de
213
- profissionais de saúde.
214
- - Mantenha estrita confidencialidade e não solicite nem discuta informações
215
- pessoais de pacientes.
216
- - Se você não souber algo sobre um tópico específico, admita honestamente e
217
- sugira a consulta de um profissional qualificado.
218
- - Fique atualizado sobre as políticas de saúde pública do Brasil e os
219
- procedimentos padrão da UBS.
220
- - Esteja preparado para discutir tópicos atuais relacionados à saúde pública
221
- no Brasil.
222
-
223
- Após fornecer sua resposta, pergunte sempre se o usuário tem mais perguntas
224
- ou se precisa de mais assistência. Use o seguinte formato:
225
-
226
- Posso ajudar com mais alguma coisa, [Nome do Usuário]?
227
-
228
- Continue esse ciclo de interação até o usuário indicar que não tem mais
229
- perguntas.
230
- Ao finalizar a conversa, use uma saudação de encerramento educada, como:
231
-
232
- Obrigado por utilizar nossos serviços, [Nome do Usuário]. Tenha um ótimo
233
- dia e não hesite em voltar se precisar de mais assistência.
234
- Lembre-se de se comunicar sempre em português formal brasileiro durante
235
- toda a interação.
236
- """
237
- if "messages" not in st.session_state:
238
- st.session_state.messages = [{"role": "system", "content": prompt_model}]
239
-
240
- def clear_all_session_state():
241
- """
242
- Limpa todos os estados da sessão.
243
- """
244
- for key in list(st.session_state.keys()):
245
- del st.session_state[key]
246
-
247
- if st.sidebar.button('Limpar Estado da Sessão', type="primary", key='limpar_sessao_sidebar'):
248
-
249
- clear_all_session_state()
250
- st.rerun()
251
-
252
- col1, col2 = st.columns(2)
253
- with col1:
254
- st.write('')
255
- with col2:
256
- st.markdown("")
257
-
258
- for message in st.session_state.messages:
259
- if message["role"] != "system":
260
- avatar = '🤖' if message["role"] == "assistant" else '👤'
261
- with st.chat_message(message["role"], avatar=avatar):
262
- st.markdown(message["content"])
263
-
264
- def generate_chat_responses(chat_complete) -> Generator[str, None, None]:
265
- """
266
- Gera conteúdo de resposta do chat a partir da resposta da API Groq.
267
- """
268
- for chunk in chat_complete:
269
- if chunk.choices[0].delta.content:
270
- yield chunk.choices[0].delta.content
271
-
272
- if prompt := st.chat_input("Digite seu prompt aqui..."):
273
- st.session_state.messages.append({
274
- "role": "user",
275
- "content": prompt
276
- })
277
-
278
- with st.chat_message("user", avatar='👤'):
279
- st.markdown(prompt)
280
-
281
- # Buscar resposta da API Groq
282
- try:
283
- chat_complete = client.chat.completions.create(
284
- model='llama-3.2-90b-text-preview',
285
- messages=st.session_state.messages,
286
- max_tokens=8000,
287
- stream=True
288
- )
289
-
290
- # Usar a função geradora
291
- with st.chat_message("assistant", avatar="🤖"):
292
- response_placeholder = st.empty()
293
- full_response = ""
294
- for chunk in generate_chat_responses(chat_complete):
295
- full_response += chunk
296
- response_placeholder.markdown(full_response + "▌")
297
- response_placeholder.markdown(full_response)
298
-
299
- # Adicionar a resposta completa ao st.session_state.messages
300
- st.session_state.messages.append({
301
- "role": "assistant",
302
- "content": full_response
303
- })
304
-
305
- except Exception as e:
306
- st.error(f"Ocorreu um erro: {e}", icon="🚨")
307
 
308
- elif nested_menu == "Subpágina 3":
309
- st.header("Subpágina 3")
310
- st.write("Conteúdo da Subpágina 3")
 
 
 
 
 
 
 
 
311
 
312
- elif main_choice == "Sobre":
313
- st.header("Sobre")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
314
 
 
 
 
 
 
315
 
 
 
 
 
 
316
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
317
 
318
  if __name__ == "__main__":
319
  main()
 
8
 
9
  # Função principal
10
  def main():
11
+ st.title("Calculadoras")
12
+
13
+ # Menu aninhado usando streamlit-option-menu na horizontal
14
+ nested_menu = option_menu(
15
+ menu_title=None,
16
+ options=[
17
+ "Incidências radiológicas", "RAG", "Geral"
18
+ ],
19
+ icons=['lungs', 'gear', 'envelope'],
20
+ menu_icon="cast",
21
+ default_index=0,
22
+ orientation="horizontal",
23
+ )
24
+
25
+ # Conteúdo das subpáginas
26
+ if nested_menu == "Incidências radiológicas":
27
+ st.header("Apoio clínico na solicitação de radiografias!")
28
+
29
+ c1, c2, c3, c4 = st.columns([1, 3, 3, 1])
30
+
31
+ with c1:
32
+ st.markdown("")
33
+
34
+ with c2:
35
+ st.header(":blue[Incidências Radiográficas] ☢️")
36
+
37
+ with c3:
38
+ st.image("icons/rx2.svg", width=400)
39
+ with c4:
40
+ st.markdown("")
41
+
42
+ add_vertical_space()
43
+ # # Descrição com estilo e emojis
44
+ st.markdown("""
45
+ ##### ✅ **Vamos melhorar a visualização das incidências médicas!**
46
+ """)
47
+
48
+ # Função para exibir regiões e incidências
49
+ def exibir_incidencias(regiao, incidencias):
50
+ st.markdown(f"## {regiao}")
51
+ for incidencia in incidencias:
52
+ st.markdown(f"- {incidencia}")
53
+
54
+ add_vertical_space(3)
55
+
56
+ st.markdown("### 🧍‍♂️ Selecione a Região do Corpo:")
57
+
58
+ incidencias_radiograficas = {
59
+ "👨‍⚕️ Tórax e Vias Aéreas": [
60
+ "👨‍⚕️ Tórax - PA e Lateral",
61
+ "🦴 Esterno – OAD e Lateral",
62
+ "🦴 Art. Esterno-Clavicular – PA, OAD e OAE",
63
+ "🦴 Costelas Posteriores – AP, OPD e OPE",
64
+ "🦴 Costelas Anteriores – PA, OAD e OPE",
65
+ "👃 Vias aéreas superiores - AP e Lateral",
66
+ ],
67
+ "💢 Abdome e Pelve": [
68
+ "💢 Abdome - AP em Decúbito Dorsal",
69
+ "💢 RAA - Tórax PA, Abdome em Decúbito Dorsal e Abdome em AP Ortostrica",
70
+ "🦵 Pelves (Bacia) - AP e AP perna de Rã, para traumatismo apenas AP",
71
+ "🦵 Quadril - AP e Axial Lateral",
72
+ "🦴 Art. Sacro-Ilíaca – Axial AP e Oblíquas",
73
+ ],
74
+ "✋ Membros Superiores": [
75
+ "✋ Dedos da mão do 2º ao 5º - PA, Lateral e Oblíqua",
76
+ "👍 Polegar - AP, Lateral e Oblíqua",
77
+ "🖐️ Mão - PA, Lateral e Oblíqua",
78
+ "✊ Mão e Punho para Idade Óssea - PA Comparativa",
79
+ "✊ Punho - PA, Lateral e Oblíqua",
80
+ "🦴 Antebraço - AP e Lateral",
81
+ "🦴 Cotovelo - AP e Lateral",
82
+ "🦴 Úmero - AP e Lateral",
83
+ "💪 Ombro - AP com rotação externa e interna",
84
+ "💪 Ombro em traumatismo - AP com rotação neutra, Lateral escapular ou Transtorácica",
85
+ "🦴 Clavícula - AP e AP Axial",
86
+ "🦴 Art. Acromioclavicular - AP Bilateral com e sem estresse",
87
+ "🦴 Escápula - AP e Lateral",
88
+ ],
89
+ "🦵 Membros Inferiores": [
90
+ "🦶 Dedos dos pés - AP, Lateral e Oblíqua",
91
+ "🦶 Pé - AP, Lateral e Oblíqua",
92
+ "🦶 Calcâneo - Axial e Lateral",
93
+ "🦵 Tornozelo - AP, AP do encaixe, Lateral e Oblíqua",
94
+ "🦿 Joelho - AP, Lateral e Oblíqua",
95
+ "🦿 Patela - PA, Lateral e Tangencial",
96
+ "🦿 Perna - AP e Lateral",
97
+ "🦿 Fêmur – AP e Lateral",
98
+ ],
99
+ "🦴 Coluna Vertebral": [
100
+ "🦴 Coluna Cervical - Axial AP, Transoral, Lateral e Oblíqua",
101
+ "🦴 Coluna Dorsal ou Torácica - AP e Lateral",
102
+ "🦴 Coluna Lombar - AP, Lateral e Oblíqua",
103
+ "🦴 Sacro e Cóccix - Axial AP e Lateral",
104
+ "🦴 Rotina para Escoliose – AP e Lateral",
105
+ "🦴 Rotina para Fusão Vertebral – AP com inclinação Esquerda e Direita Lateral com Hiperextensão e Hiperflexão",
106
+ ],
107
+ "🦷 Cabeça e Face": [
108
+ "👤 Crânio - AP Axial, PA e Lateral",
109
+ "👃 Ossos da Face - Caldwell, Waters e Lateral",
110
+ "👂 Ossos Nasais - Waters e Lateral",
111
+ "👄 Mandíbula - Axial Lateral, PA e Axial AP",
112
+ "🧠 Seios da Face - Caldwell, Waters e Lateral",
113
+ "👂 Arcos Zigomáticos – Axial AP Submentovertice e Tangencial",
114
+ "👂 Pirâmide – Rhêse, Caldwell e Waters",
115
+ "🦴 ATM's – Axial Lateral e Oblíqua Axial Lateral",
116
+ "🦴 Mastoides – Oblíqua Axial Lateral, Oblíqua Axial Anterior e Axial AP",
117
+ "🦴 Sela Turcica – Axial AP e Lateral",
118
+ ]
119
+ }
120
+
121
+ cx1, cx2 = st.columns([1, 1])
122
+
123
+ with cx1:
124
+ st.markdown("")
125
+ regioes = list(incidencias_radiograficas.keys())
126
+ regiao_escolhida = st.radio("", regioes)
127
+
128
+ with cx2:
129
+ if regiao_escolhida:
130
+ exibir_incidencias(
131
+ regiao_escolhida,
132
+ incidencias_radiograficas[regiao_escolhida])
133
+
134
+ st.markdown("""
135
+ ---
136
+ Feito com ❤️ e ☕ por **[Dr. Guilherme]**
137
+ """)
138
+
139
+ elif nested_menu == "RAG":
140
+ st.header("RAG")
141
+ my_secret = os.environ['GROQ_API_KEY']
142
+ client = Groq(api_key=my_secret)
143
 
144
+ if "messages" not in st.session_state:
145
+ st.session_state.messages = []
146
 
147
+ col1, col2 = st.columns(2)
148
+ with col1:
149
+ st.write('')
150
+ with col2:
151
+ st.markdown("### 📚 - Documentos, pesquisas e temas gerais!")
152
+
153
+ prompt_model = """
154
+ Você é um assistente virtual especializado em trabalhar na Unidade Básica
155
+ de Saúde (UBS) chamada UBS Flamengo, em Contagem, Minas Gerais, Brasil. Sua
156
+ principal função é auxiliar profissionais de saúde e funcionários
157
+ administrativos com várias tarefas, sempre se comunicando em português
158
+ formal do Brasil.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
159
 
160
+ Inicie cada interação perguntando o nome do usuário. Use o seguinte formato:
161
+ Olá! Bem-vindo(a) à UBS Flamengo. Meu nome é Zé Flamengo.
162
+ Como posso te chamar?
163
 
164
+ Dirija-se ao usuário respeitosamente, usando o nome dele durante toda a
165
+ conversa. Mantenha um tom profissional, cortês e empático em todas as
166
+ interações. Adapte o nível de linguagem ao do usuário, sempre mantendo-se
167
+ claro e compreensível. Evite usar termos técnicos excessivos, a menos que
168
+ solicitados ou apropriados ao contexto.
169
+
170
+ Gere uma resposta com base nas seguintes diretrizes:
171
+ 1. Se a consulta for sobre a preparação de relatórios, ofereça ajuda
172
+ para estruturar o relatório, sugerindo pontos-chave a serem incluídos
173
+ e fornecendo dicas para uma redação clara e concisa.
174
+ 2. Para perguntas sobre diretrizes de saúde ou notas técnicas, explique
175
+ o conteúdo de forma simples, dividindo informações complexas em partes
176
+ facilmente digestíveis.
177
+ 3. Ao resumir textos relacionados à saúde, forneça uma visão geral concisa
178
+ seguida de pontos-chave, usando marcadores para maior clareza.
179
+ 4. Se for solicitado um insight ou análise, baseie sua resposta em
180
+ informações atualizadas e confiáveis, deixando claro que as informações
181
+ devem ser verificadas com fontes oficiais.
182
+ 5. Para perguntas sobre procedimentos padrão da UBS, forneça explicações
183
+ passo a passo, usando listas numeradas quando apropriado.
184
+ 6. Se a consulta estiver além de seu conhecimento ou exigir experiência
185
+ médica, explique educadamente suas limitações e sugira que o usuário
186
+ consulte um profissional de saúde qualificado.
187
+ 7. Em caso de perguntas relacionadas a emergências, enfatize a importância
188
+ de procurar ajuda médica imediata e forneça informações básicas sobre como
189
+ entrar em contato com os serviços de emergência.
190
 
191
+ Formate suas respostas da seguinte maneira:
192
+ - Use frases completas e estruturadas.
193
+ - Empregue marcadores ou numeração para listas ou instruções passo a passo.
194
+ - Para tópicos complexos, comece com uma visão geral breve seguida de
195
+ informações mais detalhadas.
196
+ - Use exemplos práticos ou analogias para explicar conceitos difíceis, quando
197
+ relevante.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
198
 
199
+ Lembre-se destes pontos importantes:
200
+ - Nunca forneça diagnósticos médicos nem substitua o conselho de
201
+ profissionais de saúde.
202
+ - Mantenha estrita confidencialidade e não solicite nem discuta informações
203
+ pessoais de pacientes.
204
+ - Se você não souber algo sobre um tópico específico, admita honestamente e
205
+ sugira a consulta de um profissional qualificado.
206
+ - Fique atualizado sobre as políticas de saúde pública do Brasil e os
207
+ procedimentos padrão da UBS.
208
+ - Esteja preparado para discutir tópicos atuais relacionados à saúde pública
209
+ no Brasil.
210
 
211
+ Após fornecer sua resposta, pergunte sempre se o usuário tem mais perguntas
212
+ ou se precisa de mais assistência. Use o seguinte formato:
213
+
214
+ Posso ajudar com mais alguma coisa, [Nome do Usuário]?
215
+
216
+ Continue esse ciclo de interação até o usuário indicar que não tem mais
217
+ perguntas.
218
+ Ao finalizar a conversa, use uma saudação de encerramento educada, como:
219
+
220
+ Obrigado por utilizar nossos serviços, [Nome do Usuário]. Tenha um ótimo
221
+ dia e não hesite em voltar se precisar de mais assistência.
222
+ Lembre-se de se comunicar sempre em português formal brasileiro durante
223
+ toda a interação.
224
+ """
225
+ if "messages" not in st.session_state:
226
+ st.session_state.messages = [{"role": "system", "content": prompt_model}]
227
+
228
+ def clear_all_session_state():
229
+ """
230
+ Limpa todos os estados da sessão.
231
+ """
232
+ for key in list(st.session_state.keys()):
233
+ del st.session_state[key]
234
+
235
+ if st.sidebar.button('Limpar Estado da Sessão', type="primary", key='limpar_sessao_sidebar'):
236
+
237
+ clear_all_session_state()
238
+ st.rerun()
239
 
240
+ col1, col2 = st.columns(2)
241
+ with col1:
242
+ st.write('')
243
+ with col2:
244
+ st.markdown("")
245
 
246
+ for message in st.session_state.messages:
247
+ if message["role"] != "system":
248
+ avatar = '🤖' if message["role"] == "assistant" else '👤'
249
+ with st.chat_message(message["role"], avatar=avatar):
250
+ st.markdown(message["content"])
251
 
252
+ def generate_chat_responses(chat_complete) -> Generator[str, None, None]:
253
+ """
254
+ Gera conteúdo de resposta do chat a partir da resposta da API Groq.
255
+ """
256
+ for chunk in chat_complete:
257
+ if chunk.choices[0].delta.content:
258
+ yield chunk.choices[0].delta.content
259
+
260
+ if prompt := st.chat_input("Digite seu prompt aqui..."):
261
+ st.session_state.messages.append({
262
+ "role": "user",
263
+ "content": prompt
264
+ })
265
+
266
+ with st.chat_message("user", avatar='👤'):
267
+ st.markdown(prompt)
268
+
269
+ # Buscar resposta da API Groq
270
+ try:
271
+ chat_complete = client.chat.completions.create(
272
+ model='llama-3.2-90b-text-preview',
273
+ messages=st.session_state.messages,
274
+ max_tokens=8000,
275
+ stream=True
276
+ )
277
+
278
+ # Usar a função geradora
279
+ with st.chat_message("assistant", avatar="🤖"):
280
+ response_placeholder = st.empty()
281
+ full_response = ""
282
+ for chunk in generate_chat_responses(chat_complete):
283
+ full_response += chunk
284
+ response_placeholder.markdown(full_response + "▌")
285
+ response_placeholder.markdown(full_response)
286
+
287
+ # Adicionar a resposta completa ao st.session_state.messages
288
+ st.session_state.messages.append({
289
+ "role": "assistant",
290
+ "content": full_response
291
+ })
292
+
293
+ except Exception as e:
294
+ st.error(f"Ocorreu um erro: {e}", icon="🚨")
295
+
296
+ elif nested_menu == "Geral":
297
+ st.header("Geral")
298
+ st.write("Conteúdo da Subpágina 3")
299
 
300
  if __name__ == "__main__":
301
  main()