cloud-sean's picture
Create app.py
31ea27b verified
raw
history blame
5.21 kB
import streamlit as st
import os
import re
from openai import AzureOpenAI
from streamlit_pills import pills
st.set_page_config(layout="wide")
# Initialize the Azure OpenAI client
client = AzureOpenAI(
azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT"),
api_key= os.getenv("AZURE_OPENAI_API_KEY"),
api_version="2024-05-01-preview"
)
# Retrieve the assistant
assistant = client.beta.assistants.retrieve("asst_Tbjd3ckxAfOjj29TeP6KaZ0v")
# Streamlit app
st.title("MultiCare AI Summary Demo")
# Initialize session state
if "thread_id" not in st.session_state:
thread = client.beta.threads.create()
st.session_state.thread_id = thread.id
if "messages" not in st.session_state:
st.session_state.messages = []
if "selected_pill" not in st.session_state:
st.session_state.selected_pill = None
def clean_content(content):
# Remove 【18:18†source】and 【5†source】style citations
content = re.sub(r'【\d+(?::\d+)?†source】', '', content)
# Prettify [1][2] style citations to [1, 2]
content = re.sub(r'\[(\d+)\](?:\[(\d+)\])+', lambda m: f"[{', '.join(sorted(set(m.groups())))}]", content)
return content.strip()
def process_message_content(message):
message_content = message.content[0].text
annotations = message_content.annotations
citations = []
citation_map = {}
for index, annotation in enumerate(annotations):
if file_citation := getattr(annotation, "file_citation", None):
cited_file = client.files.retrieve(file_citation.file_id)
citation = f"{cited_file.filename}"
if citation not in citation_map:
citation_map[citation] = len(citation_map) + 1
citations.append(f"[{citation_map[citation]}] {citation}")
message_content.value = message_content.value.replace(annotation.text, f"[{citation_map[citation]}]")
elif file_path := getattr(annotation, "file_path", None):
cited_file = client.files.retrieve(file_path.file_id)
citation = f"{cited_file.filename}"
if citation not in citation_map:
citation_map[citation] = len(citation_map) + 1
citations.append(f"[{citation_map[citation]}] {citation}")
message_content.value = message_content.value.replace(annotation.text, f"[{citation_map[citation]}]")
cleaned_content = clean_content(message_content.value)
return cleaned_content, list(set(citations))
# Function to handle message submission
def submit_message(message):
st.session_state.messages.append({"role": "user", "content": message})
with st.chat_message("user", avatar="⚕️"):
st.markdown(message)
client.beta.threads.messages.create(
thread_id=st.session_state.thread_id,
role="user",
content=message
)
with st.spinner("Assistant is thinking..."):
run = client.beta.threads.runs.create_and_poll(
thread_id=st.session_state.thread_id,
assistant_id=assistant.id
)
if run.status == 'completed':
messages = client.beta.threads.messages.list(
thread_id=st.session_state.thread_id
)
assistant_message = messages.data[0]
processed_content, citations = process_message_content(assistant_message)
st.session_state.messages.append({
"role": "assistant",
"content": processed_content,
"citations": citations
})
with st.chat_message("assistant", avatar="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTETAUBM4r3hXmQ3eC31vWws8A9VbPvOxQNZQ&s"):
st.markdown(processed_content)
if citations:
st.markdown("---")
st.markdown("**Citations:**")
for citation in citations:
st.markdown(citation)
else:
st.error(f"Error: {run.status}")
# Display chat messages
for message in st.session_state.messages:
with st.chat_message(message["role"]):
st.markdown(message["content"])
if "citations" in message and message["citations"]:
st.markdown("---")
st.markdown("**Citations:**")
for citation in message["citations"]:
st.markdown(citation)
suggested_messages = [
"I'm a physician working at a primary care clinic, what Epic update changes will affect me?",
"Summarize Epic update changes that will impact a Med Surg Registered Nurse.",
"What Epic update changes need to be reviewed by ED registration staff?",
"Which Epic update changes impact surgeons?",
"Are there any Epic update changes that will affect X-ray technicians?",
"Create a summary of all Epic update changes that are relevant for referral coordinators?"
]
selected_pill = pills(
"Quick Questions by Role",
suggested_messages,
icons=['👨‍⚕️', '👩‍⚕️', '🏥', '🥽', '📷', '📞'],
index=None,
label_visibility="visible",
key="suggested_messages"
)
if selected_pill:
submit_message(selected_pill)
# Chat input
user_input = st.chat_input("What would you like to ask?")
if user_input:
submit_message(user_input)