import gradio as gr from openai import OpenAI import google.generativeai as genai import os client = OpenAI(api_key = os.environ["openai"]) # Configure key genai.configure(api_key=os.environ["gemini"]) conf = genai.types.GenerationConfig( temperature= 0.0, ) safety_settings = [ { "category": "HARM_CATEGORY_DANGEROUS", "threshold": "BLOCK_NONE", }, { "category": "HARM_CATEGORY_HARASSMENT", "threshold": "BLOCK_NONE", }, { "category": "HARM_CATEGORY_HATE_SPEECH", "threshold": "BLOCK_NONE", }, { "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT", "threshold": "BLOCK_NONE", }, { "category": "HARM_CATEGORY_DANGEROUS_CONTENT", "threshold": "BLOCK_NONE", }, ] def gemini_pro(text): model = genai.GenerativeModel('gemini-1.5-pro', generation_config=conf,safety_settings=safety_settings) response = model.generate_content(f"""Eres un asistente que asiste en auditar una consulta médica de telemedicina. Evalúa los siguientes puntos: - Calidad de la epicrisis - Si el diagnóstico final es acorde a la epriciris - Si el tratamiento fue acorde a la interpretación - Si el reposo (en caso de existir) fue correctamente indicado - Si la duración de la consulta fue acorde (mayor a 3 minutos) - En caso de que se haya prescripto un medicamento, evaluar si el medicamento prescripto es acorde al diagnóstico, tanto en tipo de medicamento como en dósis. Si no se prescribió ningún medicamento y no correspondía prescribirlo la evaluación debe ser positiva. Con toda la evaluación genera un json con los puntajes para cada punto, el puntaje final (promedio de los puntajes para cada punto, debe ir de 1 a 10) y comentarios para la atención en general. La puntuación debe ir de 0 a 10. 0 es un atención de muy mala calidad y 10 es una atención de calidad excelente. El json debe tener únicamente la siguientes keys: 'Calidad_epicrisis','Diagnostico_corresponde_epicrisis','Tratamiento_acorde_interpretacion','Reposo_correctamente_indicado','Duracion_consulta_acorde', 'Medicamento_correctamente_administrado', 'Puntaje_Final', 'Comentarios'. No agregar keys distintas a las mencionadas. Con la consulta: ```{text}```""") return response.text.replace('```json','').replace('```','') def gemini_flash(text): model = genai.GenerativeModel('gemini-1.5-flash', generation_config=conf,safety_settings=safety_settings) response = model.generate_content(f"""Eres un asistente que asiste en auditar una consulta médica de telemedicina. Evalúa los siguientes puntos: - Calidad de la epicrisis - Si el diagnóstico final es acorde a la epriciris - Si el tratamiento fue acorde a la interpretación - Si el reposo (en caso de existir) fue correctamente indicado - Si la duración de la consulta fue acorde (mayor a 3 minutos) - En caso de que se haya prescripto un medicamento, evaluar si el medicamento prescripto es acorde al diagnóstico, tanto en tipo de medicamento como en dósis. Si no se prescribió ningún medicamento y no correspondía prescribirlo la evaluación debe ser positiva. Con toda la evaluación genera un json con los puntajes para cada punto, el puntaje final (promedio de los puntajes para cada punto, debe ir de 1 a 10) y comentarios para la atención en general. La puntuación debe ir de 0 a 10. 0 es un atención de muy mala calidad y 10 es una atención de calidad excelente. El json debe tener únicamente la siguientes keys: 'Calidad_epicrisis','Diagnostico_corresponde_epicrisis','Tratamiento_acorde_interpretacion','Reposo_correctamente_indicado','Duracion_consulta_acorde', 'Medicamento_correctamente_administrado', 'Puntaje_Final', 'Comentarios'. No agregar keys distintas a las mencionadas. Con la consulta: ```{text}```""") return response.text.replace('```json','').replace('```','') def process_selection(text, model): # Selección del modelo según la opción escogida if model == "GPT-4o": resumen = chatgpt_response(text) elif model == "Gemini Pro": resumen = gemini_pro(text) elif model == "Gemini Flash": resumen = gemini_flash(text) print("RESUMEN",resumen) # Evalúa el string JSON a un diccionario de Python resumen = eval(resumen) # Manejar claves faltantes proporcionando valores predeterminados calidad_epicrisis = resumen.get('Calidad_epicrisis', 'No disponible') diagnostico_corresponde_epicrisis = resumen.get('Diagnostico_corresponde_epicrisis', 'No disponible') tratamiento_acorde_interpretacion = resumen.get('Tratamiento_acorde_interpretacion', 'No disponible') reposo_correctamente_indicado = resumen.get('Reposo_correctamente_indicado', 'No disponible') duracion_consulta_acorde = resumen.get('Duracion_consulta_acorde', 'No disponible') medicamento_correctamente_administrado = resumen.get('Medicamento_correctamente_administrado', 'No disponible') puntaje_final = resumen.get('Puntaje_Final', 'No disponible') comentarios = resumen.get('Comentarios', 'No disponible') # Formatear la salida return f"""## Evaluación de la consulta médica: - **Calidad de la Epicrisis:** {calidad_epicrisis} - **Diagnóstico corresponde a la Epicrisis:** {diagnostico_corresponde_epicrisis} - **Tratamiento acorde a la Interpretación:** {tratamiento_acorde_interpretacion} - **Reposo correctamente indicado:** {reposo_correctamente_indicado} - **Duración de la consulta acorde:** {duracion_consulta_acorde} - **Medicamento correctamente administrado:** {medicamento_correctamente_administrado} ### Puntaje final: - **Puntaje (0-10):** {puntaje_final} ### Comentarios: {comentarios} """ def chatgpt_response(text): response = client.chat.completions.create( model="gpt-4o", response_format={ "type": "json_object" }, messages=[ {"role": "system", "content": """ Eres un asistente que asiste en auditar una consulta médica de telemedicina. Evalúa los siguientes puntos: - Calidad de la epicrisis - Si el diagnóstico final es acorde a la epriciris - Si el tratamiento fue acorde a la interpretación - Si el reposo (en caso de existir) fue correctamente indicado - Si la duración de la consulta fue acorde (mayor a 3 minutos) - En caso de que se haya prescripto un medicamento, evaluar si el medicamento prescripto es acorde al diagnóstico, tanto en tipo de medicamento como en dósis. Si no se prescribió ningún medicamento y no correspondía prescribirlo la evaluación debe ser positiva. Con toda la evaluación genera un json con los puntajes para cada punto, el puntaje final (promedio de los puntajes para cada punto, debe ir de 1 a 10) y comentarios para la atención en general. La puntuación debe ir de 0 a 10. 0 es un atención de muy mala calidad y 10 es una atención de calidad excelente. El json debe tener únicamente la siguientes keys: 'Calidad_epicrisis','Diagnostico_corresponde_epicrisis','Tratamiento_acorde_interpretacion','Reposo_correctamente_indicado','Duracion_consulta_acorde', 'Medicamento_correctamente_administrado', 'Puntaje_Final', 'Comentarios'. No agregar keys distintas a las mencionadas. """}, {"role": "user", "content": text} ] ) return response.choices[0].message.content.replace('```json','').replace('```','') examples = [ ["""Epicrisis: Consulta por anemia. Antecedentes de obesidad, HTA, inicio anticonceptivos y a los pocos días las dejo de tomar por hemorragia. Reinicio y volvió a tener sangrado abundante. Tuvo síntomas de taquicardia. Tiene control con medico de cabecera la semana entrante. Diagnostico: Consulta por anemia. Tratamiento: Se recomienda iniciar suplementos de hierro oral (sulfato ferroso) para tratar la anemia ferropénica. Si el sangrado está relacionado con el uso de anticonceptivos, se sugiere su suspensión y una consulta con un ginecólogo para evaluar alternativas de manejo del sangrado. Reposo: 48 horas. Duración: 300 segundos. Medicamento: sulfato ferroso .""", "GPT-4o"], ["""Epicrisis: Consulta por hipertensión arterial. Paciente presenta antecedentes familiares de HTA y refiere episodios de cefalea, mareos y visión borrosa. Se realiza medición de presión arterial y se encuentra elevada en varias ocasiones. Se programó control en 1 mes con análisis de laboratorio. Diagnóstico: Hipertensión arterial. Tratamiento: Se recomienda iniciar tratamiento antihipertensivo con lisinopril 10 mg una vez al día. Se aconseja llevar un registro diario de la presión arterial y realizar cambios en el estilo de vida, como una dieta baja en sodio y aumento de actividad física. Reposo: Reposo relativo según la tolerancia. Duración: 360 segundos. Medicamento: lisinopril.""", "Gemini Pro"], ["""Epicrisis: Consulta por dolor torácico. Paciente refiere dolor en el pecho de inicio súbito, con irradiación a brazo izquierdo. Refiere antecedentes de ansiedad y estrés, pero no ha sido evaluado por un médico. Se le pregunta sobre síntomas asociados y menciona que ha tenido palpitaciones. El médico realiza una evaluación superficial sin solicitar estudios complementarios y no considera la historia clínica previa. Diagnóstico: Dolor torácico no diagnosticado. Tratamiento: No se prescribe tratamiento ni se recomienda seguimiento. El paciente es dado de alta con una recomendación genérica de "descansar" y volver si los síntomas persisten. Reposo: No se indica reposo específico. Duración: 100 segundos. Medicamento: Ninguno.""", "Gemini Flash"] ] iface = gr.Interface( fn=process_selection, inputs=[gr.Textbox(label="Descripción de la consulta"),gr.Dropdown(choices=['GPT-4o','Gemini Pro', 'Gemini Flash'], label="Modelo")], outputs="markdown", examples=examples, title="🔍 AI HealthAudit 🩺" ) iface.launch(debug=True)