Every brain we built,
and what it's for.
HawkTalk owns its weights. This is the whole shelf — routers, workhorses, function-callers, speech, drafters and adapters — with what each one measured and which surface serves it. Numbers here come from run artifacts, not estimates. Where something is incomplete or dead, it says so.
How they're served
One gateway process, one model registry, several backends. The same model id resolves to whatever the node in front of you can actually run — NPU, Neuron, CPU, or WebGPU in a browser tab.
| Backend | Runs | Format |
|---|---|---|
| Hexagon NPU (Snapdragon 8 Elite) | quick · dank · oak | ggml-hex, all layers resident on HTP |
| Qualcomm AI-100 (dl2q) | quick · dank · mini | QPC compiled via qeff, MXFP6 / FP16 |
| AWS inf2 (Inferentia2) | E2B and Qwen classes | Neuron / TGI-Neuron, continuous batching |
| CPU | ouromega · sapling · sakura | llama.cpp GGUF |
| Browser (WebGPU) | feedseed · lux | ONNX fp16 via transformers.js |
Selecting a model
Three ways, in increasing precedence. All of them accept a concrete registry id, a tier pin, or auto.
# 1. connection default
ws://host:8891/v1/realtime?model=auto
# 2. mid-session — takes effect on the next turn
{"type":"session.update","session":{"model":"tier:dank"}}
# 3. per-turn override — highest precedence
{"type":"response.create","response":{"model":"hawkalphaquick"}}
Tier vocabulary is ouro · quick · dank · think · cloud, with aliases (self, route, ouromega, live, specialist, t0–t3). auto runs the router per utterance. GET /v1/models lists what a given node actually has, with availability and routing info — always trust that over this page.
session.update re-points a live socket at a different brain without dropping the call. Every conglomerate realtime API is one model per session.Routers — the thing that decides
The flagship router and the piece the whole cost story rests on. Reads every turn and emits one of SELF · QUICK · DANK · CLOUD, then answers the SELF turns itself. Prompting a stock 270M for this scored 0/10 — the behaviour is distilled in, not prompted.
A vocab-trimmed variant (262144 → 32000, 242 MB) was built and rejected for ship: trimming remaps token ids and breaks token-space alignment with quick and dank, which is what makes cross-tier handoff free.
A second routing family aimed at mandate-verb selection rather than tier selection. Measured and kept honest: v2 reached 83.5% on the 97-case set but only 47.3% held out, bleeding to web_search and NONE. It did not reach the ouromega bar and is not in the serving path.
Workhorses — the Gemma-4 ladder
All vocab-trimmed 262144 → 150554 (English trim). Same tokenizer across the ladder, which is why a turn can move tier mid-conversation without a re-encode.
The workhorse. Active listening, quick chat, multimodal audio in. This is what answers most turns and what tier:quick resolves to.
The escalation target. Longer instructions, code, summaries — the turns quick shouldn't be guessing at. Also ships an FC-merged build for tool-heavy work.
A surgical depth cut of quick, kept because the numbers are instructive: on AI-100 MXFP6 it hits 9–14 ms TTFT and 205–215 tok/s decode. That is the ceiling the architecture can reach when depth stops being the constraint.
Function calling
Tool use is a fine-tune, not a prompt trick, so each surface gets a caller sized for its silicon.
The main function-caller. Evaluated on 42 cases across 7 categories, greedy, against a frontier ceiling.
| Category | Raw | Grammar-constrained | Cloud ceiling |
|---|---|---|---|
| simple | 100% | 100% | 100% |
| selection | 67% | 67% | 100% |
| parallel | 50% | 83% | 100% |
| ambiguous | 50% | 50% | 100% |
| grounding | 50% | 67% | 100% |
| negative | 100% | 100% | 100% |
| multiturn | 83% | 83% | 100% |
| overall | 71% | 79% | 100% |
The NPU premium function-caller, and the teacher the smaller callers are distilled from. Ships in two cuts: a full-vocab deploy build and a Lighthouse trim at vocab 181450. Trim gates all pass — token coverage 1.0, argmax agreement 1.0, max logit delta 1.05e-5.
Function calling in a browser tab with no install and no server. Ships as ONNX fp16 and boots through transformers.js — this is what the Hawknest widget loads.
The correctness-first caller, and the only non-Gemma one — chosen for the Apache-2.0 licence and native tool-use training. Always run behind a GBNF grammar. Measurement killed the 0.5B: 33.3% exact against the 1.5B's 70.8%.
| Metric | 0.5B | 1.5B |
|---|---|---|
| valid JSON | 100% | 100% |
| no hallucinated tool | 100% | 100% |
| right tool | 50.0% | 79.2% |
| exact (tool + args) | 33.3% | 70.8% |
HawkChat's on-device caller — architecturally feedseed's twin, tuned for the companion app instead of the trail. Grammar-locked to a {"calls":[…]} contract. Ships inside the Android APK.
The Hawk Alpha family
Four models, one job — turn speech into grounded tool calls on whatever hardware the user already owns. This is the ladder that ships in OpenCairn and the Hawknest widget.
| Member | Base | Runs on | Distinguishing property |
|---|---|---|---|
| Sapling | Gemma 3 1B | Phone CPU | The chat tier. Bandwidth-first vocab trim, because decode is memory-bound. Ships a full-vocab twin so the trim can be A/B'd honestly. |
| Feedseed | Gemma 3 270M | Browser, WebGPU | The floor. Runs in a tab with no install. fp16 only. |
| Sakura | Qwen 2.5 1.5B | CPU / Vulkan | Licence-clean and correctness-first. Grammar-locked. |
| Oak | Gemma 4 E2B | Hexagon NPU | The premium tier and the teacher the others learn from. |
Speech
| Model | Role | Size | Notes |
|---|---|---|---|
| Kokoro-82M | TTS | 310 MB fp32 · 88 MB | 14 voice packs — af_heart default, plus af_bella, am_puck, bm_fable, bf_isabella. Returns visemes for lip-sync. |
| Whisper base.en | STT | 148 MB | The one to ship. Worth the memory over tiny. |
| Whisper tiny.en | STT | 78 MB | Measurably mishears domain phrases. Fallback only. |
| Sherpa-onnx zipformer | STT streaming | 43 MB int8 encoder | Fully on-device streaming for Android. |
| Piper lessac-medium | TTS fallback | 63 MB | Engine fallback when Kokoro is unavailable. |
| Orpheus-3B + SNAC | TTS LLM + codec | — | Expressive speech research lane. research |
| Silero VAD | voice activity | 885 KB | Client-side endpointing. |
Embedding
A fine-tuned MiniLM/BGE-class encoder, wired into the live cache path and reachable as tier:embed. Used for retrieved-prefix grounding — the approach that measured a +40pp lever, as opposed to per-token blending, which did not.
Drafters & speculative decode
A family-native draft/target pair — same tokenizer on both sides, which the previous attempt got wrong by distilling a Qwen student from a Gemma teacher. Gated on real token-id acceptance alpha, not a proxy: it ships only above 0.65.
Self-speculation with exit layers [19, 24, 29]. Measured token agreement at exit 19 was 0.168 against a draft cost fraction of 0.534 — it does not pay. Published because a measured negative is worth as much as a win.
Persona & domain adapters
Hot-swappable LoRAs on the quick base, routed by keyword against one resident model — so a persona change costs an adapter swap, not a model load.
| Adapter | Rank | Size | For |
|---|---|---|---|
bookworm_v2 | r32 / α64 | 90 MB | Long-form reading and recall |
storylord_v2 | r32 / α64 | 90 MB | Narrative generation |
writer_v2 | r32 / α64 | 90 MB | Drafting and editing |
adpt_affect | r16 / α32 | 90 MB GGUF | Emotional register — feeds the affect lane |
adpt_code | r16 / α32 | 90 MB GGUF | Code paths |
The same model, four silicons
One protocol, four backends, all measured. This is the platform claim, and it is the reason flat-rate pricing is possible rather than subsidised.
| Silicon | Measured |
|---|---|
| Qualcomm AI-100 MXFP6 | TTFT 36–40 ms · prefill 174–392 tok/s · decode ~50 tok/s · 8-card aggregate 404.6 tok/s |
| Qualcomm AI-100 FP16 | TTFT 56–60 ms · decode ~24 tok/s — MXFP6 is ≈2× FP16 on decode |
| AWS inf2 Neuron | warm TTFB 0.346 s · ~22 tok/s streaming |
| Phone Hexagon | all layers resident on HTP · on-NPU function calling 77.5% full-correct, 100% valid format over 1000 cases |
| Host CPU | ouromega decision p50 300.2 ms on an idle box |
Voice-to-voice on one inf2 box, serial: STT 669.9 ms + chat 656.2 ms + TTS 1449.5 ms = 2775.6 ms. TTS is 52% of that budget, which is where the work is.
Incomplete, and dead
Kept on the page because a catalogue that only lists wins is a brochure.
| Thing | State | Why |
|---|---|---|
hawkalphathink (12B, tier 3) | incomplete | Config declares the shape; weights were never built on this box. The ladder currently tops out at dank. |
hawkalphalite (268M drafter) | design only | Scripts and a feasibility verdict exist; no checkpoint. |
| 268M FC-router distill | killed | Memorises. 45.1% held out. The 268M keeps tier-routing only. |
| Per-token kNN-LM decode blend | killed | Fired 40×, corrected 0. Retrieved-prefix grounding is the +40pp lever that works. |
| Turbo layer-pruned models | killed | Instruction-following destroyed. |
| ouromega en32k trim | rejected | Smaller, but remaps token ids and breaks cross-tier alignment. |
Dead means dead. Reopening any of these requires new evidence, recorded.