HAH-2024-v0.1 / app.py
drmasad's picture
Update app.py
dfd3f33 verified
raw
history blame
6.23 kB
"""
Diabetes Version
@aim: Demo for testing purposes only
@inquiries: Dr M As'ad
@email: drmohasad@gmail.com
"""
import streamlit as st
from openai import OpenAI
import os
import sys
from dotenv import load_dotenv, dotenv_values
load_dotenv()
# initialize the client
client = OpenAI(
base_url="https://p7fw46eiw6xfkxvj.us-east-1.aws.endpoints.huggingface.cloud/v1/",
api_key=os.environ.get('HUGGINGFACEHUB_API_TOKEN')
)
# Create supported models
model_links = {
"HAH v0.1": "drmasad/HAH-2024-v0.11",
}
# Pull info about the model to display
model_info = {
"HAH v0.1":
{'description': """HAH 0.1 is a fine tuned model based on Mistral 7b instruct.\n \
\nIt was created by Dr M. As'ad using 250k dB rows sourced from open source articles on diabetes** \n""",
'logo': 'https://www.hmgaihub.com/untitled.png'},
}
def reset_conversation():
'''
Resets Conversation
'''
st.session_state.conversation = []
st.session_state.messages = []
return None
# Define the available models
models = [key for key in model_links.keys()]
# Create the sidebar with the dropdown for model selection
selected_model = st.sidebar.selectbox("Select Model", models)
# Create a temperature slider
temp_values = st.sidebar.slider('Select a temperature value', 0.0, 1.0, (0.5))
# Create model description
st.sidebar.button("Reset Chat", on_click=reset_conversation)
st.sidebar.write(f"You're now chatting with **{selected_model}**")
st.sidebar.image("https://www.hmgaihub.com/untitled.png")
st.sidebar.markdown("*Generated content may be inaccurate or false.*")
st.sidebar.markdown("*This is an under development project.*")
st.sidebar.markdown("*Not a replacement for medical advice from a doctor.*")
if "prev_option" not in st.session_state:
st.session_state.prev_option = selected_model
if st.session_state.prev_option != selected_model:
st.session_state.messages = []
# st.write(f"Changed to {selected_model}")
st.session_state.prev_option = selected_model
reset_conversation()
# Pull in the model we want to use
repo_id = model_links[selected_model]
st.subheader(f'AI - {selected_model}')
# st.title(f'ChatBot Using {selected_model}')
# Set a default model
if selected_model not in st.session_state:
st.session_state[selected_model] = model_links[selected_model]
# Initialize chat history
if "messages" not in st.session_state:
st.session_state.messages = []
# Display chat messages from history on app rerun
for message in st.session_state.messages:
with st.chat_message(message["role"]):
st.markdown(message["content"])
# Initialize the streaming status flag
if "is_streaming" not in st.session_state:
st.session_state.is_streaming = False
# Chat input handling
if st.session_state.is_streaming:
st.chat_input("The assistant is currently responding. Please wait...") # Inform the user to wait
else:
# If not streaming, allow user input
if prompt := st.chat_input("Ask me anything about diabetes"):
st.session_state.is_streaming = True # Set the flag to indicate streaming has started
with st.chat_message("user"):
st.markdown(prompt)
# Add the user message to chat history
st.session_state.messages.append({"role": "user", "content": prompt})
instructions = """
Act as a highly knowledgeable endocrinology doctor with expertise in explaining complex medical information in an understandable way to patients who do not have a medical background. Your responses should not only convey empathy and care but also demonstrate a high level of medical accuracy and reliability.
When crafting your explanations, please adhere to the following guidelines:
- Prioritize medical accuracy: Ensure all information provided is up-to-date and reflects current medical consensus. Use evidence-based medical knowledge to inform your responses.
- Clarify complex concepts: Break down medical terms and concepts into understandable language. Use analogies related to everyday experiences to help explain complex ideas when possible.
- Provide actionable advice: Where appropriate, offer practical and specific advice that the patient can follow to address their concerns or manage their condition, including when to consult a healthcare professional.
- Address concerns directly: Understand and directly respond to the patient's underlying concerns or questions, offering clear explanations and reassurance about their condition or treatment options.
- Promote informed decision-making: Empower the patient with the knowledge they need to make informed health decisions. Highlight key considerations and options available to them in managing their health.
Your response should be a blend of professional medical advice and compassionate communication, creating a dialogue that educates, reassures, and empowers the patient.
Strive to make your response as informative and authoritative as a consultation with a human doctor, ensuring the patient feels supported and knowledgeable about their health concerns.
You will answer as if you are talking to a patient directly
"""
full_prompt = f"<s>[INST] {prompt} [/INST] {instructions}</s>"
# Display assistant response in chat message container
with st.chat_message("assistant"):
# Stream the response
stream = client.chat.completions.create(
model=model_links[selected_model],
messages=[
{"role": m["role"], "content": full_prompt}
for m in st.session_state.messages
],
temperature=temp_values,
stream=True,
max_tokens=1024,
)
response = st.write_stream(stream)
# Process and clean the response
response = response.replace('</s>', '').strip() # Clean unnecessary characters
st.markdown(response)
# Indicate that streaming is complete
st.session_state.is_streaming = False
# Store the final response
st.session_state.messages.append({"role": "assistant", "content": response})