Laguna on Apple Silicon
Laguna-XS-2.1 is a sparse mixture-of-experts reasoning model from poolside, built for coding and agentic work. The OptiQ quant runs at about 4.5 bits per weight (20 GB on disk) with per-layer bit-widths set by a KL-divergence sensitivity pass. It is a reasoning model, so it thinks before it answers; give it a generous token budget.
Needs OptiQ 0.4.7+
Stock
mlx-lm has no laguna class, so OptiQ ships a vendored, mlx-native port of the architecture (sigmoid MoE with a shared expert, QK-norm, GLM partial-rotary, a softplus attention gate, and hybrid full and sliding attention with dual RoPE) that registers with mlx-lm on import optiq. Run pip install "mlx-optiq>=0.4.7", then import optiq before mlx_lm.load.
The quant
| Model | Size on disk | Avg precision | Capability Score |
|---|---|---|---|
| Laguna-XS-2.1-OptiQ-4bit | 20 GB | ~4.5 bpw mixed | 85.81 |
Capability Score
The six-metric Capability Score is the unweighted mean of MMLU, GSM8K, IFEval, BFCL, HumanEval, and HashHop. Laguna was scored in reasoning mode, the setting that measures an always-on thinking model fairly. At 85.81 it sits just behind our best quant, Qwen3.6-27B.
| Benchmark | OptiQ-4bit |
|---|---|
| MMLU (reasoning, 969) | 86.2% |
| GSM8K (1000) | 95.6% |
| IFEval (strict) | 76.5% |
| BFCL-V3 simple (200 calls) | 89.0% |
| HumanEval (pass@1) | 83.5% |
| HashHop (long-context) | 84.0% |
| Capability Score | 85.81 |
A note on tool calls
Laguna emits a tool call as
<tool_call>name<arg_key>k</arg_key><arg_value>v</arg_value></tool_call>, a key and value tag format rather than JSON. OptiQ's eval and server both read that dialect, so BFCL scores its function calls correctly (89.0%) and agent loops work through optiq serve.
Hello world
hello.pypython
import optiq # registers the laguna arch with mlx-lm from mlx_lm import load, generate model, tok = load("mlx-community/Laguna-XS-2.1-OptiQ-4bit") prompt = tok.apply_chat_template( [{"role": "user", "content": "Write a Python function that returns the nth Fibonacci number."}], tokenize=False, add_generation_prompt=True, ) print(generate(model, tok, prompt=prompt, max_tokens=400))