Skip to main content

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/v1 instead of http://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

openballast-0.3.0.tar.gz (37.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

openballast-0.3.0-py3-none-any.whl (35.8 kB view details)

Uploaded Python 3

File details

Details for the file openballast-0.3.0.tar.gz.

File metadata

  • Download URL: openballast-0.3.0.tar.gz
  • Upload date:
  • Size: 37.0 kB
  • 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

Hashes for openballast-0.3.0.tar.gz
Algorithm Hash digest
SHA256 af15e30c70d57c054b0ea5f4e78f9b71edc31276cd36e293542afb7d3cdade9b
MD5 159c7064aab507f6850c972691270171
BLAKE2b-256 60c68d2dc908505ec0187c2adc3e69cb072f417e87a88ac5e99477d49b12a908

See more details on using hashes here.

File details

Details for the file openballast-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: openballast-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 35.8 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

Hashes for openballast-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 cf492758ab637ce8b2f22fb21d316326d8afde87c4a97ae4bc97478a83ac8c6d
MD5 9d24aebf98b8b468070a103a23ef1060
BLAKE2b-256 22332929ca6838a680fcf20d0043e33d84bea9a607672f42ac429122f7165741

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page