Josedcape commited on
Commit
54613fa
·
verified ·
1 Parent(s): d09e7fd

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +39 -455
app.py CHANGED
@@ -1,466 +1,55 @@
1
  import os
2
- import tempfile
3
- import openai
4
  from dotenv import load_dotenv
5
- import PyPDF2
6
- import nltk
7
- from nltk.tokenize import word_tokenize
8
- from nltk.corpus import stopwords
9
- from nltk.stem import SnowballStemmer
10
- import pandas as pd
11
- from fpdf import FPDF
12
  import streamlit as st
13
- import requests
14
- from google.cloud import texttospeech
15
- import base64
16
-
17
- nltk.download('punkt', quiet=True)
18
- nltk.download('stopwords', quiet=True)
19
 
20
  # Cargar las claves API desde el archivo .env
21
  load_dotenv()
22
- openai_api_key = os.getenv("OPENAI_API_KEY")
23
- brevo_api_key = os.getenv("BREVO_API_KEY")
24
- os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "botidinamix-g.json"
25
-
26
- # Verifica que las claves API están configuradas
27
- if not openai_api_key:
28
- st.error("No API key provided for OpenAI. Please set your API key in the .env file.")
29
- else:
30
- openai.api_key = openai_api_key
31
-
32
- if not brevo_api_key:
33
- st.error("No API key provided for Brevo. Please set your API key in the .env file.")
34
-
35
- def extraer_texto_pdf(archivo):
36
- texto = ""
37
- if archivo:
38
- with tempfile.NamedTemporaryFile(delete=False) as temp_file:
39
- temp_file.write(archivo.read())
40
- temp_file_path = temp_file.name
41
- try:
42
- with open(temp_file_path, 'rb') as file:
43
- reader = PyPDF2.PdfReader(file)
44
- for page in range(len(reader.pages)):
45
- texto += reader.pages[page].extract_text()
46
- except Exception as e:
47
- st.error(f"Error al extraer texto del PDF: {e}")
48
- finally:
49
- os.unlink(temp_file_path)
50
- return texto
51
-
52
- def preprocesar_texto(texto):
53
- tokens = word_tokenize(texto, language='spanish')
54
- tokens = [word.lower() for word in tokens if word.isalpha()]
55
- stopwords_es = set(stopwords.words('spanish'))
56
- tokens = [word for word in tokens if word not in stopwords_es]
57
- stemmer = SnowballStemmer('spanish')
58
- tokens = [stemmer.stem(word) for word in tokens]
59
- return " ".join(tokens)
60
-
61
- def obtener_respuesta(pregunta, texto_preprocesado, modelo, temperatura=0.5, assistant_id=""):
62
- try:
63
- response = openai.ChatCompletion.create(
64
- model=modelo,
65
- messages=[
66
- {"role": "system", "content": "Actua como Galatea la asistente de la clinica Odontologica OMARDENT y resuelve las inquietudes"},
67
- {"role": "user", "content": f"{pregunta}\n\nContexto: {texto_preprocesado}"}
68
- ],
69
- temperature=temperatura
70
- )
71
- respuesta = response.choices[0].message['content'].strip()
72
-
73
- # Configura la solicitud de síntesis de voz
74
- client = texttospeech.TextToSpeechClient()
75
- input_text = texttospeech.SynthesisInput(text=respuesta)
76
- voice = texttospeech.VoiceSelectionParams(
77
- language_code="es-ES", ssml_gender=texttospeech.SsmlVoiceGender.FEMALE
78
- )
79
- audio_config = texttospeech.AudioConfig(
80
- audio_encoding=texttospeech.AudioEncoding.MP3
81
- )
82
-
83
- # Realiza la solicitud de síntesis de voz
84
- response = client.synthesize_speech(
85
- input=input_text, voice=voice, audio_config=audio_config
86
- )
87
-
88
- # Reproduce el audio en Streamlit
89
- st.audio(response.audio_content, format="audio/mp3")
90
- return respuesta
91
-
92
- except openai.OpenAIError as e:
93
- st.error(f"Error al comunicarse con OpenAI: {e}")
94
- return "Lo siento, no puedo procesar tu solicitud en este momento."
95
 
