Cache-aware, causally-pruned context compression for agentic runtimes — gated by a statistical non-inferiority test on the agent's next action (a proxy). Same potency, less volume.
Honest scope: the certificate covers decision-equivalence on a trajectory corpus, not end-to-end task success — our real SWE-bench Verified test (E7) shows it does not transfer once compression gets aggressive. We publish that. E8 (500-instance long-horizon, 5 conditions) shows relevance-gated reversible compression is the only condition non-inferior to full context (−2.4 pp, 95% CI [−5.7, +0.9]; McNemar p=0.19), beats Headroom by +4.2 pp (p=0.035), and beats LLMLingua-2 by 34 points (36.8% vs 2.4% pass@1) despite removing nearly identical context fractions. We publish that too. E10 closes the loop with a trajectory-level certificate (the first of its kind): with 95% confidence, the gated compressor costs a solvable task on ≤11.4% of exchangeable runs — certified and proven out-of-sample. E11 extends this across 5 models / 3 vendors (OpenAI, Anthropic, DeepSeek): the relevance gate shows no statistically significant degradation at gate@12 on any of them, and the safe aggressive point tracks realized compression × the agent's reliance on aged-out context — a workload×model interaction, not raw capability — which is why the operating point must be auto-calibrated per deployment, fail-safe to full context.
Certified live against the real model and head-to-head vs. the real LLMLingua-2 and Headroom packages (see the benchmark). Distribution-free, finite-sample, reproducible — and honest about its caveats. No vanity metrics.
Most compressors optimize bytes. In an agent loop the money is somewhere else.
You re-send the growing context every turn. With prompt caching a cache read is ~10× cheaper than fresh input — so the dominant cost is cache misses, not context size. Distil keeps the prefix byte-stable and compresses only the volatile tail. Naive recompression sends fewer tokens yet costs more, because it rewrites the cached prefix every turn.
The eval engine isn't a ruler — it's a discovery engine. Remove a context block, replay, did any decision change? Blocks that never change a decision are provably free to drop: speculative retrievals, stale history. The measurement produces the compression policy.
We didn't just benchmark ourselves. We ran the real LLMLingua-2 and Headroom packages through the same gate, graded live by the real model.
Underneath it: a strategy ships only if a pre-registered non-inferiority test certifies it. Lossless passes; quality-degrading compression is rejected.
$ distil savings --pricing claude-opus-4-8 strategy $ / run vs baseline cache hits ------------------------------------------------------------------------ baseline (no cache, no compress) 0.01524 0.0% 0 cache only 0.01115 26.8% 1,028 naive compress + cache 0.01691 -11.0% 0 ← busts cache distil (cache-aware lossless) 0.01019 33.1% 1,028 $ distil certify --strategy distil decision-equivalence match rate: 100.0% VERDICT: PASS (certified non-inferior) $ distil certify --strategy aggressive decision-equivalence match rate: 0.0% VERDICT: FAIL (would degrade quality — blocked)
A strategy isn't trustworthy because it works once. distil bench certifies
every domain — ops, coding, support, research, data, devops, finance — or it doesn't ship.
Apply the provably-safe ones everywhere; gate the rest on evidence.
Reconstructable transforms — JSON minify, reversible run-length encoding. Always on.
Decision-aware digest + a handle; the full original stays local and re-expands on demand.
Pruning & summarization allowed only at ratios the non-inferiority gate certifies.
| Capability | What it does | Loss profile |
|---|---|---|
| Priced cache-aware engine | Models the multi-turn loop and proves naive recompression busts the cache | — |
| Schema canonicalization | Recursively key-sorts JSON/tool payloads so the prefix is byte-stable | lossless |
| Volatile-field extraction | Lifts dates/UUIDs/JWTs out of the cached prefix so it stops churning | lossless · reversible |
| Reversible digest + handles | Originals stay local and re-expand on demand | reversible |
| Reject-if-bigger invariant | Never emits a block larger than its original | safety |
| Causal / counterfactual pruning | Ablation discovers context that never changes a decision | certified |
| TOST non-inferiority gate | A strategy ships only if it passes the quality contract | the moat |
| Savings ledger + leaderboard | Local-first, privacy-preserving cumulative savings | opt-in |
Point any base_url-honoring client at the proxy — Python, TypeScript, any language —
and get cache-aware lossless compression. See integrations →
The stdlib-only core makes the packaging clean: zero runtime deps, corpus bundled.
uvx --from distil-llm distil bench
pipx install distil-llm distil certify
brew install dshakes/tap/distil distil bench
docker build -t distil . docker run distil bench
make pyz python dist/distil.pyz bench
Needs Python 3.11+. Install isolated (pipx/uv/brew/Docker) — system pip install is blocked by PEP 668 on modern macOS/Linux. Node/other stacks: point your SDK baseURL at distil proxy.
from distil.adapters.anthropic import wrap client = wrap(anthropic.Anthropic()) # compresses + keeps the cache warm
--tokenizer anthropic and
--runner anthropic make it billing-grade against the real model.