Each directory holds the two SMALL files bitgpu needs - manifest.json (the architecture
contract + tensor byte ranges) and the aux file (lookup tables; for the ONNX dirs also norm
gammas) - produced with tools/convert-gguf.py or tools/convert-onnx.py
from the public exports. The big weights file is not here: it streams straight from the
Hugging Face Hub, byte-for-byte unchanged, so nothing needs re-hosting and there is nothing to
convert.
| model | hidden / layers | weights | data file (streams from the Hub) |
|---|---|---|---|
bonsai-1.7b-gguf |
2048 / 28 | ~250 MB | prism-ml/Bonsai-1.7B-gguf (Bonsai-1.7B-Q1_0.gguf) |
bonsai-4b-gguf |
2560 / 36 | ~580 MB | prism-ml/Bonsai-4B-gguf (Bonsai-4B-Q1_0.gguf) |
bonsai-8b-gguf |
4096 / 36 | ~1.16 GB | prism-ml/Bonsai-8B-gguf (Bonsai-8B-Q1_0.gguf) |
bonsai-27b-gguf |
5120 / 64 | ~3.8 GB | prism-ml/Bonsai-27B-gguf (Bonsai-27B-Q1_0.gguf; Qwen3.5 hybrid, GGUF-only) |
bonsai-1.7b |
2048 / 28 | ~290 MB | onnx-community/Bonsai-1.7B-ONNX |
bonsai-4b |
2560 / 36 | ~660 MB | onnx-community/Bonsai-4B-ONNX |
bonsai-8b |
4096 / 36 | ~1.3 GB | onnx-community/Bonsai-8B-ONNX |
The GGUF and ONNX containers carry the same weights (the sign-bit streams are bit-identical; verified on Bonsai-8B): pick by hosting preference. GGUF is the primary path - the files are a little smaller on the wire and their manifests synthesize RoPE at load (see docs/FORMAT.md); the ONNX dirs remain fully supported.
Use them from any static host or a CDN over this repo (pin a tag for immutable caching):
import { createEngine } from 'bitgpu'
import { createChat } from 'bitgpu/chat'
const REPO = 'https://cdn.jsdelivr.net/gh/stfurkan/bitgpu@v0.19.1/models/bonsai-1.7b-gguf'
const TOK = 'https://huggingface.co/onnx-community/Bonsai-1.7B-ONNX/resolve/main'
const engine = await createEngine({
manifestUrl: `${REPO}/manifest.json`,
auxUrl: `${REPO}/Bonsai-1.7B-Q1_0.aux.bin`,
dataUrl: 'https://huggingface.co/prism-ml/Bonsai-1.7B-gguf/resolve/main/Bonsai-1.7B-Q1_0.gguf',
})
// or the ONNX flavor of the same weights:
// REPO = '.../models/bonsai-1.7b' auxUrl: `${REPO}/bonsai.aux.bin` (model_q1.aux.bin for 4B/8B)
// dataUrl: `${TOK}/onnx/model_q1.onnx_data`
const chat = await createChat(engine, {
tokenizerJsonUrl: `${TOK}/tokenizer.json`, // tokenizers live in the ONNX/source repos either way
tokenizerConfigUrl: `${TOK}/tokenizer_config.json`,
})Or copy a directory into your app's static assets and own the files (they are just static files - your repo becomes their source control). Two variants:
- copy manifest + aux only and keep
dataUrlpointed at the Hub: two small first-party files, weights still stream from HF; - also download the data file (and tokenizer files) into the same directory for a fully
first-party, offline-capable setup with no third-party requests - then the single-URL form
works, since the manifest names its data/aux files and the engine resolves them relative to
the directory:
createEngine({ modelUrl: '/models/bonsai-1.7b' }).
For GGUF models these files are a convenience, not a requirement: bitgpu/gguf's
fromGguf(ggufUrl) builds the same manifest in the browser from the GGUF header alone
(gated deep-equal to these committed ones). The committed manifests remain the recommended
path when they exist - smaller transfer, better caching.
These files are intentionally not shipped in the npm package: bitgpu stays a lean,
model-neutral engine - hotlink the pinned CDN URLs above, or copy the files and own them.
They are static and versioned with the engine; regenerating them from the exports reproduces
them byte-for-byte (python tools/convert-gguf.py --gguf <file> / convert-onnx.py --model <dir>, full pipeline in
tools/README.md).