96
- except Exception as e:
97
- st.error(f"Error al generar la respuesta y el audio: {e}")
98
- return "Lo siento, ocurrió un error al procesar tu solicitud."
99
 
100
- def guardar_en_txt(nombre_archivo, datos):
101
- carpeta = "datos_guardados"
102
- os.makedirs(carpeta, exist_ok=True)
103
- ruta_archivo = os.path.join(carpeta, nombre_archivo)
104
- try:
105
- with open(ruta_archivo, 'a', encoding='utf-8') as archivo: # Append mode
106
- archivo.write(datos + "\n")
107
- except Exception as e:
108
- st.error(f"Error al guardar datos en el archivo: {e}")
109
- return ruta_archivo
110
-
111
- def cargar_desde_txt(nombre_archivo):
112
- carpeta = "datos_guardados"
113
- ruta_archivo = os.path.join(carpeta, nombre_archivo)
114
- try:
115
- if os.path.exists(ruta_archivo):
116
- with open(ruta_archivo, 'r', encoding='utf-8') as archivo:
117
- return archivo.read()
118
- else:
119
- st.warning("Archivo no encontrado.")
120
- return ""
121
- except Exception as e:
122
- st.error(f"Error al cargar datos desde el archivo: {e}")
123
- return ""
124
-
125
- def listar_archivos_txt():
126
- carpeta = "datos_guardados"
127
- try:
128
- if not os.path.exists(carpeta):
129
- return []
130
- archivos = [f for f in os.listdir(carpeta) if f.endswith('.txt')]
131
- archivos_ordenados = sorted(archivos, key=lambda x: os.path.getctime(os.path.join(carpeta, x)), reverse=True)
132
- return archivos_ordenados
133
- except Exception as e:
134
- st.error(f"Error al listar archivos: {e}")
135
  return []
136
 
