ballast
Pull a quantized knowledge corpus — or build one from your own documents — and ground any local model. Works with Ollama and every OpenAI-compatible or MCP-capable client. Includes model profiling and a three-arm grounding benchmark, all CPU-only.
uvx openballast pull --level 3
uvx openballast serve
(Live on PyPI: pip install openballast also works.)
-
Ollama users: point your client's base URL at
http://localhost:11435/v1instead ofhttp://localhost:11434/v1— done. Every chat request is grounded with corpus facts before your model sees it. No tool calling needed, works with any model size. -
MCP users (Claude Desktop, LM Studio, Cline, Goose): add to your MCP config:
{ "ballast": { "command": "uvx", "args": ["openballast", "mcp"] } }
-
Smoke test:
uvx openballast lookup "Where was Douglas Adams born?"
What you're downloading
Ballast T0: 25.4M entities and 197M facts from Wikidata (CC0), quantized into nested levels — pick your knowledge size like you pick a GGUF quant:
| level | download | on disk | contains |
|---|---|---|---|
| L0 | 52 MB | 0.2 GB | top 0.5% most notable entities |
| L1 | 92 MB | 0.35 GB | top 1% |
| L2 | 159 MB | 0.6 GB | top 2% |
| L3 | 265 MB | 1.0 GB | top 4% |
| L4 | 427 MB | 1.6 GB | top 8% |
| L5 | 691 MB | 2.6 GB | top 16% |
| L6 | 1.1 GB | 4.2 GB | top 32% |
| L7 | 2.2 GB | 9.2 GB | everything |
Levels are nested: pull --level 5 after pull --level 3 downloads only the
new buckets. Everything runs offline after the pull — no network at answer time.
Measured effect (details: thesis): a 2B model + ~180 MB of ballast exceeds a 12B model's factual accuracy; hallucination on factual probes drops ~3×.
Commands
ballast pull --level 3 # download / upgrade the corpus
ballast build ./docs -n team # build a corpus from YOUR documents (see below)
ballast serve # OpenAI grounding proxy :11435 + MCP http :11436
ballast mcp # MCP on stdio (for client configs)
ballast lookup "question" # print the evidence blocks for a question
ballast profile -m qwen3:8b # where does this model's knowledge run out?
ballast eval -m qwen3:8b # three-arm benchmark: what does grounding buy?
ballast status # installed corpora, levels, and sizes
BALLAST_HOME overrides the storage location (default ~/.ballast).
Bring your own corpus
ballast build turns a directory of .md / .txt files (and/or parquet with
a text column, optional title and rank) into a servable corpus with the
same layout as the published one:
ballast build ./handbook --name handbook
ballast lookup --corpus handbook "What is our deploy freeze policy?"
ballast serve --corpus handbook
Documents are addressed by title; each becomes passage chunks the linker can
attach to a question. A rank column (0..1, 1 = most important) spreads
documents across nested levels so --level keeps the top slice; without ranks
everything lands in one level.
Profile a model, then size the corpus for it
ballast profile -m qwen3:8b --limit 2000 --budget 2GB
Probes the model ungrounded against the public evalset, reports its accuracy
per corpus region (head → tail), fits a grounding competence profile
(.gcp.json), and — given a byte budget — recommends the corpus level where
grounding still buys accuracy for THIS model. The profile carries a
reliability AUC against a 0.58 gate; below the gate the recommendation falls
back to the generic ordering.
Measure what grounding actually delivers
ballast eval -m qwen3:8b --limit 500
Every probe is asked three ways: ungrounded (U), with realized retrieval (R), and with oracle-entity evidence (S). The report is the delivery ratio (R − U) / (S − U) — the fraction of the reachable knowledge gap today's retrieval closes — plus coverage-conditional splits. Arms checkpoint to parquet and resume after interruption.
How it works
serve intercepts POST /v1/chat/completions, mines entity mentions from your
last message, resolves them against the local corpus (normalized label/alias
match), and prepends the matching facts as a system message. Everything else —
including streaming — passes through untouched. The MCP server exposes the same
three tools (resolve, evidence, lookup) as the hosted demo endpoint
(mcp.openballast.org).
Apache-2.0. Corpus data: CC0 (Wikidata contributors).
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file openballast-0.2.2.tar.gz.
File metadata
- Download URL: openballast-0.2.2.tar.gz
- Upload date:
- Size: 35.0 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.12.0 {"installer":{"name":"uv","version":"0.12.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6fbd4fb6cbabbc4bf4699e70fb74361705e7554cb54c969b7ccecc98f6dc4657
|
|
| MD5 |
65e6655126d5dd3c14356dc57ed5cc67
|
|
| BLAKE2b-256 |
aacc0d6e3c6369d9d6a443bfff025158b77682e51987f5b98bf289871789a185
|
File details
Details for the file openballast-0.2.2-py3-none-any.whl.
File metadata
- Download URL: openballast-0.2.2-py3-none-any.whl
- Upload date:
- Size: 34.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.12.0 {"installer":{"name":"uv","version":"0.12.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
25f3c07bcf80c91b9fd5f0ee1feed83937048f763ce131f4d84de45e2659733e
|
|
| MD5 |
b97c317573264801576a62f8efc1028b
|
|
| BLAKE2b-256 |
293ebd7568858801e906884d38305e60bf001c9663c5785ba78833ea1245df02
|