Spaces:
Runtime error
Runtime error
| """ | |
| 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}) |