File size: 4,729 Bytes
4060393
 
 
c645389
1c2dc95
4ef479c
4060393
4ef479c
c645389
e69869b
b1e9ba4
4ef479c
b1e9ba4
4ef479c
 
 
4060393
4ef479c
 
 
 
 
 
 
 
 
 
 
 
 
c0332bf
4060393
e69869b
 
 
5c03320
 
e69869b
 
 
fa08413
f88fdb3
fa08413
 
d6ba0ba
17e4a36
 
e865a39
fa08413
 
 
1b961be
fa08413
 
 
 
 
 
17e4a36
 
 
 
e865a39
17e4a36
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
fa08413
17e4a36
 
fa08413
 
17e4a36
 
 
 
 
 
 
 
 
 
fa08413
17e4a36
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e69869b
17e4a36
13966b3
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
117
118
119
120
121
122
123
124
125
126
import streamlit as st
from openai import OpenAI
import time
import os
import pandas as pd
from datetime import datetime

# Get environment variables
openai_key = os.getenv("openai_key")
assistant_id = os.getenv("ASSISTANT_ID")

# Load or create transcript file
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)

# Function to append to transcript
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)

# Streamlit UI setup
st.set_page_config(page_title="Carfind.co.za AI Assistant", layout="wide")

st.markdown("""
    <style>
    .stChatMessage { max-width: 85%; border-radius: 12px; padding: 8px; }
    .stChatMessage[data-testid="stChatMessage-user"] { background: #f0f0f0; color: #000000; }
    .stChatMessage[data-testid="stChatMessage-assistant"] { background: #D6E9FE; color: #000000; }
    </style>
""", unsafe_allow_html=True)

st.divider()

if "thread_id" not in st.session_state:
    st.session_state["thread_id"] = None

if "pending_user_message" not in st.session_state:
    st.session_state["pending_user_message"] = 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 user_input:
    st.session_state["pending_user_message"] = user_input
    st.session_state["chat_input"] = ""
    st.experimental_rerun()

if openai_key and assistant_id and st.session_state["pending_user_message"]:
    client = OpenAI(api_key=openai_key)
    user_message = st.session_state["pending_user_message"]
    st.session_state["pending_user_message"] = None

    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_message
    )
    append_to_transcript(st.session_state["thread_id"], "user", user_message)

    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 = "<img src='https://www.carfind.co.za/images/Carfind-Icon.svg' width='22' style='vertical-align:middle;'/>"

        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"<div style='background-color:#f0f0f0; color:#000000; padding:10px; border-radius:8px; margin:5px 0;'>"
                    f"👤 <strong>You:</strong> {msg.content[0].text.value}"
                    f"</div>",
                    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"<div style='background-color:#D6E9FE; color:#000000; padding:10px; border-radius:8px; margin:5px 0;'>"
                    f"{assistant_icon_html} <strong>Carfind Assistant:</strong> {response_text}"
                    f"</div>",
                    unsafe_allow_html=True
                )

        st.markdown("""
            <script>
                window.scrollTo(0, 0);
            </script>
        """, unsafe_allow_html=True)

    except Exception as e:
        st.error(f"An error occurred: {str(e)}")

elif not openai_key or not assistant_id:
    st.error("⚠️ OpenAI key or Assistant ID not found. Please ensure both are set as Hugging Face secrets.")