English documentation · runtime 7.24.4 · SDK 2.6.7. Content is maintained with runtime development; see each guide's scope and review date.
AX Code and OpenCode client retest: 19 September 2026
Status: Active
Scope: measured diagnostic snapshot
Last reviewed: 2026-09-19
Owner: ax-code runtime
This retest uses AX Code source 62895cf40a39e0ebd4afec0afa21044e9871aa0b, after the local
prefix fix (42908b46a) and MTPLX/oMLX provider additions. All six client/backend combinations
use the same Qwen3.8 27B AXQ 6-bit artifact with MTP enabled on an Apple M3 Max, 128 GiB.
The earlier measurements remain historical evidence;
their model packages, prompts, token limits and cache conditions differ. This is not a controlled
before/after estimate of the prefix fix’s speedup.
Delivered output speed
Each cell is first task / repeated task, in tokens/s. These are single observations, not medians. The repeated task starts a new CLI session against the same backend process; it is not assumed to hit a cache. Loading and waiting for the first output are excluded from this rate.
| Client | AX Engine | MTPLX | oMLX |
|---|---|---|---|
| AX Code | 11.73 / 13.60 | 18.73 / 19.69 | 17.48 / 16.60 |
| OpenCode | 22.49 / 18.98 | 27.91 / 26.35 | 20.33 / 20.64 |
The estimate is (completion tokens - 1) / (last output payload time - first output payload time).
Speculative decoding can emit several tokens in one payload, so this is a client delivery estimate,
not the backend’s native decode counter. It also does not measure complete-request throughput.
Request timing, workload and acceptance
NR means the server did not report cached-token usage; it does not assert zero. First-payload time
starts when the local recording proxy receives the model request. CLI wall time also includes client
startup and completion. The task asks for a standalone generic TypeScript LRU cache with get, set,
delete and clear, without tool execution or file edits.
| Backend | Client | Task | Input tokens | Output tokens | Cached tokens | First payload (s) | CLI wall (s) | Code checks |
|---|---|---|---|---|---|---|---|---|
| AX Engine | AX Code | First | 29,896 | 268 | NR | 197.78 | 231.58 | Pass |
| AX Engine | AX Code | Repeat | 29,896 | 268 | 29696 | 7.22 | 33.34 | Pass |
| AX Engine | OpenCode | First | 17,316 | 216 | NR | 100.86 | 112.83 | Pass |
| AX Engine | OpenCode | Repeat | 17,316 | 228 | NR | 116.03 | 129.90 | Pass |
| MTPLX | AX Code | First | 36,708 | 285 | 0 | 246.67 | 269.43 | Pass |
| MTPLX | AX Code | Repeat | 36,708 | 285 | 36708 | 0.04 | 20.48 | Pass |
| MTPLX | OpenCode | First | 18,729 | 276 | 0 | 108.67 | 121.00 | Pass |
| MTPLX | OpenCode | Repeat | 18,729 | 276 | 18729 | 0.08 | 12.77 | Pass |
| oMLX | AX Code | First | 33,124 | 275 | 0 | 212.25 | 235.62 | Pass |
| oMLX | AX Code | Repeat | 33,124 | 232 | 32768 | 4.41 | 23.34 | Pass |
| oMLX | OpenCode | First | 17,316 | 213 | 0 | 118.03 | 130.88 | Pass |
| oMLX | OpenCode | Repeat | 17,316 | 261 | 16384 | 7.73 | 22.91 | Pass |
Code acceptance checks missing keys, value lookup, LRU eviction, retained entries, update recency, deleting existing and absent keys, clearing, object-key identity and falsy values. Generated files also receive strict TypeScript checking. These bounded checks do not establish broad coding quality. All measurement rows retain their generated output and validation result; failures are not silently replaced with faster retries.
MTP and runtime conditions
- AX Engine 7.4.0:
--mlx-mtp-policy required, managed local runtime flags, n-gram acceleration and n-gram stacking disabled. Live process metrics showax_engine_mlx_mtp_model_policy_active=1with nonzero draft and accepted token counters. The AX Code snapshot follows warmup; the OpenCode snapshot follows the first task. Both include warmup and are not per-task acceptance totals. Per-task AX Code draft counts were not retained. - MTPLX 2.11.3 / MLX 0.32.2: explicit
--generation-mode mtp --depth 3; live health reportsgeneration_mode: mtpandruntime_mode: Sustained MTP. Agent rewrites and SSD session cache are off; the native in-memory session bank remains enabled. Native startup/kernel warmups are retained and excluded from timing. The unrelated load warmup completed; background warmup status at admission is retained in the data rather than assumed complete. - oMLX 0.6.4 / MLX 0.32.0: Lightning MTP enabled, depth 3, text-only model loading, concurrency one. Per-generation logs record draft acceptance and per-depth execution for warmup and both tasks. The upstream sidecar importer renames 15 tensors; their dtype, shape and payload bytes remain identical to the original AXQuant sidecar. Backbone weights are unchanged.
- Artifact:
AutomatosX/AX-Qwen3.8-27B-MLX-AXQ-6bit-MTP, revision4d36d652c21590f6813495351c3baf5fca5b3831. The artifact metadata declares MTP depth 1; recurrent depth 3 here follows the selected runtime policy/explicit experiment and does not extend artifact certification. The Optimized-Speed model package is not used in this retest. - OpenCode version is 1.18.31. All backends and clients run serially. Each client/backend pair starts a fresh process and isolated task cache, followed by an unrelated model-load warmup capped at 64 output tokens. Model loading and that warmup are excluded from the table; the first task still pays cold prefill. Fan control is left at its default, and backbone files reside on SMB storage.
What is aligned, and what remains different
Both clients receive the same frozen full project instructions, user task and four permitted tools
(glob, grep, read, skill). The source AX Code CLI uses the actual ax-engine, mtplx and
omlx provider IDs; AX Engine uses its verified loopback attachment contract with a separately
started backend carrying managed flags. This does not time the managed download/startup UI.
OpenCode uses its OpenAI-compatible provider path. Project configuration is disabled and each
client has isolated settings/state. Native client prompts, tool schemas and session headers remain
intact; therefore rendered token counts and cache behavior differ.
A local recording proxy aligns temperature 0.55, top-p 1, top-k/min-p 0, repetition penalty 1,
presence/frequency penalties 0, seed 0, thinking off, and an output ceiling of 1,024 tokens.
It forces tool_choice: none for this no-tool task. Both clients are configured for a 65,536-token
context. Every row is checked for the complete instruction snapshot, the four tool names,
common sampling, one request, successful CLI exit, natural stop and no tool execution.
The longer AX Code prompts can increase both prefill and attention work during generation. Different response lengths, content, runtime templates, kernels and cache policies prevent treating these tables as an equal-token client-overhead benchmark. MTP being active does not guarantee 30–40 tokens/s for a full coding context. To isolate client overhead or a prefix-fix effect, replay identical serialized requests/token IDs with controlled output and cache conditions separately.
This report changes no cloud, private GPU, CLI-provider or AX Trust behavior. See the local runtime setup guide for connection instructions and the sanitized measurement data for exact timings, counts, hashes, validation results and MTP evidence. Private project instructions, model responses, local paths and session headers are retained locally and are not published. Consequently, the complete private-context workload is not independently reproducible from the public report alone.