ovos-chromadb-embeddings-plugin

September 1, 2026 · View on GitHub

Ask DeepWiki

ovos-chromadb-embeddings-plugin

ChromaDB-backed EmbeddingsDB vector store plugin for OpenVoiceOS.

Install

pip install ovos-chromadb-embeddings-plugin

What is an EmbeddingsDB?

EmbeddingsDB is the abstract base class from ovos-plugin-manager for vector stores. Plugins implementing it are discovered automatically by OPM under the entry-point group opm.embeddings. This plugin registers as:

opm.embeddings → ovos-chromadb-embeddings-plugin → ChromaEmbeddingsDB

OVOS subsystems call OVOSPluginFactory.get_plugin("opm.embeddings") to obtain a configured store without coupling to a specific backend, so any EmbeddingsDB plugin (ChromaDB here, or e.g. qdrant) is a drop-in swap.

Where this fits in OVOS

This plugin is the vector store half of the stack. It stores and searches vectors but does not produce them. Pair it with an embedding producer such as ovos-gguf-embeddings-plugin (text → vectors), or the face / voice embedders.

Concrete consumers that can be backed by this store:

ConsumerUses the store for
ovos-persona-serverRAG: the OpenAI-compatible Files / Vector-Stores / /search endpoints
ovos-memory-pluginslong-term semantic memory for a persona
face / voice recognitionnearest-neighbour identity lookup over enrolment vectors

It is local-first: in persistent mode it runs fully offline on a CPU with no server.

Quickstart

import tempfile, numpy as np
from ovos_chromadb_embeddings import ChromaEmbeddingsDB

with tempfile.TemporaryDirectory() as tmp:
    db = ChromaEmbeddingsDB(config={"path": tmp})

    # Store a few 4-d vectors
    db.add_embeddings("apple",  np.array([0.9, 0.1, 0.0, 0.0]))
    db.add_embeddings("banana", np.array([0.0, 0.9, 0.1, 0.0]))
    db.add_embeddings("cherry", np.array([0.0, 0.0, 0.9, 0.1]))

    # Nearest-neighbour query
    query = np.array([0.85, 0.15, 0.0, 0.0])
    results = db.query(query, top_k=2)
    # → [("apple", 0.003...), ("banana", 0.45...)]
    print(results[0][0])  # "apple"

query returns (id, distance) tuples ordered nearest-first. The score is a distance, not a similarity. Lower is closer for the default cosine metric (and for l2). Change the metric with hnsw:space (see Configuration). The query vector must have the same dimensionality as the stored vectors.

Configuration

Pass a config dict to ChromaEmbeddingsDB(config=...) or set it in your OVOS configuration under the plugin key.

KeyTypeDefaultDescription
pathstr"./chromadb_storage"Local persistence directory (PersistentClient mode).
hoststrnoneRemote ChromaDB server host. When set, uses HttpClient instead of PersistentClient.
portint8000Port for the remote ChromaDB server (HttpClient mode only).
default_collection_namestr"embeddings"Name of the collection created/used on init.
hnsw:spacestr"cosine"Distance metric for HNSW index. Accepted: "cosine", "l2", "ip". Set via collection metadata.

Local (persistent) mode

db = ChromaEmbeddingsDB(config={"path": "/var/lib/ovos/chromadb"})

Remote server mode

db = ChromaEmbeddingsDB(config={"host": "192.168.1.10", "port": 8000})

API overview

MethodDescription
add_embeddings(key, embedding, metadata, collection_name)Upsert a single vector.
add_embeddings_batch(keys, embeddings, metadata, collection_name)Upsert a list of vectors.
get_embeddings(key, collection_name, return_metadata)Retrieve a vector by key.
get_embeddings_batch(keys, collection_name, return_metadata)Retrieve multiple vectors.
delete_embeddings(key, collection_name)Delete a vector by key.
delete_embeddings_batch(keys, collection_name)Delete multiple vectors.
query(embedding, top_k, return_metadata, collection_name)ANN search, returns [(id, distance)].
create_collection(name, metadata)Create (or get) a named collection.
get_collection(name)Retrieve a collection handle (raises ValueError if absent).
delete_collection(name)Drop a collection.
list_collections()List all collections.
count_embeddings_in_collection(collection_name)Count stored vectors.

Documentation

Examples

Testing

pip install -e ".[test]"
pytest test/ -v

The test suite uses a temporary PersistentClient with no network access. test/test_e2e.py runs a real end-to-end flow (add → query → verify nearest neighbour) using a small deterministic local embedder so it passes in CI without model downloads.


Credits

TigreGótico originally developed this plugin for OpenVoiceOS, sponsored by VisioLab. The NGI0 Commons Fund / NLnet funded the modernization.

VisioLab

This work was sponsored by VisioLab, part of Royal Dutch Visio. Royal Dutch Visio is the test, education, and research center in the field of (innovative) assistive technology for blind and visually impaired people and professionals. We explore (new) technological developments such as Voice, VR and AI and make the knowledge and expertise we gain available to everyone.

NGI0 Commons Fund

This project was funded through the NGI0 Commons Fund, a fund established by NLnet with financial support from the European Commission's Next Generation Internet programme, under the aegis of DG Communications Networks, Content and Technology under grant agreement No 101135429.