es-labs-2.0 / app.py
naughtondale's picture
Update app.py
dbd6a2e
import gradio as gr
import openai
from PyPDF2 import PdfReader # Updated import
import io
from openai import OpenAI
import os
# Define your OpenAI API key
openai.api_key = os.environ.get('openai_api_key')
#client = openai.OpenAI(api_key="sk-none")
client = openai.OpenAI(api_key=os.environ.get('openai_api_key'))
# Function to read PDF and extract text
def pdf_to_text(pdf_file):
try:
pdf_reader = PdfReader(io.BytesIO(pdf_file))
text_content = ''
for page in pdf_reader.pages:
text_content += page.extract_text()
return text_content
except Exception as e:
return f"Failed to extract text from PDF: {str(e)}"
def call_openai_model(text_content, question):
try:
conversation = [
{"role": "system", "content": "You are a Spanish-speaking chatbot that adopts the persona of a doctor who answers questions about users' uploaded lab results.As an AI doctor you are kind,courteous, friendly, and professional. You address the patient by name if it is on the lab report, and use second person pronouns (you/your) when talking to the patient who you assume uploaded the results.You allow the patient to upload their lab report in PDF format and ask questions about the results.You then intelligently respond in natural language to user questions and directions based only on the contents of the report uploaded. You also examine the uploaded document and if it does not seem like a lab report or a medical document, you politely explain to the user that you are only trained to answer questions on lab reports or medical documents. You only respond or communicate to the user in Spanish or Espanol."},
{"role": "user", "content": text_content},
{"role": "user", "content": question}
]
response = client.chat.completions.create(
model="gpt-4-1106-preview",
messages=conversation
)
#return response["choices"][0]["message"]["content"]
return response.choices[0].message.content
except Exception as e:
return f"OpenAI API error: {str(e)}"
# Define a stateful function to keep the conversation history
history = []
def stateful_chatbot(pdf_file=None, question=""):
try:
if pdf_file is not None:
text_content = pdf_to_text(pdf_file)
history.append(('Document', text_content))
else:
text_content = history[-1][1] if history else ""
if question:
answer = call_openai_model(text_content, question)
history.append(('Q', question))
history.append(('A', answer))
else:
answer = ""
conversation = "\n".join([f"{turn[0]}: {turn[1]}" for turn in history])
except Exception as e:
conversation = "An error occurred: " + str(e)
answer = "An error occurred: " + str(e)
return answer
# Gradio interface with error catching
iface = gr.Interface(
fn=stateful_chatbot,
inputs=[
gr.File(label="Upload PDF Document", type="binary"),
gr.Textbox(lines=2, placeholder="Ask a question...")
],
outputs=[
#gr.Textbox(label="Conversation History")
gr.Textbox(label="Answer")
],
allow_flagging="never",
live=False,
theme=gr.themes.Monochrome(
primary_hue="blue",
secondary_hue="blue",
neutral_hue="blue"),
title="Sistema de IA para Laboratorios de Salud",
description = '''
Conoce a "Health Labs", tu analista de salud personal e innovador, diseñado para revolucionar la manera en que interactúas con los resultados de análisis que recibes después de hacerte pruebas en un laboratorio, clínica u hospital que visitaste para verificar una condición de salud específica o tu salud general. Dichos informes suelen tener muchos términos médicos desconocidos y métricas que nuestro doctor, tratando con una larga cola de pacientes, podría no tener tiempo de explicar en detalle. Health Labs te brindará toda la atención que desees por todo el tiempo que quieras, ofreciendo explicaciones de cualquier cosa de la manera más sencilla que desees. Aconsejamos que confirmes esas explicaciones o recomendaciones con tu verdadero médico o clínico antes de hacer una aplicación personal o tomar decisiones. Para comenzar, simplemente sigue las instrucciones a continuación con una copia reciente de tus resultados de laboratorio en mano.
INSTRUCCIONES:
Escanea el código QR (con tu móvil/cámara web) que se encuentra en la esquina superior derecha de tus resultados de pruebas impresos y sube el PDF que obtengas del enlace generado a Health Labs.
Escribe tu pregunta en el cuadro de texto que está debajo del área de carga de documentos. La pregunta debe ser relevante y potencialmente respondida en el documento de laboratorio que subiste.
Haz clic en 'Enviar' para comenzar el proceso de respuesta. Recibirás una respuesta poco después en el cuadro de salida desplazable, dependiendo de la complejidad de la pregunta. Haz tantas preguntas o solicita tantas sugerencias sobre tu condición de salud como desees.
Haz clic en 'Borrar' para eliminar el documento enviado, la pregunta y la respuesta, para que puedas subir otro documento y hacer preguntas sobre él.
''')
iface.launch()