← all models

nex-n25-mini

Kept / trial  active in llama-swap.yaml · aliases: nex-n2.5-mini-35b-a3b-256k

Grill run history

RunScoretok/stepR5Log
No results-*.log found for this id/alias.

Memory notes

nex-n25-mini-trial (nex-n25-mini-trial.md)

Nex-N2.5-mini trial — 2026-09-10

Model: nex-agi/Nex-N2.5-mini (35.1B Qwen3.5-MoE, 256 experts 8/tok, 40 layers, depth-27 vision, MTP head, 262k native, Apache-2.0)

Quant: Q5_K_M 23.03 GiB + mmproj-f16 0.84 GiB from mradermacher/Nex-N2.5-mini-GGUF

Serving: llama.cpp b70adb1b4c (Aug 23), --tensor-split 45,55 (NOT -sm tensor — mmproj entry), --jinja (embedded template, no patch needed), q8_0 KV @262k, flash attention on

VRAM: GPU0 (5060 Ti) 15.1/16.3 GiB, GPU1 (4060 Ti) 15.9/16.4 GiB post-image. ViT buffer +226 MiB on GPU0 (lazy, loads on first image). ~1.2 GiB spare on GPU0, ~0.5 GiB on GPU1. Healthy.

Template

Embedded GGUF template identical to HF chat_template.jinja. No non-first-system guard (renders as ChatML turn, no patch needed). Tool format is XML <function=..><parameter=..>, NOT JSON. Always-thinking hardcoded (coi_thinking in generation prompt). The raise_exception('No user query found in messages.') tripwire on line 79 did NOT fire in multi-turn system+tools test.

Smoke tests (all PASS)

| Test | Result |

|------|--------|

| 4.1 load+answer | 64s cold load, "Four" correct, finish_reason: stop |

| 4.2 single-turn tools | 5/5 tool calls parsed |

| 4.3 multi-turn system+tools | HTTP 200, correct tool_calls (no 400/500/133-byte) |

| 4.4 think-tag leak (30 reps) | CLEAN — 90 turns, 0 leaks, 0 fabrications |

| 4.5 vision (real image) | 20/21 (95.2%), ViT loaded on GPU0 without OOM |

Grill

### Coding (rounds 1-4): 19/23 (82.6%)

| Round | Score | Failures |

|-------|-------|----------|

| R1 | 5/8 | expr_eval RUNAWAY (16k cap), articulation_points RUNAWAY, wildcard_match logic |

| R2 | 4/5 | text_justify logic |

| R3 | 5/5 | — |

| R4 | 5/5 | — (70.6 tok/step, very lean) |

### Round 5 (long-horizon agentic) x3 reps: 6/6 complete, 0/6 looped, 0% redundant all reps

| Rep | Complete | Looped | Redundant | out_tok | steps |

|-----|----------|--------|-----------|---------|-------|

| 1 | 6/6 | 0/6 | 0.0% | 4761 | 36 |

| 2 | 6/6 | 0/6 | 0.0% | 3221 | 35 |

| 3 | 6/6 | 0/6 | 0.0% | 3675 | 36 |

interrupt_replan passed all 3 reps (the task that killed apodex-11-mini 3/3 and loops aquila 4/4). already_done passed all 3 reps with 0 writes. Zero looping is the strongest signal — matches tommy, beats aquila/apodex/bigbang.

### Both-arms tests

| Test | Unaided | API ref | Gap |

|------|---------|---------|-----|

| KLayout | 0/8 | 5/8 | +5 (API ref essential) |

| Office | 5/9 | 8/9 | +3 (ref helps; bar_regions vision fails both arms) |

| Realcase | 1/7 (RUNAWAY) | n/a (always includes ref) | — |

| KLayout vision | 5/6 | 5/6 | 0 (vision test, ref irrelevant) |

Strengths

1. Zero looping — R5 6/6 x3 reps, 0 loops, 0 redundant calls. interrupt_replan absorbed cleanly every time.

2. Zero think-tag leaks — 90 turns CLEAN across all 3 textturn suites (A: no tools, B: tools+text, C: post-tool summary).

3. Perfect tool-calling — 5/5 single-turn, 5/5 multi-turn system+tools, 5/5 R3 format, 5/5 R4 agentic loops.

4. Strong vision — 20/21 (95.2%) visual grill, 5/6 KLayout vision. Among the best vision scores.

5. Lean agentic — 70.6 tok/step in R4, 92-132 tok/step in R5. Decisive, no wasted calls.

Weaknesses

1. Token-cap RUNAWAY — the always-thinking nature causes 16k budget exhaustion on complex tasks: expr_eval, articulation_points (R1), 5/8 KLayout unaided tasks, realcase (1/7), min_spacing. The model overthinks and truncates code. This is 9+ failures attributable to the token cap, not capability.

