Spaces:
Sleeping
Sleeping
File size: 6,524 Bytes
a554d99 |
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 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 |
import os
from crewai import Agent, Task, Crew
from langchain_groq import ChatGroq
import streamlit as st
from PIL import Image
import base64
from io import BytesIO
import pandas as pd # Import pandas for handling data in tabular format
# Initialize the LLM for the Doctor Assistant
llm = ChatGroq(
groq_api_key="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",
model_name="llama3-70b-8192", # Replace with the actual model name
)
# Define the Doctor Assistant with a diagnostic goal
doctor_assistant = Agent(
role='Doctor Assistant',
goal='Collect detailed health information dynamically through a series of questions based on user responses.',
backstory=(
"You are a virtual doctor assistant who asks diagnostic questions based on user responses. "
"Your role is to gather health information before the user’s doctor consultation, adapting your questions as needed."
),
verbose=True,
llm=llm,
)
# Function to process user response and generate the next question
def get_next_question(response):
# Define the task for generating the next question based on user response
task_description = f"Generate the next diagnostic question based on the user's response: '{response}'"
# Set up the task for the assistant to generate a follow-up question
follow_up_task = Task(
description=task_description,
agent=doctor_assistant,
human_input=False,
expected_output="A contextually relevant follow-up question based on user response" # Placeholder for expected output
)
# Instantiate the crew and execute the task to get the next question
crew = Crew(
agents=[doctor_assistant],
tasks=[follow_up_task],
verbose=2,
)
result = crew.kickoff()
return result
# Load the image from the specified path
image_path = "./image-removebg-preview (2).png" # Adjust path if necessary
image = Image.open(image_path)
image = image.resize((300, 300))
# Convert image to base64 and display it
buffered = BytesIO()
image.save(buffered, format="PNG")
img_str = base64.b64encode(buffered.getvalue()).decode()
st.markdown("<h1 style='text-align: center;'>Doctor Assistant Chatbot</h1>", unsafe_allow_html=True)
st.markdown(f"<div style='text-align: center;'><img src='data:image/png;base64,{img_str}' width='300' height='300'/></div>", unsafe_allow_html=True)
# Initialize session states for storing conversation history and user details
if "conversation" not in st.session_state:
st.session_state.conversation = []
if "user_details" not in st.session_state:
st.session_state.user_details = {}
# Display the conversation history
for turn in st.session_state.conversation:
role, content = turn
with st.chat_message(role):
st.markdown(content)
import pandas as pd
# Function to generate a concise report
def generate_report():
# Prepare patient detail data with key information only
patient_details = {
"Patient Name": st.session_state.user_details.get("name", 'N/A'),
"Patient Age": st.session_state.user_details.get("age", 'N/A'),
"Patient Gender": st.session_state.user_details.get("gender", 'N/A'),
"Patient Phone Number": st.session_state.user_details.get("phone_number", 'N/A'), # Assuming you have the phone number
}
# Create a DataFrame for patient details
details_df = pd.DataFrame.from_dict(patient_details, orient='index', columns=['Value'])
# Prepare keywords and summary of symptoms
symptoms_summary = []
for turn in st.session_state.conversation:
role, content = turn
if role == "user":
# Extract main keywords from user responses
symptoms_summary.append(content)
# Select only unique symptoms and key information
unique_symptoms = list(set(symptoms_summary))
# Prepare symptom keywords for display
symptoms_df = pd.DataFrame(unique_symptoms, columns=["Main Symptoms"])
# Display the report
report = f"""
## Patient Report
"""
return details_df, symptoms_df
# Initial input for user details
if not st.session_state.user_details:
name = st.text_input("Please enter your name:")
age = st.text_input("Please enter your age:")
gender = st.selectbox("Please select your gender:", ["Male", "Female", "Other"])
# Store user details in session state
if st.button("Submit Details"):
if name and age and gender:
st.session_state.user_details = {"name": name, "age": age, "gender": gender}
initial_question = "Thank you! Now, could you tell me what symptoms you're experiencing?"
st.session_state.conversation.append(("assistant", initial_question))
with st.chat_message("assistant"):
st.markdown(initial_question)
else:
st.warning("Please fill out all fields.")
# Check for user's response and generate the next question
if user_response := st.chat_input("Your response:"):
# Check for the end conversation keyword
if user_response.lower() in ["finish", "done", "end"]:
st.session_state.conversation.append(("user", user_response))
with st.chat_message("user"):
st.markdown(user_response)
# Generate and display the final report
report_df = generate_report()
st.table(report_df) # Display the report in table format
st.markdown("Thank you for your responses! The consultation has ended. Take care!", unsafe_allow_html=True)
st.stop() # Stop the app from proceeding further
# Append the user's response to the conversation
st.session_state.conversation.append(("user", user_response))
# Display the user's response immediately
with st.chat_message("user"):
st.markdown(user_response)
# Generate the next question based on the user's response
with st.spinner("Processing..."):
next_question = get_next_question(user_response)
# Append the assistant's next question to the conversation
st.session_state.conversation.append(("assistant", next_question))
# Display the assistant's response
with st.chat_message("assistant"):
st.markdown(next_question)
if st.button("Generate Report"):
details_df, symptoms_df = generate_report()
# Display patient details
st.markdown("### Patient Details")
st.table(details_df)
st.markdown("### Main Symptoms")
st.table(symptoms_df)
# Add an end line
st.markdown("---")
|