"""Embedding model wrapper — singleton pattern. Uses sentence-transformers with all-MiniLM-L6-v2 (384-dim, ~80MB). Loaded once, reused across all requests. """ from sentence_transformers import SentenceTransformer from config import Config class Embedder: """Thread-safe singleton wrapper for the embedding model.""" _instance = None @classmethod def get_instance(cls) -> "Embedder": if cls._instance is None: cls._instance = cls() return cls._instance def __init__(self) -> None: self.model = SentenceTransformer(Config.EMBEDDING_MODEL) def embed(self, text: str) -> list[float]: return self.model.encode(text).tolist() def embed_batch(self, texts: list[str]) -> list[list[float]]: return self.model.encode(texts).tolist()