Spaces:
Sleeping
Sleeping
import streamlit as st | |
from crewai import Agent, Task, Crew, Process | |
import os | |
from crewai_tools import ScrapeWebsiteTool, SerperDevTool | |
from dotenv import load_dotenv | |
from langchain_openai import ChatOpenAI | |
from docx import Document | |
from io import BytesIO | |
import base64 | |
load_dotenv() | |
# LLM object and API Key | |
os.environ["OPENAI_API_KEY"] = os.getenv("OPENAI_API_KEY") | |
os.environ["SERPER_API_KEY"] = os.getenv("SERPER_API_KEY") | |
def generate_docx(result): | |
doc = Document() | |
doc.add_heading('Healthcare Diagnosis and Treatment Recommendations', 0) | |
doc.add_paragraph(result) | |
bio = BytesIO() | |
doc.save(bio) | |
bio.seek(0) | |
return bio | |
def get_download_link(bio, filename): | |
b64 = base64.b64encode(bio.read()).decode() | |
return f'<a href="data:application/vnd.openxmlformats-officedocument.wordprocessingml.document;base64,{b64}" download="{filename}">Download Diagnosis and Treatment Plan</a>' | |
st.set_page_config( | |
layout="wide" | |
) | |
# Title | |
st.title("AI Agents to Empower Doctors") | |
# Text Inputs | |
gender = st.selectbox('Select Gender', ('Male', 'Female', 'Other')) | |
age = st.number_input('Enter Age', min_value=0, max_value=120, value=25) | |
symptoms = st.text_area('Enter Symptoms', 'e.g., fever, cough, headache') | |
medical_history = st.text_area('Enter Medical History', 'e.g., diabetes, hypertension') | |
# Initialize Tools | |
search_tool = SerperDevTool() | |
scrape_tool = ScrapeWebsiteTool() | |
llm = ChatOpenAI( | |
model="gpt-3.5-turbo-16k", | |
temperature=0.1, | |
max_tokens=8000 | |
) | |
# Define Agents | |
diagnostician = Agent( | |
role="Medical Diagnostician", | |
goal="Analyze patient symptoms and medical history to provide a preliminary diagnosis.", | |
backstory="This agent specializes in diagnosing medical conditions based on patient-reported symptoms and medical history. It uses advanced algorithms and medical knowledge to identify potential health issues.", | |
verbose=True, | |
allow_delegation=False, | |
tools=[search_tool, scrape_tool], | |
llm=llm | |
) | |
treatment_advisor = Agent( | |
role="Treatment Advisor", | |
goal="Recommend appropriate treatment plans based on the diagnosis provided by the Medical Diagnostician.", | |
backstory="This agent specializes in creating treatment plans tailored to individual patient needs. It considers the diagnosis, patient history, and current best practices in medicine to recommend effective treatments.", | |
verbose=True, | |
allow_delegation=False, | |
tools=[search_tool, scrape_tool], | |
llm=llm | |
) | |
# Define Tasks | |
diagnose_task = Task( | |
description=( | |
"1. Analyze the patient's symptoms ({symptoms}) and medical history ({medical_history}).\n" | |
"2. Provide a preliminary diagnosis with possible conditions based on the provided information.\n" | |
"3. Limit the diagnosis to the most likely conditions." | |
), | |
expected_output="A preliminary diagnosis with a list of possible conditions.", | |
agent=diagnostician | |
) | |
treatment_task = Task( | |
description=( | |
"1. Based on the diagnosis, recommend appropriate treatment plans step by step.\n" | |
"2. Consider the patient's medical history ({medical_history}) and current symptoms ({symptoms}).\n" | |
"3. Provide detailed treatment recommendations, including medications, lifestyle changes, and follow-up care." | |
), | |
expected_output="A comprehensive treatment plan tailored to the patient's needs.", | |
agent=treatment_advisor | |
) | |
# Create Crew | |
crew = Crew( | |
agents=[diagnostician, treatment_advisor], | |
tasks=[diagnose_task, treatment_task], | |
verbose=2 | |
) | |
# Execution | |
if st.button("Get Diagnosis and Treatment Plan"): | |
with st.spinner('Generating recommendations...'): | |
result = crew.kickoff(inputs={"symptoms": symptoms, "medical_history": medical_history}) | |
st.write(result) | |
docx_file = generate_docx(result) | |
download_link = get_download_link(docx_file, "diagnosis_and_treatment_plan.docx") | |
st.markdown(download_link, unsafe_allow_html=True) |