import gradio as gr from openai import OpenAI import google.generativeai as genai import os client = OpenAI(api_key = os.environ["openai"]) def chatgpt_response(text): response = client.chat.completions.create( model="gpt-4o", messages=[ {"role": "system", "content": """Eres un asistente médico que ayuda en el proceso asistencial a un médico facilitando la escritura de la historia clínica. Para responder exclusivamente utilizaras la información que se te brinda delimitada entre ``` ``` NO AGREGARÁS NI INVENTARÁS INFORMACIÓN EXTRA Basandote en la consulta médica proporciona un resumen conciso y preciso ORGANIZADO en los siguientes campos de una historia clinica: 1-motivo_de_consulta: Motivo de consulta y ademas muestra la terminología médica en CIE-10 (En forma de string). 2-enfermedad_actual: Un resumen muy corto y conciso de la o las enfermedades actuales, utilizando terminología médica adecuada, como si fueras un profesional de salud (En forma de string). 3-antecedentes: Lista de antecedentes médicos relevantes del paciente (En forma de lista). 4-medicación: Lista de los medicamentos actuales que toma el paciente (En forma de lista). La respuesta debe ser un json y los nombres de las keys deben ser: motivo_de_consulta, enfermedad_actual, antecedentes y medicación """}, {"role": "user", "content": f"""```{text}```"""} ], temperature=0 ) return response.choices[0].message.content.replace('```json','').replace('```','') # 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 médico que ayuda en el proceso asistencial a un médico facilitando la escritura de la historia clínica. Para responder exclusivamente utilizaras la información que se te brinda delimitada entre ``` ``` NO AGREGARÁS NI INVENTARÁS INFORMACIÓN EXTRA Basandote en la consulta médica proporciona un resumen conciso y preciso ORGANIZADO en los siguientes campos de una historia clinica: 1-motivo_de_consulta: Motivo de consulta y ademas muestra la terminología médica en CIE-10 (En forma de string). 2-enfermedad_actual: Un resumen muy corto y conciso de la o las enfermedades actuales, utilizando terminología médica adecuada, como si fueras un profesional de salud (En forma de string). 3-antecedentes: Lista de antecedentes médicos relevantes del paciente (En forma de lista). 4-medicación: Lista de los medicamentos actuales que toma el paciente (En forma de lista). La respuesta debe ser un json y los nombres de las keys deben ser: motivo_de_consulta, enfermedad_actual, antecedentes y medicación por ej: ```{{ "motivo_de_consulta": "string", "enfermedad_actual": "string", "antecedentes": [ "string" ], "medicación": [ "string" ] }}``` ```{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 médico que ayuda en el proceso asistencial a un médico facilitando la escritura de la historia clínica. Para responder exclusivamente utilizaras la información que se te brinda delimitada entre ``` ``` NO AGREGARÁS NI INVENTARÁS INFORMACIÓN EXTRA Basandote en la consulta médica proporciona un resumen conciso y preciso ORGANIZADO en los siguientes campos de una historia clinica: 1-motivo_de_consulta: Motivo de consulta y ademas muestra la terminología médica en CIE-10 (En forma de string). 2-enfermedad_actual: Un resumen muy corto y conciso de la o las enfermedades actuales, utilizando terminología médica adecuada, como si fueras un profesional de salud (En forma de string). 3-antecedentes: Lista de antecedentes médicos relevantes del paciente (En forma de lista). 4-medicación: Lista de los medicamentos actuales que toma el paciente (En forma de lista). La respuesta debe ser un json y los nombres de las keys deben ser: motivo_de_consulta, enfermedad_actual, antecedentes y medicación por ej: ```{{ "motivo_de_consulta": "string", "enfermedad_actual": "string", "antecedentes": [ "string" ], "medicación": [ "string" ] }}``` ```{text}```""") return response.text.replace('```json','').replace('```','') def process_selection(text, model): if model == "GPT-4o": resumen = chatgpt_response(text) elif model == "Gemini Pro": resumen = gemini_pro(text) elif model == "Gemini Flash": resumen = gemini_flash(text) resumen = eval(resumen) # Handle missing keys by providing default values motivo_de_consulta = resumen.get('motivo_de_consulta', 'No disponible') enfermedad_actual = resumen.get('enfermedad_actual', 'No disponible') antecedentes = resumen.get('antecedentes', []) medicacion = resumen.get('medicación', []) # Convert lists to strings antecedentes = ', '.join(antecedentes) medicacion = ', '.join(medicacion) # Format output return f"""## Motivo de consulta: {motivo_de_consulta} ## Enfermedad actual: {enfermedad_actual} ## Antecedentes: {antecedentes} ## Medicación: {medicacion} """ examples = [ ["""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. Refiere palpitaciones y sensación de cansancio. Trae laboratorio HTo 27 Hb 8.9 Hb medicación habitual enalapril 10 mg . Niega signos de sangrado activo. impresiona cuadro de ansiedad de base en contexto de prequirurgico de cx bariatrica.. Anemia. reposo. explico síntomas de anemia, sugiero seguimiento por nutrición y psicología, reevaluar método anticonceptivo. Control ambulatorio de TA. en caso de persistencia de síntomas consultar a guardia .""", "GPT-4o"], ["""Paciente refiere histórico de hipertensión, refiere estar en un cambio de medicación (tomaba 40mg de telmisartán por dia y ahora losartan 80 mg dos veces al día) hace un mes. Presentó hoy 160/110, refiere haber tomado la pastilla y que bajo para 110/60. Refiere por el aumento de la presion estar sentiendose mal, con un malestar generel, pesadez en la cabeza. No refiere signos de alarma. Consulta para pedir constancia por el dia de hoy para presentar al trabajo. Refiere tener cita con su cardiologo de cabecera el jueves. Refiere estar con situaciones que le ocosionan estres. Como antecedentes refiere historico familiar de HTA.. Trastorno hipertensivo arterial sistémico. Se indican pautas de alarma, que haga control con su cardiologo de cabecera, medidas hieginicas dietarias y que siga con su medicacion habitual.""", "Gemini Pro"], ["""paciente refiere vomitos y diarrea de 12 horas de evolucion. Gastroenteritis. Reposo en domicilio, crema de bismuto: una cucharada sopera despues de cada deposicion diarreica, reliveran 20 gotas cada 8 horas, tafirol cada 8 horas. DIETA: arroz, fideos y verduras hervidas o al vapor, carne o pollo a la plancha, beber abundante agua, te o mate cocido; colacion con galletas de agua o tostadas y queso untable o mermelada ligth, manzana (pelada) banana o pera EVITAR comida con grasas, salsas, frituras, cremas, encurtidos, embutidos, mate y cafe. Abundante hidratacion con agua, te y mate cocido.""", "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="💡 Quick Med Report 🏥" ) iface.launch(debug=True)