import os import streamlit as st import time import json from datetime import datetime from openai import OpenAI # Streamlit Page Config st.set_page_config(page_title="Ctrack AI Assistant", layout="wide") # Authentication AUTHORIZED_USERS = { "andrew@lortechnologies.com": "Pass.123", "rian@lortechnologies.com": "Pass.123", "test@test.com": "Pass.123" } if "authenticated" not in st.session_state: st.session_state["authenticated"] = False def login(): email = st.session_state.get("email", "") password = st.session_state.get("password", "") if email in AUTHORIZED_USERS and AUTHORIZED_USERS[email] == password: st.session_state["authenticated"] = True else: st.error("Invalid email or password. Please try again.") if not st.session_state["authenticated"]: st.title("Sign In") st.text_input("Email", key="email") st.text_input("Password", type="password", key="password") st.button("Login", on_click=login) st.stop() # Page Header st.title("🚚 Ctrack Virtual Assistant") st.caption("Official AI assistant for Ctrack’s fleet management solutions") # Load OpenAI API Key OPENAI_API_KEY = os.getenv("OPENAI_API_KEY") CTRACK_ASSISTANT_ID = "asst_ItfaIt2UF2nN1UpOS5xa6l5p" if not OPENAI_API_KEY: st.error("Missing OPENAI_API_KEY environment variable.") st.stop() # Create Tabs main_tab, flagged_tab = st.tabs(["Ctrack Assistant", "Flagged Responses"]) # Directory to store flagged responses FLAGGED_RESPONSES_DIR = "flagged_responses" os.makedirs(FLAGGED_RESPONSES_DIR, exist_ok=True) def save_flagged_response(user_query, ai_response): timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") filename = f"{FLAGGED_RESPONSES_DIR}/flagged_{timestamp}.json" flagged_data = { "query": user_query, "response": ai_response, "timestamp": datetime.now().isoformat() } with open(filename, "w") as file: json.dump(flagged_data, file, indent=4) st.success(f"Response flagged and saved as {filename}.") def ctrack_chat(tab): with tab: st.subheader("πŸ€– Chat with Ctrack AI") client = OpenAI(api_key=OPENAI_API_KEY) session_key = "ctrack_chat" if session_key not in st.session_state: st.session_state[session_key] = [] if st.button("Clear Chat", key="clear_chat"): st.session_state[session_key] = [] st.rerun() for idx, msg in enumerate(st.session_state[session_key]): role, content = msg["role"], msg["content"] st.chat_message(role).write(content) if role == "assistant" and st.button("🚩 Flag", key=f"flag_{idx}"): user_query = st.session_state[session_key][idx-1]["content"] if idx > 0 else "Unknown" save_flagged_response(user_query, content) if prompt := st.chat_input("Ask about Ctrack's services, fleet solutions, or integrations"): st.session_state[session_key].append({"role": "user", "content": prompt}) st.chat_message("user").write(prompt) try: thread = client.beta.threads.create() thread_id = thread.id client.beta.threads.messages.create( thread_id=thread_id, role="user", content=prompt ) run = client.beta.threads.runs.create( thread_id=thread_id, assistant_id=CTRACK_ASSISTANT_ID ) while True: status = client.beta.threads.runs.retrieve(thread_id=thread_id, run_id=run.id) if status.status == "completed": break time.sleep(1) messages = client.beta.threads.messages.list(thread_id=thread_id) response = messages.data[0].content[0].text.value st.session_state[session_key].append({"role": "assistant", "content": response}) st.chat_message("assistant").write(response) if st.button("🚩 Flag", key=f"flag_response_{len(st.session_state[session_key])}"): save_flagged_response(prompt, response) except Exception as e: st.error(f"OpenAI Error: {str(e)}") ctrack_chat(main_tab) # Flagged Response Viewer with flagged_tab: st.subheader("🚩 Flagged Responses") files = [f for f in os.listdir(FLAGGED_RESPONSES_DIR) if f.endswith(".json")] if files: selected = st.selectbox("Select a flagged response to download:", files) if selected: with open(os.path.join(FLAGGED_RESPONSES_DIR, selected), "r") as file: flagged = file.read() st.download_button("πŸ“₯ Download", data=flagged, file_name=selected, mime="application/json") else: st.info("No flagged responses yet.")