import streamlit as st from app.data_loader import get_data, load_docs from app.document_processor import process_documents, save_vector_store_to_supabase from app.db import supabase from app.config import Config import app.vector_store as vs import app.rag as rag BUCKET_NAME = Config.BUCKET_NAME VECTOR_STORE_PREFIX = Config.VECTOR_STORE_PREFIX def prepare_vector_store_if_needed(history_len: int): """ Orchestrates vector store availability. - If no local history and vector store is outdated: sync data, process, and upload. - Else: load cached vector store from Supabase. Returns a vector_store or None. """ vector_store = vs.get_cached_vector_store() if history_len == 0: if vs.vector_store_is_outdated(): with st.spinner("Memuat dan memproses dokumen..."): get_data() docs = load_docs() if len(docs) > 0: reordered_docs = rag.reorder_embedding(docs) vector_store = process_documents(reordered_docs) with st.spinner("Mengunggah vector store ke Supabase..."): success = save_vector_store_to_supabase(vector_store, supabase, BUCKET_NAME, VECTOR_STORE_PREFIX) if success: print("Vector store berhasil diunggah ke Supabase!") else: print("Gagal mengunggah vector store ke Supabase.") else: print("Folder 'data/' kosong. Chatbot tetap bisa digunakan, tetapi tanpa konteks dokumen.") vector_store = None else: with st.spinner("Memuat vector store dari Supabase..."): vector_store = vs.get_cached_vector_store() if vector_store: print("Vector store berhasil dimuat dari Supabase!") else: # Jika gagal memuat (mis. karena mismatch versi Pydantic/LangChain pada pickle), # fallback: bangun ulang dari dokumen dan unggah agar kompatibel dengan runtime saat ini. print("Gagal memuat vector store dari Supabase. Mencoba membangun ulang...") get_data() docs = load_docs() if len(docs) > 0: reordered_docs = rag.reorder_embedding(docs) vector_store = process_documents(reordered_docs) with st.spinner("Mengunggah vector store ke Supabase..."): success = save_vector_store_to_supabase(vector_store, supabase, BUCKET_NAME, VECTOR_STORE_PREFIX) if success: print("Vector store hasil rebuild berhasil diunggah ke Supabase!") else: print("Gagal mengunggah vector store hasil rebuild ke Supabase.") else: print("Tidak ada dokumen untuk membangun ulang vector store.") vector_store = None else: vector_store = st.session_state.get("vector_store") or vs.get_cached_vector_store() return vector_store