137
- def generar_pdf(dataframe, titulo, filename):
138
- pdf = FPDF()
139
- pdf.add_page()
140
- pdf.set_font("Arial", size=12)
141
- pdf.cell(200, 10, txt=titulo, ln=True, align='C')
142
-
143
- for i, row in dataframe.iterrows():
144
- row_text = ", ".join(f"{col}: {val}" for col, val in row.items())
145
- pdf.cell(200, 10, txt=row_text, ln=True)
146
-
147
- try:
148
- with tempfile.NamedTemporaryFile(delete=False, suffix='.pdf') as tmp_file:
149
- pdf.output(tmp_file.name)
150
- return tmp_file.name
151
- except Exception as e:
152
- st.error(f"Error al generar PDF: {e}")
153
- return None
154
-
155
- def enviar_correo(destinatario, asunto, contenido):
156
- url = "https://api.brevo.com/v3/smtp/email"
157
- headers = {
158
- "accept": "application/json",
159
- "api-key": brevo_api_key,
160
- "content-type": "application/json"
161
- }
162
- payload = {
163
- "sender": {"email": "tu_correo@dominio.com"},
164
- "to": [{"email": destinatario}],
165
- "subject": asunto,
166
- "htmlContent": contenido
167
- }
168
- try:
169
- response = requests.post(url, json=payload, headers=headers)
170
- if response.status_code == 201:
171
- st.success(f"Correo enviado a {destinatario}")
172
- else:
173
- st.error(f"Error al enviar el correo: {response.text}")
174
- except Exception as e:
175
- st.error(f"Error al enviar el correo: {e}")
176
-
177
- def enviar_whatsapp(numero, mensaje):
178
- url = "https://api.brevo.com/v3/whatsapp/send"
179
- headers = {
180
- "accept": "application/json",
181
- "api-key": brevo_api_key,
182
- "content-type": "application/json"
183
- }
184
- payload = {
185
- "recipient": {"number": numero},
186
- "sender": {"number": "tu_numero_whatsapp"},
187
- "content": mensaje
188
- }
189
- try:
190
- response = requests.post(url, json=payload, headers=headers)
191
- if response.status_code == 201:
192
- st.success(f"Mensaje de WhatsApp enviado a {numero}")
193
- else:
194
- st.error(f"Error al enviar el mensaje de WhatsApp: {response.text}")
195
- except Exception as e:
196
- st.error(f"Error al enviar el mensaje de WhatsApp: {e}")
197
-
198
- def flujo_laboratorio():
199
- st.title("🦷 Gestión de Trabajos de Laboratorio")
200
-
201
- if 'laboratorio' not in st.session_state:
202
- st.session_state.laboratorio = []
203
-
204
- with st.form("laboratorio_form"):
205
- tipo_trabajo = st.selectbox("Tipo de trabajo:", [
206
- "Protesis total", "Protesis removible metal-acrilico", "Parcialita acrilico",
207
- "Placa de blanqueamiento", "Placa de bruxismo", "Corona de acrilico",
208
- "Corona en zirconio", "Protesis flexible", "Acker flexible"
209
- ])
210
- doctor = st.selectbox("Doctor que requiere el trabajo:", ["Dr. Jose Daniel C", "Dr. Jose Omar C"])
211
- fecha_entrega = st.date_input("Fecha de entrega:")
212
- fecha_envio = st.date_input("Fecha de envío:")
213
- laboratorio = st.selectbox("Laboratorio dental:", ["Ernesto Correa lab", "Formando Sonrisas"])
214
- nombre_paciente = st.text_input("Nombre paciente:")
215
- observaciones = st.text_input("Observaciones:")
216
- numero_orden = st.text_input("Número de orden:")
217
- cantidad = st.number_input("Cantidad:", min_value=1, step=1)
218
-
219
- submitted = st.form_submit_button("Registrar Trabajo")
220
-
221
- if submitted:
222
- trabajo = {
223
- "tipo_trabajo": tipo_trabajo,
224
- "doctor": doctor,
225
- "fecha_entrega": str(fecha_entrega),
226
- "fecha_envio": str(fecha_envio),
227
- "laboratorio": laboratorio,
228
- "nombre_paciente": nombre_paciente,
229
- "observaciones": observaciones,
230
- "numero_orden": numero_orden,
231
- "cantidad": cantidad,
232
- "estado": "pendiente"
233
- }
234
- st.session_state.laboratorio.append(trabajo)
235
- datos_guardados = mostrar_datos_como_texto([trabajo]) # Append only the new entry
236
- guardar_en_txt('trabajos_laboratorio.txt', datos_guardados)
237
- st.success("Trabajo registrado con éxito.")
238
-
239
- if st.session_state.laboratorio:
240
- st.write("### Trabajos Registrados")
241
- df_trabajos = pd.DataFrame(st.session_state.laboratorio)
242
- st.write(df_trabajos)
243
-
244
- pdf_file = generar_pdf(df_trabajos, "Registro de Trabajos de Laboratorio", "trabajos_laboratorio.pdf")
245
- st.download_button(
246
- label="📥 Descargar PDF",
247
- data=open(pdf_file, 'rb').read(),
248
- file_name="trabajos_laboratorio.pdf",
249
- mime="application/pdf"
250
- )
251
-
252
- def flujo_insumos():
253
- st.title("📦 Gestión de Insumos")
254
-
255
- if 'insumos' not in st.session_state:
256
- st.session_state.insumos = []
257
-
258
- with st.form("insumos_form"):
259
- insumo_nombre = st.text_input("Nombre del Insumo:")
260
- insumo_cantidad = st.number_input("Cantidad Faltante:", min_value=0, step=1)
261
- submitted = st.form_submit_button("Agregar Insumo")
262
-
263
- if submitted and insumo_nombre:
264
- insumo = {"nombre": insumo_nombre, "cantidad": insumo_cantidad}
265
- st.session_state.insumos.append(insumo)
266
- datos_guardados = mostrar_datos_como_texto([insumo]) # Append only the new entry
267
- guardar_en_txt('insumos.txt', datos_guardados)
268
- st.success(f"Insumo '{insumo_nombre}' agregado con éxito.")
269
-
270
- if st.session_state.insumos:
271
- st.write("### Insumos Registrados")
272
- insumos_df = pd.DataFrame(st.session_state.insumos)
273
- st.write(insumos_df)
274
-
275
- pdf_file = generar_pdf(insumos_df, "Registro de Insumos Faltantes", "insumos.pdf")
276
- st.download_button(
277
- label="📥 Descargar PDF",
278
- data=open(pdf_file, 'rb').read(),
279
- file_name="insumos_faltantes.pdf",
280
- mime="application/pdf"
281
- )
282
-
283
- def buscar_datos_guardados():
284
- st.title("🔍 Buscar Datos Guardados")
285
-
286
- carpeta = "datos_guardados"
287
- if not os.path.exists(carpeta):
288
- st.info("No se encontraron archivos de datos guardados.")
289
- return
290
-
291
- archivos = listar_archivos_txt()
292
-
293
- if archivos:
294
- archivo_seleccionado = st.selectbox("Selecciona un archivo para ver:", archivos)
295
-
296
- if archivo_seleccionado:
297
- datos = cargar_desde_txt(archivo_seleccionado)
298
- if datos:
299
- st.write(f"### Datos del archivo {archivo_seleccionado}")
300
- st.text_area("Datos", datos, height=300)
301
-
302
- # Link to download the file
303
- try:
304
- with open(os.path.join(carpeta, archivo_seleccionado), 'rb') as file:
305
- st.download_button(
306
- label="📥 Descargar Archivo TXT",
307
- data=file,
308
- file_name=archivo_seleccionado,
309
- mime="text/plain"
310
- )
311
- except Exception as e:
312
- st.error(f"Error al preparar la descarga: {e}")
313
-
314
- # Enviar el archivo seleccionado por correo
315
- if st.button("Enviar por correo"):
316
- contenido = f"Datos del archivo {archivo_seleccionado}:\n\n{datos}"
317
- enviar_correo("josedcape@gmail.com", f"Datos del archivo {archivo_seleccionado}", contenido)
318
-
319
- # Enviar el archivo seleccionado por WhatsApp
320
- if st.button("Enviar por WhatsApp"):
321
- mensaje = f"Datos del archivo {archivo_seleccionado}:\n\n{datos}"
322
- enviar_whatsapp("3114329322", mensaje)
323
-
324
- else:
325
- st.warning(f"No se encontraron datos en el archivo {archivo_seleccionado}")
326
  else:
