Added
- Pluggable embedding providers.
config.embeddings.providernow acceptslocal(default, zero-dependency@xenova/transformers) or an opt-in API provider:openai,voyage, orcohere. Bring a frontier embedder such as OpenAItext-embedding-3-largefor frontier-class retrieval, while the default stays fully local with no API keys and no new runtime dependencies (API providers use the nativefetchon Node 22.5+). The key is read fromOPENAI_API_KEY/VOYAGE_API_KEY/COHERE_API_KEY. Optionalembeddings.apiBaseUrl(https only; localhost may use http) andembeddings.batchSize(positive integer, default 64). API requests are bounded by a 30s timeout.
Changed
- Provider-aware reindex identity. The local provider keeps the bare model string as its identity, so existing stores are NOT re-indexed on upgrade. Switching to or from an API embedder (or changing the model or vector dimension) triggers the existing reindex path.
embeddings.enabled: falsenow hard-disables embedding for both local and API providers, which prevents unwanted paid API calls.- Status surface.
hippo statusandhippo embed --statusnow show the active provider, model, whether the API key is present, the vector dimension, and a reindex-pending hint, and still report cached counts when embeddings are disabled or a key was removed.
Notes
- Embedding stays best-effort on the add path: a provider failure never rejects a write. The explicit
hippo embedbackfill checkpoints progress per chunk and surfaces hard failures, so it never reports a false success. A malformed API response (wrong vector count or an empty vector) is treated as a hard failure so a reindex aborts atomically. - A real frontier-embedder LongMemEval benchmark (dual numbers: the zero-dependency local floor plus the frontier number) is a follow-up that must run on a host with API egress and a key. See
docs/FRONTIER_EMBEDDER_BENCHMARK.md.
Reviewed across a plan-stage senior-code-review and 10 rounds of cross-model codex review, all findings fixed. Full test suite green (2525 tests).