quiver-client
The Python client for Quiver, the security-first vector database. Embeddings are produced by the caller — Quiver is model-agnostic.
Install
uv add quiver-client # or: pip install quiver-client
Usage
from quiver import Client, Point
# Connect (use https:// and the api_key your server requires).
with Client("http://127.0.0.1:6333", api_key="your-api-key") as q:
q.create_collection("items", dim=3, metric="cosine")
q.upsert("items", [
Point("a", [0.1, 0.2, 0.3], {"color": "red"}),
Point("b", [0.9, 0.1, 0.0], {"color": "blue"}),
])
hits = q.search(
"items",
[0.1, 0.2, 0.25],
k=5,
filter={"eq": {"field": "color", "value": "red"}},
)
for hit in hits:
print(hit.id, hit.score, hit.payload)
create_collection also takes index (hnsw | vamana | disk_vamana | ivf)
and pq_subspaces to select the memory-frugal disk-resident path.
For late-interaction (ColBERT) retrieval, create a collection with
multivector=True, index documents as token sets with upsert_documents, and
rank them by MaxSim with search_multi_vector:
q.create_collection("papers", dim=128, metric="cosine", multivector=True)
q.upsert_documents("papers", [Document("p1", token_vectors, {"title": "…"})])
hits = q.search_multi_vector("papers", query_token_vectors, k=10)
Client-side payload encryption
Seal payload fields with a key Quiver never sees (install
quiver-client[encryption]). The server stores and returns ciphertext it
cannot read; keep fields server-filterable by leaving them in cleartext:
from quiver import Client, Point
from quiver.encryption import PayloadCipher
cipher = PayloadCipher.from_hex("…64 hex chars…") # a dedicated key, never the at-rest one
with Client("http://127.0.0.1:6333", api_key="…") as q:
payload = {"tier": "gold", **cipher.seal({"ssn": "078-05-1120"})} # tier stays filterable
q.upsert("people", [Point("p1", [0.1, 0.2, 0.3], payload)])
hit = q.get("people", "p1")
secret = cipher.open(hit.payload) # -> {"ssn": "078-05-1120"}
The envelope (XChaCha20-Poly1305) matches the Rust reference and the TypeScript SDK byte-for-byte — see client-side encryption.
Encrypted vector search (DCPE, experimental)
Encrypt the vectors themselves so the server can run nearest-neighbour
search without ever seeing the plaintext embeddings (install
quiver-client[dcpe]). This is property-preserving (distance-comparison-
preserving) encryption — experimental, L2-only, and not semantically secure:
it leaks the approximate distance-comparison relation by design. Use a dedicated
key, and encrypt both the data and the queries with the same cipher.
from quiver import Client
from quiver.dcpe import DcpeCipher
cipher = DcpeCipher.from_hex("…64 hex chars…", approximation_factor=0.02)
with Client("http://127.0.0.1:6333", api_key="…") as q:
q.create_collection("vault", dim=8, metric="l2", vector_encryption="dcpe")
sealed = cipher.encrypt([0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8])
q.upsert("vault", [{"id": "a", "vector": sealed.ciphertext}])
hits = q.search("vault", cipher.encrypt_query(my_query), k=10)
See ADR-0031 and docs/security/dcpe.md.
LangChain
A LangChain VectorStore adapter ships in quiver.langchain (install
quiver-client[langchain]):
from quiver import Client
from quiver.langchain import QuiverVectorStore
store = QuiverVectorStore.from_texts(
texts, embedding, client=Client(api_key="…"),
collection="docs", index="disk_vamana", pq_subspaces=48,
)
docs = store.similarity_search("query", k=4)
Development
uv sync # create the venv and install dependencies
uv run pytest # run the test suite (HTTP mocked with respx)
License
AGPL-3.0-only.
Metadata
Release files for quiver-client 1.1.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 | |
|---|---|---|---|---|
| quiver_client-1.1.0.tar.gz | 307.0 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| quiver_client-1.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 342.2 kB
Release files / quiver_client-1.1.0.tar.gz
| Download URL | quiver_client-1.1.0.tar.gz |
|---|---|
| Size | 307.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
f9041caf87a315b69cb80c80dd6abca6425ec46352d358a9a90e407093b7a701
|
|
BLAKE2b-256 checksum How to use checksums |
2a1ed9bd8382eb6a38cb0c41563573d63df7607c54e6bc96e5ca8eeaf12d76f2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.32 {"installer":{"name":"uv","version":"0.11.32","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / quiver_client-1.1.0-py3-none-any.whl
| Download URL | quiver_client-1.1.0-py3-none-any.whl |
|---|---|
| Size | 35.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
8bcf679cfbfaaeaa0b49d647b8074b60070997e7cffdd835e7d390ae1893e116
|
|
BLAKE2b-256 checksum How to use checksums |
f7619b447f8b7b015530c643ccc900cefc6f0ab5f66e4d7803a46624a836d33d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.32 {"installer":{"name":"uv","version":"0.11.32","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Security for quiver-client 1.1.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.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A 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.