import streamlit as st import os from dotenv import load_dotenv from langsmith import traceable from app.chat import ( initialize_session_state, display_chat_history, ) from app.data_loader import get_data, load_docs from app.document_processor import process_documents, save_vector_store_to_supabase, load_vector_store_from_supabase from app.db import supabase from app.config import Config # Modularized helpers import app.rag as rag import app.vector_store as vs import app.auth as auth import app.ui as ui from app.session import restore_user_session_if_needed, ensure_active_session from app.workflows import prepare_vector_store_if_needed from uuid import uuid4 load_dotenv() BUCKET_NAME = Config.BUCKET_NAME VECTOR_STORE_PREFIX = Config.VECTOR_STORE_PREFIX @traceable(name="Main Chatbot RAG App") def main(): try: load_dotenv() except Exception: pass initialize_session_state() st.set_page_config( page_title="PNP-Bot", page_icon="assets/favicon.ico", ) # Try restore Supabase session if user missing restore_user_session_if_needed() # Authentication gate user = st.session_state.get("user") if not user: auth.auth_view() return # Ensure we have an active chat session ensure_active_session(user["id"]) # Sidebar: delegate completely to UI module with st.sidebar: ui.render_sidebar_sessions() # Vector store orchestration (delegated) vector_store = prepare_vector_store_if_needed(len(st.session_state["history"])) st.session_state["vector_store"] = vector_store if st.session_state["vector_store"] is not None: chain = rag.create_conversational_chain(st.session_state["vector_store"]) display_chat_history(chain) if __name__ == "__main__": main()