327
- st.info("No se encontraron archivos de datos guardados.")
328
-
329
- def generar_notificaciones_pendientes():
330
- if 'laboratorio' not in st.session_state or not st.session_state.laboratorio:
331
- st.info("No hay trabajos pendientes.")
332
- return
333
-
334
- pendientes = [trabajo for trabajo in st.session_state.laboratorio if trabajo["estado"] == "pendiente"]
335
- if pendientes:
336
- st.write("### Notificaciones de Trabajos Pendientes")
337
- for trabajo in pendientes:
338
- st.info(f"Pendiente: {trabajo['tipo_trabajo']} - {trabajo['numero_orden']} para {trabajo['doctor']}. Enviado a {trabajo['laboratorio']} el {trabajo['fecha_envio']}.")
339
-
340
- def mostrar_datos_como_texto(datos):
341
- texto = ""
342
- if isinstance(datos, dict):
343
- for key, value in datos.items():
344
- texto += f"{key}: {value}\n"
345
- elif isinstance(datos, list):
346
- for item in datos:
347
- if isinstance(item, dict):
348
- for key, value in item.items():
349
- texto += f"{key}: {value}\n"
350
- texto += "\n"
351
- else:
352
- texto += f"{item}\n"
353
- return texto
354
-
355
- def flujo_presupuestos():
356
- st.title("💰 Asistente de Presupuestos")
357
- st.markdown("Hola Dr. cuénteme en que puedo ayudarle?")
358
-
359
- lista_precios = {
360
- "Restauraciones en resina de una superficie": 75000,
361
- "Restauraciones en resina de dos superficies": 95000,
362
- "Restauraciones en resina de tres o más superficies": 120000,
363
- "Restauración en resina cervical": 60000,
364
- "Coronas metal-porcelana": 750000,
365
- "Provisional": 80000,
366
- "Profilaxis simple": 75000,
367
- "Profilaxis completa": 90000,
368
- "Corona en zirconio": 980000,
369
- "Blanqueamiento dental láser por sesión": 150000,
370
- "Blanqueamiento dental casero": 330000,
371
- "Blanqueamiento mixto": 430000,
372
- "Prótesis parcial acrílico hasta 6 dientes": 530000,
373
- "Prótesis parcial acrílico de más de 6 dientes": 580000,
374
- "Prótesis flexible hasta 6 dientes": 800000,
375
- "Prótesis flexible de más de 6 dientes": 900000,
376
- "Prótesis total de alto impacto": 650000,
377
- "Acker flexible hasta 2 dientes": 480000,
378
- "Exodoncia por diente": 85000,
379
- "Exodoncia cordal": 130000,
380
- "Endodoncia con dientes terminados en 6": 580000,
381
- "Endodoncia de un conducto": 380000,
382
- "Endodoncia de premolares superiores": 480000,
383
- }
384
-
385
- if 'presupuesto' not in st.session_state:
386
- st.session_state['presupuesto'] = []
387
-
388
- with st.form("presupuesto_form"):
389
- tratamiento = st.selectbox("Selecciona el tratamiento", list(lista_precios.keys()))
390
- cantidad = st.number_input("Cantidad", min_value=1, step=1)
391
- agregar = st.form_submit_button("Agregar al Presupuesto")
392
-
393
- if agregar:
394
- precio_total = lista_precios[tratamiento] * cantidad
395
- st.session_state['presupuesto'].append({"tratamiento": tratamiento, "cantidad": cantidad, "precio_total": precio_total})
396
- st.success(f"Agregado: {cantidad} {tratamiento} - Total: {precio_total} COP")
397
-
398
- if st.session_state['presupuesto']:
399
- st.write("### Servicios Seleccionados")
400
- total_presupuesto = sum(item['precio_total'] for item in st.session_state['presupuesto'])
401
- for item in st.session_state['presupuesto']:
402
- st.write(f"{item['cantidad']} x {item['tratamiento']} - {item['precio_total']} COP")
403
- st.write(f"**Total: {total_presupuesto} COP**")
404
-
405
- if st.button("Copiar Presupuesto al Asistente"):
406
- servicios = "\n".join([f"{item['cantidad']} x {item['tratamiento']} - {item['precio_total']} COP" for item in st.session_state['presupuesto']])
407
- total = f"**Total: {total_presupuesto} COP**"
408
- st.session_state['presupuesto_texto'] = f"{servicios}\n{total}"
409
- st.success("Presupuesto copiado al asistente de chat.")
410
- st.session_state['mostrar_chat'] = True
411
-
412
- if st.session_state['mostrar_chat']:
413
- st.markdown("### Chat con Asistente")
414
- pregunta_usuario = st.text_input("Escribe tu pregunta aquí:", value=st.session_state.get('presupuesto_texto', ''))
415
- if st.button("Enviar Pregunta"):
416
- manejar_pregunta_usuario(pregunta_usuario)
417
-
418
- def flujo_radiografias():
419
- st.title("📸 Registro de Radiografías")
420
-
421
- if 'radiografias' not in st.session_state:
422
- st.session_state.radiografias = []
423
-
424
- with st.form("radiografias_form"):
425
- nombre_paciente = st.text_input("Nombre del Paciente:")
426
- tipo_radiografia = st.selectbox("Tipo de Radiografía:", ["Periapical", "Panorámica", "Cefalométrica"])
427
- fecha_realizacion = st.date_input("Fecha de Realización:")
428
- observaciones = st.text_area("Observaciones:")
429
-
430
- submitted = st.form_submit_button("Registrar Radiografía")
431
-
432
  if submitted:
