-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapp.py
executable file
·156 lines (125 loc) · 6.11 KB
/
app.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
# Importación de bibliotecas necesarias
import os
import openai
import streamlit as st
import time
import streamlit as st
import openai
# Configuración de la página
st.set_page_config(
page_title="AcreditaSalud",
page_icon="⚕️",
layout="wide",
menu_items={
'Get Help': 'https://qualitymaster.co/',
'Report a bug': None,
'About': "AcreditaSalud: Tu asistente en acreditación y gestión de la calidad en salud. Obtén información, guías y recomendaciones para mejorar la calidad en tu institución."
}
)
# Función para verificar si el archivo secrets.toml existe
def secrets_file_exists():
secrets_path = os.path.join('.streamlit', 'secrets.toml')
return os.path.isfile(secrets_path)
# Intentar obtener el ID del asistente de OpenAI desde st.secrets si el archivo secrets.toml existe
if secrets_file_exists():
try:
ASSISTANT_ID = st.secrets['ASSISTANT_ID']
except KeyError:
ASSISTANT_ID = None
else:
ASSISTANT_ID = None
# Si no está disponible, pedir al usuario que lo introduzca
if not ASSISTANT_ID:
ASSISTANT_ID = st.sidebar.text_input('Introduce el ID del asistente de OpenAI', type='password')
# Si aún no se proporciona el ID, mostrar un error y detener la ejecución
if not ASSISTANT_ID:
st.sidebar.error("Por favor, proporciona el ID del asistente de OpenAI.")
st.stop()
assistant_id = ASSISTANT_ID
# Inicialización del cliente de OpenAI
client = openai
st.title("Bienvenido a AcreditaSalud ⚕️✅")
st.write("""
[![ver código fuente](https://img.shields.io/badge/Repositorio%20GitHub-gris?logo=github)](https://github.com/bladealex9848/AcreditaSalud)
![Visitantes](https://api.visitorbadge.io/api/visitors?path=https%3A%2F%2Facreditasalud.streamlit.app&label=Visitantes&labelColor=%235d5d5d&countColor=%231e7ebf&style=flat)
""")
st.markdown("""
### ⚕️✅ ¡Hola! Soy AcreditaSalud, tu asistente en acreditación y gestión de la calidad en salud
Estoy aquí para brindarte información y apoyo en tu camino hacia la excelencia en la calidad de la atención en salud en Colombia.
#### ¿Qué puedo hacer por ti hoy? 🤔
* Explicarte los estándares de acreditación en salud y los criterios para cumplirlos.
* Guiarte en la implementación del PAMEC (Programa de Auditoría para el Mejoramiento de la Calidad), paso a paso.
* Brindar información clara sobre los requisitos de habilitación y acreditación en salud en Colombia.
* Asesorarte sobre la interpretación y aplicación de la normativa relacionada con la calidad en salud.
* Ofrecer recomendaciones prácticas para el mejoramiento continuo de la calidad en tu institución de salud.
**¡No dudes en consultarme cualquier inquietud sobre acreditación o gestión de la calidad en salud!**
*Recuerda: Proporciono información basada en mi conocimiento actual y en la normativa vigente. Para asesoría legal o técnica específica, consulta a un experto.*
""")
# Inicialización de variables de estado de sesión
st.session_state.start_chat = True
if "thread_id" not in st.session_state:
st.session_state.thread_id = None
# Cargar la clave API de OpenAI
API_KEY = os.environ.get('OPENAI_API_KEY') or st.secrets.get('OPENAI_API_KEY')
if not API_KEY:
API_KEY = st.sidebar.text_input('Introduce tu clave API de OpenAI', type='password')
if not API_KEY:
st.sidebar.error("Por favor, proporciona una clave API para continuar.")
st.stop()
openai.api_key = API_KEY
def process_message_with_citations(message):
"""Extraiga y devuelva solo el texto del mensaje del asistente."""
if hasattr(message, 'content') and len(message.content) > 0:
message_content = message.content[0]
if hasattr(message_content, 'text'):
nested_text = message_content.text
if hasattr(nested_text, 'value'):
return nested_text.value
return 'No se pudo procesar el mensaje'
# Crear un hilo de chat inmediatamente después de cargar la clave API
if not st.session_state.thread_id:
thread = client.beta.threads.create()
st.session_state.thread_id = thread.id
st.write("ID del hilo: ", thread.id)
if "messages" not in st.session_state:
st.session_state.messages = []
for message in st.session_state.messages:
with st.chat_message(message["role"]):
st.markdown(message["content"])
if prompt := st.chat_input("¿Cómo puedo ayudarte hoy?"):
st.session_state.messages.append({"role": "user", "content": prompt})
with st.chat_message("usuario"):
st.markdown(prompt)
# Enviar mensaje del usuario
client.beta.threads.messages.create(
thread_id=st.session_state.thread_id,
role="user",
content=prompt
)
# Crear una ejecución para el hilo de chat
run = client.beta.threads.runs.create(
thread_id=st.session_state.thread_id,
assistant_id=assistant_id
)
while run.status != 'completed':
time.sleep(1)
run = client.beta.threads.runs.retrieve(
thread_id=st.session_state.thread_id,
run_id=run.id
)
# Recuperar mensajes agregados por el asistente
messages = client.beta.threads.messages.list(
thread_id=st.session_state.thread_id
)
# Procesar y mostrar mensajes del asistente
for message in messages:
if message.run_id == run.id and message.role == "assistant":
full_response = process_message_with_citations(message)
st.session_state.messages.append({"role": "assistant", "content": full_response})
with st.chat_message("assistant"):
st.markdown(full_response)
# Footer
st.sidebar.markdown('---')
st.sidebar.subheader('Creado por:')
st.sidebar.markdown('Alexander Oviedo Fadul')
st.sidebar.markdown("[GitHub](https://github.com/bladealex9848) | [Website](https://alexanderoviedofadul.dev/) | [LinkedIn](https://www.linkedin.com/in/alexander-oviedo-fadul/) | [Instagram](https://www.instagram.com/alexander.oviedo.fadul) | [Twitter](https://twitter.com/alexanderofadul) | [Facebook](https://www.facebook.com/alexanderof/) | [WhatsApp](https://api.whatsapp.com/send?phone=573015930519&text=Hola%20!Quiero%20conversar%20contigo!%20)")