| """MiniCPM-Embedding client — runs on Modal GPU (NF4 4-bit).""" |
|
|
| from typing import List |
|
|
| from config import settings |
| from models.modal_client import get_embedder |
|
|
|
|
| class MiniCPMEmbedder: |
| def __init__(self): |
| self._remote = get_embedder() |
|
|
| def embed_documents(self, texts: List[str]) -> List[List[float]]: |
| if not texts: |
| return [] |
| batch_size = settings.EMBED_BATCH_SIZE |
| if len(texts) <= batch_size: |
| return self._remote.embed_documents.remote(texts) |
|
|
| vectors: List[List[float]] = [] |
| for start in range(0, len(texts), batch_size): |
| batch = texts[start : start + batch_size] |
| vectors.extend(self._remote.embed_documents.remote(batch)) |
| return vectors |
|
|
| def embed_query(self, query: str) -> List[float]: |
| return self._remote.embed_query.remote(query) |
|
|
| def get_embedding_dim(self) -> int: |
| return 2304 |
|
|