File size: 5,814 Bytes
dab6e6a
 
 
 
 
 
5e6f9c4
 
 
dab6e6a
5e6f9c4
 
dab6e6a
5e6f9c4
 
 
 
 
 
 
 
 
 
 
b1a364e
5e6f9c4
 
 
 
 
 
 
 
b1a364e
5e6f9c4
771d4ac
5e6f9c4
 
 
 
 
771d4ac
5e6f9c4
 
 
 
 
 
 
 
 
29c0acf
5e6f9c4
 
 
b1a364e
5e6f9c4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b1a364e
 
 
 
5e6f9c4
 
b069a16
771d4ac
ee377a3
5e6f9c4
 
 
ee377a3
771d4ac
 
a104661
 
5e6f9c4
 
a104661
771d4ac
b1a364e
5e6f9c4
771d4ac
b1a364e
5e6f9c4
 
 
 
 
b1a364e
5e6f9c4
 
b1a364e
 
5e6f9c4
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
   
#            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()