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 v5.2.0 · Last updated: 2026-08-22 · Applies to: velesdb-core 5.2.0 · Report a docs error
Release files for velesdb 5.2.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-5.2.0.tar.gz | 3.6 MB | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| velesdb-5.2.0-cp39-abi3-win_arm64.whl | CPython 3.9 | abi3 | Windows ARM64 | Details |
| velesdb-5.2.0-cp39-abi3-win_amd64.whl | CPython 3.9 | abi3 | Windows x86-64 | Details |
| velesdb-5.2.0-cp39-abi3-musllinux_1_2_x86_64.whl | CPython 3.9 | abi3 | Linux musl 1.2+ x86-64 | Details |
| velesdb-5.2.0-cp39-abi3-musllinux_1_2_aarch64.whl | CPython 3.9 | abi3 | Linux musl 1.2+ ARM64 | Details |
| velesdb-5.2.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl | CPython 3.9 | abi3 | Linux glibc 2.17+ x86-64 | Details |
| velesdb-5.2.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl | CPython 3.9 | abi3 | Linux glibc 2.17+ ARM64 | Details |
| velesdb-5.2.0-cp39-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl | CPython 3.9 | abi3 | macOS 10.12+ x86-64, macOS 11.0+ ARM64, macOS 10.12+ universal2 (ARM64, x86-64) | Details |
Total release size: 35.6 MB
Release files / velesdb-5.2.0.tar.gz
| Download URL | velesdb-5.2.0.tar.gz |
|---|---|
| Size | 3.6 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
c0a24fb2bedb437bb752a0e55588c28138b5067bf91110ae7a94adcdcce33969
|
|
BLAKE2b-256 checksum How to use checksums |
412d801f96c3b291ba368935541f6abdcbe9edb0b10b605494ea4567c0b44fab
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / velesdb-5.2.0-cp39-abi3-win_arm64.whl
| Download URL | velesdb-5.2.0-cp39-abi3-win_arm64.whl |
|---|---|
| Size | 3.7 MB |
| Tags | CPython 3.9 Windows ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
0ed773958d49bc8525e79717343810c09903ab9d5e68ccc1abf0b43900d9e7e6
|
|
BLAKE2b-256 checksum How to use checksums |
9e04108d806b74759205139df5fb6cdfe9fc10e4ab96290af27118ca1b0a53fa
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.9
|
Release files / velesdb-5.2.0-cp39-abi3-win_amd64.whl
| Download URL | velesdb-5.2.0-cp39-abi3-win_amd64.whl |
|---|---|
| Size | 3.9 MB |
| Tags | CPython 3.9 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
1af803ffe3bf2ebe127e143a382d23dee265c79a072090cbfe891d74ce6ad7d3
|
|
BLAKE2b-256 checksum How to use checksums |
f4812702c2dcc2339e910fc886e3b3fe366909f74b1e99973e7b08c36a39ab4f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.9
|
Release files / velesdb-5.2.0-cp39-abi3-musllinux_1_2_x86_64.whl
| Download URL | velesdb-5.2.0-cp39-abi3-musllinux_1_2_x86_64.whl |
|---|---|
| Size | 4.4 MB |
| Tags | CPython 3.9 Linux musl 1.2+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
d45118d12e56c186ec11db8bba2cb2805153b1e6fd34cddb9fd45a74afa2e578
|
|
BLAKE2b-256 checksum How to use checksums |
ad15425c6bd21312db1220cc10d4b3ada0a4814f03775d7fed98a5162d04e614
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / velesdb-5.2.0-cp39-abi3-musllinux_1_2_aarch64.whl
| Download URL | velesdb-5.2.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 |
6198080cfe827738c9409772f6162ead1352b83165d14607fa713a65384efceb
|
|
BLAKE2b-256 checksum How to use checksums |
b839a3069ccc2a5ca617241cb444036e4dcd81af3daa9d778d9a6308e771637b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / velesdb-5.2.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | velesdb-5.2.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 |
c3d1c71a2bb6e3011ee1906bd94c1ff2acfb12b7f368dda6f1f14b012cfe8224
|
|
BLAKE2b-256 checksum How to use checksums |
45229ffccb49dd8d1c043263353ef7dc8da442469fa5436081e0fc460c56ffda
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / velesdb-5.2.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | velesdb-5.2.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 |
7f1cd46fabc095973f3c6d8964f73b89d0c6bc92e63385e7b51dc6991eef9d69
|
|
BLAKE2b-256 checksum How to use checksums |
9fab24d7925d5ac251c18b7ea74de2b04e6e6a8be526e6e4bc407bde7a8ab7e7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / velesdb-5.2.0-cp39-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
| Download URL | velesdb-5.2.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 |
1095a44c057d560b1199afd3e00874344efc10f92ebc6f9794933c61e6049746
|
|
BLAKE2b-256 checksum How to use checksums |
0353ee14dee650024c74d76bf77329dbc425a6689c4ed8d6f9910e9203b950cb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.9
|