File size: 3,245 Bytes
daa81fb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a638271
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
daa81fb
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
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