2. KLayout API recall — 0/8 unaided (doesn't know the KLayout API). 5/8 with ref is decent but below tommy's 7/8.

3. Realcase FAIL — 1/7, RUNAWAY. The always-thinking model can't complete the complex KLayout+Excel script within 16k tokens. tommy scores 7/7.

4. Office vision reading — bar_regions axis labels misread in both arms ('Region 3'/'third bar' instead of 'East'). The model sees the chart type but can't read text labels in images reliably.

Comparison to incumbents

| Model | Coding | R5 loops | Think-tag | KLayout+ref | Office unaided | Realcase |

|-------|--------|----------|-----------|-------------|----------------|----------|

| nex-n25-mini | 19/23 | 0/6 x3 | CLEAN | 5/8 | 5/9 | 1/7 |

| tommy | 27/29 | 0/6 | CLEAN | 7/8 | 9/9 | 7/7 |

| aquila | 22/23 | 4/4 loops | LEAK (real use) | — | 8/9 | 7/7 |

| apodex-1.1 | — | 3/3 loops | CLEAN | 4/8 | 0/9→6/9 | — |

Verdict: KEPT as trial, not promoted

The model earns its slot on two critical axes that are hard to find: zero looping and zero think-tag leaks. Its vision (20/21) and tool-calling (perfect) are also strong. However, it does NOT displace tommy:

  • Coding 19/23 vs tommy's 27/29
  • Realcase 1/7 (RUNAWAY) vs tommy's 7/7
  • KLayout+ref 5/8 vs tommy's 7/8
  • Office unaided 5/9 vs tommy's 9/9

The always-thinking token cap is the root cause of most failures. Path B (vLLM Int4-Int8Mix) was tested to see if vLLM's reasoning/content split would fix the RUNAWAY. It does NOT. See Path B section below.

The model is NOT a driver candidate (tommy/aquila territory) until the RUNAWAY is resolved. It IS a capable agentic+vision model that's safe to drive (zero leaks, zero loops).

---

Path B: vLLM Int4-Int8Mix (2026-09-10)

Quant: Tech2wild/Nex-N2.5-mini-Int4-Int8Mix — compressed-tensors W4A16 experts (group 128), W8A16 attention/shared-expert, BF16 lm_head/vision/embed. 19.6 GiB on disk (16 shards). Stored on NVMe (~/models-nvme/nex-n25-int4) — /mnt/models was 99% full.

Serving: vLLM 0.26.0, TP=2, --max-model-len 131072, --max-num-seqs 8, --gpu-memory-utilization 0.95, --kv-cache-dtype fp8, --enable-auto-tool-choice, --tool-call-parser qwen3_coder, --reasoning-parser qwen3. Cold start 4m40s.

VRAM: GPU0 14.2/16.3 GiB, GPU1 14.1/16.4 GiB — lighter than Path A (15.1 + 15.9). ~2 GiB spare on each card.

Speed: 88-112 tok/s (significantly faster than llama.cpp Path A).

### Key finding: RUNAWAY NOT FIXED

vLLM separates reasoning from content in the API response (uses reasoning key, not reasoning_content — vLLM 0.26.0 naming). The qwen3 reasoning parser correctly splits thinking from content (CLEAN 15/15 textturn). BUT max_tokens counts BOTH reasoning + content tokens together — there is no separate reasoning budget in vLLM 0.26.0's ReasoningConfig (only reasoning_parser, reasoning_start_str, reasoning_end_str — no max_reasoning_tokens).

Result: the model still overthinks and hits the 16k cap. Tested at 32k: still RUNAWAY. The model overthinks indefinitely regardless of budget — more tokens just means more thinking, not convergence.

### reasoning_effort=none + enable_thinking=false bypass

The template supports reasoning_effort: none which pre-closes the think block ( didSelect\n\n\n\n), and vLLM's qwen3 parser supports enable_thinking: false which starts in CONTENT state. Together they skip thinking entirely. Result:

  • No RUNAWAY — 1285 tokens, 11.6s (vs 16000 tokens, 163s with thinking)
  • But quality drops: R1 4/8 (vs 5/8 with thinking), realcase 0/7 (sloppy code, smart quotes)
  • expr_eval still loops at 16k even without thinking — the model has a fundamental looping bug on that task independent of the thinking mechanism

### Path B vs Path A full comparison

| Test | Path A (llama.cpp Q5_K_M) | Path B (vLLM Int4-Int8Mix) | Delta |

|------|--------------------------|---------------------------|-------|

| R1-4 coding | 19/23 (82.6%) | 19/23 (82.6%) | Same |

| R5 x3 complete | 18/18 | 17/18 | -1 (sampling) |

| R5 x3 looped | 0/18 | 0/18 | Same |

| Tool calls | 5/5 | 5/5 (qwen3_coder) | Same |

| Think-tag leak | CLEAN 90 turns | CLEAN 15 turns | Same |

| KLayout unaided | 0/8 | 1/8 | +1 (5 RUNAWAY on vLLM) |

| KLayout API ref | 5/8 | 5/8 | Same |

| Office unaided | 5/9 | 2/9 | -3 |

| Office API ref | 8/9 | 5/9 | -3 |

| Realcase (16k) | 1/7 (RUNAWAY) | 0/7 (RUNAWAY) | -1 |

| Realcase (32k) | — | 0/7 (RUNAWAY) | More budget doesn't help |

### Path B-specific failures

vLLM has MORE RUNAWAY events than Path A in domain tests:

  • KLayout unaided: 5/8 tasks hit 16k cap (path_polygon, rotate_place, merge_stats, grow_shapes, min_spacing)
  • KLayout API ref: 2/8 hit 16k cap (merge_stats, min_spacing)
  • Office unaided: line_months hit 16k cap
  • Realcase: all 7 tasks hit cap at both 16k and 32k

Office is notably worse on vLLM: line_months fails with ImportError: cannot import name 'LineChart' from 'openpyxl' in API ref (a code quality issue, not RUNAWAY). bar_regions:vision fails both arms with wrong axis label reading (same as Path A).

### Path B verdict

Path B does NOT fix the RUNAWAY and is WORSE on domain tests. vLLM provides:

  • ✓ Cleaner API (reasoning separated from content)
  • ✓ Faster throughput (88-112 tok/s)
  • ✓ Lighter VRAM (14.2 + 14.1 vs 15.1 + 15.9)
  • ✗ Does NOT fix the token-cap RUNAWAY (max_tokens counts reasoning + content)
  • ✗ Office WORSE (2/9 vs 5/9 unaided, 5/9 vs 8/9 API ref)
  • ✗ More RUNAWAY events in KLayout unaided (5/8 vs 0/8 on Path A — Path A's KLayout failures were wrong answers, not RUNAWAY)

Final verdict: KEPT as trial, not promoted. Path B does NOT improve on Path A. The RUNAWAY is a model behavior problem (overthinking without convergence), not a backend problem. The model is too small (3.1B active params out of 35.1B) for complex KLayout/realcase tasks — it either overthinks indefinitely or produces sloppy code without thinking. No backend or quantization can fix this.

llama-swap.yaml entry

  "nex-n25-mini":
    aliases: [nex-n2.5-mini-35b-a3b-256k]
    # nex-agi/Nex-N2.5-mini — TRIAL 2026-09-10. Agentic/computer-use model,
    # apache-2.0. arch qwen35moe (VERIFIED from the GGUF header): 40 layers,
    # 256 experts 8/tok, kv_heads 2, head_dim 256, full_attention_interval 4,
    # vision depth 27, 262144 native, MTP head present. Same family llama.cpp
    # already runs for fable-fusion / tommy / pocket-35b / kat-coder.
    #
    # QUANT: Q5_K_M 23.03 GiB. Budget from auto-memory/qwen35moe-35b-vram-ceiling.md
    # (aquila measured at 23.30 GiB, i.e. this is 0.27 GiB SMALLER):
    #   weights 23,583 + mmproj 860 + q8_0 KV @262144 2,700 + compute 1,973
    #   + lazy ViT 472  =  ~29,588 of 32,691 MiB, ~3.1 GiB spare.
    #
    # TEMPLATE: this model does NOT share the family template. It has NO
    # non-first-system guard (renders it as its own ChatML turn), so no patch
    # is needed for that defect — the embedded template is used as-is until
    # the multi-turn tools test proves otherwise. Tool format is XML
    # <function=..><parameter=..>, NOT function_call{json}.
    #
    # --tensor-split 45,55 NOT -sm tensor: this is an mmproj entry and the
    # 903 MB vision tower lands WHOLLY on CUDA0 ignoring the split
    # (auto-memory/mmproj-caps-cuda0-tensor-split.md). 45,55 is the MEASURED
    # value for a ~23 GiB Q5 weight set at 262k with vision. Do NOT "balance"
    # toward 50,50 — 47,53 left only 543 MiB on the 4060 Ti and crashed bigbang
    # on its first image.
    #
    # ALWAYS-THINKING: template hardcodes coi_thinking. CoT -> reasoning_content,
    # answer -> content. At a small max_tokens it caps mid-think and returns an
    # EMPTY content with no error.
    cmd: |
      /usr/bin/env
      CUDA_DEVICE_ORDER=PCI_BUS_ID
      ${llama_bin}
      -m /mnt/models/gguf/Nex-N2.5-mini.Q5_K_M.gguf
      --mmproj /mnt/models/gguf/Nex-N2.5-mini.mmproj-f16.gguf
      --alias nex-n25-mini
      --jinja
      -ngl 99 -c 262144 -fa on
      --tensor-split 45,55
      -b 2048 -ub 512
      --temp 0.6 --top-p 0.95 --top-k 20 --min-p 0.0
      --cache-type-k q8_0 --cache-type-v q8_0
      --host 127.0.0.1 --port 9198 --parallel 1
    proxy: http://127.0.0.1:9198