Models
The three Ab tiers — Creek, River and Ocean — what powers each, and what your browser needs to run them.
Ab ships three model tiers. They differ only in size: all three are Qwen3.5 instruct models, quantized the same way, running through the same in-browser stack. A bigger tier reasons better and writes better; it also downloads slower and needs more memory. The tier name is the product surface — the underlying model id is an implementation detail we can change without renaming anything.
The tiers
| Tier | Model | Download | Best for |
|---|---|---|---|
| Creek 2.5 | Qwen3.5-0.8B-q4f16_1-MLC | ~1.6 GB | Light and quick — runs almost anywhere |
| River 2.5 | Qwen3.5-4B-q4f16_1-MLC | ~3.8 GB | Balanced depth and speed |
| Ocean 2.5 | Qwen3.5-9B-q4f16_1-MLC | ~6.3 GB | The deepest — for capable machines |
All three are q4f16 quantized: weights compressed to 4 bits with 16-bit floating-point activations. That is what makes a 9-billion-parameter model fit in a browser tab at all.
The sizes above are runtime footprints — weights plus the KV cache the model needs while it is thinking — not just the download. That is the number worth watching, because it decides whether your device can hold the model, not merely fetch it.
How the model runs
Inference happens on your GPU, in your browser, through WebLLM. There is no inference server.
- The model is loaded lazily, on the first message you send — never on page load. If you never open chat, nothing is downloaded.
- It runs in a Web Worker, so generation never blocks the interface.
- Weights are downloaded once and cached by the browser under this origin. Later sessions start almost immediately. You can see the cache in DevTools under Application → Cache Storage, in the
webllm/model,webllm/wasmandwebllm/configbuckets, and clearing site data removes it.
The one and only network request in the whole flow is that initial weight download from the MLC CDN. Your prompts, and anything the assistant reads about your holdings, never leave the tab.
How a tier gets chosen
Ab picks a tier for you on first use, then lets you override it. The web platform deliberately refuses to report exact free memory — it is a fingerprinting vector — so this is a heuristic, not a measurement. Two signals feed it, in apps/web/lib/chat/capability.ts:
navigator.deviceMemory, approximate system RAM in GB. It is bucketed, Chromium-only, and capped at 8.- The WebGPU adapter's
maxBufferSize, used as a fallback wheredeviceMemoryis missing.
From those Ab estimates a safe budget and selects the largest tier that fits.
Ocean is never auto-selected. Because deviceMemory tops out at 8 GB, the estimated budget can never justify a 6.3 GB download on its own. Choosing Ocean is always a deliberate act, which is how we want a download that size to work.
Creek is the default when detection is unavailable entirely — it is the only tier safe to assume sight-unseen.
Browser support
Ab needs WebGPU, which in practice means:
- Chrome or Edge 113+
- Safari 18+
- A desktop machine
Where WebGPU is missing, the chat surface says so plainly instead of failing halfway through a download.
Open models
The whole inference stack is deliberately unencumbered. WebLLM is Apache-2.0, and the tiers are all Qwen3.5, also Apache-2.0. Model weights carry their own licenses independent of the runtime, which is exactly why the ladder is all-Qwen rather than a mix — it keeps the licensing story simple and commercially clean.
Because every tier is the same family, tokenizer and prompting behaviour stay identical as you move between them. Switching tiers changes how well Ab thinks, not how it behaves.
