Spaces:
Sleeping
Sleeping
| # 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() |