Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2.0 KiB
modules/verbo/ — Provider de embeddings model-agnostic (era dime)
Propósito. Capa de embeddings estructuralmente agnóstica al modelo:
la elección de backend es config por instancia. Los vectores quedan
atados a su ModelId — comparar vectores de modelos distintos es un
error explícito, no un sinsentido silencioso. Un daemon permite cargar
un modelo una vez y compartirlo entre procesos.
Crates
| crate | tipo | rol |
|---|---|---|
verbo-core |
lib | Contrato: ModelId, EmbeddingVector (cosine), EmbedError, trait Provider |
verbo-mock |
lib | Backend determinista sin modelo (FNV-1a + LCG) — para tests |
verbo-daemon |
lib | Daemon (sirve un Provider por socket Unix) + DaemonClient (lo consume como Provider) |
Dependencias
mock,daemon←verbo-core.daemon←tokio+postcard(frames con prefijo de largo).verbo-corees#![forbid(unsafe_code)], sóloserde+async-trait.
Compartir entre procesos
verbo-daemon resuelve la duplicación de modelos en RAM: un Daemon
carga el modelo una vez; N procesos lo consumen vía DaemonClient, que
implementa Provider y por tanto es indistinguible de un backend local.
Multi-instancia = un daemon por modelo, cada uno en su socket.
Estado
Contrato + mock + daemon implementados y verdes (~25 tests).
Pendiente — backends de modelos reales (requieren infra/API keys):
| backend pendiente | tipo | nota |
|---|---|---|
verbo-cohere |
remoto | API Cohere — recomendado para uso remoto |
verbo-bge |
local | bge-code-large vía ONNX — recomendado local |
verbo-fastembed |
local | modelos ligeros (MiniLM 384d) |
Cada uno implementa Provider y puede servirse vía verbo-daemon sin
cambios — el daemon es agnóstico del backend.