Proyecto_50 / app.py
JairoCesar's picture
Update app.py
5e6f9c4 verified
# 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()