import streamlit as st from openai import OpenAI import time import os import pandas as pd import datetime from huggingface_hub import HfApi, upload_file # Environment variables generated_user = os.getenv("User") generated_password = os.getenv("Password") openai_key = os.getenv("openai_key") assistant_id = os.getenv("ASSISTANT_ID") hf_token = os.getenv("HF_TOKEN") transcript_file = "transcripts.xlsx" st.set_page_config(page_title="Carfind.co.za AI Assistant", layout="wide") st.markdown("

🚗 Carfind.co.za AI Assistant

", unsafe_allow_html=True) st.caption("Chat with Carfind.co.za and find your next car fast") st.markdown(""" """, unsafe_allow_html=True) # Save chat to Excel and push to Hugging Face repo def append_to_transcript(thread_id, role, message): timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") new_entry = { "Timestamp": timestamp, "Thread_ID": thread_id, "Role": role, "Message": message } try: if os.path.exists(transcript_file): df = pd.read_excel(transcript_file) df = pd.concat([df, pd.DataFrame([new_entry])], ignore_index=True) else: df = pd.DataFrame([new_entry]) df.to_excel(transcript_file, index=False) # Upload updated transcripts.xlsx to Hugging Face api = HfApi(token=hf_token) upload_file( path_or_fileobj=transcript_file, path_in_repo="transcripts.xlsx", repo_id="IAMTFRMZA/cfaiassistant", repo_type="space", token=hf_token, commit_message=f"Transcript update {timestamp}" ) except Exception as e: st.error(f"Transcript logging failed: {str(e)}") # 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.") else: st.divider() if "thread_id" not in st.session_state: st.session_state["thread_id"] = None 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["thread_id"] = None st.success("Chat cleared.") st.rerun() if openai_key and assistant_id and hf_token: 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 # Add user message and log 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 = "" # Display chat conversation for msg in reversed(messages_response.data): if msg.role == "user": st.markdown( f"
" f"👤 You: {msg.content[0].text.value}" f"
", 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}" f"
", unsafe_allow_html=True ) except Exception as e: st.error(f"An error occurred: {str(e)}") else: st.error("⚠️ Missing OpenAI key, Assistant ID or HF token. Please check Hugging Face secrets.")