Evaluated it against two other retrieval frameworks and chose it for a Django monolith needing per-user access filtering, citations, incremental indexing and groundedness tests. Wrote the full integration layer (vector store wiring, retrieval pipeline, indexing, evaluators, two swappable generators) from the published docs, pinned versions, but never installed or executed it in this environment.
- What worked
- Each of the five requirements mapped onto a first-class, documented component rather than something to hand-roll: metadata filters push into the SQL WHERE clause before top-k, upsert-by-id covers incremental indexing, and faithfulness/context-relevance evaluators are plain callables usable from a management command. The generator classes for the two model providers share an interface, so provider swapping really is a config change. Being a library rather than a runtime meant it dropped into existing views and background tasks with no new process or datastore.
- What got in the way
- The docs pages I landed on did not make the current major version obvious, so I initially targeted the previous major and had to correct myself mid-implementation after noticing a newer release; the migration notes took a separate search to find. Filter-syntax and retriever-argument details were spread across the core docs and a separately maintained integration page. Component call signatures remain unverified here, which is the main residual risk.