File size: 4,257 Bytes
4060393
 
 
6dad2a2
c645389
4060393
f7e33cd
 
 
c645389
4060393
f7e33cd
6dad2a2
 
f7e33cd
4060393
f7e33cd
6dad2a2
 
 
f7e33cd
6dad2a2
 
 
 
 
f7e33cd
 
 
6dad2a2
f7e33cd
 
 
 
 
 
 
555e200
f7e33cd
 
f9476ac
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6dad2a2
f7e33cd
f9476ac
c645389
 
 
f7e33cd
c645389
f7e33cd
 
c645389
f7e33cd
 
c645389
f9476ac
 
 
 
c645389
 
f7e33cd
c645389
 
 
 
 
 
 
f9476ac
c645389
 
f7e33cd
c645389
 
 
 
 
f7e33cd
c645389
f7e33cd
 
 
 
c645389
 
 
 
f7e33cd
c645389
 
 
f7e33cd
c645389
 
 
f7e33cd
c645389
 
 
f7e33cd
f9476ac
 
f7e33cd
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
import streamlit as st
from openai import OpenAI
import time
import datetime
import os

# Securely get credentials from Hugging Face secrets
generated_user = os.getenv("User")
generated_password = os.getenv("Password")
openai_key = os.getenv("openai_key")

# Streamlit app configuration
st.set_page_config(page_title="Carfind.co.za AI Assistant")
st.title("Carfind.co.za AI Assistant")
st.caption("Chat with Carfind.co.za and find your next car fast")

# Initialize authentication state
if "authenticated" not in st.session_state:
    st.session_state.authenticated = False

# Login screen
if not st.session_state.authenticated:
    st.subheader("Login")
    username = st.text_input("Username")
    password = st.text_input("Password", type="password")

    # Auto-login once both fields are filled
    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()

    # Display chat history
    if "messages" not in st.session_state:
        st.session_state["messages"] = []

    for message in st.session_state.messages:
        role = message["role"]
        content = message["content"]
        st.chat_message(role).write(content)

    # Add Clear Chat button next to input field
    clear_col, input_col = st.columns([1, 8])
    with clear_col:
        if st.button("🧹 Clear Chat"):
            st.session_state.messages = []
            st.success("Chat history cleared.")

    with input_col:
        user_input = st.chat_input("Type your message here...")

    # Check for OpenAI key
    if openai_key:
        client = OpenAI(api_key=openai_key)
        ASSISTANT_ID = "asst_5gQR21fOsmHil11FGBzEArA7"

        # Save chat transcript (backend only)
        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")

        # Handle user input and keep sticky experience
        if user_input:
            st.session_state.messages.append({"role": "user", "content": user_input})
            st.chat_message("user").write(user_input)

            try:
                # Start OpenAI chat thread
                thread = client.beta.threads.create()
                thread_id = thread.id

                # Send user message
                client.beta.threads.messages.create(
                    thread_id=thread_id,
                    role="user",
                    content=user_input
                )

                # Trigger assistant response
                run = client.beta.threads.runs.create(
                    thread_id=thread_id,
                    assistant_id=ASSISTANT_ID
                )

                # Wait for assistant completion
                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)

                # Retrieve assistant message
                messages = client.beta.threads.messages.list(thread_id=thread_id)
                assistant_message = messages.data[0].content[0].text.value

                # Display and store the assistant’s response
                st.chat_message("assistant").write(assistant_message)
                st.session_state.messages.append({"role": "assistant", "content": assistant_message})

                # Save chat log
                save_transcript(st.session_state.messages)

            except Exception as e:
                st.error(f"An error occurred: {str(e)}")
    else:
        st.error("OpenAI key not found. Please ensure it is set as a Hugging Face secret.")