433
- radiografia = {
434
- "nombre_paciente": nombre_paciente,
435
- "tipo_radiografia": tipo_radiografia,
436
- "fecha_realizacion": str(fecha_realizacion),
437
- "observaciones": observaciones
438
  }
439
- st.session_state.radiografias.append(radiografia)
440
- datos_guardados = mostrar_datos_como_texto([radiografia])
441
- guardar_en_txt('radiografias.txt', datos_guardados)
442
- st.success("Radiografía registrada con éxito.")
443
-
444
- if st.session_state.radiografias:
445
- st.write("### Radiografías Registradas")
446
- df_radiografias = pd.DataFrame(st.session_state.radiografias)
447
- st.write(df_radiografias)
448
-
449
- pdf_file = generar_pdf(df_radiografias, "Registro de Radiografías", "radiografias.pdf")
450
- st.download_button(
451
- label="📥 Descargar PDF",
452
- data=open(pdf_file, 'rb').read(),
453
- file_name="radiografias.pdf",
454
- mime="application/pdf"
455
- )
456
-
457
- def mostrar_recomendaciones():
458
- st.title("⭐ Recomendaciones")
459
- st.write("Aquí puedes encontrar recomendaciones y consejos útiles.")
460
 
461
  def main():
462
  st.set_page_config(page_title="Galatea OMARDENT", layout="wide")
