Josedcape commited on
Commit
eb3b12e
·
verified ·
1 Parent(s): 51f7b67

Upload 8 files

Browse files
Files changed (8) hide show
  1. buscar_datos.py +30 -0
  2. chat.py +90 -0
  3. home.py +65 -0
  4. insumos.py +6 -0
  5. notificaciones.py +6 -0
  6. radiografias.py +49 -0
  7. recomendaciones.py +89 -0
  8. trabajos.py +6 -0
buscar_datos.py ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # pages/buscar_datos.py
2
+ import streamlit as st
3
+ from utils.data_manager import cargar_desde_txt, listar_archivos_txt
4
+
5
+ def show():
6
+ st.title("🔍 Buscar Datos Guardados")
7
+
8
+ archivos = listar_archivos_txt()
9
+
10
+ if archivos:
11
+ archivo_seleccionado = st.selectbox("Selecciona un archivo para ver:", archivos)
12
+
13
+ if archivo_seleccionado:
14
+ datos = cargar_desde_txt(archivo_seleccionado)
15
+ if datos:
16
+ st.write(f"### Datos del archivo {archivo_seleccionado}")
17
+ st.text_area("Datos", datos, height=300)
18
+
19
+ # Link to download the file
20
+ with open(archivo_seleccionado, 'rb') as file:
21
+ st.download_button(
22
+ label="📥 Descargar Archivo TXT",
23
+ data=file,
24
+ file_name=archivo_seleccionado,
25
+ mime="text/plain"
26
+ )
27
+ else:
28
+ st.warning(f"No se encontraron datos en el archivo {archivo_seleccionado}")
29
+ else:
30
+ st.info("No se encontraron archivos de datos guardados.")
chat.py ADDED
@@ -0,0 +1,90 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ import os
3
+ from utils.data_manager import (
4
+ extraer_texto_pdf,
5
+ preprocesar_texto,
6
+ obtener_respuesta,
7
+ handle_voice_input
8
+ )
9
+ # Configuración de la clave API
10
+ OPENAI_API_KEY= "sk-proj-3LjZDUxPCK7NOxAGsBrcT3BlbkFJPwq200vDWf5JG2YWgAsx" # Reemplaza esto con tu clave API real
11
+
12
+ def inicializar_estado():
13
+ """Inicializa el estado de la sesión si no está ya inicializado."""
14
+ if 'modelo' not in st.session_state:
15
+ st.session_state['modelo'] = "gpt-3.5-turbo"
16
+ if 'temperatura' not in st.session_state:
17
+ st.session_state['temperatura'] = 0.5
18
+ if 'mensajes_chat' not in st.session_state:
19
+ st.session_state['mensajes_chat'] = []
20
+
21
+ def barra_lateral():
22
+ """Configura la barra lateral de la aplicación."""
23
+ st.sidebar.image(os.path.join("assets"), use_column_width=True)
24
+ st.sidebar.title("🤖 Galatea OMARDENT")
25
+ st.sidebar.markdown("---")
26
+ st.sidebar.subheader("🧠 Configuración del Modelo")
27
+ st.session_state['modelo'] = st.sidebar.selectbox(
28
+ "Selecciona el modelo:",
29
+ ["gpt-3.5-turbo", "gpt-4", "gpt-4-32k"],
30
+ index=0,
31
+ help="Elige el modelo de lenguaje de OpenAI que prefieras."
32
+ )
33
+ st.sidebar.markdown("---")
34
+ st.session_state['temperatura'] = st.sidebar.slider(
35
+ "🌡️ Temperatura",
36
+ min_value=0.0, max_value=1.0,
37
+ value=st.session_state['temperatura'], step=0.1
38
+ )
39
+
40
+ def mostrar_mensajes_chat():
41
+ """Muestra los mensajes del chat."""
42
+ for mensaje in st.session_state['mensajes_chat']:
43
+ with st.chat_message(mensaje["role"]):
44
+ st.markdown(mensaje["content"])
45
+
46
+ def manejar_pregunta_usuario(pregunta_usuario, archivo_pdf):
47
+ """Procesa la pregunta del usuario."""
48
+ st.session_state['mensajes_chat'].append({"role": "user", "content": pregunta_usuario})
49
+ with st.chat_message("user"):
50
+ st.markdown(pregunta_usuario)
51
+
52
+ texto_preprocesado = ""
53
+ if archivo_pdf:
54
+ texto_pdf = extraer_texto_pdf(archivo_pdf)
55
+ texto_preprocesado = preprocesar_texto(texto_pdf)
56
+
57
+ respuesta = obtener_respuesta(pregunta_usuario, texto_preprocesado, st.session_state['modelo'], st.session_state['temperatura'])
58
+ st.session_state['mensajes_chat'].append({"role": "assistant", "content": respuesta})
59
+ with st.chat_message("assistant"):
60
+ st.markdown(respuesta)
61
+
62
+ def manejar_captura_de_voz(audio_capturado):
63
+ """Procesa el archivo de audio subido."""
64
+ texto_extraido = handle_voice_input(audio_capturado)
65
+ st.markdown("### Texto extraído del audio:")
66
+ st.write(texto_extraido)
67
+
68
+ def main():
69
+ st.header("💬 Hablar con Galatea OMARDENT - Página de Chat")
70
+ inicializar_estado()
71
+ barra_lateral()
72
+
73
+ # --- Área principal de la aplicación ---
74
+ archivo_pdf = st.file_uploader("📂 Cargar PDF", type='pdf', key='chat_pdf')
75
+
76
+ mostrar_mensajes_chat()
77
+
78
+ pregunta_usuario = st.chat_input("Pregunta:")
79
+ if pregunta_usuario:
80
+ manejar_pregunta_usuario(pregunta_usuario, archivo_pdf)
81
+
82
+ st.markdown("### Captura de voz")
83
+ audio_capturado = st.file_uploader("Subir archivo de audio", type=["wav", "mp3"], key='audio_chat')
84
+ if audio_capturado:
85
+ manejar_captura_de_voz(audio_capturado)
86
+
87
+ st.markdown("---")
88
+
89
+ if __name__ == "__main__":
90
+ main()
home.py ADDED
@@ -0,0 +1,65 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # pages/home.py
2
+ import os
3
+ import streamlit as st
4
+ from utils.data_manager import (
5
+ extraer_texto_pdf,
6
+ preprocesar_texto,
7
+ obtener_respuesta
8
+ )
9
+
10
+ def show():
11
+ st.header("💬 Hablar con Galatea OMARDENT")
12
+
13
+ # Inicializa los valores predeterminados si no existen
14
+ if 'modelo' not in st.session_state:
15
+ st.session_state.modelo = "gpt-3.5-turbo"
16
+ if 'temperatura' not in st.session_state:
17
+ st.session_state.temperatura = 0.5
18
+
19
+ # --- Barra lateral ---
20
+ with st.sidebar:
21
+ st.image(os.path.join("assets", "Logo Omardent.png"), use_column_width=True)
22
+ st.title("🤖 Galatea OMARDENT")
23
+ st.markdown("---")
24
+
25
+ # Selección de modelo de lenguaje
26
+ st.subheader("🧠 Configuración del Modelo")
27
+ st.session_state.modelo = st.selectbox(
28
+ "Selecciona el modelo:",
29
+ ["gpt-3.5-turbo", "gpt-4", "gpt-4-32k"],
30
+ index=0,
31
+ help="Elige el modelo de lenguaje de OpenAI que prefieras."
32
+ )
33
+
34
+ # Opciones adicionales
35
+ st.markdown("---")
36
+ st.session_state.temperatura = st.slider("🌡️ Temperatura", min_value=0.0, max_value=1.0, value=st.session_state.temperatura, step=0.1)
37
+
38
+ # --- Área principal de la aplicación ---
39
+ # Carga de archivo PDF
40
+ archivo_pdf = st.file_uploader("📂 Cargar PDF", type='pdf')
41
+
42
+ # --- Chatbot ---
43
+ if 'mensajes' not in st.session_state:
44
+ st.session_state.mensajes = []
45
+
46
+ for mensaje in st.session_state.mensajes:
47
+ with st.chat_message(mensaje["role"]):
48
+ st.markdown(mensaje["content"])
49
+
50
+ pregunta_usuario = st.chat_input("Pregunta:")
51
+ if pregunta_usuario:
52
+ st.session_state.mensajes.append({"role": "user", "content": pregunta_usuario})
53
+ with st.chat_message("user"):
54
+ st.markdown(pregunta_usuario)
55
+
56
+ if archivo_pdf:
57
+ texto_pdf = extraer_texto_pdf(archivo_pdf)
58
+ texto_preprocesado = preprocesar_texto(texto_pdf)
59
+ else:
60
+ texto_preprocesado = ""
61
+
62
+ respuesta = obtener_respuesta(pregunta_usuario, texto_preprocesado, st.session_state.modelo, st.session_state.temperatura)
63
+ st.session_state.mensajes.append({"role": "assistant", "content": respuesta})
64
+ with st.chat_message("assistant"):
65
+ st.markdown(respuesta)
insumos.py ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ from utils.data_manager import flujo_insumos
3
+
4
+ def show():
5
+ flujo_insumos()
6
+
notificaciones.py ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ # pages/notificaciones.py
2
+ import streamlit as st
3
+ from utils.data_manager import generar_notificaciones_pendientes
4
+
5
+ def show():
6
+ generar_notificaciones_pendientes()
radiografias.py ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # pages/radiografias.py
2
+ import streamlit as st
3
+ from utils.data_manager import guardar_en_txt, cargar_desde_txt, mostrar_datos_como_texto
4
+
5
+ def show():
6
+ st.title("📋 Registro de Radiografías")
7
+
8
+ if 'radiografias' not in st.session_state:
9
+ st.session_state.radiografias = []
10
+
11
+ with st.form("radiografias_form"):
12
+ nombre_paciente = st.text_input("Nombre del Paciente:")
13
+ fecha_envio = st.date_input("Fecha en que se envía la Radiografía:")
14
+ motivo_consulta = st.text_input("Motivo de Consulta:")
15
+ tipo_diagnostico = st.text_input("Tipo de Diagnóstico:")
16
+ tutor_envia = st.text_input("Tutor que envía la Radiografía:")
17
+ recomendaciones = st.selectbox("Recomendaciones:", [
18
+ "Recomendaciones después de una exodoncia dental",
19
+ "Recomendaciones después de un blanqueamiento dental",
20
+ "Recomendaciones para el uso de una prótesis dental"
21
+ ])
22
+ submitted = st.form_submit_button("Registrar Radiografía")
23
+
24
+ if submitted:
25
+ radiografia = {
26
+ "nombre_paciente": nombre_paciente,
27
+ "fecha_envio": str(fecha_envio),
28
+ "motivo_consulta": motivo_consulta,
29
+ "tipo_diagnostico": tipo_diagnostico,
30
+ "tutor_envia": tutor_envia,
31
+ "recomendaciones": recomendaciones
32
+ }
33
+ st.session_state.radiografias.append(radiografia)
34
+ datos_guardados = mostrar_datos_como_texto(st.session_state.radiografias)
35
+ guardar_en_txt('radiografias.txt', datos_guardados)
36
+ st.success("Radiografía registrada con éxito.")
37
+
38
+ if st.session_state.radiografias:
39
+ st.write("### Radiografías Registradas")
40
+ st.text_area("Radiografías", mostrar_datos_como_texto(st.session_state.radiografias), height=300)
41
+
42
+ # Link to download the file
43
+ with open('datos_guardados/radiografias.txt', 'rb') as file:
44
+ st.download_button(
45
+ label="📥 Descargar Registro de Radiografías",
46
+ data=file,
47
+ file_name="radiografias.txt",
48
+ mime="text/plain"
49
+ )
recomendaciones.py ADDED
@@ -0,0 +1,89 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ import io
3
+ from docx import Document
4
+ from PyPDF2 import PdfReader, PdfWriter
5
+ from utils.data_manager import extraer_texto_pdf
6
+ import openai
7
+
8
+ def show():
9
+ st.title("✍️ IA para Modificación de Documentos")
10
+
11
+ uploaded_file = st.file_uploader("Sube un documento (PDF o DOCX)", type=['pdf', 'docx'])
12
+
13
+ if uploaded_file:
14
+ if uploaded_file.type == "application/pdf":
15
+ texto_original = extraer_texto_pdf(uploaded_file)
16
+ st.text_area("Contenido del Documento Original", texto_original, height=300)
17
+ elif uploaded_file.type == "application/vnd.openxmlformats-officedocument.wordprocessingml.document":
18
+ documento = Document(uploaded_file)
19
+ texto_original = "\n".join([para.text for para in documento.paragraphs])
20
+ st.text_area("Contenido del Documento Original", texto_original, height=300)
21
+
22
+ st.markdown("### Modificar Documento")
23
+
24
+ receptor = st.text_input("Modificar Para (Nombre del Receptor):")
25
+ notas_adicionales = st.text_area("Notas Adicionales:", height=100)
26
+
27
+ if st.button("Generar Documento Modificado"):
28
+ contenido_modificado = modificar_documento(texto_original, receptor, notas_adicionales)
29
+ st.text_area("Contenido del Documento Modificado", contenido_modificado, height=300)
30
+
31
+ # Descargar documento modificado
32
+ if uploaded_file.type == "application/pdf":
33
+ pdf_modificado = modificar_pdf(uploaded_file, contenido_modificado)
34
+ st.download_button(
35
+ label="📥 Descargar PDF Modificado",
36
+ data=pdf_modificado,
37
+ file_name="documento_modificado.pdf",
38
+ mime="application/pdf"
39
+ )
40
+ elif uploaded_file.type == "application/vnd.openxmlformats-officedocument.wordprocessingml.document":
41
+ docx_modificado = modificar_docx(contenido_modificado)
42
+ st.download_button(
43
+ label="📥 Descargar DOCX Modificado",
44
+ data=docx_modificado,
45
+ file_name="documento_modificado.docx",
46
+ mime="application/vnd.openxmlformats-officedocument.wordprocessingml.document"
47
+ )
48
+
49
+ def modificar_documento(texto, receptor, notas):
50
+ """Modifica el contenido del documento basado en el receptor y notas adicionales."""
51
+ prompt = f"Modifica el siguiente texto para que esté dirigido a {receptor} y añade las siguientes notas: {notas}.\n\nTexto:\n{texto}"
52
+ response = openai.ChatCompletion.create(
53
+ model="gpt-3.5-turbo", # o "gpt-4" si estás usando ese modelo
54
+ messages=[
55
+ {"role": "system", "content": "Eres un asistente útil."},
56
+ {"role": "user", "content": prompt}
57
+ ]
58
+ )
59
+ return response.choices[0].message['content']
60
+
61
+ def modificar_pdf(pdf_file, nuevo_contenido):
62
+ """Modifica el contenido de un PDF."""
63
+ reader = PdfReader(pdf_file)
64
+ writer = PdfWriter()
65
+
66
+ # Añadir el contenido modificado a una nueva página del PDF
67
+ for page in reader.pages:
68
+ writer.add_page(page)
69
+
70
+ nueva_pagina = writer.add_blank_page(width=reader.pages[0].mediabox.width, height=reader.pages[0].mediabox.height)
71
+ nueva_pagina.insert_text(nuevo_contenido)
72
+
73
+ pdf_output = io.BytesIO()
74
+ writer.write(pdf_output)
75
+ pdf_output.seek(0)
76
+
77
+ return pdf_output
78
+
79
+ def modificar_docx(nuevo_contenido):
80
+ """Modifica el contenido de un DOCX."""
81
+ doc = Document()
82
+ for line in nuevo_contenido.split("\n"):
83
+ doc.add_paragraph(line)
84
+
85
+ docx_output = io.BytesIO()
86
+ doc.save(docx_output)
87
+ docx_output.seek(0)
88
+
89
+ return docx_output
trabajos.py ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ from utils.data_manager import flujo_laboratorio
3
+
4
+ def show():
5
+ st.title("🦷 Gestión de Trabajos de Laboratorio")
6
+ flujo_laboratorio()