corvid-python
Python binding for corvid — an
embedded database with typed values, vector/text/hybrid search, graph
edges, geo, TTL, and schemas. The engine is compiled in (a Rust pyo3
crate pinned to an exact corvid release tag) and exposed as idiomatic
synchronous OOP: Db, Collection, a fluent Query builder, and
field() predicates. No SQL, no JSON, no serialization on the data
path — values map natively (see the value mapping below).
Its correctness story is the engine's golden suite: the same
267-line fixture files the C ABI smoke harness runs are replayed
against this binding's public API on every CI run
(tests/test_golden.py).
Install
Pending first publish: the package is not on PyPI yet — everything is prepared (maturin wheel config, one abi3 wheel per platform), and publishing waits on the first release tag (docs/PLAN.md §6). Until then, build from source — Python 3.11–3.14 (the floor is 3.11; CI exercises 3.14/3.13/3.12/3.11 on every wheel platform), Rust ≥ 1.88, and a C toolchain:
pip install maturin
maturin develop --release # into the active venv
The wheel is abi3 (cp311), so one wheel per platform covers every
Python ≥ 3.11. Planned platform matrix: linux-x64 /
linux-arm64 / macos-arm64 / windows-x64.
Usage
from array import array
from corvid import Db, field
db = Db.open("app.redb") # or Db.open_memory()
docs = db.collection("docs")
docs.insert("p1", {
"title": "rust embedded database",
"kind": "doc",
"v": array("f", [1.0, 0.0]),
})
# hybrid retrieval: filter + vector + BM25, fused (RRF) + reranked (MMR)
rows = (
docs.query()
.filter(field("kind").eq("doc"))
.vector("v", array("f", [1.0, 0.0]), 10, "cosine")
.text("title", "rust database", 10)
.fuse_rrf(60)
.rerank_mmr(1.0)
.limit(5)
.run()
) # [Row(key, score, document), ...]
for row in rows:
print(row.key, row.score, row.document["title"])
# predicates everywhere (queries and deletes)
docs.delete_where(field("kind").eq("draft"))
# scalar/compound/text/geo/vector indexes (incl. quantized + PQ + on-disk)
docs.create_vector_index("v", "cosine")
# TTL, graph, geo, schema, CAS, bulk writes, dump/backup/compact …
docs.close()
db.close()
Every failure raises a native CorvidError with the engine error
code (the C ABI's frozen 1–19 table, exported as ErrorCode) and
the engine message. Type stubs ship in-package (py.typed) — the
public API is fully typed.
Examples
Six runnable programs in examples/ — one per concept,
deterministic output, executed on every CI leg:
| File | What it shows |
|---|---|
quickstart.py |
open, insert 3 docs, kNN vector query, print |
hybrid.py |
filter + vector + BM25, RRF fusion, MMR rerank, limit |
vector_index.py |
in-memory / on-disk / binary-quantized HNSW vs exact, reopen |
text_search.py |
BM25 ranking, English + CJK (bigram segmentation) |
graph.py |
link/neighbors/traverse + the delete cascade |
geo.py |
radius / bbox / nearest-k over real coordinates (haversine km) |
maturin develop && python examples/hybrid.py
Value mapping
| Python | engine |
|---|---|
None, bool, str |
Null / Bool / Text |
int |
Int (full i64 — out-of-range ints raise code 12) |
float |
Float |
bytes / bytearray |
Bytes |
array('f') |
Vector (other typecodes are rejected) |
list / tuple |
Array |
dict (str keys) |
Map |
Reading back: Int → int (arbitrary precision — no ±2^53 boundary,
unlike the JS binding's number/BigInt split), Float → float with
f64 bits preserved exactly — NaN payloads, -0.0, and ±inf all
round-trip bit-exactly (CPython floats are unboxed C doubles; pyo3
copies them by value — the fidelity corner where V8 canonicalizes NaN
payloads at the N-API boundary; Python has no such caveat). Vector →
array('f') (f32-exact both directions), Map → dict in the
engine's key order. Keys are str (UTF-8) or bytes (non-UTF-8 keys
come back as bytes).
Python marks the Int/Float distinction natively (2 is an int, 2.0
a float), so the mapping is a clean bijection — there is no
Int/Float collapse and no typed-float escape hatch (the JS binding
needs CorvidFloat for CAS/unique/group-key corners).
Surface manifest (docs/SURFACE.tsv)
Every construct of the engine's public surface (the radar-enforced list the
engine publishes as scripts/bindings/surface.tsv at each release tag) is
resolved in docs/SURFACE.tsv: the Python API exposing it plus the test that
proves it (golden fixture line references), or N/A + reason where the v1
binding deliberately does not expose it. scripts/surface-gate.sh fails CI
when a line is unresolved, a cell is empty, or the N/A count drifts from the
committed baseline — so an engine pin bump that changes the surface lands in
this gate, not in a user's bug report.
Development
python -m venv .venv && source .venv/bin/activate
pip install maturin pytest
maturin develop # build the native extension
pytest tests # the golden suite (267 fixture lines)
cargo fmt --check # + cargo clippy --all-targets -- -D warnings
The plan — architecture ruling (engine compiled in via pyo3 vs Python-side ctypes/cffi FFI), the full OOP surface, the value contract, and follow-up tasks — is docs/PLAN.md.
License
MIT.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file corvid_python-0.3.3.tar.gz.
File metadata
- Download URL: corvid_python-0.3.3.tar.gz
- Upload date:
- Size: 74.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
maturin/1.15.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a036318b4c240fbc986fed59f9b14c9d8578703f0406346639f7a9dc5455b6e8
|
|
| MD5 |
b84070c1bb8f75f791e15e951ec89c81
|
|
| BLAKE2b-256 |
cbc343413a0ed0c3416944ae6f0ee6db2e328b8ca49eecea9986e6c147c85478
|
File details
Details for the file corvid_python-0.3.3-cp311-abi3-win_amd64.whl.
File metadata
- Download URL: corvid_python-0.3.3-cp311-abi3-win_amd64.whl
- Upload date:
- Size: 1.2 MB
- Tags: CPython 3.11+, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
maturin/1.15.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
272024e9788132d95bdfbc875024e6a83b63dbb554073595316871fa05e9edf9
|
|
| MD5 |
c5a907cf1b4305a609d2fccaff2eaafd
|
|
| BLAKE2b-256 |
82e8effeca8060bbcafbb7df9c85a0e3fc686acc2c8dc72756f29753737869ad
|
File details
Details for the file corvid_python-0.3.3-cp311-abi3-manylinux_2_34_x86_64.whl.
File metadata
- Download URL: corvid_python-0.3.3-cp311-abi3-manylinux_2_34_x86_64.whl
- Upload date:
- Size: 1.3 MB
- Tags: CPython 3.11+, manylinux: glibc 2.34+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
maturin/1.15.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
70f1020a0e2871727aa5d586f371e5d3c5fd1f22f8f41487c0c1c193ea506b9e
|
|
| MD5 |
54e57a0fd8731e08ce7f6c5d683e8c5f
|
|
| BLAKE2b-256 |
dacac3aa7fc6bb9832eaf766adb65611299dd52850bffc7d1f8406af9e277b0f
|
File details
Details for the file corvid_python-0.3.3-cp311-abi3-manylinux_2_34_aarch64.whl.
File metadata
- Download URL: corvid_python-0.3.3-cp311-abi3-manylinux_2_34_aarch64.whl
- Upload date:
- Size: 1.1 MB
- Tags: CPython 3.11+, manylinux: glibc 2.34+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
maturin/1.15.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c581cc6f55fb30e408df732f86ce776931d2516856ca5f081328de2cde0324aa
|
|
| MD5 |
e004d3b5793987b40f134856740834b3
|
|
| BLAKE2b-256 |
9130597733c16daf023ea766188c2769f438814b4d095e8c943c314ff603f8fd
|
File details
Details for the file corvid_python-0.3.3-cp311-abi3-macosx_11_0_arm64.whl.
File metadata
- Download URL: corvid_python-0.3.3-cp311-abi3-macosx_11_0_arm64.whl
- Upload date:
- Size: 1.1 MB
- Tags: CPython 3.11+, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
maturin/1.15.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b2dc66e2d78d3dcd55b152ecf6e72019bc30cd4ddc8ad75534b4121531274507
|
|
| MD5 |
3fe515315288ffaf4094ba96294366cd
|
|
| BLAKE2b-256 |
f26d94790be54902c85093571f6866781eb9b6a6816992d89040eb6cb9d1ca39
|