rager
Composable RAG primitives with caching baked in.
Install
uv add rager
Getting started
uv run pytest
uv run prek install
For GPU (CUDA/ROCm) torch, add the matching PyTorch index to your own project and install torch from it — those builds aren't on PyPI.
Example
Wire the primitives together yourself — there is no hidden pipeline. This chunks documents, embeds and indexes each chunk under its own key, then answers a query from the nearest chunk:
chunker = SemanticChunker()
embedder = SentenceTransformerDenseEmbedder()
index = FaissIndex(384, MemoryStore())
chunks = MemoryStore()
generator = TransformersGenerator()
key = 0
for document in documents:
for chunk in chunker.chunks(document):
await index.set(key, await embedder.embed(chunk))
chunks[key] = chunk
key += 1
query = "Why do cats purr?"
(key,) = await index.similar(await embedder.embed(query), embedding_results=1)
answer = await generator.prompt(f"Answer using only the context.\n{chunks[key]}\n{query}")
tests/application/ has full dense and hybrid recipes.
API
Every stage is a Protocol with concrete implementations. Each module also ships an abstract Base* helper that derives the protocol from a few core operations, so you can drop in your own implementation. async methods batch concurrent calls; model-backed methods cache results under .jar/.
Parsers — extract text units from files
Parser— protocol:units(file)returns text units.BaseParser— derives a cachedunits()from_jar,_batched, and_units; the jar is keyed by the file'sblake3content hash.UnstructuredFileParser— parses any file supported byunstructured, returning its elements.UnstructuredPageParser— composes a file parser and returns one string per page, grouping elements by page number.PdfFileParser,MarkdownFileParser,CsvFileParser— aliases ofUnstructuredFileParser;PdfPageParser,MarkdownPageParser,CsvPageParser— aliases ofUnstructuredPageParser, for readable call sites.
Chunkers — split units into chunks
Chunker— protocol:chunks(unit) -> list[str].BaseChunker— derives a cachedchunks()from_jarand_split.SemanticChunker— splits on semantic boundaries with a token budget:SemanticChunker(model_name="gpt-3.5-turbo", chunk_size=1000, overlap=0).
Embedders — turn chunks into vectors
Embedder[E]— protocol:async embed(chunk) -> E.BaseEmbedder— derives a cachedembed()from_jarand_encode.SentenceTransformerDenseEmbedder— dense, L2-normalizedDenseEmbeddingvia SentenceTransformers (defaultall-MiniLM-L6-v2).SpladeSparseEmbedder— sparseSparseEmbeddingvia a SPLADE encoder (defaultprithivida/Splade_PP_en_v1).
Indexes — store vectors and search by similarity
Index[K, E]— protocol: aStore[K, E]of embeddings plusasync similar(embedding, embedding_results=100) -> list[key]. Ranks by inner product (equals cosine for L2-normalized vectors).FaissIndex(dimensions, key_map)— flat FAISS index; seals embeddings on disk under.jar/and records each key's FAISS id in the injectedkey_mapstore.SparseIndex(embedding_map, token_map)— inner-product search over sparse weight maps through an inverted token index; the injected stores decide whether embeddings live in memory or on disk, and search only loads the posting lists of the query's tokens.
Fusers — merge ranked lists
Fuser[V]— protocol:fuse(*rankings) -> list[V].BaseFuser— derivesfuse()from_weight(rank, size).ReciprocalRankFuser— reciprocal rank fusion with smoothing constantk(default 60).BordaCountFuser— Borda count fusion.
Scorers — rerank chunks against a query
Scorer— protocol:async score(query, chunk) -> float.BaseScorer— derives a cachedscore()from_jarand_predict.CrossEncoderScorer— cross-encoder reranker (defaultcross-encoder/ms-marco-MiniLM-L6-v2).
Generators — produce an answer
Generator— protocol:async prompt(query) -> str.BaseGenerator— derives a cachedprompt()from_jarand_generate.TransformersGenerator— local Transformers text-generation model (defaultHuggingFaceTB/SmolLM2-135M-Instruct,max_new_tokens=512).
Stores — map keys to data
Store[K, V]— protocol: mapping-style access (store[key],del store[key],in,len(), iteration) plusset(key, value),get(key) -> value | None,remove(key),clear(), andkeys().BaseStore— derives the full protocol fromkeys,__setitem__,__getitem__, and__delitem__.MemoryStore[K, V]— in-memory map from key to value (chunk text, embeddings, metadata, ...).FileStore[K, V]— likeMemoryStore, but seals values on disk under.jar/, keeping only keys and digests in memory.
Types
Hash— ablake3hasher.DenseEmbedding—list[float].SparseEmbedding—dict[int, float]mapping token id to weight.
Metadata
Release files for rager 0.4.1
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 | Actions |
|---|---|---|---|---|
| rager-0.4.1.tar.gz | 16.5 kB | Without provenance | Details for rager-0.4.1.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| rager-0.4.1-py3-none-any.whl | Python 3 | none | any | Details for rager-0.4.1-py3-none-any.whl |
Total release size: 38.1 kB
Release files / rager-0.4.1.tar.gz
| Download URL | rager-0.4.1.tar.gz |
|---|---|
| Size | 16.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
6e32acc3b5998c106639ea7a803a714f5c6d42a4d0f46447a77a0f51745f36a7
|
|
BLAKE2b-256 checksum How to use checksums |
5605d1c98d793de832f413682a1b27747e0c948b89760aea70f537c4516d7c4b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.31 {"installer":{"name":"uv","version":"0.11.31","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"CachyOS Linux","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / rager-0.4.1-py3-none-any.whl
| Download URL | rager-0.4.1-py3-none-any.whl |
|---|---|
| Size | 21.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
2968a69016ac51c4791f762dd9d52a10242d6b3f926e1168e3d8025a37a17b4a
|
|
BLAKE2b-256 checksum How to use checksums |
3dc90c7ad9bcdb439ffb21e8fce951fb0bcec5fbde32cea33f087a139915389b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.31 {"installer":{"name":"uv","version":"0.11.31","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"CachyOS Linux","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Security for rager 0.4.1
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.