import streamlit as st from openai import OpenAI import time import os import pandas as pd from datetime import datetime # Load environment variables openai_key = os.getenv("openai_key") assistant_id = os.getenv("ASSISTANT_ID") # Set up transcript log transcript_file = "transcripts.xlsx" if not os.path.exists(transcript_file): df = pd.DataFrame(columns=["timestamp", "thread_id", "role", "message"]) df.to_excel(transcript_file, index=False) def append_to_transcript(thread_id, role, message): df_existing = pd.read_excel(transcript_file) new_entry = pd.DataFrame({ "timestamp": [datetime.now().strftime("%Y-%m-%d %H:%M:%S")], "thread_id": [thread_id], "role": [role], "message": [message] }) updated_df = pd.concat([df_existing, new_entry], ignore_index=True) updated_df.to_excel(transcript_file, index=False) # Configure page st.set_page_config(page_title="Carfind.co.za AI Assistant", layout="wide") # Inject custom styling st.markdown(""" """, unsafe_allow_html=True) # Initialize session if "thread_id" not in st.session_state: st.session_state["thread_id"] = None # Carfind logo + powered by text (animated) st.markdown( """
Powered by Carfind
""", unsafe_allow_html=True ) # Chat input + inline clear button input_col, clear_col = st.columns([9, 1]) with input_col: user_input = st.chat_input("Type your message here...") with clear_col: if st.button("🗑️", key="clear-chat", help="Clear Chat"): st.session_state["thread_id"] = None st.rerun() # Chat logic if openai_key and assistant_id: client = OpenAI(api_key=openai_key) if user_input: if not st.session_state["thread_id"]: thread = client.beta.threads.create() st.session_state["thread_id"] = thread.id client.beta.threads.messages.create( thread_id=st.session_state["thread_id"], role="user", content=user_input ) append_to_transcript(st.session_state["thread_id"], "user", user_input) try: with st.spinner("Thinking and typing... 💭"): run = client.beta.threads.runs.create( thread_id=st.session_state["thread_id"], assistant_id=assistant_id ) while True: run_status = client.beta.threads.runs.retrieve( thread_id=st.session_state["thread_id"], run_id=run.id ) if run_status.status == "completed": break time.sleep(1) messages_response = client.beta.threads.messages.list( thread_id=st.session_state["thread_id"] ) assistant_icon_html = "" messages_sorted = sorted(messages_response.data, key=lambda x: x.created_at, reverse=True) for msg in messages_sorted: if msg.role == "user": st.markdown( f"
" f"👤 You: {msg.content[0].text.value}
", unsafe_allow_html=True ) else: response_text = msg.content[0].text.value append_to_transcript(st.session_state["thread_id"], "assistant", response_text) st.markdown( f"
" f"{assistant_icon_html} Carfind Assistant: {response_text}
", unsafe_allow_html=True ) 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.")