import streamlit as st import requests import datetime from pymongo import MongoClient from streamlit_cookies_manager import CookieManager # Inject the scroll control HTML/JS def load_html(file_name): with open(file_name, 'r', encoding='utf-8') as file: return file.read() # Initialize the Cookie Manager (no encryption) cookies = CookieManager(prefix="ktosiek/streamlit-cookies-manager/") if not cookies.ready(): st.stop() # Connect to MongoDB client = MongoClient("mongodb://localhost:27017/") # Adjust your MongoDB connection URI db = client["chatbot_db"] # Database name users_collection = db["users"] # Collection to store user data # Generate a user ID and store it in cookies if not already set if 'user_id' not in cookies: cookies['user_id'] = str(datetime.datetime.now().timestamp()) # Use timestamp as a unique ID cookies.save() user_id = cookies.get('user_id') # Check if the user exists in the database user_data = users_collection.find_one({"user_id": user_id}) # If user doesn't exist, create a new entry with the current timestamp and empty chat history if not user_data: timestamp = str(datetime.datetime.now().isoformat()) # Unique timestamp for each user users_collection.insert_one({ "user_id": user_id, "timestamp": timestamp, "messages": [] # Empty chat history }) st.write("New user detected! Created user entry in the database.") else: # If user exists, load the chat history from the database st.session_state.messages = user_data["messages"] # Initialize a processing flag in session state if 'processing' not in st.session_state: st.session_state.processing = False # Function to send POST request to a local server def send_post_request(prompt): url = "http://localhost:19194/" # Update this to your actual server URL payload = prompt.title() response = requests.post(url, json=payload) json = response.json() if "response" in json: return json["response"] else: return json # Custom CSS to fix the input box at the bottom of the page st.markdown( """ """, unsafe_allow_html=True ) st.title('Ask Maargdarshak') if 'messages' not in st.session_state: st.session_state.messages = [] # Load chat history from session state for message in st.session_state.messages: st.chat_message(message['role']).markdown(message['content']) # Disable the input box if processing a prompt if st.session_state.processing: st.chat_input("Processing...", disabled=True) else: # Prompt input prompt = st.chat_input("Ask your question here") if prompt: # Set the processing flag to True to disable input st.session_state.processing = True # Display the user prompt in the chat UI st.chat_message('user').markdown(prompt) st.session_state.messages.append({'role': 'user', 'content': prompt}) # Show spinner while generating the response with st.spinner("Generating response..."): # Get the bot's response via a POST request response = send_post_request(prompt) # Display the bot's response in the chat UI st.chat_message('bot').markdown(response) st.session_state.messages.append({'role': 'bot', 'content': response}) # Update the user's chat history in the database users_collection.update_one( {"user_id": user_id}, {"$push": {"messages": {'role': 'user', 'content': prompt}}}, ) users_collection.update_one( {"user_id": user_id}, {"$push": {"messages": {'role': 'bot', 'content': response}}}, ) # Save updated history to cookies (optional, MongoDB handles persistence) cookies['history'] = st.session_state.messages cookies.save() # Reset the processing flag to enable input again st.session_state.processing = False