AI Proxy · benchmark

Benchmark — 3 configurations

2026-08-16 10:41 · proxy 0.2.0

GPU NVIDIA GB10 · 122 GB
Configurations 1
Requests 30
Graded suite longctx-lite

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.

Configuration

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

Long context — what the window actually holds

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.

RungPrompt tokensRecalledstart25%50%75%end Prefill tok/sFirst token WaitExcluded
16k15,98775/7515/1515/1515/1515/1515/152,7915.7s11.2s
64k63,98375/7515/1515/1515/1515/1515/152,64424.2s30.2s
128k128,00775/7515/1515/1515/1515/1515/152,33254.9s1:01
256k262,19774/7515/1515/1515/1514/1515/151,8332:232:30
300k300,07675/7515/1515/1515/1515/1515/151,7242:543:03
512k512,14463/6513/1313/1312/1313/1312/131,3036:336:352
600k600,17621/254/55/54/54/54/51,1818:288:30
700k700,18718/254/55/53/53/53/51,06810:5510:57
800k800,24524/255/55/54/55/55/596913:4513:47
900k900,28417/255/55/52/52/53/589516:4616:49
all 517/540106/108108/108100/108101/108102/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.

Why it failed

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.

Reasonnemotron-3.5-lightning-30b-a3b-ctx1m
backend or harness error
the request never produced a gradeable answer
2 (100%)
total failures2

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.

Determinism

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.

TaskWhat it asksModelPassedRate
longctx_512kRecall five facts planted through a 512,000-token haystack.nemotron-3.5-lightning-30b-a3b-ctx1m3/560%

Consistency

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.

Metricminp50p90max
Time to first token ms5,69098,945392,370393,445
Decode rate tokens/sec27.852.380.284.1
Total ms11,133114,816510,684686,881

Correctness by tier

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.

ConfigurationHard
nemotron-3.5-lightning-30b-a3b-ctx1m93%

Per-task correctness

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.

TaskPerfect
longctx_512kRecall five facts planted through a 512,000-token haystack.60%

What the failures actually looked like

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 example

Hardware

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

What was tested

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. · needles
  • longctx_64k Recall five facts planted through a 64,000-token haystack. · needles
  • longctx_128k Recall five facts planted through a 128,000-token haystack. · needles
  • longctx_256k Recall five facts planted through a 262,144-token haystack. · needles
  • longctx_300k Recall five facts planted through a 300,000-token haystack. · needles
  • longctx_512k Recall five facts planted through a 512,000-token haystack. · needles

Graded 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.0
  • cpp g++ (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0
  • csharp 8.0.423
  • go go version go1.26.5 linux/arm64
  • js v18.19.1
  • php PHP 8.5.8 (cli) (built: Jul 7 2026 04:52:05) (NTS gcc 14.2.0)
  • python 3.12.3
  • rust rustc 1.97.1 (8bab26f4f 2026-07-14)
  • sqlite 3.45.1

Cold-start cost

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