AI-buddy_Bot / app.py
DataMine's picture
Update app.py
69f873d verified
import streamlit as st
import requests
import json
import time
# Define API Key and Base URL
API_KEY = "tauHGktuvULkGzYof5jKdVCNfZZryj32"
API_BASE_URL = "https://oapi.tasking.ai/v1"
MODEL_ID = "X5lMcszUYZvPpFnigD8mCfPI"
# Streamlit interface setup
st.set_page_config(page_title="Custom Assistant", page_icon="🤖", layout="centered")
st.markdown('<a href="#sidebar" style="font-size: 1.2rem; color: #ff4b4b; text-decoration: none;">⬅️ Go to Sidebar to know how AI helps in your profession</a>', unsafe_allow_html=True)
st.title("🤖 AI-Buddy Assistant")
# Custom CSS to increase font size and make sidebar mobile-friendly
st.markdown("""
<style>
.sidebar .sidebar-content {
font-size: 1.1rem;
color: #333333;
background-color: #f9f9f9;
padding: 15px;
border-radius: 8px;
}
.sidebar .sidebar-content h1 {
font-size: 1.5rem;
font-weight: bold;
color: #ff4b4b;
margin-bottom: 10px;
}
.sidebar .sidebar-content select, .sidebar .sidebar-content textarea, .sidebar .sidebar-content input {
border: 2px solid #ff4b4b;
padding: 10px;
font-size: 1.1rem;
margin-bottom: 10px;
border-radius: 5px;
}
.sidebar .sidebar-content button {
background-color: #ff4b4b;
color: white;
font-size: 1.1rem;
padding: 8px 15px;
border-radius: 5px;
border: none;
cursor: pointer;
transition: background-color 0.3s ease;
}
.sidebar .sidebar-content button:hover {
background-color: #ff6565;
}
.st-chat-message p {
font-size: 1.1rem;
}
</style>
""", unsafe_allow_html=True)
# Sidebar for AI in Profession
st.sidebar.title("Want to know how AI helps in your profession and the role of AI-Buddy?")
st.sidebar.write("Select your details below and discover the potential of AI in your career!")
# Dropdown options for profession with 'Other' option
professions = ["Software Engineer", "Business","Student", "Data Scientist", "Marketing Specialist", "Financial Analyst", "Teacher", "Doctor", "Project Manager", "Consultant", "Business Analyst", "Other"]
# Dropdown options for field with 'Other' option
fields = ["IT", "Healthcare", "Education", "Finance", "Marketing", "Engineering", "Sales", "Human Resources", "Consulting", "Other"]
# Mandatory Dropdowns for profession and field
profession = st.sidebar.selectbox("Choose Your Profession", professions, key="profession")
field = st.sidebar.selectbox("Choose Your Field/Domain", fields, key="field")
# If 'Other' is selected, require text input for custom profession/field
if profession == "Other":
profession = st.sidebar.text_input("Please specify your profession", key="custom_profession")
if field == "Other":
field = st.sidebar.text_input("Please specify your field", key="custom_field")
# Text area for additional description
description = st.sidebar.text_area("About you (a short description)", placeholder="Briefly describe your role", key="description")
# Submit button with mandatory field checks
if st.sidebar.button("Submit"):
# Check if all required fields are filled
if not profession or not field or (profession == "Other" and not st.session_state.custom_profession) or (field == "Other" and not st.session_state.custom_field):
st.sidebar.error("Please fill in all required fields.")
else:
# Add input details as a message to chat history
st.session_state.messages.append(
{"role": "user", "content": f"My profession is {profession} in the {field} field. Here’s a bit about me: {description}. Tell me how AI and AI-Buddy can help me."}
)
# Clear the sidebar content to simulate sidebar closure
st.sidebar.empty()
st.sidebar.write("Details submitted! You can continue chatting below.")
# Initialize chat history
if "messages" not in st.session_state:
st.session_state.messages = [
{"role": "assistant", "content": "Hello! How can I assist you today?"}
]
# Function to make a request to the custom API
def get_chat_response():
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {API_KEY}",
}
data = {
"model": MODEL_ID,
"messages": st.session_state.messages # Send entire conversation history
}
try:
response = requests.post(f"{API_BASE_URL}/chat/completions", headers=headers, json=data)
if response.status_code == 200:
response_json = response.json()
content = response_json["choices"][0]["message"]["content"]
try:
content_parsed = json.loads(content)
return content_parsed["choices"][0]["message"]["content"]
except json.JSONDecodeError:
return content
else:
raise Exception(f"API Error: {response.status_code} - {response.text}")
except Exception as e:
st.error("Re-enter the prompt")
print(f"Error: {e}")
return None
# Function to simulate streaming effect for displaying assistant's response
def display_response_streaming(response_content):
response_placeholder = st.empty() # Create a placeholder for assistant's response
streaming_text = ""
for char in response_content:
streaming_text += char
response_placeholder.write(streaming_text)
time.sleep(0.05) # Small delay to simulate typing effect
# Chat interface - User Input
if prompt := st.chat_input("Type your message"):
# Append user's message to the chat history
st.session_state.messages.append({"role": "user", "content": prompt})
# Display chat history and generate assistant response
for message in st.session_state.messages:
with st.chat_message(message["role"]):
st.write(message["content"])
# Generate assistant response if the last message is from the user
if st.session_state.messages[-1]["role"] == "user":
with st.chat_message("assistant"):
with st.spinner("Thinking..."):
# Get assistant's response based on the entire conversation history
response_content = get_chat_response()
if response_content:
# Stream the assistant's response chunk by chunk
display_response_streaming(response_content)
# Append the assistant's response to the chat history
st.session_state.messages.append({"role": "assistant", "content": response_content})
else:
st.write("Sorry, Re-enter the prompt")