-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapp.py
156 lines (127 loc) · 6.21 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="TrasladoJudicialBot",
page_icon="⚖️",
layout="wide",
initial_sidebar_state="collapsed",
menu_items={
'Get Help': 'https://marduk.pro/',
'Report a bug': None,
'About': "TrasladoJudicialBot: Tu asistente especializado en traslados de servidores judiciales en Colombia. Obtén información sobre requisitos, procedimientos y plazos."
}
)
# 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 TrasladoJudicialBot ⚖️")
st.write("""
[![ver código fuente](https://img.shields.io/badge/Repositorio%20GitHub-gris?logo=github)](https://github.com/bladealex9848/TrasladoJudicialBot)
![Visitantes](https://api.visitorbadge.io/api/visitors?path=https%3A%2F%2Ftrasladojudicialbot.streamlit.app&label=Visitantes&labelColor=%235d5d5d&countColor=%231e7ebf&style=flat)
""")
st.markdown("""
### ⚖️ ¡Hola! Soy TrasladoJudicialBot, tu asistente en traslados y licencias de servidores judiciales
Estoy aquí para brindarte información y apoyo sobre traslados y licencias no remuneradas en la Rama Judicial colombiana.
#### ¿Qué puedo hacer por ti hoy? 🤔
* Explicarte qué es un traslado o una licencia no remunerada en el contexto judicial colombiano
* Describir los diferentes tipos de traslados y licencias, junto con sus requisitos
* Guiarte en el procedimiento para solicitar un traslado o una licencia no remunerada
* Informarte sobre los plazos y recursos legales disponibles
* Brindar información actualizada sobre la normativa aplicable, incluyendo los cambios introducidos por la Ley 2430 de 2024
* Explicarte la interpretación del Consejo de Estado sobre licencias no remuneradas y traslados
**¡No dudes en consultarme cualquier inquietud sobre traslados o licencias de servidores judiciales!**
*Recuerda: Proporciono información basada en mi conocimiento actual y en la normativa vigente hasta octubre de 2024. Para asesoría legal o técnica específica, consulta a un abogado o experto en el tema.*
""")
# 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)")