Hero model · first-mover MLX quants

Tmax-9B & Tmax-27B

Hamish Ivison's hybrid Gated-DeltaNet agent model — and the first family Rapid-MLX took from "broken on import" to "first-class end-to-end tool calling" on Apple Silicon. We publish every quant and own the alias config.

TL;DR — one command. pip install rapid-mlx && rapid-mlx serve tmax-27b runs Tmax-27B with tool calling on 0.8.19+. We shipped the first MLX quants (4 / 6 / 8 bit and bf16) at mlx-community/Tmax-*-MLX-* and the alias config that handles the qwen3_xml tool parser, the hybrid-cache flag, and the phantom vision-tower strip that was blocking mlx-lm sanitize. Headline tok/s: TODO — refreshed bench pending on M3 Ultra for the 0.8.19 cut.

Why Tmax matters

Tmax is a hybrid Gated-DeltaNet architecture — a 3:1 ratio of RNN-style Gated-DeltaNet blocks to full self-attention. The RNN blocks give it constant per-token memory cost (no quadratic KV explosion at long context) while the attention blocks keep recall strong on agentic workloads. It comes out of Hamish Ivison's agent-tuning lineage at Ai2 and inherits that family's bias toward tool use and code.

For a Mac, this is interesting because the RNN portion means the memory footprint at 64k or 128k context is dramatically smaller than a pure-attention model of the same parameter count. You can hold Tmax-27B 4-bit plus a comfortable working context inside 24 GB of RAM.

Quants we publish

All quants live under mlx-community. The Rapid-MLX aliases below resolve to these repos automatically:

Tmax-9B family

aliashf repoweightsrecommended for
tmax-9b mlx-community/Tmax-9B-MLX-4bit ~4.7 GB ≤16 GB Macs — MacBook Air M1/M2/M3 base
tmax-9b-6bit mlx-community/Tmax-9B-MLX-6bit ~6.8 GB 24 GB sweet spot
tmax-9b-8bit mlx-community/Tmax-9B-MLX-8bit ~8.9 GB 32 GB · highest quality at 9B
tmax-9b-bf16 mlx-community/Tmax-9B-MLX-bf16 ~17 GB research / fine-tuning baseline

Tmax-27B family

aliashf repoweightsrecommended for
tmax-27b mlx-community/Tmax-27B-MLX-4bit ~14 GB ≤32 GB Macs
tmax-27b-6bit mlx-community/Tmax-27B-MLX-6bit ~20 GB 48 GB · quality-throughput sweet spot
tmax-27b-8bit mlx-community/Tmax-27B-MLX-8bit ~27 GB 64 GB+ · highest quality at 27B

We deliberately do not publish a tmax-27b-bf16 — the ~54 GB footprint is prohibitive for the small set of machines that could load it, and the 8-bit quant is within KLD noise of bf16.

Engineering notes

The interesting part of "first-mover support" is the bugs we had to flush out of the pipeline before rapid-mlx serve tmax-9b would just work. These are documented here so anyone porting other hybrid-Gated-DeltaNet models has a starting point.

Phantom vision tower in the config

The Tmax checkpoints declare Qwen3_5ForConditionalGeneration in config.json — a class that includes a vision tower stub — but ship zero vision-tower tensors in the safetensors shards. Standard mlx-lm sanitization fails on the missing keys at load time. We strip the vision-tower entries during MLX conversion before publishing, which is why our quants live at mlx-community/Tmax-*-MLX-* rather than the broken community uploads that landed earlier.

is_hybrid alias correction

Tmax-27B requires the hybrid (RNN + attention) KV path; without it, the cache is treated as fully rewindable and prefix-cache hits corrupt the RNN state. The 27B aliases now ship with is_hybrid: true (PR #902 landed in 0.8.19). The 9B variants run fine on the standard transformer path and stay at is_hybrid: false.

Tool-call parser

Both 9B and 27B use the qwen3_xml tool-call parser — they emit Qwen3-style <tool_call>…</tool_call> XML blocks rather than JSON-fenced or Hermes-style envelopes. The alias config wires this in by default, so OpenAI-shape tools=[…] requests round-trip cleanly without any client-side massaging.

Run it

$ rapid-mlx serve tmax-9b
# or, for the larger model:
$ rapid-mlx serve tmax-27b

Chat completion (cURL)

$ curl http://localhost:8000/v1/chat/completions \
    -H "Content-Type: application/json" \
    -d '{
      "model": "tmax-9b",
      "messages": [
        {"role": "user", "content": "Plan a weekend in Kyoto."}
      ]
    }'

Tool call (Python)

from openai import OpenAI

client = OpenAI(base_url="http://localhost:8000/v1", api_key="not-used")

tools = [{
    "type": "function",
    "function": {
        "name": "get_weather",
        "description": "Get the current weather for a city.",
        "parameters": {
            "type": "object",
            "properties": {"city": {"type": "string"}},
            "required": ["city"],
        },
    },
}]

resp = client.chat.completions.create(
    model="tmax-27b",
    messages=[{"role": "user", "content": "Weather in Osaka?"}],
    tools=tools,
)
print(resp.choices[0].message.tool_calls)

Benchmarks

Numbers below were measured on a Mac Studio M3 Ultra with Rapid-MLX 0.8.19, single-stream, median of 3 rounds. They match what we shipped on the model cards at mlx-community/Tmax-27B-MLX-*.

Tmax-27B

quant RAM footprint prefill @ 16k tool-call latency
4bit~14 GB311.2 tok/s2180.9 ms
6bit~20 GB303.4 tok/s2488.5 ms
8bit~27 GB308.3 tok/s2680.6 ms

Prefill is "tokens per second of input ingestion at a 16k-token context"; tool-call latency is end-to-end time from request to parsed tool_calls array on a small toolchain. Full single-stream / multi-stream tables live on the HF model card and the engine README.

References