drguilhermeapolinario commited on
Commit
72234bc
·
verified ·
1 Parent(s): d276b66

Delete app.py

Browse files
Files changed (1) hide show
  1. app.py +0 -591
app.py DELETED
@@ -1,591 +0,0 @@
1
- import folium
2
- import geopandas as gpd
3
- import plotly.express as px
4
- import streamlit as st
5
- from branca.colormap import LinearColormap
6
- from groq import Groq
7
- from streamlit_extras.add_vertical_space import add_vertical_space
8
- from streamlit_extras.stylable_container import stylable_container
9
- from streamlit_folium import folium_static
10
- from streamlit_option_menu import option_menu
11
- from folium.plugins import MarkerCluster, HeatMap
12
- import numpy as np
13
- from shapely.geometry import Point
14
-
15
- from data_cleaning import processar_arquivo
16
-
17
- st.set_page_config(
18
- page_title="Dashboard UBS Flamengo",
19
- page_icon="📊",
20
- layout="wide",
21
- initial_sidebar_state="expanded",
22
- )
23
-
24
- # Inicializar variáveis dos DataFrames como None
25
- DF_DATA = None
26
- DF_HEAD = None
27
- DF_IDADE = None
28
- DF_GENERO = None
29
- DF_COR = None
30
- DF_DEFICIENCIA = None
31
- DF_DOENCAS = None
32
- DF_ESCOLA = None
33
- DF_TRANSGEN = None
34
-
35
- # Upload de arquivo CSV na barra lateral
36
- uploaded_file = st.sidebar.file_uploader("Escolha um arquivo CSV", type="csv")
37
-
38
- if uploaded_file is not None:
39
- dataframes = processar_arquivo(uploaded_file)
40
-
41
- DF_DATA = dataframes.get("Data")
42
- DF_HEAD = dataframes.get("Head")
43
- DF_IDADE = dataframes.get("Idade")
44
- DF_GENERO = dataframes.get("genero")
45
- DF_COR = dataframes.get("cor")
46
- DF_DEFICIENCIA = dataframes.get("deficiencia")
47
- DF_DOENCAS = dataframes.get("doencas")
48
- DF_ESCOLA = dataframes.get("Escola")
49
- DF_TRANSGEN = dataframes.get("transgen")
50
-
51
- for df in [DF_IDADE, DF_GENERO, DF_COR, DF_DEFICIENCIA, DF_DOENCAS, DF_ESCOLA, DF_TRANSGEN]:
52
- if df is not None:
53
- df["Descrição"] = df["Descrição"].str.capitalize()
54
- else:
55
- st.sidebar.info("Adicione um arquivo .csv.")
56
-
57
- def gerar_resumo_df():
58
- resumo = ""
59
- if DF_DATA is not None:
60
- resumo += "Resumo DF_DATA:\n"
61
- resumo += DF_DATA.to_string(index=False) + "\n\n"
62
- if DF_HEAD is not None:
63
- resumo += "Resumo DF_HEAD:\n"
64
- resumo += DF_HEAD.to_string(index=False) + "\n\n"
65
- if DF_IDADE is not None:
66
- resumo += "Resumo DF_IDADE:\n"
67
- resumo += DF_IDADE.to_string(index=False) + "\n\n"
68
- if DF_GENERO is not None:
69
- resumo += f"Resumo DF_GENERO:\n{DF_GENERO.to_string(index=False)}\n\n"
70
- if DF_COR is not None:
71
- resumo += f"Resumo DF_COR:\n{DF_COR.to_string(index=False)}\n\n"
72
- if DF_DEFICIENCIA is not None:
73
- resumo += f"Resumo DF_DEFICIENCIA:\n{DF_DEFICIENCIA.to_string(index=False)}\n\n"
74
- if DF_DOENCAS is not None:
75
- resumo += f"Resumo DF_DOENCAS:\n{DF_DOENCAS.to_string(index=False)}\n\n"
76
- if DF_ESCOLA is not None:
77
- resumo += f"Resumo DF_ESCOLA:\n{DF_ESCOLA.to_string(index=False)}\n\n"
78
- if DF_TRANSGEN is not None:
79
- resumo += f"Resumo DF_TRANSGEN:\n{DF_TRANSGEN.to_string(index=False)}\n\n"
80
- return resumo
81
-
82
- # Mostrar o resumo no Streamlit
83
- #st.text(gerar_resumo_df())
84
-
85
- #######################################
86
- ############ BANNER ##################
87
- #######################################
88
-
89
- with stylable_container(
90
- key="banner",
91
- css_styles="""
92
- img {
93
- width: 1800px;
94
- height: 400px;
95
- overflow: hidden;
96
- position: relative;
97
- object-fit: cover;
98
- border-radius: 14px; /* Adiciona bordas arredondadas */
99
- mask-image: linear-gradient(to bottom, rgba(0, 0, 0, 1), rgba(0, 0, 0, 0));
100
- -webkit-mask-image: linear-gradient(to bottom, rgba(0, 0, 0, 1), rgba(0, 0, 0, 0)); /* For Safari */
101
- }
102
- """,
103
- ):
104
- st.image("./banner.png")
105
-
106
- add_vertical_space(5)
107
-
108
- c1, c2 = st.columns([5, 5])
109
- with c1:
110
- st.markdown(
111
- """
112
- ## Dashboard UBS Flamengo
113
- ###### :brain: _by Dr. Guilherme Apolinário_
114
-
115
- #### Bem-vindo! :wave:
116
- """
117
- )
118
-
119
- with c2:
120
- with stylable_container(
121
- key="graph_entry",
122
- css_styles="""
123
- img {
124
- width: 600px;
125
- height: 160px;
126
- overflow: hidden;
127
- position: relative;
128
- object-fit: cover;
129
- mask-image: linear-gradient(to bottom, rgba(0, 0, 0, 1), rgba(0, 0, 0, 0)); /* For Safari */
130
- }
131
- """,
132
- ):
133
- st.image("./graph1.png")
134
- st.divider()
135
-
136
- ###########################################
137
- ############### LATERAL ##################
138
- ###########################################
139
-
140
- st.sidebar.markdown(
141
- """
142
- ### Informações:
143
- - Análise de dados do relatório de cadastro individual.
144
- - Iniciativa - Ubs Flamengo
145
- - Acesso livre
146
- ### Links:
147
- ##
148
- ##### - [PEC SUS](https://sape.pecsus.com.br/) 📝
149
- ###
150
- ##### - [Obsidian - Dr Guilherme](http://dr-guilhermeapolinario.com) 🌎
151
- ##### - [GitHub - Dr Guilherme](http://dr-guilhermeapolinario.com) 🌎
152
- """
153
- )
154
-
155
- st.markdown(
156
- """
157
- ### Intruções:
158
- ##### - Acesse o site :orange[PEC SUS], na aba esquerda selecione consolidado, :blue[*RELATÓRIO DE CADASTRO INDIVIDUAL*]
159
- ##### - Selecione a opção :orange[baixar arquivo .csv]. Após baixar o arquivo, selecione o arquivo .csv na aba ao lado, e pronto.
160
- ##### - Clique no botão de expansão abaixo para iniciar o processo.
161
- ##### - Utilize o chatbot com a inteligência artificial 🤖 Zé Flamengo para tirar suas dúvidas.
162
- """
163
- )
164
- st.divider()
165
-
166
- st.markdown(
167
- """
168
- ### :world_map: **Conhecendo a área de abrangencia da UBS Flamengo: (IBGE 2022)**
169
- """
170
- )
171
-
172
-
173
- @st.cache_data
174
- def load_data():
175
- return gpd.read_file("flamengo_ibge2022.geojson").to_crs(epsg=4326)
176
-
177
- gdf = load_data()
178
-
179
- LATITUDE = -19.971591804
180
- LONGITUDE = -44.057912815
181
- lat = -19.96214
182
- long = -44.05603
183
-
184
- show_all = st.checkbox(":man-woman-girl-boy: **Análise geral**")
185
- if show_all:
186
-
187
- total_pop = gdf["POP"].sum()
188
- # st.write(f"População Total: {total_pop:,}")
189
- # st.write(f"Número de Setores Censitários: {len(gdf)}")
190
- # Divisão da tela em três colunas para as opções
191
- col1, col2, col3 = st.columns([1, 1, 2])
192
-
193
- with col1:
194
- st.write(f"###### População Total: {total_pop:,}")
195
- map_type = st.selectbox("Tipo de mapa", ["População", "Densidade", "Heatmap"])
196
-
197
- with col2:
198
- st.write(f"###### Número de Setores Censitários: {len(gdf)}")
199
- base_map = st.selectbox("Mapa base", ["Cartodb Positron", "OpenStreetMap"])
200
-
201
- # Checkboxes para mostrar/ocultar mapa e gráfico
202
- col1, col2 = st.columns(2)
203
- show_map = col1.checkbox("Mostrar Mapa")
204
- show_chart = col2.checkbox("Mostrar Gráfico")
205
-
206
- # Análise adicional acima das colunas
207
- st.subheader("Análise Adicional")
208
-
209
- total_pop = gdf["POP"].sum()
210
- st.write(f"População Total: {total_pop:,}")
211
- st.write(f"Número de Setores Censitários: {len(gdf)}")
212
-
213
- if show_map or show_chart:
214
- col1, col2 = st.columns(2)
215
-
216
- if show_map:
217
- with col1:
218
- m = folium.Map(location=[LATITUDE, LONGITUDE], tiles=base_map, zoom_start=15)
219
-
220
- if map_type in ["População", "Densidade"]:
221
- if map_type == "População":
222
- column = "POP"
223
- caption = "População residente UBS Flamengo - IBGE 2022"
224
- else:
225
- gdf["DENSIDADE"] = gdf["POP"] / gdf["AREA_KM2"]
226
- column = "DENSIDADE"
227
- caption = "Densidade populacional (hab/km²) - UBS Flamengo - IBGE 2022"
228
-
229
- colorscale = px.colors.sequential.Viridis
230
- colormap = LinearColormap(
231
- colors=colorscale,
232
- vmin=gdf[column].min(),
233
- vmax=gdf[column].max(),
234
- caption=caption,
235
- )
236
-
237
- folium.GeoJson(
238
- gdf,
239
- style_function=lambda feature: {
240
- "fillColor": colormap(feature["properties"][column]),
241
- "color": "black",
242
- "weight": 1,
243
- "fillOpacity": 0.7,
244
- },
245
- highlight_function=lambda feature: {
246
- "fillColor": "#ffaf00",
247
- "color": "green",
248
- "weight": 3,
249
- "fillOpacity": 0.9,
250
- },
251
- tooltip=folium.features.GeoJsonTooltip(
252
- fields=["CD_SETOR", column, "AREA_KM2"],
253
- aliases=[
254
- "Setor Censitário:",
255
- f"{caption}:",
256
- "Área (km²):",
257
- ],
258
- style=(
259
- "background-color: white; color: #333333; font-family: calibri; font-size: 12px; padding: 10px;"
260
- ),
261
- ),
262
- ).add_to(m)
263
-
264
- colormap.add_to(m)
265
-
266
- elif map_type == "Heatmap":
267
- heat_data = [[row['geometry'].centroid.y, row['geometry'].centroid.x, row['POP']] for idx, row in gdf.iterrows()]
268
- HeatMap(heat_data).add_to(m)
269
-
270
- # Add marker for UBS Flamengo
271
- folium.Marker(
272
- [lat, long],
273
- popup="UBS Flamengo",
274
- tooltip="UBS Flamengo",
275
- icon=folium.Icon(color="red", icon="info-sign"),
276
- ).add_to(m)
277
-
278
- # Display map
279
- STYLE_STATEMENT = "<style>.leaflet-control-layers { position: fixed; top: 10px; left: 50px; } </style>"
280
- m.get_root().html.add_child(folium.Element(STYLE_STATEMENT))
281
- folium_static(m)
282
-
283
- if show_chart:
284
- with col2:
285
- fig = px.bar(
286
- gdf,
287
- x="CD_SETOR",
288
- y="POP",
289
- title="Distribuição da População por Setor Censitário",
290
- color="POP", # Mudança de cor conforme a população
291
- color_continuous_scale=px.colors.sequential.Viridis
292
- )
293
- st.plotly_chart(fig)
294
-
295
- # Análise de faixa etária (assumindo que você tenha colunas de faixa etária)
296
- age_columns = ["POP_0A4", "POP_5A9", "POP_10A14", "POP_15A19", "POP_20A24", "POP_25A29", "POP_30A34", "POP_35A39", "POP_40A44", "POP_45A49", "POP_50A54", "POP_55A59", "POP_60A64", "POP_65A69", "POP_70A74", "POP_75A79", "POP_80A84", "POP_85A89", "POP_90A94", "POP_95A99", "POP_100OUMAIS"]
297
-
298
- if all(col in gdf.columns for col in age_columns):
299
- age_data = gdf[age_columns].sum()
300
- fig_age = px.pie(values=age_data.values, names=age_data.index, title="Distribuição Etária da População")
301
- st.plotly_chart(fig_age)
302
- else:
303
- st.write("Dados de faixa etária não disponíveis no conjunto de dados.")
304
-
305
- # Opção de download de dados
306
- if st.button("Baixar Dados"):
307
- csv = gdf.to_csv(index=False)
308
- st.download_button(
309
- label="Baixar como CSV",
310
- data=csv,
311
- file_name="dados_populacionais_ubs_flamengo.csv",
312
- mime="text/csv",
313
- )
314
-
315
- st.divider()
316
- add_vertical_space(3)
317
-
318
- st.markdown(
319
- """
320
- ## Dados de saúde Relatório de cadastro individual.
321
- """
322
- )
323
-
324
- def criar_grafico_personalizado(df, x_col, y_col, titulo):
325
- fig = px.bar(
326
- df,
327
- x=x_col,
328
- y=y_col,
329
- title=titulo,
330
- text=y_col,
331
- color=x_col,
332
- color_discrete_sequence=px.colors.qualitative.Bold
333
- )
334
- fig.update_traces(texttemplate='%{text:.2s}', textposition='outside')
335
- fig.update_layout(
336
- uniformtext_minsize=8,
337
- uniformtext_mode='hide',
338
- xaxis_title=x_col,
339
- yaxis_title=y_col,
340
- title_font_size=24,
341
- title_font_family="Arial",
342
- title_font_color="blue",
343
- title_x=0.5,
344
- paper_bgcolor='rgba(0,0,0,0)',
345
- plot_bgcolor='rgba(0,0,0,0)',
346
- xaxis_tickangle=-45
347
- )
348
- return fig
349
-
350
- if uploaded_file is not None:
351
- with st.expander("Visualização", expanded=True):
352
- selected_tab = option_menu(
353
- menu_title=None,
354
- options=["Faixa Etária", "Gênero", "Cor", "Deficiência", "Doenças", "Escolaridade", "Identidade de Gênero"],
355
- icons=["person", "gender-female", "person-plus", "person-wheelchair", "capsule-pill", "stars", "gender-trans"],
356
- menu_icon="cast",
357
- default_index=0,
358
- orientation="horizontal",
359
- styles={
360
- "container": {"padding": "0!important", "background-color": "#262730"},
361
- "icon": {"color": "#4FCBFC", "font-size": "18px"},
362
- "nav-link": {
363
- "font-size": "14px",
364
- "text-align": "center",
365
- "margin": "0px",
366
- "padding": "10px",
367
- "--hover-color": "#363940",
368
- "color": "#FFFFFF",
369
- },
370
- "nav-link-selected": {"background-color": "#0083B8"},
371
- "separator": {"border-color": "#4B4B4B"},
372
- },
373
- )
374
-
375
- if selected_tab == "Faixa Etária" and DF_IDADE is not None:
376
- st.subheader("Distribuição por Faixa Etária")
377
- col1, col2 = st.columns(2)
378
- with col1:
379
- st.dataframe(DF_IDADE, hide_index=True)
380
- with col2:
381
- DF_IDADE["Masculino"] = DF_IDADE["Masculino"].astype(int) * -1
382
- DF_IDADE["Feminino"] = DF_IDADE["Feminino"].astype(int)
383
- fig_idade = px.bar(
384
- DF_IDADE,
385
- x=["Masculino", "Feminino"],
386
- y="Descrição",
387
- orientation="h",
388
- title="Pirâmide Etária",
389
- labels={"value": "População", "Descrição": "Faixa Etária"},
390
- color="Descrição",
391
- color_discrete_sequence=px.colors.qualitative.Set3,
392
- )
393
- fig_idade.update_layout(
394
- barmode="relative", xaxis_title="População", yaxis_title="Faixa Etária"
395
- )
396
- st.plotly_chart(fig_idade)
397
- DF_IDADE["Masculino"] = DF_IDADE["Masculino"].abs()
398
-
399
- elif selected_tab == "Gênero" and DF_GENERO is not None:
400
- st.subheader("Distribuição por Gênero")
401
- col1, col2 = st.columns(2)
402
- with col1:
403
- st.dataframe(DF_GENERO, hide_index=True)
404
- with col2:
405
- fig_genero = px.pie(
406
- DF_GENERO,
407
- names="Descrição",
408
- values="Valor",
409
- title="Distribuição por Gênero",
410
- color_discrete_sequence=px.colors.qualitative.Pastel
411
- )
412
- st.plotly_chart(fig_genero)
413
-
414
- elif selected_tab == "Cor" and DF_COR is not None:
415
- st.subheader("Distribuição por Cor")
416
- col1, col2 = st.columns(2)
417
- with col1:
418
- st.dataframe(DF_COR, hide_index=True)
419
- with col2:
420
- fig_cor = px.pie(
421
- DF_COR,
422
- names="Descrição",
423
- values="Valor",
424
- title="Distribuição por Cor",
425
- color_discrete_sequence=px.colors.qualitative.Vivid
426
- )
427
- st.plotly_chart(fig_cor)
428
-
429
- elif selected_tab == "Deficiência" and DF_DEFICIENCIA is not None:
430
- st.subheader("Distribuição por Deficiência")
431
- col1, col2 = st.columns(2)
432
- with col1:
433
- st.dataframe(DF_DEFICIENCIA, hide_index=True)
434
- with col2:
435
- fig_deficiencia = criar_grafico_personalizado(
436
- DF_DEFICIENCIA,
437
- x_col="Descrição",
438
- y_col="Valor",
439
- titulo="Distribuição por Deficiência"
440
- )
441
- st.plotly_chart(fig_deficiencia)
442
-
443
- elif selected_tab == "Doenças" and DF_DOENCAS is not None:
444
- st.subheader("Distribuição por Doenças")
445
- col1, col2 = st.columns(2)
446
- with col1:
447
- st.dataframe(DF_DOENCAS, hide_index=True)
448
- with col2:
449
- fig_doencas = criar_grafico_personalizado(
450
- DF_DOENCAS,
451
- x_col="Descrição",
452
- y_col="Valor",
453
- titulo="Distribuição por Doenças"
454
- )
455
- st.plotly_chart(fig_doencas)
456
-
457
- elif selected_tab == "Escolaridade" and DF_ESCOLA is not None:
458
- st.subheader("Distribuição por Escolaridade")
459
- col1, col2 = st.columns(2)
460
- with col1:
461
- st.dataframe(DF_ESCOLA, hide_index=True)
462
- with col2:
463
- fig_escola = criar_grafico_personalizado(
464
- DF_ESCOLA,
465
- x_col="Descrição",
466
- y_col="Valor",
467
- titulo="Distribuição por Escolaridade"
468
- )
469
- st.plotly_chart(fig_escola)
470
-
471
- elif selected_tab == "Identidade de Gênero" and DF_TRANSGEN is not None:
472
- st.subheader("Distribuição por Identidade de Gênero")
473
- col1, col2 = st.columns(2)
474
- with col1:
475
- st.dataframe(DF_TRANSGEN, hide_index=True)
476
- with col2:
477
- fig_transgen = criar_grafico_personalizado(
478
- DF_TRANSGEN,
479
- x_col="Descrição",
480
- y_col="Valor",
481
- titulo="Distribuição por Identidade de Gênero"
482
- )
483
- st.plotly_chart(fig_transgen)
484
-
485
- add_vertical_space()
486
-
487
- st.info(
488
- """
489
- 📢 **CONVERSE COM IA SE TIVER DÚVIDAS NA ANÁLISE DOS GRÁFICOS**"""
490
- )
491
-
492
- add_vertical_space(1)
493
-
494
- with stylable_container(
495
- key="brain",
496
- css_styles="""
497
- img {
498
- width: 120px;
499
- height: 100px;
500
- overflow: hidden;
501
- position: relative;
502
- object-fit: cover;
503
- border-radius: 14px; /* Adiciona bordas arredondadas */
504
- }
505
- """,
506
- ):
507
- st.image("./b.png")
508
- # Widget expander para interação da IA
509
- with st.expander(" Converse com o 🤖 Zé Flamengo", expanded=True):
510
- client = Groq(
511
- api_key=st.secrets["GROQ_API_KEY"],
512
- )
513
-
514
- INPUT_KEY = "USER_CHAT_input"
515
-
516
- USER_CHAT = st.text_input(
517
- "Digite sua pergunta sobre saúde na microárea:",
518
- placeholder="Digite sua pergunta aqui...",
519
- )
520
-
521
- if st.button("Enviar pergunta", key="send_button"):
522
- if USER_CHAT is not None: # Verifica se há texto na entrada
523
- try:
524
- RESUMO_DF = gerar_resumo_df()
525
- CHAT_COMPLETION = client.chat.completions.create(
526
- messages=[
527
- {
528
- "role": "system",
529
- "content": f"""
530
- Seu nome é Zé Flamengo, você é um assistente virtual especializado em análise de dados médicos epidemiológicos. Você tem 20 anos de experiência
531
- em análise de dados de saúde de microáreas de um PSF (Programa Saúde da Família).
532
- Sua função é:
533
- 1. Analisar dados de uma unidade básica de saúde.
534
- 2. Os dados que irá analisar são provenientes do Relatório de Cadastro Individual, advindos do PEC SUS.
535
- 3. Suas respostas devem ser sempre em português.
536
- 4. Seja conciso e evite conversar sobre outros temas.
537
- 5. Sempre retome o tema da conversa.
538
- 6. Realize sempre os cálculos novamente para garantir que os resultados fornecidos sejam precisos e atualizados.
539
- Os dataframes que irá analisar são do Relatório de cadastro indiviual. ele foi transformados em texto aqui disponíveis:
540
-
541
- {RESUMO_DF}
542
-
543
- As faixas etárias recomendadas para exames preventivos são:
544
- - **Papanicolau (Preventivo):** Mulheres entre 25 e 64 anos, com frequência anual nos primeiros dois exames consecutivos com resultados normais, depois a cada três anos.
545
- - **Mamografia:** Mulheres entre 50 e 69 anos, com frequência bienal.
546
-
547
- Informações sobre o Relatório de Cadastro Individual:
548
- - **Objetivo:** Coletar dados sociodemográficos e de saúde dos indivíduos cadastrados em uma unidade básica de saúde.
549
- - **Principais Indicadores:** Idade, sexo, condições de saúde (doenças crônicas, gestantes, etc.), status de vacinação, hábitos de vida (tabagismo, alcoolismo, atividade física), entre outros.
550
-
551
- Exemplos de perguntas esperadas:
552
- - Qual a porcentagem de mulheres na faixa etária de preventivo?
553
- - Qual a porcentagem de mulheres na faixa etária de mamografia?
554
- - Quantas mulheres estão nas faixas etárias de preventivo e mamografia?
555
- - Qual a relação masculino/feminino?
556
- - Qual a porcentagem das doenças em relação à população total?
557
-
558
- Use essas informações para responder às perguntas do usuário.
559
- Regras:
560
- 1. Seja sempre cortês.
561
- 2. Responda somente assuntos referentes ao resumo.
562
- 3. Caso seja feita alguma pergunta a você diferente de resumos, responda: "Vamos voltar ao trabalho que interessa?"
563
- 4. Responda sempre em português.
564
- 5. Se não souber a resposta, responda: "Desculpe, mas não tenho esta informação."
565
- 6. Nas suas respostas, não forneça os nomes dos dataframes, apenas responda às perguntas.
566
- 7. Destaque os principais achados e tendências nos dados sempre que possível.
567
- 8. Se aplicável, sugira possíveis ações ou recomendações baseadas nos dados analisados.
568
- """,
569
- },
570
- {
571
- "role": "user",
572
- "content": USER_CHAT,
573
- },
574
- ],
575
- model="llama3-70b-8192",
576
- temperature=0.2,
577
- max_tokens=1500,
578
- )
579
- st.write(CHAT_COMPLETION.choices[0].message.content)
580
-
581
- # Limpa o campo de entrada após enviar a pergunta
582
- st.session_state[INPUT_KEY] = ""
583
- except Exception as e:
584
- st.error(f"Erro ao gerar a conclusão do chat: {e}")
585
- else:
586
- st.warning("Por favor, digite uma pergunta antes de enviar.")
587
-
588
-
589
- # Adicione este código fora do expander para evitar a reexecução do script ao pressionar Enter
590
- if "USER_CHAT_input" in st.session_state and st.session_state.USER_CHAT_input:
591
- st.session_state.USER_CHAT_input = ""