"""Local embedding model wrapper (fastembed / ONNX — no torch dependency).""" from __future__ import annotations from functools import lru_cache from typing import List from .config import get_settings @lru_cache def _model(): from fastembed import TextEmbedding settings = get_settings() return TextEmbedding(model_name=settings.embedding_model) def embed_texts(texts: List[str]) -> List[List[float]]: if not texts: return [] # fastembed returns numpy arrays (already L2-normalized for bge models). return [v.tolist() for v in _model().embed(texts)] def embed_query(text: str) -> List[float]: return embed_texts([text])[0]