velesdb (Python)
Embedded vector + graph database for Python: local-first semantic search and explainable agent memory.
Licensed under the VelesDB Core License 1.0 (source-available). The compiled wheel embeds the VelesDB engine and is governed by the same license.
Objective
Vector search usually means running a server: a container, a port, a network hop on every query, and an ops story you did not ask for. VelesDB's Python SDK removes all of it — the engine is compiled into the wheel and runs inside your process, against a directory on disk. You get microsecond-scale similarity search, hybrid dense + sparse retrieval, graphs and VelesQL without a daemon, and — when you are building an agent — a memory layer that can explain why it returned what it returned.
If you already run a managed vector service and are happy with it, you do not have this problem and can stop here.
Use cases
- A RAG prototype on a laptop that must survive
pip installand nothing else — no Docker, no cloud account. - An AI agent that has to remember decisions across process restarts and justify them later (
why()). - A desktop or CLI application shipping semantic search inside the app, with the index living next to the user's data.
- A batch job that embeds a corpus once, writes a portable index directory, and searches it in-process.
- An offline or air-gapped environment where sending embeddings to a hosted API is not an option.
Prerequisites
| Requirement | Minimum version | Note |
|---|---|---|
| Python | 3.9 | requires-python = ">=3.9"; a single cp39-abi3 wheel covers 3.9+ |
| pip | any recent | prebuilt wheels, no compilation |
| NumPy | 1.20 | hard runtime dependency, installed automatically |
| Rust | 1.90 | only when building from the sdist / source checkout |
| Embedding model | — | not included: VelesDB stores and searches vectors, it does not generate them |
Installation
pip install velesdb
Optional extras (all independent, install only what you use):
pip install "velesdb[embed-sentence-transformers]" # local embedding adapter
pip install "velesdb[embed-openai]" # OpenAI-compatible adapter
pip install "velesdb[pandas]" # DataFrame ingestion
pip install "velesdb[polars]" # Polars ingestion
Building from a source checkout of this repository instead:
pip install maturin
cd crates/velesdb-python
maturin develop
First success in 60 seconds
# pip install velesdb
import velesdb
db = velesdb.Database("./hello_velesdb_data") # created if missing
docs = db.get_or_create_collection("docs", metric="cosine") # dimension auto-detected
# 4-D vectors whose axes stand for four made-up topics: [tech, food, music, sport]
docs.upsert([
{"id": 1, "vector": [1.0, 0.0, 0.0, 0.0], "payload": {"title": "Rust release notes"}},
{"id": 2, "vector": [0.0, 1.0, 0.0, 0.0], "payload": {"title": "Best ramen in Tokyo"}},
{"id": 3, "vector": [0.6, 0.0, 0.8, 0.0], "payload": {"title": "AI-generated jazz"}},
])
results = docs.search_request(velesdb.SearchOptions(vector=[1.0, 0.0, 0.0, 0.0], k=2))
for r in results:
print(f"score={r['score']:.3f} {r['payload']['title']}")
Expected output — the exact-match document scores 1.000, the partly-tech one 0.600:
score=1.000 Rust release notes
score=0.600 AI-generated jazz
Anything else is a failure: an empty output means the upsert did not land (check
that ./hello_velesdb_data is writable), and a ModuleNotFoundError means the
wheel is not installed in the interpreter you are running. The longer version of
this script is
examples/python/hello_velesdb.py.
Next step, the agent-memory wedge — the same package, no extra install:
from velesdb import MemoryService # offline, deterministic, no API key
mem = MemoryService("./agent_memory") # on-disk store; survives restarts
reason = mem.remember("Robert is recovering from knee surgery")
mem.remember("Booked the aisle seat on Robert's flight", links=[(reason, "because")])
mem.why("why the aisle seat on Robert's flight?") # walks booking → reason
why() returns the best-matching memory plus the connected subgraph reached
through typed links — context that shares no words with the question, which a
plain vector recall cannot find. See
PYTHON_AGENT_MEMORY.md.
Configuration
Database(path, config=...) accepts a typed VelesConfigOptions covering every
engine section of the core VelesConfig. Build it in code or load it from a
velesdb.toml (engine-only semantics: a shell-owned [server] / [logging]
table in a shared file is ignored).
| Section | Type | Controls |
|---|---|---|
limits |
LimitsOptions |
collection and resource ceilings |
search |
SearchConfigOptions |
default search mode, max results |
hnsw |
HnswConfigOptions |
index build/search parameters |
storage |
StorageOptions |
on-disk storage behaviour |
quantization |
QuantizationOptions |
compression settings |
from velesdb import Database, VelesConfigOptions, LimitsOptions, SearchConfigOptions
cfg = VelesConfigOptions(
limits=LimitsOptions(max_collections=50),
search=SearchConfigOptions(default_mode="accurate", max_results=100),
)
db = Database("./tenant1", config=cfg)
# Or from TOML (fail-fast: invalid TOML/values raise ValueError,
# a missing file raises FileNotFoundError):
cfg = VelesConfigOptions.from_toml_path("./velesdb.toml")
db = Database("./tenant1", config=cfg)
wal_batch is intentionally not exposed — the concurrent WAL writer is a
VelesDB Enterprise feature (see
WRITE_CONCURRENCY.md).
Examples
Runnable scripts, not snippets: examples/python/
(hello_velesdb.py, hybrid_queries.py, fusion_strategies.py,
graph_traversal.py, graphrag_langchain.py, graphrag_llamaindex.py,
multimodel_notebook.py) and the agent-memory demos in
examples/agent_memory/.
API / commands
Signatures and docstrings ship inside the wheel as a typed stub
(python/velesdb/__init__.pyi, with py.typed),
so your IDE and mypy/pyright are the reference. Task-oriented guides:
| Guide | What it covers |
|---|---|
| PYTHON_API_REFERENCE.md | Database / Collection, sparse + hybrid search, fusion strategies, distance metrics, storage modes, bulk loading, streaming ingestion |
| PYTHON_AGENT_MEMORY.md | MemoryService (remember / recall / why / feedback) and the semantic / episodic / procedural SDK |
| PYTHON_CONTEXT_COMPILER.md | compile_context, provenance handles, working contexts, LangChain and LlamaIndex wiring |
| PYTHON_GRAPH.md | persistent graph collections, MATCH queries, in-memory GraphStore |
| PYTHON_VELESQL.md | VelesQL.parse() / ParsedStatement introspection |
| PYTHON_RAG_PIPELINE.md | text → embeddings → results, built-in embedding adapters |
| PYTHON_PERFORMANCE.md | throughput tuning (numpy f32, upsert_bulk_numpy, batching) |
| PYTHON_ENGINE_BENCHMARKS.md | measured engine latency and recall figures |
| PYTHON_REMOTE_SERVER.md | talking to a running velesdb-server over HTTP |
Known limits
- No embedding generation. VelesDB stores and searches vectors; you bring the model (or use the optional adapters).
- Embedded only. There is no Python client class for a remote server — use HTTP against
velesdb-server. - One process per database directory. A second process opening the same path fails with
DatabaseLockedError([VELES-031]). wal_batch/ concurrent WAL writing is not exposed — Enterprise feature.- No GPU in the published wheels. The
gpuCargo feature exists but is not enabled by[tool.maturin]; it requires building from source. Collection.search(...)is deprecated since v1.15 (emitsDeprecationWarning); usesearch_request(SearchOptions(...)).Collection.get_graph_store()returns a standalone in-memory graph that is not connected to the collection; useDatabase.create_graph_collection()for persistence.
Compatibility
Prebuilt wheels published to PyPI (single cp39-abi3 wheel per platform, so one
wheel covers Python 3.9 and later):
| Platform | Status | Note |
|---|---|---|
| Linux x86_64 (glibc) | Prebuilt wheel | manylinux2014 — glibc 2.17+ |
| Linux aarch64 (glibc) | Prebuilt wheel | manylinux2014 |
| Linux x86_64 (musl) | Prebuilt wheel | musllinux_1_2 — Alpine images |
| Linux aarch64 (musl) | Prebuilt wheel | musllinux_1_2 |
| macOS arm64 + x86_64 | Prebuilt wheel | single universal2 wheel |
| Windows x64 | Prebuilt wheel | MSVC |
| Windows arm64 | Prebuilt wheel | aarch64-pc-windows-msvc |
| Anything else (PyPy, exotic arches, older glibc) | Source build | sdist fallback, needs Rust 1.90 |
Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
ModuleNotFoundError: No module named 'velesdb' |
the compiled extension is not installed in the active interpreter (a source checkout is not importable as-is) | pip install velesdb, or maturin develop inside crates/velesdb-python |
DimensionMismatchError: ... expected 768 ... 512 |
the vector length differs from the collection's dimension | re-embed with the model that matches the collection, or create the collection with dimension=None to auto-detect on first upsert |
DatabaseLockedError: [VELES-031] Database is already opened by another process |
another process (or a still-open handle, e.g. a notebook kernel) holds that directory | close the other handle, or give the second process its own directory |
RuntimeError on collection.stream_insert([...]) |
streaming ingestion was never enabled | call collection.enable_streaming(...) first |
FileNotFoundError from VelesConfigOptions.from_toml_path(...) |
config loading is fail-fast by design | check the path; malformed TOML or invalid values raise ValueError instead |
All typed exceptions (DimensionMismatchError, CollectionNotFoundError,
CollectionExistsError, EdgeExistsError, DatabaseLockedError,
VelesQLSyntaxError, VelesQLParameterError) derive from velesdb.VelesDBError,
so except velesdb.VelesDBError is a safe catch-all.
velesdb-python v6.0.0 · Last updated: 2026-09-02 · Applies to: velesdb-core 6.0.0 · Report a docs error
Release files for velesdb 6.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| velesdb-6.0.0.tar.gz | 3.7 MB | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| velesdb-6.0.0-cp39-abi3-win_arm64.whl | CPython 3.9 | abi3 | Windows ARM64 | Details |
| velesdb-6.0.0-cp39-abi3-win_amd64.whl | CPython 3.9 | abi3 | Windows x86-64 | Details |
| velesdb-6.0.0-cp39-abi3-musllinux_1_2_x86_64.whl | CPython 3.9 | abi3 | Linux musl 1.2+ x86-64 | Details |
| velesdb-6.0.0-cp39-abi3-musllinux_1_2_aarch64.whl | CPython 3.9 | abi3 | Linux musl 1.2+ ARM64 | Details |
| velesdb-6.0.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl | CPython 3.9 | abi3 | Linux glibc 2.17+ x86-64 | Details |
| velesdb-6.0.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl | CPython 3.9 | abi3 | Linux glibc 2.17+ ARM64 | Details |
| velesdb-6.0.0-cp39-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl | CPython 3.9 | abi3 | macOS 10.12+ universal2 (ARM64, x86-64), macOS 10.12+ x86-64, macOS 11.0+ ARM64 | Details |
Total release size: 36.0 MB
Release files / velesdb-6.0.0.tar.gz
| Download URL | velesdb-6.0.0.tar.gz |
|---|---|
| Size | 3.7 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
4626d05fee9136b4bb19b9e7ee530f0a5776547c4f2c5378bf05479a1b76959d
|
|
BLAKE2b-256 checksum How to use checksums |
e4003ffc7c5746c251cd755541c093e93973acfc6ef44660c30edba4009c33f6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / velesdb-6.0.0-cp39-abi3-win_arm64.whl
| Download URL | velesdb-6.0.0-cp39-abi3-win_arm64.whl |
|---|---|
| Size | 3.7 MB |
| Tags | CPython 3.9 Windows ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
d54fa360c2f4b97face509db1dd05b68b60183c47943f671c143c66531be3ca8
|
|
BLAKE2b-256 checksum How to use checksums |
6c519961ba5b625bdeb274df623dacd7f1ae3b7cde0b254f27bedac8b314e51e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.9
|
Release files / velesdb-6.0.0-cp39-abi3-win_amd64.whl
| Download URL | velesdb-6.0.0-cp39-abi3-win_amd64.whl |
|---|---|
| Size | 4.0 MB |
| Tags | CPython 3.9 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
6cbaae3e861a82aa00463d94c66959986e75f138423a329eaa58e38fbb69a837
|
|
BLAKE2b-256 checksum How to use checksums |
2e8fc2176c35b9ddde367e18583abd1ef48fb6a3647d36bafdc22eaae5d32fe7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.9
|
Release files / velesdb-6.0.0-cp39-abi3-musllinux_1_2_x86_64.whl
| Download URL | velesdb-6.0.0-cp39-abi3-musllinux_1_2_x86_64.whl |
|---|---|
| Size | 4.5 MB |
| Tags | CPython 3.9 Linux musl 1.2+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
241044b4fda56e0180fd9db82bc5014ec2c266805f1ed1e69768135e32e42ad5
|
|
BLAKE2b-256 checksum How to use checksums |
e52e5829e8ce7b89ae8f9d5f1cc0d46a6ed2c5ddc9a5968d1cd9d2c5fec65d1e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / velesdb-6.0.0-cp39-abi3-musllinux_1_2_aarch64.whl
| Download URL | velesdb-6.0.0-cp39-abi3-musllinux_1_2_aarch64.whl |
|---|---|
| Size | 4.1 MB |
| Tags | CPython 3.9 Linux musl 1.2+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
fef093afb2d8465c6683e8bea3968d73f7db1652194daf34049bc093220a961e
|
|
BLAKE2b-256 checksum How to use checksums |
c5321ee4bb676a8e3ce296d0b36337ee458f067ff21f27da78807ccef40ce5e7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / velesdb-6.0.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | velesdb-6.0.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 4.2 MB |
| Tags | CPython 3.9 Linux glibc 2.17+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
8e34f6a511d7cd814ea662c5ca3e7622d93ebac81259db18175e32a0d86f3459
|
|
BLAKE2b-256 checksum How to use checksums |
7543da357b8162c7213afdce05129d984e890587e8427f7bfae31f392442215c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / velesdb-6.0.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | velesdb-6.0.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 3.9 MB |
| Tags | CPython 3.9 Linux glibc 2.17+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
2c84cca724db1058b1e16882ea00e879d02f84cc9b968ae0323cef2a62b45600
|
|
BLAKE2b-256 checksum How to use checksums |
6a344a626c4e1d9c8d9513b4157b1f92411d50f8c8688899de40d260922fe8e9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / velesdb-6.0.0-cp39-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
| Download URL | velesdb-6.0.0-cp39-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl |
|---|---|
| Size | 7.7 MB |
| Tags | CPython 3.9 abi3 macOS 10.12+ universal2 (ARM64, x86-64) macOS 10.12+ x86-64 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
c406b45c527788fecffb8de689f0be7dfda50d882bd06fe9293c3c9a74f06958
|
|
BLAKE2b-256 checksum How to use checksums |
2c59c2a3bc3be9fd8c7919f47a6a5ecc02b6e9d27c78334ba685f72f4805d876
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.9
|