Skip to main content

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

corvid_python-0.3.3.tar.gz (74.8 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

corvid_python-0.3.3-cp311-abi3-win_amd64.whl (1.2 MB view details)

Uploaded CPython 3.11+Windows x86-64

corvid_python-0.3.3-cp311-abi3-manylinux_2_34_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.11+manylinux: glibc 2.34+ x86-64

corvid_python-0.3.3-cp311-abi3-manylinux_2_34_aarch64.whl (1.1 MB view details)

Uploaded CPython 3.11+manylinux: glibc 2.34+ ARM64

corvid_python-0.3.3-cp311-abi3-macosx_11_0_arm64.whl (1.1 MB view details)

Uploaded CPython 3.11+macOS 11.0+ ARM64

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

Hashes for corvid_python-0.3.3.tar.gz
Algorithm Hash digest
SHA256 a036318b4c240fbc986fed59f9b14c9d8578703f0406346639f7a9dc5455b6e8
MD5 b84070c1bb8f75f791e15e951ec89c81
BLAKE2b-256 cbc343413a0ed0c3416944ae6f0ee6db2e328b8ca49eecea9986e6c147c85478

See more details on using hashes here.

File details

Details for the file corvid_python-0.3.3-cp311-abi3-win_amd64.whl.

File metadata

File hashes

Hashes for corvid_python-0.3.3-cp311-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 272024e9788132d95bdfbc875024e6a83b63dbb554073595316871fa05e9edf9
MD5 c5a907cf1b4305a609d2fccaff2eaafd
BLAKE2b-256 82e8effeca8060bbcafbb7df9c85a0e3fc686acc2c8dc72756f29753737869ad

See more details on using hashes here.

File details

Details for the file corvid_python-0.3.3-cp311-abi3-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for corvid_python-0.3.3-cp311-abi3-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 70f1020a0e2871727aa5d586f371e5d3c5fd1f22f8f41487c0c1c193ea506b9e
MD5 54e57a0fd8731e08ce7f6c5d683e8c5f
BLAKE2b-256 dacac3aa7fc6bb9832eaf766adb65611299dd52850bffc7d1f8406af9e277b0f

See more details on using hashes here.

File details

Details for the file corvid_python-0.3.3-cp311-abi3-manylinux_2_34_aarch64.whl.

File metadata

File hashes

Hashes for corvid_python-0.3.3-cp311-abi3-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 c581cc6f55fb30e408df732f86ce776931d2516856ca5f081328de2cde0324aa
MD5 e004d3b5793987b40f134856740834b3
BLAKE2b-256 9130597733c16daf023ea766188c2769f438814b4d095e8c943c314ff603f8fd

See more details on using hashes here.

File details

Details for the file corvid_python-0.3.3-cp311-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for corvid_python-0.3.3-cp311-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b2dc66e2d78d3dcd55b152ecf6e72019bc30cd4ddc8ad75534b4121531274507
MD5 3fe515315288ffaf4094ba96294366cd
BLAKE2b-256 f26d94790be54902c85093571f6866781eb9b6a6816992d89040eb6cb9d1ca39

See more details on using hashes here.

Release history Release notifications | RSS feed

0.4.1

5 files

0.4.0

5 files

0.3.4

5 files

This release

0.3.3 This release

5 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page