import streamlit as st import requests import os from dotenv import load_dotenv from requests.exceptions import RequestException, HTTPError, ConnectionError, Timeout, TooManyRedirects, JSONDecodeError from textblob import TextBlob # Load environment variables load_dotenv() # Function to reset conversation def reset_conversation(): st.session_state.messages = [] st.session_state.ask_intervention = False return None # Function to interact with the selected model via the Together API def interact_with_together_api(messages, model_link): all_messages = [] if not any("role" in msg for msg in messages): all_messages.append({"role": "system", "content": model_pre_instructions[selected_model]}) else: all_messages.append({"role": "system", "content": f"Switched to model: {selected_model}"}) for human, assistant in messages: all_messages.append({"role": "user", "content": human}) all_messages.append({"role": "assistant", "content": assistant}) all_messages.append({"role": "user", "content": messages[-1][1]}) url = "https://api.together.xyz/v1/chat/completions" payload = { "model": model_link, "temperature": 1.05, "top_p": 0.9, "top_k": 50, "repetition_penalty": 1, "n": 1, "messages": all_messages, } TOGETHER_API_KEY = os.getenv('TOGETHER_API_KEY') headers = { "accept": "application/json", "content-type": "application/json", "Authorization": f"Bearer {TOGETHER_API_KEY}", } try: response = requests.post(url, json=payload, headers=headers) response.raise_for_status() response_data = response.json() assistant_response = response_data["choices"][0]["message"]["content"] return assistant_response except (HTTPError, ConnectionError, Timeout, TooManyRedirects) as e: st.error(f"Error communicating with the API: {e}") return None except JSONDecodeError as e: st.error(f"Error decoding JSON response: {e}") return None except RequestException as e: st.error(f"RequestException: {e}") return None # Function to perform sentiment analysis on the conversation def analyze_sentiment(messages): sentiments = [] for _, message in messages: blob = TextBlob(message) sentiment_score = blob.sentiment.polarity sentiments.append(sentiment_score) # Calculate average sentiment score average_sentiment = sum(sentiments) / len(sentiments) return average_sentiment # Initialize chat history and session state attributes if "messages" not in st.session_state: st.session_state.messages = [] st.session_state.ask_intervention = False # Create sidebar with model selection dropdown and reset button model_links = { "Addiction recovery AI": "NousResearch/Nous-Hermes-2-Yi-34B", "Mental health AI": "NousResearch/Nous-Hermes-2-Yi-34B" } selected_model = st.sidebar.selectbox("Select Model", list(model_links.keys())) reset_button = st.sidebar.button('Reset Chat', on_click=reset_conversation) # Accept user input with input validation max_input_length = 100 # Maximum allowed character limit for user input if prompt := st.chat_input(f"Hi, I'm {selected_model}, let's chat (Max {max_input_length} characters)"): if len(prompt) > max_input_length: st.error(f"Maximum input length exceeded. Please limit your input to {max_input_length} characters.") else: with st.chat_message("user"): st.markdown(prompt) st.session_state.messages.append(("user", prompt)) # Interact with the selected model assistant_response = interact_with_together_api(st.session_state.messages, model_links[selected_model]) if assistant_response is not None: with st.empty(): st.markdown("AI is typing...") st.empty() st.markdown(assistant_response) if any(keyword in prompt.lower() for keyword in ["human", "therapist", "someone", "died", "death", "help", "suicide", "suffering", "crisis", "emergency", "support", "depressed", "anxiety", "lonely", "desperate", "struggling", "counseling", "distressed", "hurt", "pain", "grief", "trauma", "abuse", "danger", "risk", "urgent", "need assistance"]): if not st.session_state.ask_intervention: if st.button("After the analyzing our session you may need some extra help, so you can reach out to a certified therapist at +25493609747 Name: Ogega feel free to talk"): st.write("You can reach out to a certified therapist at +25493609747.") st.session_state.messages.append(("assistant", assistant_response)) # Display conversation insights st.sidebar.subheader("Conversation Insights") average_sentiment = analyze_sentiment(st.session_state.messages) st.sidebar.write(f"Average Sentiment: {average_sentiment}") # Add logo and text to the sidebar st.sidebar.image("https://assets.isu.pub/document-structure/221118065013-a6029cf3d563afaf9b946bb9497d45d4/v1/2841525b232adaef7bd0efe1da81a4c5.jpeg", width=200) st.sidebar.write("A product proudly developed by Kisii University")