File size: 3,983 Bytes
4060393
e69869b
4060393
 
6dad2a2
c645389
4060393
f7e33cd
 
c645389
e69869b
4060393
c0332bf
e69869b
f7e33cd
4060393
e69869b
 
 
 
 
 
 
 
 
 
6dad2a2
 
 
 
e69869b
6dad2a2
 
 
f7e33cd
 
6dad2a2
f7e33cd
 
 
 
 
 
555e200
f88fdb3
 
e69869b
 
f88fdb3
e69869b
 
 
d6ba0ba
e69869b
 
 
 
 
1b961be
e69869b
1b961be
fb4fbbe
1b961be
e69869b
 
 
 
 
 
 
 
 
 
 
 
 
d6ba0ba
e69869b
d6ba0ba
c0332bf
1b961be
d6ba0ba
e69869b
d6ba0ba
1b961be
 
 
 
e69869b
 
 
 
 
 
 
 
 
 
 
1b961be
e69869b
 
1b961be
 
e69869b
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
import streamlit as st
from streamlit_chat import message
from openai import OpenAI
import time
import datetime
import os

generated_user = os.getenv("User")
generated_password = os.getenv("Password")
openai_key = os.getenv("openai_key")
assistant_id = os.getenv("ASSISTANT_ID")

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")

dark_mode = st.toggle("๐ŸŒ™ Switch to Light Mode", value=True)

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)

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.")

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:
        client = OpenAI(api_key=openai_key)

        if user_input:
            # Create thread once and reuse it
            if not st.session_state["thread_id"]:
                thread = client.beta.threads.create()
                st.session_state["thread_id"] = thread.id

            # Add user message to thread
            client.beta.threads.messages.create(
                thread_id=st.session_state["thread_id"], role="user", content=user_input
            )

            try:
                with st.spinner("Thinking and typing... ๐Ÿ’ญ"):
                    # Run assistant
                    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)

                # โœ… Fetch the entire conversation history:
                messages_response = client.beta.threads.messages.list(
                    thread_id=st.session_state["thread_id"]
                )

                # Display the entire conversation (in chronological order)
                for msg in reversed(messages_response.data):
                    if msg.role == "user":
                        message(msg.content[0].text.value, is_user=True, avatar_style="adventurer")
                    else:
                        message(f"**Carfind Assistant:** {msg.content[0].text.value}", is_user=False, avatar_style="bottts")

            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.")