{"repo": "anurag-1a/chatdoc", "files": {"app.py": {"3b0c73d12f4e11df0260e5c09baaffb99370128a": {"t": 1785674397.0148282, "n": 6354, "h": "cc79176b612a9d63", "c": "import os\nimport re\nimport streamlit as st\nfrom modules.vectordb_manager import VectorStoreManager\nfrom modules.groq_chat import ChatWithGroq\nfrom modules.history_manager import ChatHistoryManager\n\nst.set_page_config(page_title=\"ChatDoc with Groq\", layout=\"wide\")\n\n# --- Initialize memory ---\nif \"chat_history\" not in st.session_state:\n st.session_state[\"chat_history\"] = []\nif \"chatbot_context\" not in st.session_state:\n st.session_state[\"chatbot_context\"] = None\nif \"selected_history\" not in st.session_state:\n st.session_state[\"selected_history\"] = \"New Session\"\nif \"active_session_id\" not in st.session_state:\n st.session_state[\"active_session_id\"] = \"New Session\"\nif \"last_uploaded_files\" not in st.session_state:\n st.session_state[\"last_uploaded_files\"] = []\n# Handle session switch or uploaded files to reset chatbot context\nif \"file_uploader_key\" not in st.session_state:\n st.session_state.file_uploader_key = \"file_uploader_0\"\n# When resetting (new chat or session change), increment key to reset uploader\ndef reset_uploader():\n if \"file_uploader_key\" in st.session_state:\n # Increment key to force Streamlit reset file uploader\n key_number = int(st.session_state.file_uploader_key.split(\"_\")[-1])\n st.session_state.file_uploader_key = f\"file_uploader_{key_number + 1}\"\n else: \n st.session_state.file_uploader_key = \"file_uploader_0\"\n\n# --- Login: Enter Groq API Key ---\nif \"groq_api_key\" not in st.session_state:\n st.title(\"🔐 Login to ChatDOC\")\n api_key = st.text_input(\"Enter your Groq API Key\", type=\"password\")\n if st.button(\"Login\"):\n if api_key.startswith(\"gsk_\"):\n st.session_state[\"groq_api_key\"] = api_key\n st.rerun()\n else:\n st.error(\"Please enter a valid Groq API key.\")\n st.stop()\n\n# Managers \nvector_manager = VectorStoreManager()\nhistory_manager = ChatHistoryManager()\n\n# Streamlit App Title\nst.title(\"📄 Chat with your Files(PDFs/txt)\")\n\n# Streamlit Sidebar: Load old sessions\nwith st.sidebar:\n st.header(\"📜 Chat Sessions\")\n if st.button(\"➕ New Chat\", use_container_width=True):\n # Save current chat session before reset\n if st.session_state.get(\"chat_history\"):\n history_manager.history = st.session_state[\"chat_history\"]\n saved_path = history_manager.save()\n st.toast(f\"Previous session saved to: {saved_path}\")\n # Reset state for new session\n st.session_state[\"chat_history\"] = []\n st.session_state[\"chatbot_context\"] = None\n st.session_state[\"selected_history\"] = \"New Session\"\n st.session_state[\"active_session_id\"] = \"New Session\"\n st.session_state[\"last_uploaded_files\"] = []\n reset_uploader()\n st.rerun()\n try:\n history_files = [f for f in os.listdir(\"chat_history\") if f.endswith(\".json\")]\n except FileNotFoundError:\n history_files = []\n\n selected_history = st.selectbox(\"Choose Session\", [\"New Session\"] + history_files)\n st.session_state[\"selected_history\"] = selected_history\n\n\n\n\nuploaded_files = st.file_uploader(\n \"Upload PDF or TXT files\", \n type=[\"pdf\", \"txt\"], \n accept_multiple_files=True, \n key=st.session_state.file_uploader_key\n)\nfile_names = [f.name for f in uploaded_files] if uploaded_files else []\n\n# Detect state switch or new document upload\nsession_changed = st.session_state[\"selected_history\"] != st.session_state[\"active_session_id\"]\nfile_changed = file_names != st.session_state[\"last_uploaded_files\"]\n\nif session_changed or file_changed:\n st.session_state[\"chatbot_context\"] = None\n st.session_state[\"chat_history\"] = []\n st.session_state[\"last_uploaded_files\"] = file_names\n st.session_state[\"active_session_id\"] = st.session_state[\"selected_history\"]\n\n# Load selected chat history\nif st.session_state[\"selected_history\"] != \"New Session\":\n session_name = st.session_state[\"selected_history\"].replace(\".json\", \"\")\n loaded_history = history_manager.load(session_name)\n st.session_state[\"chat_history\"] = loaded_history\n st.session_state[\"chatbot_context\"] = None\n load_msg = st.empty()\n load_msg.info(f\"📄 {selected_history} Loaded\")\n\n# Create new chatbot\nif st.session_state[\"selected_history\"] == \"New Session\" and uploaded_files:\n if st.session_state[\"chatbot_context\"] is None:\n with st.spinner(\"📖 Reading and indexing documents...\"):\n retriever = vector_manager.create_or_load_vectorstore(uploaded_files)\n chatbot = ChatWithGroq(retriever, groq_api_key=st.session_state[\"groq_api_key\"])\n st.session_state[\"chatbot_context\"] = chatbot\n \n\n\n# Left Side Chat Block \nchatbot = st.session_state.get(\"chatbot_context\", None)\n\nif chatbot and st.session_state[\"selected_history\"] == \"New Session\":\n user_question = st.chat_input(\"Ask anything from the uploaded docs...\")\n\n if user_question:\n with st.spinner(\"💡 Thinking...\"):\n response = chatbot.ask(user_question)\n raw_answer = response[\"answer\"]\n\n final_answer = raw_answer.strip()\n\n st.session_state[\"chat_history\"].append({\n \"user\": user_question,\n \"bot\": raw_answer,\n #\"reasoning\": reasoning,\n \"answer\": final_answer\n })\n\n# View chat history \nif st.session_state.get(\"chat_history\"):\n for msg in st.session_state[\"chat_history\"]:\n with st.chat_message(\"user\"):\n st.markdown(msg[\"user\"])\n with st.chat_message(\"assistant\"):\n if msg.get(\"reasoning\"):\n with st.expander(\"🧠 LLM Thinking\", expanded=False):\n st.markdown(f\"{msg.get(\"reasoning\") or 'No reasoning provided.'}\")\n st.markdown(msg.get(\"answer\") or msg[\"bot\"])\n\n\n# Saving current session \nif st.session_state[\"selected_history\"] == \"New Session\" and st.session_state[\"chat_history\"]:\n st.markdown(\"---\")\n st.subheader(\"💾 Save this session\")\n\n custom_name = st.text_input(\"Optional filename (e.g. receipts.json):\", key=\"save_name\")\n\n if st.button(\"✅ Save Chat\", use_container_width=True):\n filename = custom_name.strip() if custom_name.endswith(\".json\") else None\n history_manager.history = st.session_state[\"chat_history\"]\n path = history_manager.save(name=filename)\n st.success(f\"📁 Session saved to `{path}`\")"}}}}