# PATIO DE JUEGOS DE INTELIGENCIA ARTIFICIAL # PROYECTO 50 Consulta Médica colombiana IA # Consejero Médico regional personalizado # Bogota colombia 2024 import gradio as gr import os import google.generativeai as genai # --- CONFIGURACIÓN DE GEMINI --- GEMINI_API_KEY = os.getenv("GEMINI_API_KEY") if not GEMINI_API_KEY: print("Error: GEMINI_API_KEY no encontrada. Por favor configúrala en tus variables de entorno.") # En un script real, podrías querer salir o levantar una excepción aquí. # Para Gradio, si la clave no está, la llamada a la API fallará más tarde. # exit() # Descomentar si quieres que el script termine si no hay clave else: try: genai.configure(api_key=GEMINI_API_KEY) except Exception as e: print(f"Error al configurar Gemini API: {e}") # exit() # Descomentar si quieres que el script termine si la configuración falla # Inicializar el modelo Gemini (puedes cambiar "gemini-1.5-flash" por otro, ej. "gemini-1.5-pro-latest") # Usamos "gemini-1.5-flash" por ser más rápido y económico, adecuado para muchos casos de chat. try: gemini_model = genai.GenerativeModel("gemini-1.5-flash") print("Modelo Gemini inicializado correctamente.") except Exception as e: print(f"Error al inicializar el modelo Gemini: {e}") gemini_model = None # Asegurarse de que la app no intente usar un modelo no inicializado # Función para manejar la completación del chat con Gemini def chat_con_bot(ciudad, informacion_clinica): if not gemini_model: return "Error: El modelo Gemini no está disponible. Verifica la configuración de la API Key y el modelo." if not GEMINI_API_KEY: # Doble chequeo por si el print anterior no detuvo la ejecución return "Error: GEMINI_API_KEY no configurada. La aplicación no puede funcionar." mensaje_usuario = f"Ciudad: {ciudad}. Información clínica: {informacion_clinica}" # El prompt para Gemini puede beneficiarse de un rol o instrucción más explícita # sobre cómo debe actuar, similar a un system prompt. # Por ejemplo, podrías anteponer: # "Eres un consejero médico colombiano. Proporciona información basada en los siguientes datos, ajustando tu lenguaje según el nivel educativo y la epidemiología local." # Sin embargo, para mantener la similitud con el original, solo pasamos el mensaje. # Para Gemini, los parámetros como temperature, max_tokens, top_p se pasan en `generation_config` generation_config = genai.types.GenerationConfig( temperature=0.7, max_output_tokens=1024, # Equivalente a max_tokens en Groq top_p=1 # stop_sequences=None # Equivalente a stop en Groq, si lo necesitas ) try: completion = gemini_model.generate_content( mensaje_usuario, generation_config=generation_config, stream=True ) respuesta = "" for chunk in completion: # Gemini chunks tienen el texto directamente en chunk.text (o en partes si hay candidatos múltiples) # Para un chat simple, chunk.text suele ser suficiente. if chunk.parts: # Más robusto para manejar diferentes tipos de chunks respuesta += "".join(part.text for part in chunk.parts if hasattr(part, 'text')) elif hasattr(chunk, 'text') and chunk.text: respuesta += chunk.text except Exception as e: print(f"Error durante la llamada a Gemini API: {e}") return f"Hubo un error al procesar tu solicitud con Gemini: {str(e)}" return respuesta # Configurar la interfaz de Gradio usando Blocks with gr.Blocks(theme=gr.themes.Soft()) as interfaz: # Añadido un tema suave para mejor apariencia gr.Markdown("# Consulta Médica colombiana IA\nModelo Gemini 1.5 Flash en español") # Actualizado el modelo with gr.Row(): informacion_clinica = gr.Textbox( label="¿Cuáles son tus síntomas, desde cuándo aparecieron, cuál es tu sexo, edad, y antecedentes médicos, fármacos y si hay algún hallazgo físico observable?", lines=5, # Más espacio para texto largo placeholder="Ej: Dolor de cabeza y fiebre desde hace 2 días, mujer, 30 años, sufro de migraña, tomo ibuprofeno, no veo nada raro al examinarme." ) with gr.Row(): ciudad = gr.Textbox( label="¿En qué ciudad o municipio vives (para ajustes epidemiológicos) y qué nivel de educación tienes (para ajustar la explicación de tu enfermedad)?", value="Bogotá", placeholder="Ej: Medellín, bachiller" ) with gr.Row(): respuesta_bot = gr.Textbox(label="Respuesta del Consejero Médico IA", lines=10, interactive=False) # Renombrado para claridad y hecho no interactivo with gr.Row(): enviar = gr.Button("Enviar Consulta") # Texto del botón más descriptivo limpiar = gr.Button("Limpiar Campos") def limpiar_campos(): return "Bogotá", "", "" # Limpia ciudad (a Bogotá), información clínica y respuesta enviar.click(fn=chat_con_bot, inputs=[ciudad, informacion_clinica], outputs=respuesta_bot) limpiar.click(fn=limpiar_campos, inputs=None, outputs=[ciudad, informacion_clinica, respuesta_bot]) # Asegúrate de que 'respuesta_bot' coincide con el nombre del output Textbox # Lanzar la aplicación if __name__ == "__main__": if not GEMINI_API_KEY or not gemini_model: print("No se puede iniciar la interfaz de Gradio debido a problemas con la API de Gemini.") print("Por favor, asegúrate de que la variable de entorno GEMINI_API_KEY está configurada correctamente.") else: interfaz.launch()