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.
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 | |
|---|---|---|---|
| rager-0.4.1.tar.gz | 16.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| rager-0.4.1-py3-none-any.whl | Python 3 | none | any | Details |
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}
|