AI Proxy · benchmark
2026-08-16 10:41 · proxy 0.2.0
nemotron-3.5-lightning-30b-a3b-ctx1m scored 93% fully correct at 52.3 tok/s, first token in 98,945 ms.
30 of 30 requests succeeded.
Backend
ollama
Context
short
Thinking
auto
Prompt cache
—
Temperature
—
Quantisation
not reported
Prefix caching
—
KV cache dtype
—
Decode rate
52.3
Time to first token
98,945 ms
Reply length
1,419 tok
Total per request
114,816 ms
A model's advertised context is the prompt it will accept. It says nothing about whether the model can still find anything in there. Those are different properties and they part company well before the advertised number: a backend will happily prefill a prompt the model cannot actually read, return a confident answer, and report success at every layer. Nothing in a coding or agentic suite can catch that, because every one of their prompts fits in a few thousand tokens.
So this measures the second property directly. Five facts — short codes — are planted at fixed depths through a haystack of known size, and all five are asked for in a single request. The haystack is deliberately repetitive, enumerated ledger lines that all look alike, which is the hard case for binding a fact to a position: the number below is a lower bound, and a real document of the same size would score better.
Each rung is run five times, and each repeat is a different draw — the filler shifts from the first line and the needles jitter around their depths. Repeating one identical prompt would measure the backend's prompt cache instead, which serves repeats two through five off a prefix it already holds and returns five matching answers that look like consistency.
Read the depth columns before the totals. The first needle sits near the start on every repeat, because a backend that front-truncates an over-long prompt discards the beginning first — so a healthy start column is the evidence that the window is genuinely allocated, and a failing one means the prompt was silently cut rather than badly recalled. When start holds and the middle columns fall, that is a retrieval limit in the model. When start falls, it is a configuration problem in the stack.
Prefill tok/s is the prompt size over the time before the first token returned. At these sizes it is the only throughput figure that means anything — the answer is five short lines, so decode speed is noise next to the cost of reading the haystack.
| Rung | Prompt tokens | Recalled | start | 25% | 50% | 75% | end | Prefill tok/s | First token | Wait | Excluded |
|---|---|---|---|---|---|---|---|---|---|---|---|
16k | 15,987 | 75/75 | 15/15 | 15/15 | 15/15 | 15/15 | 15/15 | 2,791 | 5.7s | 11.2s | — |
64k | 63,983 | 75/75 | 15/15 | 15/15 | 15/15 | 15/15 | 15/15 | 2,644 | 24.2s | 30.2s | — |
128k | 128,007 | 75/75 | 15/15 | 15/15 | 15/15 | 15/15 | 15/15 | 2,332 | 54.9s | 1:01 | — |
256k | 262,197 | 74/75 | 15/15 | 15/15 | 15/15 | 14/15 | 15/15 | 1,833 | 2:23 | 2:30 | — |
300k | 300,076 | 75/75 | 15/15 | 15/15 | 15/15 | 15/15 | 15/15 | 1,724 | 2:54 | 3:03 | — |
512k | 512,144 | 63/65 | 13/13 | 13/13 | 12/13 | 13/13 | 12/13 | 1,303 | 6:33 | 6:35 | 2 |
600k | 600,176 | 21/25 | 4/5 | 5/5 | 4/5 | 4/5 | 4/5 | 1,181 | 8:28 | 8:30 | — |
700k | 700,187 | 18/25 | 4/5 | 5/5 | 3/5 | 3/5 | 3/5 | 1,068 | 10:55 | 10:57 | — |
800k | 800,245 | 24/25 | 5/5 | 5/5 | 4/5 | 5/5 | 5/5 | 969 | 13:45 | 13:47 | — |
900k | 900,284 | 17/25 | 5/5 | 5/5 | 2/5 | 2/5 | 3/5 | 895 | 16:46 | 16:49 | — |
| all | — | 517/540 | 106/108 | 108/108 | 100/108 | 101/108 | 102/108 | — | — | — | 2 |
2 unit(s) excluded: the reply hit the output cap before it finished answering. A truncated reply is not a recall failure, and scoring it as one measures the token budget rather than the model. Reasoning length here grows with the size of the prompt, not the difficulty of the task.
6 unit(s) are not counted at all: the request failed or never reported a prompt size, so the model never saw the haystack. A request that died is not a recall of zero.
Failures by kind: 11 reported as not found · 7 absent from the reply · 5 misattributed to another needle. These are not interchangeable. A model that writes NAME=MISSING has lost the fact and knows it — it can tell you it does not know. A model that answers with another needle's code has lost it and does not know, and will state the wrong answer with the same confidence as a right one. Both score zero; only one is safe to build on.
Every failed task, classified by the first thing that went wrong. A model that is cut off, silent, unwilling or simply incorrect has four different problems, and only one of them is answered by picking a different model — the others are a token budget, a prompt, and a policy decision.
| Reason | nemotron-3.5-lightning-30b-a3b-ctx1m |
|---|---|
| backend or harness error the request never produced a gradeable answer | 2 (100%) |
| total failures | 2 |
Scores, standings and charts above describe longctx-lite only. 2 further runs from longctx-v1 are reported in their own sections rather than ranked alongside — a 24-task preference suite and a 119-task correctness suite produce numbers that do not mean the same thing.
1 task did not settle: the same model, the same prompt, a different outcome between repeats. Treat these scores as samples, not measurements — and expect the coin to land wrong somewhere inside a long agent run.
| Task | What it asks | Model | Passed | Rate |
|---|---|---|---|---|
longctx_512k | Recall five facts planted through a 512,000-token haystack. | nemotron-3.5-lightning-30b-a3b-ctx1m | 3/5 | 60% |
A single configuration, so there is nothing to rank — what matters here is consistency across the 30 requests. A wide gap between p50 and max means the number is not repeatable.
| Metric | min | p50 | p90 | max |
|---|---|---|---|---|
| Time to first token ms | 5,690 | 98,945 | 392,370 | 393,445 |
| Decode rate tokens/sec | 27.8 | 52.3 | 80.2 | 84.1 |
| Total ms | 11,133 | 114,816 | 510,684 | 686,881 |
The core tier confirms a model is not broken; it saturates for anything capable, which is exactly why the hard tier exists. Compare two models on the hard row when both score 100% on core.
| Configuration | Hard |
|---|---|
| nemotron-3.5-lightning-30b-a3b-ctx1m | 93% |
Share of responses that passed every case for that task. A model strong everywhere except one task and a model mediocre throughout can share an overall average.
5 of 6 tasks were fully correct on every run; the ones that were not are listed below.
| Task | Perfect |
|---|---|
longctx_512kRecall five facts planted through a 512,000-token haystack. | 60% |
The first failing case per configuration: the call that was made, what came back, and what should have — or the compile error or timeout that stopped it. This is what a percentage point of correctness is made of.
longctx_512k — Recall five facts planted through a 512,000-token haystack. · 1 examplehit the token cap mid-answer — the echo code, planted at the end → "PERIWINKLE-2051 does not appear anywhere in the reply", expected "PERIWINKLE-2051"GPU
NVIDIA GB10 · 122 GB
Unified memory
122 GB
CPU
Cortex-X925
Cores
20
OS
Ubuntu 24.04.4 LTS (aarch64)
Kernel
6.17.0-1018-nvidia
Ollama
0.32.13
Proxy
0.2.0
Every task asks for one answer in the task's language — Python, JavaScript under node, C and C++ under gcc, Rust, C#, or PHP, each run in a separate process under a timeout with the return value compared against the expected one. HTML and CSS tasks are graded structurally: the answer is parsed and checked against required structure (bindings, attributes, declarations in the right context) — a claim about the markup, not about how a browser renders it. Tasks whose toolchain is absent on the machine are skipped and listed here, never scored as zero. Fully correct counts only responses where every case for that task passed; cases is the share of individual cases that passed, so a near-miss still scores there. A response with no extractable code block scores zero — that measures instruction-following, not coding.
Suite
longctx-lite
Tasks
6
Cases
30
Repeats
5 per task
Languages
1
Hard — 6 tasks, 30 cases
longctx_16k Recall five facts planted through a 16,000-token haystack. · needleslongctx_64k Recall five facts planted through a 64,000-token haystack. · needleslongctx_128k Recall five facts planted through a 128,000-token haystack. · needleslongctx_256k Recall five facts planted through a 262,144-token haystack. · needleslongctx_300k Recall five facts planted through a 300,000-token haystack. · needleslongctx_512k Recall five facts planted through a 512,000-token haystack. · needlesGraded with
bash GNU bash, version 5.2.21(1)-release (aarch64-unknown-linux-gnu)c gcc (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0cpp g++ (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0csharp 8.0.423go go version go1.26.5 linux/arm64js v18.19.1php PHP 8.5.8 (cli) (built: Jul 7 2026 04:52:05) (NTS gcc 14.2.0)python 3.12.3rust rustc 1.97.1 (8bab26f4f 2026-07-14)sqlite 3.45.1x-client-name: ai-proxy-bench.The price of making the model answerable, excluded from every measurement above: booting the server where one has to be booted (container start plus weight load) plus the discarded warm-up request. Counting only the warm-up understated a vLLM start twenty-fold — the weights are already in memory by the time that request arrives.
40,736 ms