Views
No views yet
minimax_m3_vl vision-language, MiniMax Sparse Attention) for
oMLX on Apple Silicon.switch_mlp.gate_up_proj
(129-row) layout required by the current mlx-vlm M3 code.gate_up_proj layout. It will not load on stock mlx-vlm.c0b3518 or later (verified on head 8fd6fe7, 2026-06-15).
Earlier commits use the unfused layout and will report Received 855 parameters not in model.
PR #1374 is also what's needed to run M3 at all (the minimax_m3_vl architecture is not in
released mlx-vlm/mlx-lm).trust_remote_code: true — M3 ships a custom HF processor via auto_map.torch + torchvision installed in the serving env — M3's image/video processor imports torch
(the MLX env does not include it by default).recommendedMaxWorkingSet ceiling. The fused layout in this checkpoint is what keeps long generations
under that ceiling (the unfused layout OOMs).model_settings.json entry:1{
2 "MiniMax-M3-oQ4": {
3 "trust_remote_code": true,
4 "temperature": 1.0,
5 "top_p": 0.95,
6 "top_k": 40,
7 "force_sampling": true
8 }
9}minimax_m3_vl handling).
Without them you'll see the failure modes below. We use them in production and intend to upstream them;
ping us if you want the diffs.| Area | oMLX file | What it does | Without it |
|---|---|---|---|
| Scheduling | scheduler.py | Serialize minimax_m3_vl (like Llama-4) + handle the MiniMax-Sparse-Attention KV cache (MiniMaxM3KVCache ↔ batch variant; #1374 263a4e0 adds the model-side cache-merge) | MiniMaxM3KVCache … does not support batching with history under concurrency |
| Reasoning | api/utils.py | Map <mm:think>/</mm:think> → <think>/</think> before thinking extraction | CoT leaks into content instead of reasoning_content |
| Tool calls | api/tool_calling.py + server.py | Parse <invoke name=…> + bare <key>value</key> params and strip the ]<]minimax[>[ token (200058) | raw tool-call markup leaks into content, no structured tool_calls |
tool_parsers (then selectable
without an oMLX patch); the scheduler + reasoning bits are oMLX-side.<mm:think>…</mm:think> (vs the usual <think>). The api/utils.py
mapping above turns it into a clean reasoning_content field.]<]minimax[>[ is special token 200058, the namespace marker):]<]minimax[>[<tool_call>]<]minimax[>[<invoke name="FUNC">]<]minimax[>[<param>value]<]minimax[>[</param>]<]minimax[>[</invoke>]<]minimax[>[</tool_call><invoke name="..."> with bare <key>value</key> parameter tags (not
<parameter name="key">). The api/tool_calling.py parser above converts this to structured
tool_calls.