Spaces:
Sleeping
Sleeping
import os | |
import streamlit as st | |
from datetime import datetime | |
import json | |
import requests | |
import uuid | |
from datetime import date, datetime | |
import requests | |
from pydantic import BaseModel, Field | |
from typing import Optional | |
placeHolderPersona1 = """##Diagnostic Agent (DA): | |
##Objective: Gather comprehensive details about the user's illness. | |
##Conversation Flow: | |
#Symptom Collection: | |
Primary Symptoms: Ask about the main symptoms the user is experiencing. | |
Duration and Severity: Gather details on how long the symptoms have been present and their severity. | |
Medical History: Collect information on any relevant medical history or existing conditions. | |
Current Medications: Inquire about any current medications the user | |
is taking. | |
Allergies: Identify any known allergies to medications. | |
Lifestyle Factors: Consider any lifestyle factors that may affect the choice of medication. | |
##Example Interaction: | |
DA: "Can you describe the primary symptoms you are experiencing?" | |
User: "I have a persistent cough and fever." | |
DA: "How long have you been experiencing these symptoms?" | |
""" | |
placeHolderPersona2 = """## You are an advisor for a doctor, augmenting their professional opinion on prescribed drug options | |
## Objective: Analyse the structured data to identify suitable medicinal products for the list given in the user message from the given conversation between an AI doctor and a human patient | |
## Processing Steps: | |
Symptom Analysis: Evaluate the symptoms and other collected information. | |
Product Matching: Match the symptoms and patient profile to suitable medicinal products. | |
IDMP Compliance: Ensure the identified products are compliant with IDMP standards. | |
Recommendation Generation: Generate a list of recommended medicinal products. | |
Feedback Loop: If needed, request additional information from the DA or user. | |
# Example Interaction: | |
RA: "Based on the symptoms of a persistent cough and fever, along with your medical history, we recommend considering ProductX and ProductY. Please consult with your healthcare provider before use.""" | |
placeHolderUser2 = """This is the list of available drugs on offer to prescribe please use your understanding of the Generic version of each drug and give the Trademark Name | |
Trademark Name,Generic,Product area | |
Amoxil,amoxiicillin,General medicines | |
Anoro Ellipta,umeclidinium and vilanterol,General medicines | |
Arnuity Ellipta,Fluticasone,General medicines | |
Augmentin,amoxicillin/clavulanate potassium,General medicines | |
Avamys / Veramyst,fluticasone furoate,General medicines | |
Avodart/Avolve / Duodart,dutasteride,General medicines | |
Bactroban,mupirocin,General medicines | |
Beconase,beclomethasone,General medicines | |
Becotide/Becloforte,beclomethasone dipropionate,General medicines | |
Betnovate,betamethasone valerate,General medicines | |
Cutivate,fluticasone propionate,General medicines | |
Dermovate,clobetasol propionate,General medicines | |
Duac,clindamycin phosphate and benzoyl peroxide,General medicines | |
Eltroxin,Levothyroxin sodium,General medicines | |
Eumovate,clobetasone butyrate,General medicines | |
Flixonase/Flonase,fluticasone propionate,General medicines | |
Flixotide / Flovent - Diskus / MDI,fluticasone propionate,General medicines | |
Flolan,epoprostenol,General medicines | |
Fortum,ceftazidime,General medicines | |
Hepsera,Adefovir,General medicines | |
Imigran/ImITrex FDT,sumatriptan succinate,General medicines | |
Imuran,Azathioprine,General medicines | |
Incruse,umeclidinium,General medicines | |
Keppra,Levetiracetam,General medicines | |
Lacipil,Lacidipine,General medicines | |
Lacticare - Family,Lactic Acid,General medicines | |
Lamictal,lamotrigine,General medicines | |
Lanoxin,Digoxin,General medicines | |
Levoxacin,Levofloxacin,General medicines | |
Lovaza,omega-3 acid ethyl esters,General medicines | |
Malarone,atovaquone and proguanil hydrochloride,General medicines | |
Mepron,atovaquone,General medicines | |
Naramig/Amerge,naratriptan hydrochloride,General medicines | |
Paxil / Seroxat,paroxetine hydrochloride,General medicines | |
Relenza,zanamivir,General medicines | |
Relvar/Breo,Fluticasone furoate/vilanterol,General medicines | |
Requip,ropinirole hydrochloride,General medicines | |
Rythmol,propafenone hydrochloride,General medicines | |
Septrin,Cotrimoxazole,General medicines | |
Seretide / Advair - Diskus / MDI,"salmeterol xinofoate, fluticasone propionate",General medicines | |
Serevent - Diskus / MDI,salmeterol xinafoate,General medicines | |
Toctino,Alitretinoin,General medicines | |
Trelegy - Ellipta,"fluticasone furoate, umeclidinium, and vilanterol inhalation powder",General medicines | |
Valtrex,valaciclovir hydrochloride,General medicines | |
Ventolin - Diskus / MDI,Salbutamol,General medicines | |
Volibris (Ambrisentan),ambrisentan,General medicines | |
Wellbutrin,bupropion hydrochloride,General medicines | |
Xyzal,Levocetirizine,General medicines | |
Zagallo,Dutasteride,General medicines | |
Zeffix,lamivudine,General medicines | |
Zentel,Albendazole,General medicines | |
Zinacef,cefuroxime,General medicines | |
Zovirax,aciclovir,General medicines | |
Zyban,bupropion hydrochloride,General medicines | |
Zyloric,Allopurinol,General medicines | |
Zyrtec,cetirizine,General medicines | |
This is the conversation to date, | |
""" | |
class ChatRequestClient(BaseModel): | |
user_id: str | |
user_input: str | |
numberOfQuestions: int | |
welcomeMessage: str | |
llm1: str | |
tokens1: int | |
temperature1: float | |
persona1SystemMessage: str | |
persona2SystemMessage: str | |
userMessage2: str | |
llm2: str | |
tokens2: int | |
temperature2: float | |
def call_chat_api(data: ChatRequestClient): | |
url = "https://agent-builder-api.greensea-b20be511.northeurope.azurecontainerapps.io/chat/" | |
# Validate and convert the data to a dictionary | |
validated_data = data.dict() | |
# Make the POST request to the FastAPI server | |
response = requests.post(url, json=validated_data) | |
if response.status_code == 200: | |
return response.json() # Return the JSON response if successful | |
else: | |
return "An error occured" # Return the raw response text if not successful | |
def genuuid (): | |
return uuid.uuid4() | |
def format_elapsed_time(time): | |
# Format the elapsed time to two decimal places | |
return "{:.2f}".format(time) | |
# Title of the application | |
# st.image('agentBuilderLogo.png') | |
st.title('LLM-Powered Agent Interaction') | |
# Sidebar for inputting personas | |
st.sidebar.image('agentBuilderLogo.png') | |
st.sidebar.header("Agent Personas Design") | |
# st.sidebar.subheader("Welcome Message") | |
# welcomeMessage = st.sidebar.text_area("Define Triaging Persona", value=welcomeMessage, height=300) | |
st.sidebar.subheader("Finance Intake AI") | |
numberOfQuestions = st.sidebar.slider("Number of Questions", min_value=0, max_value=10, step=1, value=5, key='persona1_questions') | |
persona1SystemMessage = st.sidebar.text_area("Define Triaging Persona", value=placeHolderPersona1, height=300) | |
with st.sidebar.expander("See explanation"): | |
st.write("This AI persona will converse with the patient to gather their symptoms. With each round of chat, the object of the AI is to ask more specific follow up questions as it narrows down to the specific diagnosis. However this AI should never give a diagnosis") | |
st.image("agentPersona1.png") | |
llm1 = st.sidebar.selectbox("Model Selection", ['GPT3.5','GPT-4'], key='persona1_size') | |
temp1 = st.sidebar.slider("Tempreature", min_value=0.0, max_value=1.0, step=0.1, value=0.5, key='persona1_temp') | |
tokens1 = st.sidebar.slider("Tokens", min_value=0, max_value=4000, step=100, value=500, key='persona1_tokens') | |
# Persona 2 | |
st.sidebar.subheader("Diagnosis and Next Best Action AI") | |
persona2SystemMessage = st.sidebar.text_area("Define Diagnosis Persona", value=placeHolderPersona2, height=300) | |
with st.sidebar.expander("See explanation"): | |
st.write("This AI persona uses the output of the symptom intake AI as its input. This AI’s job is to augment a health professional by assisting with a diagnosis and possible next best action. The teams will need to determine if this should be a tool used directly by the patient, as an assistant to the health professional or a hybrid of the two. ") | |
st.image("agentPersona2.png") | |
llm2 = st.sidebar.selectbox("Model Selection", ['GPT-4', 'GPT3.5'], key='persona2_size') | |
temp2 = st.sidebar.slider("Tempreature", min_value=0.0, max_value=1.0, step=0.1, value=0.3, key='persona2_temp') | |
tokens2 = st.sidebar.slider("Tokens", min_value=0, max_value=4000, step=100, value=2000, key='persona2_tokens') | |
userMessage2 = st.sidebar.text_area("Define User Message", value=placeHolderUser2, height=150) | |
st.sidebar.caption(f"Session ID: {genuuid()}") | |
# Main chat interface | |
st.header("Chat with the Agents") | |
user_id = st.text_input("User ID:", key="user_id") | |
user_input = st.text_input("Write your message here:", key="user_input") | |
if 'history' not in st.session_state: | |
st.session_state.history = [] | |
if st.button("Send"): | |
# Placeholder for processing the input and generating a response | |
data = ChatRequestClient( | |
user_id=user_id, | |
user_input=user_input, | |
numberOfQuestions=numberOfQuestions, | |
welcomeMessage="", | |
llm1=llm1, | |
tokens1=tokens1, | |
temperature1=temp1, | |
persona1SystemMessage=persona1SystemMessage, | |
persona2SystemMessage=persona2SystemMessage, | |
userMessage2=userMessage2, | |
llm2=llm2, | |
tokens2=tokens2, | |
temperature2=temp2 | |
) | |
response = call_chat_api(data) | |
st.markdown(f"##### Time take: {format_elapsed_time(response['elapsed_time'])}") | |
st.markdown(f"##### Question Count : {response['count']} of {numberOfQuestions}") | |
# {"count":count, "user_id":user_id,"time_stamp":time_stamp, "elapsed_time":elapsed_time, "content":content} | |
st.session_state.history.append("You: " + user_input) | |
st.session_state.history.append("Agent: " + response['content']) # Using 'response' after it's defined | |
for message in st.session_state.history: | |
st.write(message) | |