Kept / trial active in llama-swap.yaml · aliases: nex-n2.5-mini-35b-a3b-256k
| Run | Score | tok/step | R5 | Log |
|---|---|---|---|---|
| No results-*.log found for this id/alias. | ||||
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.
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.
| 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 |
### 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) |
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.
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.
| 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 | — |
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:
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).
---
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:
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:
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:
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.
"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