463
-
464
  # Inicializar el estado de la sesión
465
  if 'modelo' not in st.session_state:
466
  st.session_state['modelo'] = "gpt-3.5-turbo"
@@ -480,8 +69,6 @@ def main():
480
  st.session_state['presupuesto_texto'] = ''
481
  if 'mostrar_chat' not in st.session_state:
482
  st.session_state['mostrar_chat'] = False
483
- if 'memoria' not in st.session_state:
484
- st.session_state['memoria'] = {}
485
 
486
  # Barra lateral
487
  ruta_logo = os.path.join("assets", "Logo Omardent.png")
@@ -512,7 +99,7 @@ def main():
512
 
513
  st.sidebar.markdown("---")
514
  st.sidebar.subheader("🌟 Navegación")
515
- lateral_page = st.sidebar.radio("Ir a", ["Página Principal", "Gestión de Trabajos", "Gestión de Insumos", "Registro de Radiografías", "Buscar Datos", "Notificaciones", "Recomendaciones", "Asistente de Presupuestos", "Comunicación", "Asistente de Agendamiento"])
516
 
517
  top_page = st.selectbox("Navegación Superior", ["Página Principal", "Galatea-Asistente"])
518
 
@@ -539,6 +126,8 @@ def main():
539
  st.write("Página de Comunicación") # Implementar según sea necesario
540
  elif lateral_page == "Asistente de Agendamiento":
541
  st.write("Página de Agendamiento") # Implementar según sea necesario
 
 
542
 
543
  def mostrar_pagina_principal():
544
  st.title("VIRTUAL OMARDENT AI-BOTIDINAMIX")
@@ -714,11 +303,6 @@ def manejar_pregunta_usuario(pregunta_usuario, archivo_pdf=None):
714
  st.session_state['video_estado'] = 'playing'
715
  st.markdown(f"<script>document.getElementById('background-video').play();</script>", unsafe_allow_html=True)
716
 
717
- # Almacenar la información importante en la memoria
718
- if "nombre" in pregunta_usuario.lower() or "teléfono" in pregunta_usuario.lower():
719
- st.session_state['memoria']['última_interacción'] = pregunta_usuario
720
- guardar_en_txt('memoria_asistente.txt', f"Última interacción: {pregunta_usuario}")
721
-
722
  def capturar_voz():
