""" 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"[INST] {prompt} [/INST] {instructions}" # 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('', '').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})