Terminal-Bench 4.0 · provider routing · 2026-09-01

Pinned Beats Auto

Letting OpenRouter choose a host for GLM 5.3 Flash made an agent stall almost twice as often as pinning one host, and cost 76% more per prompt token. Five hosts, 1,801 model calls, all arms run at the same time.

Model z-ai/glm-5.3-flash Harness Harbor · terminus-2 Tasks 5 × 2 attempts × 100 turns Calls 1,801 Window 23:36–06:20 UTC

Pinning DeepInfra cut the stall rate from 41.5% to 24.0%.

That gap is z = −5.18, p < 0.0001, and it survives Holm correction for the four arms tested against the router. It is not a close call and it is not one lucky arm out of five.

Stall rate
41.5% → 24.0%
auto vs pinned DeepInfra
Cost / 1M prompt tok
$0.067 → $0.038
auto pays 1.76×
Work completed
3.3×
prompt tokens processed
Hosts auto used
7
across 299 calls

What was measured

A stall is a call that never finished.

Each arm ran the same five Terminal-Bench 4.0 tasks with the same agent, differing only in which serving host answered the model calls. Four arms pinned a single host through a local proxy; the fifth left OpenRouter to route freely. Every call was recorded at the proxy: which host actually answered, tokens in and out, the cached-token split, billed cost, latency, status.

A stall is a call that returned HTTP 200, streamed keep-alive padding for over 300 seconds, and never delivered a completion. The agent sits idle behind one of these. We saw a single call stall for 1,044 seconds before we capped them, on a host that had answered the previous four calls in 9 to 24 seconds.

Stall rate by arm

Bars show the rate; whiskers are 95% Wilson intervals. Hover for detail.

0%10% 20%30% 40%50% 60% DeepInfra (pinned): 118 of 492 calls stalled. 95% CI 20.4–27.9%. deepinfra 24.0% p < 0.0001 Parasail (pinned): 129 of 324 calls stalled. 95% CI 34.6–45.2%. parasail 39.8% OpenRouter auto (baseline): 124 of 299 calls stalled. 95% CI 36.0–47.1%. auto 41.5% baseline Z.AI (pinned): 158 of 376 calls stalled. 95% CI 37.1–47.1%. z-ai 42.0% Novita (pinned): 161 of 310 calls stalled. 95% CI 46.4–57.4%. novita 51.9% p = 0.010
Green is significantly better than the router, red significantly worse, grey indistinguishable from it: all after Holm correction over four tests. Two arms separate from auto; two do not. Picking a host at random is not the win: picking the right host is.

Cost per million prompt tokens

Billed by OpenRouter, summed over calls that reported usage.

$0$0.04 $0.08$0.12$0.16 DeepInfra: $0.038 per 1M prompt tokens over 16.15M tokens. deepinfra $0.038 Z.AI: $0.038 per 1M prompt tokens over 10.25M tokens. z-ai $0.038 Novita: $0.044 per 1M prompt tokens over 5.37M tokens. novita $0.044 OpenRouter auto: $0.067 per 1M prompt tokens over 4.93M tokens. auto $0.067 1.76× DeepInfra Parasail: $0.126 per 1M prompt tokens over 3.95M tokens. parasail $0.126
Every figure here is a lower bound. Between 30% and 56% of each arm's calls were abandoned before the response carrying usage arrived: those tokens were billed and we cannot see them. The arms that stall most are understated most, which pushes against the finding rather than for it.

Where the router actually sent traffic

299 auto calls; 150 named a host before finishing.

calls answered Z.AI answered 66 auto-routed calls. Z.AI 66 Parasail answered 46 auto-routed calls: the most expensive host in the set. Parasail 46 priciest host DeepInfra answered only 26 auto-routed calls: the cheapest and most reliable host. DeepInfra 26 cheapest + most reliable Novita answered 7 auto-routed calls. Novita 7 Relace answered 2 auto-routed calls. Relace 2 Together answered 2 auto-routed calls. Together 2 Morph answered 1 auto-routed call. Morph 1
The router spread one workload across seven hosts and sent the fewest calls to the one that turned out cheapest and most reliable. Every pinned arm stayed on its host: of the 814 pinned calls that returned a provider echo, none was served by the wrong host. The 688 that hung returned no echo.

Every number

ArmCallsStall %95% CIAbandoned $/1M ptokCache %p50 sp90 sHosts
deepinfra49224.020.4–27.9147 0.03869.4181311
parasail32439.834.6–45.2171 0.12671.8202071
auto29941.536.0–47.1149 0.06763.8311737
z-ai37642.037.1–47.1186 0.03888.8792321
novita31051.946.4–57.4174 0.04485.0642491
Stall rate vs auto, Holm-corrected over four tests: deepinfra z −5.18 · p < 0.0001 novita z +2.59 · p = 0.010 parasail p = 0.674 z-ai p = 0.886

Trial level

Ten trials per arm. Errored means the trial died before a verdict.

ArmTrialsResolvedErrored Input tokCached tokOutput tok
deepinfra1012 17,022,67411,653,760459,375
parasail1018 5,040,2503,561,984828,842
auto1007 5,329,6603,319,808530,215
z-ai908 6,881,7285,936,256525,060
novita909 749,119514,496188,919
DeepInfra pushed 3.3× the prompt tokens auto did in the same wall-clock window, and lost 2 trials to errors where auto lost 7. Fewer stalls means more turns actually complete.

What this does not show

Method

Five Google Cloud VMs, one per arm, all started within the same minute in us-central1-a, each running the benchmark through Harbor against terminal-bench/terminal-bench@4.0.0. Model calls were routed through a local pinning proxy that injects the host selection and records every call. Arms differ in one variable: the provider token.

compound-bench harbor \
  --providers openrouter/deepinfra/fp8 \
  --model z-ai/glm-5.3-flash \
  --tasks html-js-filter,photonic-waveguide-routing,music-harmony,\
bun-sourcemap-leak,foodstuff-beta-activity \
  --attempts 2 --n-concurrent 5 --ak max_turns=100 \
  --ledger-dir artifacts/ledger --go

Stall rates are compared with a two-proportion z-test over calls, corrected across the four arm-vs-router tests with Holm–Bonferroni. Intervals are Wilson score intervals, which behave properly at rates far from 50% with a few hundred observations.