File size: 1,709 Bytes
ec666c4
8f25a7a
 
db27c93
ec666c4
 
 
3c1e19a
69a4e9f
 
 
 
4942c09
 
 
 
 
 
 
 
69a4e9f
 
 
 
 
 
 
 
 
 
8f25a7a
 
3c1e19a
69a4e9f
d01f520
69a4e9f
 
 
 
 
 
 
8f25a7a
3c1e19a
8f25a7a
d01f520
8f25a7a
d01f520
3c1e19a
69a4e9f
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
import requests
import time
import logging
import os
from rag_core.utils import log_timed

@log_timed("gửi API tạo embedding")
def get_embedding(text: str, retries: int = 3, base_timeout: int = 30):
    api_key = os.getenv("GEMINI_API_KEY")
    if not api_key:
        raise ValueError("Thiếu biến môi trường GEMINI_API_KEY.")

    # Giới hạn độ dài text gửi lên API (ví dụ 8000 ký tự)
    MAX_LEN = 8000
    if not text or not text.strip():
        raise ValueError("Chunk rỗng, không thể tạo embedding.")
    if len(text) > MAX_LEN:
        logging.warning(f"Chunk quá dài ({len(text)} ký tự), sẽ cắt còn {MAX_LEN} ký tự đầu.")
        text = text[:MAX_LEN]

    url = f"https://generativelanguage.googleapis.com/v1/models/text-embedding-004:embedContent?key={api_key}"

    payload = {
        "content": {
            "parts": [
                { "text": text }
            ]
        }
    }

    for i in range(retries):
        try:
            current_timeout = base_timeout * (i + 1)
            response = requests.post(url, json=payload, timeout=current_timeout)
            response.raise_for_status()

            # Kiểm tra phản hồi chứa trường embedding không
            data = response.json()
            if "embedding" not in data:
                raise ValueError(f"Phản hồi không có 'embedding': {data}")
            return data["embedding"]['values']

        except requests.exceptions.RequestException as e:
            logging.warning(f"Lỗi embedding (lần {i+1}/{retries}, timeout={current_timeout}s): {e}")
            if i < retries - 1:
                time.sleep(2)
            else:
                raise