@betterdb/retrieval (Python)
betterdb-retrieval — developer-facing retrieval SDK over Valkey Search (FT.*): typed index schema, idempotent index lifecycle, upsert/delete, and vector + filtered + hybrid query. This is the Python equivalent of the TypeScript @betterdb/retrieval package, built on betterdb-valkey-search-kit.
See it live in BetterDB Monitor
BetterDB Monitor auto-discovers every betterdb-retrieval instance on your Valkey - zero configuration, the library already registers itself - and turns its stats into live dashboards:
- AI Cache & Memory - hit rate, cost saved, evictions, and index size across all your caches and memory stores, with history.
- AI Traces - OpenTelemetry waterfalls for each request, correlated with live Valkey state to explain every cache hit and miss.
Run it self-hosted (docker run -p 3001:3001 betterdb/monitor), or use BetterDB Cloud - which can also provision a managed, TLS-enabled Valkey instance with the Search module in one click - exactly what this library needs.
Installation
pip install betterdb-retrieval valkey
Requires a Valkey server with the Valkey Search module loaded.
Quick start
from valkey.asyncio import Valkey
from betterdb_retrieval import Retriever, UpsertEntry
client = Valkey.from_url("redis://localhost:6379")
async def embed(text: str) -> list[float]:
... # return an embedding
retriever = Retriever(
client=client,
name="docs",
schema={
"fields": {
"category": {"type": "tag"},
"year": {"type": "numeric", "sortable": True},
},
"vector": {"algorithm": "hnsw", "metric": "cosine"},
},
embed_fn=embed,
)
# Create the index if it doesn't exist (idempotent; dims resolved from embed_fn).
await retriever.create_index()
await retriever.upsert([
UpsertEntry(
id="doc1",
text="Valkey is a high-performance key-value store",
fields={"category": "db", "year": 2024},
),
])
hits = await retriever.query(
text="fast in-memory database",
k=5,
filter={"category": "db"},
)
Retriever API
create_index()— create the index if absent (idempotent). Vector dimension is taken fromschema["vector"]["dims"]or resolved by probingembed_fn.upsert(entries)— embed each entry'stextand write it as a hash with itsfields.delete(ids)— delete documents by id.query(*, k, text=None, vector=None, filter=None, hybrid=None)— KNN search. Providetext(embedded for you) or a precomputedvector, a positivek, an optionalfilter(tag/numeric fields), andhybrid="rerank"to post-process hits through arerank_fn. Returnslist[QueryHit].describe_index()/health()— index stats: doc count, indexing state, dimension, percent indexed, and an optional estimated recall.drop_index()— drop the index (no-op if it doesn't exist).register()/unregister()— publish/remove a discovery marker in the shared__betterdb:cachesregistry, ownership-checked so it never clobbers a foreign cache type.
QueryHit.scoreis the raw KNN vector distance (lower is closer), not a similarity — rank ascending.
Observability
Pass metrics (a RetrievalMetrics) and/or tracer (a RetrievalTracer) to instrument every operation. create_prometheus_metrics() provides a ready-made prometheus-client implementation.
Development
uv run --extra dev pytest tests -q
License
MIT
Metadata
Release files for betterdb-retrieval 0.5.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 | Provenance | |
|---|---|---|---|---|
| betterdb_retrieval-0.5.0.tar.gz | 44.0 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| betterdb_retrieval-0.5.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 63.6 kB
Release files / betterdb_retrieval-0.5.0.tar.gz
| Download URL | betterdb_retrieval-0.5.0.tar.gz |
|---|---|
| Size | 44.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
4701b1e360655f7525b9542b494fc250c2217ef2d7db4c6c3025db6cc81ec933
|
|
BLAKE2b-256 checksum How to use checksums |
c8aaf8602fc76abe73c36ac485999a89b1a79e303646c8449f4b3f1a0c5cca54
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 23, 2026.
Transparency logRelease files / betterdb_retrieval-0.5.0-py3-none-any.whl
| Download URL | betterdb_retrieval-0.5.0-py3-none-any.whl |
|---|---|
| Size | 19.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
ecf0d0037850ef6680e0284ce669f7605656b4b9ce969737605b51b9d43a8a29
|
|
BLAKE2b-256 checksum How to use checksums |
9308033ec1f7c48a47fe082f19da98534f0ce663e28af6b9216bbfd0e8b85854
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 23, 2026.
Transparency logSecurity for betterdb-retrieval 0.5.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for betterdb_retrieval-0.5.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 23, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.