723
  st.markdown(
724
  """
 
1
  import os
 
 
2
  from dotenv import load_dotenv
3
+ from supabase import create_client, Client
 
 
 
 
 
 
4
  import streamlit as st
 
 
 
 
 
 
5
 
6
  # Cargar las claves API desde el archivo .env
7
  load_dotenv()
8
+ supabase_url = os.getenv("SUPABASE_URL")
9
+ supabase_key = os.getenv("SUPABASE_KEY")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10
 
11
+ # Crear el cliente de Supabase
12
+ supabase: Client = create_client(supabase_url, supabase_key)
 
13
 
14
+ def obtener_datos():
15
+ response = supabase.table('tu_tabla').select('*').execute()
16
+ if response.status_code == 200:
17
+ return response.data
18
+ else:
19
+ st.error(f"Error al obtener datos: {response.error.message}")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
20
  return []
21
 
22
+ def insertar_datos(datos):
23
+ response = supabase.table('tu_tabla').insert(datos).execute()
24
+ if response.status_code == 201:
25
+ st.success("Datos insertados con éxito.")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
26
  else:
27
+ st.error(f"Error al insertar datos: {response.error.message}")
28
+
29
+ def supabase_page():
30
+ st.title("Acceso a Base de Datos en la Nube con Supabase")
31
+
32
+ # Mostrar datos
33
+ if st.button("Obtener Datos"):
34
+ datos = obtener_datos()
35
+ if datos:
36
+ st.write(datos)
37
+
38
+ # Insertar datos
39
+ with st.form("insertar_datos_form"):
40
+ columna1 = st.text_input("Valor para columna1")
41
+ columna2 = st.text_input("Valor para columna2")
42
+ submitted = st.form_submit_button("Insertar Datos")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
43
  if submitted:
44
+ datos = {
45
+ "columna1": columna1,
46
+ "columna2": columna2
 
 
47
  }
48
+ insertar_datos(datos)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
49
 
50
  def main():
51
  st.set_page_config(page_title="Galatea OMARDENT", layout="wide")
52
+
53
  # Inicializar el estado de la sesión
54
  if 'modelo' not in st.session_state:
55
  st.session_state['modelo'] = "gpt-3.5-turbo"
 
69
  st.session_state['presupuesto_texto'] = ''
70
  if 'mostrar_chat' not in st.session_state:
71
  st.session_state['mostrar_chat'] = False
 
 
72
 
73
  # Barra lateral
74
  ruta_logo = os.path.join("assets", "Logo Omardent.png")
 
99
 
100
  st.sidebar.markdown("---")
101
  st.sidebar.subheader("🌟 Navegación")
102
+ lateral_page = st.sidebar.radio("Ir a", ["Página Principal", "Gestión de Trabajos", "Gestión de Insumos", "Registro de Radiografías", "Buscar Datos", "Notificaciones", "Recomendaciones", "Asistente de Presupuestos", "Comunicación", "Asistente de Agendamiento", "Supabase"])
103
 
104
  top_page = st.selectbox("Navegación Superior", ["Página Principal", "Galatea-Asistente"])
105
 
 
126
  st.write("Página de Comunicación") # Implementar según sea necesario
127
  elif lateral_page == "Asistente de Agendamiento":
128
  st.write("Página de Agendamiento") # Implementar según sea necesario
129
+ elif lateral_page == "Supabase":
130
+ supabase_page()
131
 
132
  def mostrar_pagina_principal():
133
  st.title("VIRTUAL OMARDENT AI-BOTIDINAMIX")
 
303
  st.session_state['video_estado'] = 'playing'
304
  st.markdown(f"<script>document.getElementById('background-video').play();</script>", unsafe_allow_html=True)
305
 
 
 
 
 
 
306
  def capturar_voz():
307
  st.markdown(
308
  """