main / app.py
ogegadavis254's picture
Update app.py
1311090 verified
raw
history blame
5.27 kB
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")