You're paying for tokens you've already sent, prompts that still compress, and traffic you can't inspect.
The open-source caches, compressors, scanners, routers, eval, and obs tools that fix that already exist. They just don't install as one localhost overlay.
Honest caveats
Read these before the catalog count.
| Claim | What it actually is |
|---|---|
| Live number | openbundle status on this traffic. Paper ranges are not multiplied into a ceiling. |
| NeMo rails | LIVE only if NeMo Guardrails constructs with Colang. Import-only or empty config is off, not a keyword stand-in. Extra provider tokens only if that constructed rail actually calls out (nemo_rail_tokens). |
| GPTCache + Semantic Router | Two independent warming jobs. Sharing one embedding download is unverified. |
| LMCache / kvcached / KVzip | Self-hosted only, not verified to work together, and not live unless an adapter is constructed in this sidecar. |
| Lynx-8B | Not default-live. --with-lynx does not print Lynx unless the adapter actually constructs. Hosted-API users get a citation/overlap heuristic. |
| Observability | SDKs default to vendor hosted free tiers. Traces leave this machine unless --self-host. |
| Scanners | Secrets / PII / injection fail-open. A crash prints DEGRADED: — not a quiet live. Retry on the next request; success returns live; session fail_open_count stays. |
| This overlay | MIT, localhost, pre-seed. No moat. One named tool per job. |
22 hosted-API jobs + 5 conditional = 27 named tools. openbundle status is the live number on this traffic — not a multiplied ceiling.
pip install openbundle
openbundle init && openbundle serve
export ANTHROPIC_BASE_URL=http://127.0.0.1:4180 # or OPENAI_BASE_URL
Point Claude Code, Cursor, Aider, or any OpenAI/Anthropic-compatible client at that URL. Then:
openbundle status
openbundle off is full passthrough on the same URL. Repo and source are never touched.
Install
pip install openbundle
openbundle init # overlay yaml; LLMLingua may warm (model download); never touches your repo
openbundle serve # http://127.0.0.1:4180
Default pip install openbundle includes exact-hash plus GPTCache and LLMLingua-2 (that last one pulls torch / a local model). Everything else is pip install openbundle[all] or a per-job extra. openbundle status is what actually constructed — missing extras show off, not a vendor-named stub.
openbundle on | off # same URL, repo untouched
openbundle attach # Claude Code / Cursor / Codex / Aider snippets
openbundle status # live | warming | degraded | advisory | off
openbundle report # before/after table for this session
openbundle uninstall # --yes to skip the prompt
Flags: --with-lynx (Lynx-8B faithfulness, only if the adapter constructs) · --self-host (obs SDKs on localhost; --local-obs is an alias).
openbundle attach reprints the Claude Code / Cursor / Codex / Aider snippets for the current shell.
Attach a coding agent
The sidecar is the only URL the agent should see. Set OPENROUTER_API_KEY (or a native Anthropic/OpenAI key) in the environment that runs openbundle serve.
# Claude Code — this session, then `claude`
$env:ANTHROPIC_BASE_URL = "http://127.0.0.1:4180"
$env:ANTHROPIC_AUTH_TOKEN = "openbundle"
$env:ANTHROPIC_API_KEY = ""
Cursor: Settings → Models → OpenAI-compatible. Base URL http://127.0.0.1:4180/v1, API key openbundle.
Codex / other OpenAI CLIs: OPENAI_BASE_URL=http://127.0.0.1:4180/v1 and OPENAI_API_KEY=openbundle.
Aider: aider --openai-api-base http://127.0.0.1:4180/v1 --openai-api-key openbundle.
Do not point the agent at openrouter.ai if you want OpenBundle in the path. If Claude Code was logged into Anthropic, /logout once, restart, then /status.
Pipeline order
exact-hash → semantic cache → compress (LLMLingua-2) → history prune (Selective Context)
→ RAG compress (RECOMP, if RAG) → secrets → PII → injection → NeMo rails
→ Semantic Router → RouteLLM (or first-party prefix router) → LiteLLM → provider
→ Guardrails AI → Instructor
→ eval trio (promptfoo / DeepEval / Opik, sampled, not blocking)
→ obs SDKs (Langfuse / OpenObserve / OpenMeter / AgentOps / Agenta)
→ RAG faithfulness (Lynx, conditional / after the answer — not one of the 22)
This is job order, not a promise every name is live. A stage runs only if that library constructed; otherwise status shows off / warming. Cache keys original messages. Compress only on miss. Scans before the request leaves the box. JSON retry is skipped on SSE. Output validation after the model that actually answered.
The catalog
22 hosted-API jobs for hosted-API users, 5 more if self-hosted inference or --with-lynx is detected, plus 8 advisory tools (memory + batch). openbundle status is the live number. Full table: CATALOG.md · credits: CREDITS.md.
Not this proxy (kept in the full catalog / credits, not on the live path): coalesce, prompt-cache inject, session hygiene, serving engines, quantizers, token-level constrained decoding, vector DBs, orchestration frameworks.
Not another AI gateway
| OpenBundle | Typical AI gateway | |
|---|---|---|
| License | Fully open source (MIT) | Commercial or open-core |
| Runs where | Your machine only | Often a hosted control plane |
| Live number | openbundle status |
Marketing ceiling |
| Attribution | Every active tool named | Varies |
Security and data
- Binds
127.0.0.1only;--exposeis required (and warns) to bind wider. - Input scanners fail-open: a crash does not drop the request. Status shows
DEGRADED:, then retries on the next request. ~/.openbundle/samples.jsonlstores a local, size-capped sample of recent prompts. Never transmitted anywhere. Disable withOPENBUNDLE_NO_SAMPLES=1.- Provider errors and disconnects are forwarded as-is; failed turns are never cached.
- No virtual keys, no multi-tenant auth — this is a single-user local overlay.
License
Release files for openbundle 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| openbundle-0.1.0.tar.gz | 86.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| openbundle-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 177.0 kB
Release files / openbundle-0.1.0.tar.gz
| Download URL | openbundle-0.1.0.tar.gz |
|---|---|
| Size | 86.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
2daa8e3902a93acd97554858b03c897ae226dcaf7bb23fe864419fad384fdac3
|
|
BLAKE2b-256 checksum How to use checksums |
9ff493eef5a36563fb3862098367b48a8896163c5e201c10aee2197aa27bf266
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 20, 2026.
Transparency logRelease files / openbundle-0.1.0-py3-none-any.whl
| Download URL | openbundle-0.1.0-py3-none-any.whl |
|---|---|
| Size | 90.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
8264522ca0d8efbf05df6dc6b6d282681b51b22a197c850ebdef71085d0dbb5f
|
|
BLAKE2b-256 checksum How to use checksums |
cc1ae2f36721ae5b9fcdc165d986054a55ee188619d5c13bbbad95e74e015291
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 20, 2026.
Transparency log