File size: 4,908 Bytes
5440189
181097d
d77914a
181097d
5440189
181097d
663a26a
 
 
dcf12df
181097d
 
 
 
0f883c2
181097d
 
 
73ef64f
181097d
 
 
 
 
 
 
462a7c2
181097d
 
 
dcf12df
462a7c2
181097d
 
dcf12df
181097d
 
 
462a7c2
181097d
 
 
 
 
 
 
 
 
 
 
 
 
0f883c2
181097d
 
 
dcf12df
181097d
462a7c2
 
181097d
 
dcf12df
181097d
 
 
 
7cd5531
dcf12df
181097d
dcf12df
73ef64f
dcf12df
181097d
 
 
 
dcf12df
 
 
 
181097d
 
 
 
dcf12df
181097d
2fca014
181097d
dcf12df
462a7c2
 
181097d
dcf12df
 
181097d
dcf12df
462a7c2
181097d
dcf12df
181097d
dcf12df
59e6c45
 
181097d
59e6c45
 
181097d
59e6c45
dcf12df
2fca014
dcf12df
181097d
5440189
 
181097d
1eeddf6
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
import os
import sys
import time
import google.generativeai as genai
from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import SupabaseVectorStore
from supabase.client import create_client

# Класс для работы с эмбеддингами и контроля лимитов (ваш рабочий код)
class RateLimitedEmbeddings:
    def __init__(self, api_key, model_name):
        genai.configure(api_key=api_key)
        self.model_name = model_name

    def embed_documents(self, texts):
        embeddings = []
        batch_size = 30 
        
        for i in range(0, len(texts), batch_size):
            batch = texts[i : i + batch_size]
            print(f"--- Обработка батча: {i} из {len(texts)} ---")
            
            try:
                res = genai.embed_content(
                    model=self.model_name,
                    content=batch,
                    task_type="retrieval_document"
                )
                embeddings.extend(res['embedding'])
                # Пауза 5 секунд между батчами для стабильности на бесплатном тарифе
                time.sleep(5) 
            except Exception as e:
                if "429" in str(e):
                    print("Лимит Google превышен. Ждем 70 секунд...")
                    time.sleep(70)
                    res = genai.embed_content(
                        model=self.model_name,
                        content=batch,
                        task_type="retrieval_document"
                    )
                    embeddings.extend(res['embedding'])
                else:
                    raise e
                    
        return embeddings

    def embed_query(self, text):
        res = genai.embed_content(
            model=self.model_name,
            content=text,
            task_type="retrieval_query"
        )
        return res['embedding']

def load_book_to_supabase():
    # Получаем секреты из окружения GitHub Actions
    supabase_url = os.environ.get("SUPABASE_URL")
    supabase_key = os.environ.get("SUPABASE_SERVICE_ROLE_KEY")
    gemini_api_key = os.environ.get("GEMINI_API_KEY")

    if not all([supabase_url, supabase_key, gemini_api_key]):
        print("ОШИБКА: Проверьте секреты в настройках GitHub!")
        sys.exit(1)

    print("--- Шаг 1: Подключение к Supabase ---")
    supabase = create_client(supabase_url, supabase_key)

    print("--- Шаг 1.1: Очистка таблицы перед полной загрузкой ---")
    try:
        # Очищаем таблицу, так как id теперь имеет тип text
        supabase.table("documents").delete().neq("id", "0").execute()
        print("Таблица очищена.")
    except Exception as e:
        print(f"Предупреждение при очистке: {e}")

    print("--- Шаг 2: Загрузка файла книги ---")
    if not os.path.exists("book.txt"):
        print("ОШИБКА: Файл book.txt не найден в корне репозитория!")
        sys.exit(1)
        
    try:
        loader = TextLoader("book.txt", encoding="utf-8")
        documents = loader.load()
    except Exception as e:
        print(f"ОШИБКА при чтении файла: {e}")
        sys.exit(1)

    print("--- Шаг 3: Нарезка текста ---")
    # Параметры нарезки (3000 символов с перекрытием 300)
    text_splitter = RecursiveCharacterTextSplitter(chunk_size=3000, chunk_overlap=300)
    docs = text_splitter.split_documents(documents)
    
    # ОГРАНИЧЕНИЕ УБРАНО: Загружаем все фрагменты
    print(f"К ЗАГРУЗКЕ: {len(docs)} фрагментов.")

    print("--- Шаг 4: Инициализация эмбеддингов (Модель 001 / 3072 dim) ---")
    custom_embeddings = RateLimitedEmbeddings(gemini_api_key, "models/gemini-embedding-001")

    print("--- Шаг 5: Запуск процесса загрузки в базу ---")
    try:
        # LangChain сам разобьет docs на вызовы embed_documents по 30 штук
        SupabaseVectorStore.from_documents(
            docs,
            custom_embeddings,
            client=supabase,
            table_name="documents",
            query_name="match_documents",
        )
        print("--- УСПЕХ: Вся книга полностью загружена в Supabase! ---")
    except Exception as e:
        print(f"КРИТИЧЕСКАЯ ОШИБКА при загрузке: {e}")
        sys.exit(1)

if __name__ == "__main__":
    load_book_to_supabase()