IAMTFRMZA's picture
Update app.py
5774305 verified
raw
history blame
4.31 kB
import streamlit as st
from streamlit_chat import message
from openai import OpenAI
import time
import datetime
import os
# Load secrets from Hugging Face environment
generated_user = os.getenv("User")
generated_password = os.getenv("Password")
openai_key = os.getenv("openai_key")
assistant_id = os.getenv("ASSISTANT_ID")
# Streamlit page setup
st.set_page_config(page_title="Carfind.co.za AI Assistant", layout="wide")
st.markdown("<h1 style='text-align: center;'>πŸš— Carfind.co.za AI Assistant</h1>", unsafe_allow_html=True)
st.caption("Chat with Carfind.co.za and find your next car fast")
# Light / Dark mode toggle
dark_mode = st.toggle("πŸŒ™ Switch to Light Mode", value=True)
# Custom styling for bubbles
st.markdown("""
<style>
.stChatMessage { max-width: 85%; border-radius: 12px; padding: 8px; }
.stChatMessage[data-testid="stChatMessage-user"] { background: #333; color: white; }
.stChatMessage[data-testid="stChatMessage-assistant"] { background: #00529B; color: white; }
</style>
""", unsafe_allow_html=True)
# Authentication
if "authenticated" not in st.session_state:
st.session_state.authenticated = False
if not st.session_state.authenticated:
st.subheader("πŸ”‘ Login")
username = st.text_input("Username")
password = st.text_input("Password", type="password")
if username and password:
if username == generated_user and password == generated_password:
st.session_state.authenticated = True
st.success("Login successful! Redirecting...")
time.sleep(1)
st.rerun()
else:
st.error("Incorrect username or password. Please try again.")
# Chat UI after login
else:
st.divider()
if "messages" not in st.session_state:
st.session_state["messages"] = []
# Show chat history
for msg in st.session_state["messages"]:
if msg["role"] == "assistant":
message(f"πŸš— **Carfind Assistant:** {msg['content']}", is_user=False)
else:
message(msg["content"], is_user=True, avatar_style="adventurer")
# Input and Clear Chat button
input_col, clear_col = st.columns([8, 1])
with input_col:
user_input = st.text_input("Type your message here...", key="chat_input")
with clear_col:
if st.button("πŸ—‘οΈ", help="Clear Chat"):
st.session_state.messages = []
st.success("Chat cleared.")
st.rerun()
if openai_key and assistant_id:
client = OpenAI(api_key=openai_key)
def save_transcript(messages):
with open("chat_logs.txt", "a") as log:
log.write(f"\n--- New Chat ({datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}) ---\n")
for msg in messages:
log.write(f"{msg['role'].capitalize()}: {msg['content']}\n")
log.write("--- End Chat ---\n")
if user_input:
st.session_state.messages.append({"role": "user", "content": user_input})
message(user_input, is_user=True, avatar_style="adventurer")
try:
with st.spinner("Thinking and typing... πŸ’­"):
thread = client.beta.threads.create()
client.beta.threads.messages.create(thread_id=thread.id, role="user", content=user_input)
run = client.beta.threads.runs.create(thread_id=thread.id, assistant_id=assistant_id)
while True:
run_status = client.beta.threads.runs.retrieve(thread_id=thread.id, run_id=run.id)
if run_status.status == "completed":
break
time.sleep(1)
assistant_reply = client.beta.threads.messages.list(thread_id=thread.id).data[0].content[0].text.value
st.session_state.messages.append({"role": "assistant", "content": assistant_reply})
message(f"πŸš— **Carfind Assistant:** {assistant_reply}", is_user=False)
save_transcript(st.session_state.messages)
except Exception as e:
st.error(f"An error occurred: {str(e)}")
else:
st.error("⚠️ OpenAI key or Assistant ID not found. Please ensure both are set as Hugging Face secrets.")