import os os.system('pip install curl_cffi tqdm bitsandbytes tiktoken g4f pinecone-client pandas datasets sentence-transformers') # Setup and load your keys import os from g4f import ChatCompletion #from google.colab import userdata from pinecone import Pinecone import pandas as pd from datasets import Dataset from sentence_transformers import SentenceTransformer import gradio as gr model_name = "BAAI/bge-m3" # Retrieve the Pinecone API key from the user PINECONE_API_KEY = "3a3e9022-381d-436e-84cb-ba93464d283e" # Use the key you set in the secrets PINECONE_ENVIRONMENT = "us-east-1" # Use the environment you set in the secrets # Initialize Pinecone with the API key pc = Pinecone(api_key=PINECONE_API_KEY) # Global variables to store the selected model and dimensions EMBED_MODEL = 'BGE_M3-1024' DIMENSIONS = 1024 # Confirm selection automatically print(f"Model selected: {EMBED_MODEL}") print(f"Dimensions set as: {DIMENSIONS}") # Function to print current selection (can be used in other cells) def print_current_selection(): print(f"Currently selected model: {EMBED_MODEL}") print(f"Dimensions: {DIMENSIONS}") # Establecer el nombre del índice automáticamente INDEX_NAME = 'neonatos' # Obtener la clave API de Pinecone #PINECONE_API_KEY = userdata.get('PINECONE_API_KEY') def connect_to_pinecone(index_name): global INDEX_NAME try: pc = Pinecone(api_key=PINECONE_API_KEY) index = pc.Index(index_name) # Asegurarse de que la conexión se establezca index_stats = index.describe_index_stats() print(f"Successfully connected to Pinecone index '{index_name}'!") print("Index Stats:", index_stats) # Actualizar la variable global INDEX_NAME INDEX_NAME = index_name print(f"Global INDEX_NAME updated to: {INDEX_NAME}") except Exception as e: print(f"Failed to connect to Pinecone index '{index_name}':", str(e)) # Conectar automáticamente al índice "neonatos" connect_to_pinecone(INDEX_NAME) # Función para imprimir el nombre del índice actual (puede ser usada en otras celdas) def print_current_index(): print(f"Current index name: {INDEX_NAME}") # Verificar si las variables globales necesarias están configuradas if 'INDEX_NAME' not in globals() or INDEX_NAME is None: raise ValueError("INDEX_NAME is not set. Please set the index name first.") if 'EMBED_MODEL' not in globals() or EMBED_MODEL is None: raise ValueError("EMBED_MODEL is not set. Please select an embedding model first.") # Inicializar cliente de Pinecone #PINECONE_API_KEY = userdata.get('PINECONE_API_KEY') pc = Pinecone(api_key=PINECONE_API_KEY) # Inicializar el índice de Pinecone index = pc.Index(INDEX_NAME) # Obtener la dimensión del índice index_stats = index.describe_index_stats() vector_dim = index_stats['dimension'] print(f"Index dimension: {vector_dim}") # Definir manualmente los campos de contexto y enlace CONTEXT_FIELDS = ['Tag','Pregunta','Respuesta'] LINK_FIELDS = ['Tag','Respuesta'] # Imprimir confirmación de campos seleccionados print(f"Context fields set to: {CONTEXT_FIELDS}") print(f"Link fields set to: {LINK_FIELDS}") # Función para obtener las selecciones actuales de campos (puede ser usada en otras celdas) def get_field_selections(): return { "CONTEXT_FIELDS": CONTEXT_FIELDS, "LINK_FIELDS": LINK_FIELDS } ##################################### # Check if required global variables are set if 'EMBED_MODEL' not in globals() or EMBED_MODEL is None: raise ValueError("EMBED_MODEL is not set. Please select an embedding model first.") if 'INDEX_NAME' not in globals() or INDEX_NAME is None: raise ValueError("INDEX_NAME is not set. Please create or select an index first.") if 'CONTEXT_FIELDS' not in globals() or 'LINK_FIELDS' not in globals(): raise ValueError("CONTEXT_FIELDS and LINK_FIELDS are not set. Please run the field selection cell first.") # Initialize the Sentence-Transformer model embedding_model = SentenceTransformer(model_name) # Initialize Pinecone with the API key and connect to the index pinecone_client = Pinecone(api_key=PINECONE_API_KEY) index = pinecone_client.Index(INDEX_NAME) # Constants LIMIT = 3750 def vector_search(query): # Generate embedding using Sentence-Transformer model xq = embedding_model.encode(query) # Perform vector search on Pinecone index res = index.query(vector=xq.tolist(), top_k=3, include_metadata=True) if res['matches']: return [ { 'content': ' '.join(f"{k}: {v}" for k, v in match['metadata'].items() if k in CONTEXT_FIELDS and k != 'Tag'), 'metadata': match['metadata'] } for match in res['matches'] if 'metadata' in match ] return [] def create_prompt(query, contexts): prompt_start = "\n\nContexto:\n" prompt_end = f"\n\nPregunta: {query}\nRespuesta:" current_contexts = "\n\n---\n\n".join([context['content'] for context in contexts]) if len(prompt_start + current_contexts + prompt_end) >= LIMIT: # Truncate contexts if they exceed the limit available_space = LIMIT - len(prompt_start) - len(prompt_end) truncated_contexts = current_contexts[:available_space] return prompt_start + truncated_contexts + prompt_end else: return prompt_start + current_contexts + prompt_end def complete(prompt): return [f"Hola"] def check_image_exists(filepath): return os.path.exists(filepath) def chat_function(message, history): # Perform vector search search_results = vector_search(message) # Create prompt with relevant contexts query_with_contexts = create_prompt(message, search_results) # Generate response response = complete(query_with_contexts) partial_message = response[0].split("\n")[0] # Solo tomar la primera línea de la respuesta # Handle the logic for processing tags and images internally relevant_links = [result['metadata'].get(field) for result in search_results for field in LINK_FIELDS if field in result['metadata']] full_response = partial_message image_url = None tags_detected = [] filtered_links = [] if relevant_links: for link in relevant_links: if any(tag in link for tag in ["rId101", "rId105", "rId109", "rId113", "rId117", "rId121", "rId125", "rId129", "rId133", "rId136", "rId139", "rId142", "rId145", "rId149", "rId153", "rId157", "rId161", "rId165", "rId169", "rId173", "rId177", "rId180", "rId184", "rId187", "rId192", "rId195", "rId40", "rId44", "rId47", "rId50", "rId53", "rId56", "rId59", "rId63", "rId66", "rId70", "rId73", "rId76", "rId80", "rId83", "rId87", "rId90", "rId94", "rId97"]): tags_detected.append(link) # Save the tag but don't display it else: filtered_links.append(link) # Add the first relevant link under a single "Respuestas relevantes" section if filtered_links: full_response += f".\n\nTe detallamos nuestro contenido a continuación:\n" + filtered_links[0] # Now handle the images based on the detected tags tags_to_images = { "rId101": "images/rId101.png", "rId105": "images/rId105.png", "rId109": "images/rId109.png", "rId113": "images/rId113.png", "rId117": "images/rId117.png", "rId121": "images/rId121.png", "rId125": "images/rId125.png", "rId129": "images/rId129.png", "rId133": "images/rId133.png", "rId136": "images/rId136.png", "rId139": "images/rId139.png", "rId142": "images/rId142.png", "rId145": "images/rId145.png", "rId149": "images/rId149.png", "rId153": "images/rId153.png", "rId157": "images/rId157.png", "rId161": "images/rId161.png", "rId165": "images/rId165.png", "rId169": "images/rId169.png", "rId173": "images/rId173.png", "rId177": "images/rId177.png", "rId180": "images/rId180.png", "rId184": "images/rId184.png", "rId187": "images/rId187.png", "rId192": "images/rId192.png", "rId195": "images/rId195.png", "rId40": "images/rId40.png", "rId44": "images/rId44.png", "rId47": "images/rId47.png", "rId50": "images/rId50.png", "rId53": "images/rId53.png", "rId56": "images/rId56.png", "rId59": "images/rId59.png", "rId63": "images/rId63.png", "rId66": "images/rId66.png", "rId70": "images/rId70.png", "rId73": "images/rId73.png", "rId76": "images/rId76.png", "rId80": "images/rId80.png", "rId83": "images/rId83.png", "rId87": "images/rId87.png", "rId90": "images/rId90.png", "rId94": "images/rId94.png", "rId97": "images/rId97.png", } for tag in tags_detected: for key, path in tags_to_images.items(): if key in tag and check_image_exists(path): image_url = path break return full_response, image_url def update_image(image_url): if image_url: return image_url else: return None images = [ {"id": "rId101", "path": "images/rId101.png", "description": "El código UBIGEO muestra que Lima (150101) tiene el mayor número de registros, seguido por Trujillo (130101) y San Juan de Miraflores (150133), destacando la concentración de atención médica en estas zonas. Un gráfico de barras visualiza los 10 códigos UBIGEO más frecuentes, facilitando la identificación de las áreas con mayor actividad en salud."}, {"id": "rId105", "path": "images/rId105.png", "description": "Los establecimientos de nivel 3 son los más representados, con 652,948 registros, seguidos por los de nivel 4 (310,272) y nivel 2 (277,385)."}, {"id": "rId109", "path": "images/rId109.png", "description": "El código UBIGEO revela que Lima (150101) lidera en registros, seguido por Trujillo (130101) y San Juan de Miraflores (150133), evidenciando la concentración de atención médica. Un gráfico de barras destaca los 10 códigos más frecuentes, facilitando la identificación de áreas con mayor actividad en salud."}, {"id": "rId113", "path": "images/rId113.png", "description": "El Instituto Nacional Materno Perinatal lidera en registros, destacando su rol en la atención materno-infantil en Perú. Le siguen el Hospital María Auxiliadora y el Hospital Nacional Cayetano Heredia. El gráfico de barras horizontal compara los 10 establecimientos con más registros."}, {"id": "rId117", "path": "images/rId117.png", "description": "El código UBIGEO muestra que Lima (150101) encabeza los registros, seguido por Trujillo (130101) y San Juan de Miraflores (150133), reflejando la concentración de atención médica. Un gráfico de barras resalta los 10 códigos más frecuentes, ayudando a identificar las áreas con mayor actividad en salud."}, {"id": "rId121", "path": "images/rId121.png", "description": "La Atención Inmediata del Recién Nacido Normal es el servicio más registrado, seguido por el Internamiento del Recién Nacido con Patología No Quirúrgica. Estos reflejan los cuidados comunes en neonatología. Servicios más especializados, como Internamiento en UCI y Atención por Emergencia, son menos frecuentes. Un gráfico de barras horizontal muestra la distribución de los registros por tipo de servicio."}, {"id": "rId125", "path": "images/rId125.png", "description": "El análisis de la variable FECINGHOSP muestra que los ingresos hospitalarios se distribuyen en el tiempo, con picos en ciertos períodos. El rango va del 7 de diciembre de 2021 al 30 de septiembre de 2023, con una mediana el 6 de noviembre de 2022, reflejando una demanda constante de hospitalización de recién nacidos. Un gráfico de líneas muestra los momentos de mayor afluencia hospitalaria."}, {"id": "rId129", "path": "images/rId129.png", "description": "La variable FECALTAHOSP, que registra las altas hospitalarias, sigue un patrón similar a los ingresos, con fechas entre el 1 de enero de 2022 y el 30 de septiembre de 2023. La mediana es el 10 de noviembre de 2022, sugiriendo hospitalizaciones breves y un manejo eficiente. Un gráfico de líneas ilustra la distribución de las altas a lo largo del tiempo."}, {"id": "rId133", "path": "images/rId133.png", "description": "El análisis muestra que la mayoría de los recién nacidos están hospitalizados por períodos cortos, con una mediana de 1 día y una media de 3.46 días. La desviación estándar de 5.25 días refleja la variabilidad según la complejidad de los casos, con estancias máximas de hasta 35 días. Histogramas y boxplots visualizan la distribución de los días de hospitalización según sexo y nivel de establecimiento de salud, destacando variaciones por factores."}, {"id": "rId136", "path": "images/rId136.png", "description": "Descripción 10"}, {"id": "rId139", "path": "images/rId139.png", "description": "Descripción 11"}, {"id": "rId142", "path": "images/rId142.png", "description": "Descripción 12"}, {"id": "rId145", "path": "images/rId145.png", "description": "Descripción 13"}, {"id": "rId149", "path": "images/rId149.png", "description": "Descripción 14"}, {"id": "rId153", "path": "images/rId153.png", "description": "Descripción 15"}, {"id": "rId157", "path": "images/rId157.png", "description": "Descripción 16"}, {"id": "rId161", "path": "images/rId161.png", "description": "Descripción 17"}, {"id": "rId165", "path": "images/rId165.png", "description": "Descripción 18"}, {"id": "rId169", "path": "images/rId169.png", "description": "Descripción 19"}, {"id": "rId173", "path": "images/rId173.png", "description": "Descripción 20"}, {"id": "rId177", "path": "images/rId177.png", "description": "Descripción 21"}, {"id": "rId180", "path": "images/rId180.png", "description": "Descripción 22"}, {"id": "rId184", "path": "images/rId184.png", "description": "Descripción 23"}, {"id": "rId187", "path": "images/rId187.png", "description": "Descripción 24"}, {"id": "rId192", "path": "images/rId192.png", "description": "Descripción 25"}, {"id": "rId195", "path": "images/rId195.png", "description": "Descripción 26"}, {"id": "rId40", "path": "images/rId40.png", "description": "El análisis de la frecuencia de códigos anonimizados revela que los 10 más comunes se repiten entre 52 y 75 veces, indicando múltiples visitas o tratamientos para los mismos pacientes. Un gráfico de barras muestra la frecuencia de estos códigos, usando solo los primeros 5 caracteres para facilitar su lectura y comparación."}, {"id": "rId44", "path": "images/rId44.png", "description": "El análisis de la frecuencia de códigos anonimizados muestra que los 10 más comunes se repiten entre 52 y 75 veces, lo que sugiere múltiples visitas o tratamientos de los mismos pacientes. Un gráfico de barras presenta la frecuencia de estos códigos, utilizando solo los primeros 5 caracteres para simplificar la comparación."}, {"id": "rId47", "path": "images/rId47.png", "description": "Descripción 29"}, {"id": "rId50", "path": "images/rId50.png", "description": "Descripción 30"}, {"id": "rId53", "path": "images/rId53.png", "description": "Descripción 31"}, {"id": "rId56", "path": "images/rId56.png", "description": "Descripción 32"}, {"id": "rId59", "path": "images/rId59.png", "description": "Descripción 33"}, {"id": "rId63", "path": "images/rId63.png", "description": "La variable FECATENCION, que registra la fecha de atención a los recién nacidos, abarca del 1 de enero de 2022 al 30 de septiembre de 2023, con mayor concentración entre mayo de 2022 y abril de 2023. El análisis muestra una distribución uniforme con ligeros picos. Las visualizaciones incluyen registros por año y una serie de tiempo con líneas punteadas que destacan fechas clave para un análisis temporal detallado."}, {"id": "rId66", "path": "images/rId66.png", "description": "Descripción 35"}, {"id": "rId70", "path": "images/rId70.png", "description": "La variable SEXO clasifica a los pacientes en femenino y masculino, con una ligera predominancia de masculinos (651,827) sobre femeninos (588,778), lo que puede aportar a la comprensión de las dinámicas de género en la atención neonatal. Un gráfico de barras con colores diferenciados (rosado y azul) facilita la comparación visual. La variable PESO, con un rango de 1.75 kg a 4.55 kg y un promedio de 3.13 kg, refleja un margen estrecho de variabilidad."}, {"id": "rId73", "path": "images/rId73.png", "description": "Descripción 37"}, {"id": "rId76", "path": "images/rId76.png", "description": "Descripción 38"}, {"id": "rId80", "path": "images/rId80.png", "description": "El análisis muestra que Lima lidera en registros con 284,662, seguida por La Libertad, Cajamarca y Cusco, con entre 73,592 y 80,447 registros. Esto refleja la alta población y centralización de servicios en la capital. En contraste, Moquegua, Madre de Dios y Tacna tienen menos de 8,000 registros, posiblemente por menor población o acceso limitado a salud. Gráficos de barras visualizan los departamentos con más y menos registros."}, {"id": "rId83", "path": "images/rId83.png", "description": "Descripción 40"}, {"id": "rId87", "path": "images/rId87.png", "description": "En cuanto a la distribución por provincia, la ciudad de Lima lidera con 83,743 registros, seguida por Trujillo, San Juan de Miraflores, y Cajamarca, que registran entre 26,721 y 32,926 casos. Estas cifras reflejan la alta demanda de atención en áreas urbanas y densamente pobladas. En contraste, provincias como Ocros y Canta, con tan solo 3 y 5 registros respectivamente, se encuentran en el extremo opuesto, lo que podría indicar áreas con menor cobertura de servicios de salud o baja densidad poblacional. La distribución de registros por provincia se presenta en gráficos de barras que ilustran tanto los valores más altos como los más bajos."}, {"id": "rId90", "path": "images/rId90.png", "description": "Descripción 42"}, {"id": "rId94", "path": "images/rId94.png", "description": "El análisis por distrito confirma a Lima como el líder en registros con 83,743 casos, seguido por Trujillo y San Juan de Miraflores, resaltando su relevancia como centros de atención médica. En contraste, distritos como Acos Vinchos y Capachica tienen solo un registro, lo que sugiere menor cobertura o acceso a servicios de salud. Gráficos de barras visualizan tanto los distritos con más como con menos registros."}, {"id": "rId97", "path": "images/rId97.png", "description": "Descripción 44"}, ] # Gradio layout setup with gr.Blocks() as demo: with gr.Row(): with gr.Column(scale=1): # Agregar el video al inicio video = gr.Video(value="video.mp4", label="Video de Introducción") # Agregar las imágenes en un grid de 3 columnas por fila # Sección de acordeón para las imágenes with gr.Accordion("Mostrar imágenes", open=True): for i in range(0, len(images), 3): with gr.Row(): for j in range(3): if i + j < len(images): with gr.Column(scale=1): gr.Image(value=images[i + j]["path"]) gr.Markdown(images[i + j]["description"]) chatbot_output = gr.Chatbot(label="ChatBot") chatbot_input = gr.Textbox(label="Tu mensaje") submit_button = gr.Button("Enviar") chatbot_history = gr.State(value=[]) image_url = gr.State(value=None) # Agregar un botón para descargar el PDF download_button = gr.File(label="Descargar Informe sobre Administración de Medicamentos a Recién Nacidos", value="Reporte.pdf") # Main accordion for categories with gr.Accordion("Categorías de Preguntas", open=True): # Diagnósticos Accordion with gr.Accordion("Diagnósticos", open=False): # Subaccordion for Diagnósticos Comunes with gr.Accordion("Diagnósticos Comunes", open=False): button_1 = gr.Button("¿Cuál es el diagnóstico más común en el conjunto de datos?") button_2 = gr.Button("¿Qué porcentaje del total de registros corresponde al diagnóstico 'Nacido Vivo Único' (Z370)?") button_3 = gr.Button("¿Cuáles son los diagnósticos más comunes que requieren hospitalización prolongada?") button_4 = gr.Button("¿Cuáles son los códigos CIE-10 relacionados con infecciones neonatales?") button_5 = gr.Button("¿Qué tan frecuentes son los diagnósticos relacionados con nacimientos prematuros?") button_6 = gr.Button("¿Cuáles son los diagnósticos menos comunes en el conjunto de datos?") # Recommendation-oriented question button_7 = gr.Button("¿Qué mejoras pueden implementarse para reducir la incidencia de diagnósticos comunes?") # Subaccordion for Diagnósticos Críticos with gr.Accordion("Diagnósticos Críticos", open=False): button_8 = gr.Button("¿Cuál es la incidencia de diagnósticos graves como el 'Síndrome de Dificultad Respiratoria' (P220)?") button_9 = gr.Button("¿Cuál es la tasa de mortalidad asociada a estos diagnósticos graves?") button_10 = gr.Button("¿Qué porcentaje de neonatos con sepsis requiere cuidados intensivos?") # Recommendation-oriented question button_11 = gr.Button("¿Qué medidas preventivas pueden reducir los diagnósticos críticos en neonatos?") # Subaccordion for Codificación y Clasificación with gr.Accordion("Codificación y Clasificación", open=False): button_12 = gr.Button("¿Qué códigos CIE-10 están asociados con infecciones en neonatos?") button_13 = gr.Button("¿Qué diagnósticos están clasificados bajo el código P00-P96 en neonatos?") # Recommendation-oriented question button_14 = gr.Button("¿Cómo puede mejorarse la codificación para identificar con precisión los diagnósticos neonatales?") # Tratamientos Accordion with gr.Accordion("Tratamientos", open=False): # Subaccordion for Medicamentos Comunes with gr.Accordion("Medicamentos Comunes", open=False): button_15 = gr.Button("¿Cuáles son los medicamentos más utilizados en neonatos?") button_16 = gr.Button("¿Cuál es el medicamento más utilizado para infecciones neonatales?") button_17 = gr.Button("¿Cuáles son los efectos secundarios más comunes de estos medicamentos?") # Recommendation-oriented question button_18 = gr.Button("¿Qué mejoras pueden hacerse en la administración de medicamentos para minimizar efectos secundarios en neonatos?") # Subaccordion for Intervenciones Médicas with gr.Accordion("Intervenciones Médicas", open=False): button_19 = gr.Button("¿Cuál es la proporción de diagnósticos que requieren intervención quirúrgica?") button_20 = gr.Button("¿Cuáles son las complicaciones más frecuentes durante las intervenciones quirúrgicas en neonatos?") button_21 = gr.Button("¿Cuál es la tasa de éxito de las intervenciones quirúrgicas en neonatos?") # Recommendation-oriented question button_22 = gr.Button("¿Qué mejoras pueden implementarse para reducir las complicaciones durante intervenciones quirúrgicas?") # Estadísticas y Frecuencia Accordion with gr.Accordion("Estadísticas y Frecuencia", open=False): # Subaccordion for Estadísticas Generales with gr.Accordion("Estadísticas Generales", open=False): button_23 = gr.Button("¿Qué porcentaje de los registros corresponde al diagnóstico de 'Nacido Vivo Único' (Z370)?") button_24 = gr.Button("¿Cuál es la distribución por edad gestacional de los neonatos en el conjunto de datos?") button_25 = gr.Button("¿Cuál es la tasa de readmisión hospitalaria en neonatos?") # Recommendation-oriented question button_26 = gr.Button("¿Qué cambios pueden hacerse para reducir la tasa de readmisión hospitalaria en neonatos?") # Subaccordion for Diferencias Geográficas with gr.Accordion("Diferencias Geográficas", open=False): button_27 = gr.Button("¿Cómo varía el acceso a medicamentos entre regiones?") button_28 = gr.Button("¿Existen diferencias significativas en las tasas de diagnóstico entre diferentes regiones?") button_29 = gr.Button("¿Cómo varía la mortalidad neonatal entre diferentes departamentos?") # Recommendation-oriented question button_30 = gr.Button("¿Qué políticas pueden implementarse para mejorar el acceso a medicamentos en regiones menos desarrolladas?") # Subaccordion for Análisis Temporal with gr.Accordion("Análisis Temporal", open=False): button_31 = gr.Button("¿Existen patrones estacionales en la administración de medicamentos?") button_32 = gr.Button("¿Cómo han cambiado las tasas de mortalidad neonatal a lo largo de los años?") button_33 = gr.Button("¿Existen variaciones en la incidencia de diagnósticos críticos a lo largo del año?") # Recommendation-oriented question button_34 = gr.Button("¿Qué estrategias pueden implementarse para reducir la mortalidad neonatal en períodos estacionales críticos?") # Impacto y Calidad de Datos Accordion with gr.Accordion("Impacto y Calidad de Datos", open=False): # Subaccordion for Impacto en la Salud Neonatal with gr.Accordion("Impacto en la Salud Neonatal", open=False): button_35 = gr.Button("¿Cómo impacta el uso de antibióticos en la recuperación neonatal?") button_36 = gr.Button("¿Qué mejoras se pueden implementar en la atención neonatal?") button_37 = gr.Button("¿Cuál es la efectividad de las medidas preventivas en la reducción de infecciones neonatales?") # Recommendation-oriented question button_38 = gr.Button("¿Qué nuevas estrategias de prevención pueden implementarse para reducir infecciones neonatales?") # Subaccordion for Calidad de Datos with gr.Accordion("Calidad de Datos", open=False): button_39 = gr.Button("¿Cuáles son las limitaciones de los datos sobre salud neonatal?") button_40 = gr.Button("¿Qué tan completos y precisos son los registros de diagnóstico?") button_41 = gr.Button("¿Cómo afecta la calidad de los datos a la investigación y atención neonatal?") # Recommendation-oriented question button_42 = gr.Button("¿Qué mejoras pueden implementarse para aumentar la calidad y precisión de los datos neonatales?") with gr.Column(scale=1): image_output = gr.Image(label="Imagen asociada") def process_input(message, history): full_response, image = chat_function(message, history) history.append((message, full_response)) return history, history, image # Function to update chatbot input with preset question def send_preset_question(question, history): return process_input(question, history) # Assign the buttons to send the respective categorized questions button_assignments = [ (button_1, "¿Cuál es el diagnóstico más común en el conjunto de datos?"), (button_2, "¿Qué porcentaje del total de registros corresponde al diagnóstico 'Nacido Vivo Único' (Z370)?"), (button_3, "¿Cuáles son los diagnósticos más comunes que requieren hospitalización prolongada?"), (button_4, "¿Cuáles son los códigos CIE-10 relacionados con infecciones neonatales?"), (button_5, "¿Qué tan frecuentes son los diagnósticos relacionados con nacimientos prematuros?"), (button_6, "¿Cuáles son los diagnósticos menos comunes en el conjunto de datos?"), (button_7, "¿Qué mejoras pueden implementarse para reducir la incidencia de diagnósticos comunes?"), (button_8, "¿Cuál es la incidencia de diagnósticos graves como el 'Síndrome de Dificultad Respiratoria' (P220)?"), (button_9, "¿Cuál es la tasa de mortalidad asociada a estos diagnósticos graves?"), (button_10, "¿Qué porcentaje de neonatos con sepsis requiere cuidados intensivos?"), (button_11, "¿Qué medidas preventivas pueden reducir los diagnósticos críticos en neonatos?"), (button_12, "¿Qué códigos CIE-10 están asociados con infecciones en neonatos?"), (button_13, "¿Qué diagnósticos están clasificados bajo el código P00-P96 en neonatos?"), (button_14, "¿Cómo puede mejorarse la codificación para identificar con precisión los diagnósticos neonatales?"), (button_15, "¿Cuáles son los medicamentos más utilizados en neonatos?"), (button_16, "¿Cuál es el medicamento más utilizado para infecciones neonatales?"), (button_17, "¿Cuáles son los efectos secundarios más comunes de estos medicamentos?"), (button_18, "¿Qué mejoras pueden hacerse en la administración de medicamentos para minimizar efectos secundarios en neonatos?"), (button_19, "¿Cuál es la proporción de diagnósticos que requieren intervención quirúrgica?"), (button_20, "¿Cuáles son las complicaciones más frecuentes durante las intervenciones quirúrgicas en neonatos?"), (button_21, "¿Cuál es la tasa de éxito de las intervenciones quirúrgicas en neonatos?"), (button_22, "¿Qué mejoras pueden implementarse para reducir las complicaciones durante intervenciones quirúrgicas?"), (button_23, "¿Qué porcentaje de los registros corresponde al diagnóstico de 'Nacido Vivo Único' (Z370)?"), (button_24, "¿Cuál es la distribución por edad gestacional de los neonatos en el conjunto de datos?"), (button_25, "¿Cuál es la tasa de readmisión hospitalaria en neonatos?"), (button_26, "¿Qué cambios pueden hacerse para reducir la tasa de readmisión hospitalaria en neonatos?"), (button_27, "¿Cómo varía el acceso a medicamentos entre regiones?"), (button_28, "¿Existen diferencias significativas en las tasas de diagnóstico entre diferentes regiones?"), (button_29, "¿Cómo varía la mortalidad neonatal entre diferentes departamentos?"), (button_30, "¿Qué políticas pueden implementarse para mejorar el acceso a medicamentos en regiones menos desarrolladas?"), (button_31, "¿Existen patrones estacionales en la administración de medicamentos?"), (button_32, "¿Cómo han cambiado las tasas de mortalidad neonatal a lo largo de los años?"), (button_33, "¿Existen variaciones en la incidencia de diagnósticos críticos a lo largo del año?"), (button_34, "¿Qué estrategias pueden implementarse para reducir la mortalidad neonatal en períodos estacionales críticos?"), (button_35, "¿Cómo impacta el uso de antibióticos en la recuperación neonatal?"), (button_36, "¿Qué mejoras se pueden implementar en la atención neonatal?"), (button_37, "¿Cuál es la efectividad de las medidas preventivas en la reducción de infecciones neonatales?"), (button_38, "¿Qué nuevas estrategias de prevención pueden implementarse para reducir infecciones neonatales?"), (button_39, "¿Cuáles son las limitaciones de los datos sobre salud neonatal?"), (button_40, "¿Qué tan completos y precisos son los registros de diagnóstico?"), (button_41, "¿Cómo afecta la calidad de los datos a la investigación y atención neonatal?"), (button_42, "¿Qué mejoras pueden implementarse para aumentar la calidad y precisión de los datos neonatales?") ] for button, question in button_assignments: button.click(send_preset_question, inputs=[gr.State(value=question), chatbot_history], outputs=[chatbot_output, chatbot_history, image_url]) submit_button.click(process_input, inputs=[chatbot_input, chatbot_history], outputs=[chatbot_output, chatbot_history, image_url]) image_url.change(fn=update_image, inputs=image_url, outputs=image_output) # Launch the interface demo.launch(debug=True)