test / app.py
mohammedriza-rahman's picture
Update app.py
99a0fa8 verified
import streamlit as st
import requests
import json
import time
from PIL import Image
import warnings
# Ignore warnings
warnings.filterwarnings("ignore")
# Define API Key and Base URL
API_KEY = "taPxd2jFPxNTTEXZsGAXbRxSgylLsEKi"
API_BASE_URL = "https://oapi.tasking.ai/v1"
MODEL_ID = "X5lMtrEVvhZuirQGg3aflNOW"
# Define profession and domain hierarchies
PROFESSION_DOMAINS = {
"Teacher": [
"Mathematics", "Science", "English", "History", "Computer Science",
"Primary Education", "Secondary Education", "Special Education", "Other"
],
"Doctor": [
"General Medicine", "Pediatrics", "Cardiology", "Neurology", "Surgery",
"Alternative Medicine", "Public Health", "Other"
],
"Engineer": [
"Civil", "Mechanical", "Electrical", "Software", "Chemical",
"Robotics", "AI/ML", "Environmental", "Other"
],
"Student": [
"Arts and Humanities", "Science", "Commerce/Business", "Engineering",
"Medical", "Computer Science", "Other"
],
"Other": []
}
# Streamlit interface setup
st.set_page_config(page_title="AI-Buddy Assistant", page_icon="🤖", layout="wide")
# Initialize session state for sidebar visibility
if "sidebar_visible" not in st.session_state:
st.session_state.sidebar_visible = False
# Sidebar toggle button with the logo in the same row
col1, col2 = st.columns([0.1, 0.9]) # Create two columns for sidebar button and logo
with col1:
if st.button("☰"):
st.session_state.sidebar_visible = not st.session_state.sidebar_visible
with col2:
# Load and display the logo image (resize it if needed)
img = Image.open("AI Buddy Green Logo.png") # Make sure this image path is correct
resized_img = img.resize((400, 150)) # Resize the logo if needed
st.image(resized_img, caption="AI-Buddy Assistant", use_column_width=False, output_format="PNG")
# Sidebar content based on visibility
if st.session_state.sidebar_visible:
with st.sidebar:
st.title("Customize Your Experience")
# First dropdown - Profession Selection
profession = st.selectbox(
"Choose Your Profession",
["Select Profession"] + list(PROFESSION_DOMAINS.keys()),
key="profession_selector"
)
# Initialize variables
selected_profession = None
selected_domain = None
# Handle profession selection
if profession == "Other":
custom_profession = st.text_input("Please specify your profession")
if custom_profession:
selected_profession = custom_profession
else:
selected_profession = profession
# Domain selection
if profession and profession != "Select Profession":
if profession == "Other":
domain = st.text_input("Please specify your domain")
if domain:
selected_domain = domain
else:
domain = st.selectbox(
"Choose Your Domain",
["Select Domain"] + PROFESSION_DOMAINS[profession],
key="domain_selector"
)
if domain == "Other":
custom_domain = st.text_input("Please specify your domain")
if custom_domain:
selected_domain = custom_domain
else:
selected_domain = domain
# Description text area
description = st.text_area(
"About you (a short description)",
placeholder="Briefly describe your role",
key="description"
)
# Submit button with validation
if st.button("Submit"):
if profession == "Select Profession":
st.error("Please select a profession.")
elif profession == "Other" and not custom_profession:
st.error("Please specify your profession.")
elif not selected_domain or (domain == "Select Domain"):
st.error("Please select or specify a domain.")
else:
# Format the profession details for the chat
profession_details = f"My profession is {selected_profession} in the {selected_domain} domain"
# Add input details as a message to chat history
st.session_state.messages.append({
"role": "user",
"content": f"{profession_details}. Here's a bit about me: {description}. Tell me how AI-Buddy can help me."
})
# Clear the sidebar content
st.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
}
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
def display_response_streaming(response_content):
response_placeholder = st.empty()
streaming_text = ""
for char in response_content:
streaming_text += char
response_placeholder.write(streaming_text)
time.sleep(0.05)
# Chat interface - User Input
if prompt := st.chat_input("Type your message"):
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..."):
response_content = get_chat_response()
if response_content:
display_response_streaming(response_content)
st.session_state.messages.append({"role": "assistant", "content": response_content})
else:
st.write("Sorry, Re-enter the prompt")