File size: 1,506 Bytes
ee39cc9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
# ────────────────────────────── utils/embeddings.py ──────────────────────────────
import os
from typing import List
import requests

from utils.logger import get_logger


logger = get_logger("EMBED", __name__)


class EmbeddingClient:
    """Embedding client that calls external embedding service via HTTP.

    Expects environment variable EMBEDDER_BASE_URL pointing at an API with:
      POST /embed {"texts": [..]} -> {"vectors": [[..], ...], "model": "..."}
    """

    def __init__(self, base_url: str = None):
        self.base_url = (base_url or os.getenv("EMBEDDER_BASE_URL", "")).rstrip("/")
        if not self.base_url:
            logger.warning("EMBEDDER_BASE_URL not set; embedding calls will fail.")

    def embed(self, texts: List[str]) -> List[list]:
        if not texts:
            return []
        if not self.base_url:
            raise RuntimeError("EMBEDDER_BASE_URL not configured")
        url = f"{self.base_url}/embed"
        try:
            resp = requests.post(url, json={"texts": texts}, timeout=60)
            if resp.status_code >= 400:
                raise RuntimeError(f"Embedding API error {resp.status_code}: {resp.text[:200]}")
            data = resp.json()
            vectors = data.get("vectors") or []
            return vectors
        except Exception as e:
            logger.warning(f"Embedding API failed: {e}")
            raise