"""Embedding-Wrapper für lokale Modelle.""" import hashlib import logging from pathlib import Path from typing import List logger = logging.getLogger(__name__) class LocalEmbedder: """Wrapper um sentence-transformers mit Caching.""" def __init__(self, model_name: str = "all-MiniLM-L6-v2", cache_dir: Path = None): self.model_name = model_name self.cache_dir = cache_dir or Path.home() / ".cache" / "hermes_memory" / "embeddings" self.cache_dir.mkdir(parents=True, exist_ok=True) self._model = None self._dim = 384 def _load_model(self): if self._model is None: try: from sentence_transformers import SentenceTransformer self._model = SentenceTransformer(self.model_name) self._dim = self._model.get_sentence_embedding_dimension() except ImportError: logger.error("sentence-transformers nicht installiert.") raise return self._model def _cache_key(self, text: str) -> str: return hashlib.sha256(text.encode("utf-8")).hexdigest() + ".npy" def embed(self, texts: List[str]) -> List[List[float]]: model = self._load_model() return model.encode(texts, convert_to_numpy=True).tolist() def embed_query(self, text: str) -> List[float]: return self.embed([text])[0] @property def dim(self) -> int: return self._dim