Integrations#
Each integration is an optional extra, so the core stays free of dependencies. The OPA, OpenFGA, SpiceDB, Cerbos and Keto authorizers need no extra at all: they use the standard library’s HTTP client.
Integration |
Kind |
Install |
Pre-filters |
|---|---|---|---|
Backend |
|
Yes, inside the SQL query |
|
Backend |
|
Yes, as a |
|
Backend |
|
Yes, inside the kNN search |
|
Backend |
|
Yes, inside the k-NN search |
|
Backend |
|
Yes, as a |
|
Backend |
|
Yes, inside the vector search, with parameterized filters |
|
Backend |
|
Yes, as the |
|
Backend |
|
Yes, inside the vector search |
|
Backend |
|
Yes, in the same KNN query |
|
Backend |
|
Yes, before the vector search ranks |
|
Backend, in process |
|
Yes, an ID selector inside the search |
|
Backend |
|
Yes, in the YQL query, inside the nearest-neighbor search |
|
Backend |
|
Yes, in each ANN query’s |
|
Backend |
|
Yes, as the query’s metadata filter |
|
Authorizer |
none |
When the policy returns a filter |
|
Authorizer |
none |
Yes, through ListObjects |
|
Authorizer |
none |
Yes, through LookupResources |
|
Authorizer |
none |
Yes, from query plans |
|
Authorizer, in process |
|
No: post-filters, every candidate decided by Cedar |
|
Authorizer, in process |
|
No: post-filters, every candidate decided by Casbin |
|
Authorizer |
none |
No: post-filters, Keto has no reverse lookup |
|
Permission sync onto the chunks |
none (bring Google’s client) |
Through |
|
Framework, and any LangChain vector store as a backend |
|
Wrapped stores post-filter |
|
Framework, and any LlamaIndex index as a backend |
|
Wrapped indexes post-filter |
|
Framework |
|
Through any wardowl backend |
|
Agent tool server |
|
Through any wardowl backend |
|
OpenAI Agents SDK, Pydantic AI, CrewAI, AutoGen, Semantic Kernel, DSPy, through MCP |
none (the framework’s MCP client) |
Through any wardowl backend |
|
Retrieval for any language, OIDC tokens |
|
Through any wardowl backend |
|
Reference RAG service: verified tokens, tenants, safe errors |
none (your app’s FastAPI) |
Through any wardowl backend |
|
Observer |
|
Choosing a store#
Every store applies the permission filter inside its own search, passes the conformance kit in CI against the real store, and keeps permission values out of query text. They differ in what is worth knowing in production:
Store |
A write is searchable |
Native |
Permission values travel as |
Keyword search |
CI tests against |
|---|---|---|---|---|---|
When |
|
Bound SQL parameters (jsonb containment) |
Full-text, |
PostgreSQL 17 with pgvector |
|
When |
No (a thread) |
A |
No |
Chroma’s in-process client |
|
When |
|
A |
BM25, |
9.5.5 |
|
When |
|
A |
BM25, |
3.9.0 |
|
When |
|
Filter objects ( |
BM25 (IDF modifier), |
1.19.2 |
|
At once (strong consistency, the default) |
|
|
BM25, |
3.0.2 |
|
When |
|
A BSON filter ( |
BM25 (Atlas Search), |
Atlas Local 8.0.30 |
|
When |
|
Filter objects ( |
BM25, |
1.39.12 |
|
When |
|
Hex-encoded TAG values |
BM25, |
8.10.2 |
|
When |
No (a thread) |
Hex-encoded list values ( |
BM25, |
LanceDB 0.40, embedded |
|
At once |
No (a thread) |
|
None |
faiss-cpu 1.15, in process |
|
When |
No (a thread) |
Hex-encoded terms in YQL ( |
BM25, |
8.763.13 |
|
When |
No (a thread) |
Bound |
No |
5.0.9 |
|
Within seconds; at once with |
No (a thread) |
|
No |
Pinecone serverless, API 2026-07 |
Keyword and vector search combine into hybrid search with RankFusion, across
stores as well as within one. Measured recall, latency and throughput at a million chunks are in
Benchmarks for pgvector, Qdrant,
Elasticsearch, OpenSearch and Weaviate.
Backends and authorizers combine freely: pgvector with OpenFGA, Chroma with OPA, a LangChain
store with permissions on the chunks. A store not listed here needs only a search method; see
Extending wardowl.