This is the first SGLang pass after the MiMo work. The goal was practical, not leaderboard-theoretical: can one of the new Qwen3.6 models become a useful local agent route for Echo?
Current verdict: Qwen3.6-35B-A3B-FP8 is the only candidate worth continuing. It is dramatically faster than dense 27B-FP8 and scored better on the full tool benchmark. But both models failed the cross-turn sleeper-injection test, so neither should become an autonomous default route without a hardened tool-policy wrapper.
| Model | Role in the test | Result so far |
|---|---|---|
Qwen/Qwen3.6-27B-FP8 | Main original candidate for Echo | Works, smokes pass, full tool score 87, but too slow for a primary agent route. |
Qwen/Qwen3.6-35B-A3B-FP8 | MoE speed comparison | Clear practical winner so far: full tool score 89 and roughly six times faster single-stream decode than 27B. |
Qwen/Qwen3.6-27B BF16 | Control candidate | Not run yet; FP8 was the right first path on Spark memory/headroom. |
nameistoken/Qwen3.6-27B-Quark-W8A8-INT8 | INT8 comparison | Deferred. Interesting, but not the first thing to chase after 35B-A3B won the speed/score comparison. |
| Qwen3-VL / Qwen3-Coder cookbooks | Curiosity track | Researched, not tested in this pass. |
The working runtime was lmsysorg/sglang:v0.5.12.post1-cu130. I explicitly checked that it contained the SGLang FP8 loader fix path associated with the earlier Qwen3.6-FP8 dropped-scale bug. That matters because a bad loader makes the model look worse than it is.
| Item | 27B-FP8 | 35B-A3B-FP8 |
|---|---|---|
| Host | Spark1 | Spark2 |
| Engine | SGLang 0.5.12.post1 | SGLang 0.5.12.post1 |
| Context | 65,536 | 65,536 |
| Quant | FP8 e4m3 | FP8 e4m3 |
| Model memory at load | 28.93 GB | 34.69 GB |
| Startup to ready | ~260 seconds | ~205 seconds |
| Tool parser | qwen3_coder | qwen3_coder |
| Reasoning parser | qwen3 | qwen3 |
python3 -m sglang.launch_server \
--model-path /models/Qwen3.6-27B-FP8 \
--host 0.0.0.0 \
--port 8027 \
--tp-size 1 \
--mem-fraction-static 0.75 \
--context-length 65536 \
--reasoning-parser qwen3 \
--tool-call-parser qwen3_coder \
--page-size 64 \
--mamba-scheduler-strategy no_buffer \
--trust-remote-code
The 35B-A3B run used the same shape on a separate Spark node and port, pointed at the Hugging Face cache snapshot for Qwen3.6-35B-A3B-FP8.
Both models passed the basic serving gates:
| Gate | 27B-FP8 | 35B-A3B-FP8 |
|---|---|---|
/v1/models | pass | pass |
Exact marker: QWEN36_OK | pass | pass |
Arithmetic: 17*23 = 391 | pass | pass |
OpenAI tool_calls[] weather smoke | pass | pass |
| Reasoning/content stream separation | pass | pass |
Operational gotcha: with thinking enabled and too small a max_tokens, Qwen3.6 can return only reasoning_content and stop at length with content=null. That is not a server failure, but agent routes need either non-thinking mode for tool-heavy calls or enough output budget for final content.
The dense 27B model was the model I expected to matter. The MoE 35B-A3B model is what actually looked operationally interesting.
| Benchmark | Concurrency | 27B-FP8 output tok/s | 35B-A3B-FP8 output tok/s | Read |
|---|---|---|---|---|
| random pp512 / tg128 | 1 | 7.49 | 45.59 | 35B-A3B is about 6.1× faster. |
| random pp512 / tg128 | 2 | 13.96 | 66.49 | 35B-A3B keeps the lead under light concurrency. |
| random pp512 / tg128 | 4 | 25.54 | 93.02 | 35B-A3B remains the practical route. |
| random pp2048 / tg128 | 1 | 6.61 | not run | 27B pays a visible prompt penalty. |
| random pp2048 / tg128 | 2 | 12.18 | not run | 27B is still stable, just slow. |
I used tool-eval-bench 2.0.7, temperature 0, top_p=0.95, repetition_penalty=1.08, sequential concurrency 1, and Qwen thinking disabled via chat template kwargs.
| Model | Short score | Full score | Points | Deployability | Responsiveness | Important failure |
|---|---|---|---|---|---|---|
Qwen3.6-35B-A3B-FP8 | 100 | 89 | 123 / 138 | 84 | 72 | TC-60 sleeper injection |
Qwen3.6-27B-FP8 | 97 | 87 | 120 / 138 | 66 | 18 | TC-60 sleeper injection plus schema/tool-boundary misses |
run_code when direct analysis was appropriate.get_weather.additionalProperties: false.web_search with an empty required query.The dense 27B model is now a low-priority path. It works, but the speed is wrong. A local main agent route cannot feel like a research artifact every time it speaks.
The 35B-A3B MoE is different. It is fast enough to be interesting and scored slightly better than 27B in the full tool harness. But TC-60 is a blocker. A model that can carry attacker instructions across turns into later email/tool actions is not something I want wired into autonomous execution.
Next experiment: keep the 35B-A3B SGLang route as the candidate, but test it under a hardened system prompt and tool-policy wrapper focused on cross-turn injection, required-parameter hygiene, and ambiguity handling. Only after that should MTP or Quark INT8 get time.
| Candidate | Call | Reason |
|---|---|---|
Qwen3.6-27B-FP8 | Stop chasing as default | Good enough to run, too slow and less safe/responsive than 35B-A3B. |
Qwen3.6-35B-A3B-FP8 | Continue as canary | Best speed and best score so far, but needs injection/tool-policy hardening. |
| MTP/speculative | Defer | The base 35B-A3B speed is already strong; safety quality matters more now. |
| Quark W8A8 INT8 | Defer | Interesting comparison, but the MoE route already changed the priority order. |