File size: 4,529 Bytes
4060393
76c8330
4060393
 
6dad2a2
c645389
4060393
6bccdc8
f7e33cd
 
c645389
6bccdc8
4060393
6bccdc8
c0332bf
76c8330
f7e33cd
4060393
6bccdc8
76c8330
 
6bccdc8
76c8330
 
 
 
 
 
 
 
6bccdc8
6dad2a2
 
 
 
76c8330
6dad2a2
 
 
f7e33cd
 
6dad2a2
f7e33cd
 
 
 
 
 
6bccdc8
555e200
f88fdb3
 
1b961be
 
 
86adc68
76c8330
 
6bccdc8
7ac34ac
76c8330
f88fdb3
6bccdc8
76c8330
 
 
f88fdb3
76c8330
 
f88fdb3
76c8330
 
1b961be
6bccdc8
76c8330
1b961be
 
 
 
 
 
 
 
fb4fbbe
1b961be
76c8330
 
c645389
76c8330
 
1b961be
76c8330
c0332bf
76c8330
c0332bf
1b961be
76c8330
1b961be
 
 
 
6bccdc8
76c8330
 
 
 
6bccdc8
76c8330
 
1b961be
76c8330
 
1b961be
 
6bccdc8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
import streamlit as st
from streamlit_chat import message
from openai import OpenAI
import time
import datetime
import os

# Load Hugging Face secrets
generated_user = os.getenv("User")
generated_password = os.getenv("Password")
openai_key = os.getenv("openai_key")
assistant_id = os.getenv("ASSISTANT_ID")

# Streamlit UI 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 chat bubble styling
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.")

# Main chat interface
else:
    st.divider()

    if "messages" not in st.session_state:
        st.session_state["messages"] = []

    # Display chat history
    for msg in st.session_state["messages"]:
        if msg["role"] == "assistant":
            message(f"![carfind-logo](https://www.carfind.co.za/images/Carfind-Icon.svg) **Carfind Assistant:** {msg['content']}", is_user=False)
        else:
            message(msg["content"], is_user=True, avatar_style="adventurer")

    # Input + clear 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()

    # Handle chat
    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)

                    # Get the assistant reply
                    response_messages = client.beta.threads.messages.list(thread_id=thread.id)
                    assistant_reply = response_messages.data[0].content[0].text.value

                st.session_state.messages.append({"role": "assistant", "content": assistant_reply})
                message(f"![carfind-logo](https://www.carfind.co.za/images/Carfind-Icon.svg) **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.")