Skip to content
OpenSmartRoute
Documentation
Python SDK

Published runs - opensmartroute 1.1.0

The published run on MT-Bench human, PPE human and WebDev Arena against the declarative router and every baseline.

Python SDK 5 min read

Produced with the recipe in Benchmarks and leaderboard recipe on 2026-09-10, osr 1.1.0, seed 0, --limit 1000 per suite (the 0.5.0 run of 2026-09-06 is quoted in the comparison column below). One JSON per suite: <suite>.json is the learned router (--slm slm.json --baselines --calibration --robustness), <suite>.declarative.json is the same catalogue without the SLM (--baselines only). The per-row arrays calibration.conformal_pairs and calibration.temperature_samples were removed from the committed files; every aggregate they feed (reliability, held_out) is kept.

Data

RoleCache nameHugging Face datasetRows after --tier relabelling
trainarena-55k-tierslmarena-ai/arena-human-preference-55k2 084
trainroutellm-battles-tiersroutellm/gpt4_judge_battles4 000
held outmt-bench-human-tierslmsys/mt_bench_human_judgments (human)2 228
held outppe-human-tierslmarena-ai/PPE-Human-Preference-V1 (test)2 360
held outwebdev-arena-tierslmarena-ai/webdev-arena-preference-10k (test)1 070

Catalogue: ../targets.yaml (llm-small / llm-mid / llm-frontier). SLM bundle: osr -t examples/leaderboard/targets.yaml slm train --out slm.json --cache-dir data --source arena-55k-tiers --source routellm-battles-tiers --report --seed 0 -> 6 051 rows, 10 % holdout (605 rows) accuracy 0.724, ECE 0.051, Brier 0.196; the constant-predictor baseline on the same holdout is 0.727, so the SLM's measured skill on pairwise tier labels is 0 - the report says so rather than hiding it. sha256 d1a101088b179811c72bef873ebace926ef855f52b03573bfe983d2470469fde (4.0 MB, not committed; the command is deterministic for the same cache). The 0.5.0 bundle was 8faf8466...cbbb1e (5 956 rows, 0.721).

Results

Suite (n=1000)Router (learned)0.5.0DeclarativeStatic task tableRandomCheapestBest priorParaphraseRepeat flipsECE rawECE held-out temp.ECE held-out isotonic
MT-Bench human0.5140.5230.4210.5410.4410.3720.3431.0000.0000.1980.0850.050
PPE human0.5630.5520.4180.6510.4450.1740.6510.8940.0000.2440.1690.116
WebDev Arena0.5730.5730.1920.6700.3910.0000.6700.8120.0000.1600.0580.071

Cost and latency per 1k tokens for the learned router: MT-Bench $0.00370 / 978 ms, PPE $0.00460 / 1096 ms, WebDev $0.00331 / 933 ms (static task table: $0.003 / 900 ms on MT-Bench, $0.015 / 2500 ms on PPE and WebDev, since it degenerates to "always the best single tier").

Reading: the learned router beats the declarative router by +9 to +38 pp and random / cheapest everywhere, at a fifth to a third of the cost of "always frontier" on PPE and WebDev. Against 0.5.0 the accuracies moved by -0.9 / +1.1 / 0.0 pp - noise - while raw ECE fell from 0.28-0.33 to 0.16-0.24: the 1.1.0 SLM trains with a validation split, early stopping and a calibrator fitted on the validation rows (G-1 in the gap plan), so the shipped confidence is closer to honest before any post-hoc fitting. It still does not beat the best single tier on any suite (-3 to -10 pp): a pairwise battle between two named models is a weak label for a three-tier decision, and the label-noise floor cannot be measured on these rows (one sample per prompt). A calibrator fitted on the even rows and scored on the odd rows brings held-out ECE to 0.05-0.12 (isotonic). These are the numbers a RouterArena / LLMRouterBench / xRouteBench entry should quote; the gated multi-sample suites (step 5 of the recipe) are what would let the router be scored against the noise floor.

RouterBench (0-shot) - 11 real models, real task labels

routerbench.json, produced by ../routerbench.py on 2026-09-10 with osr 1.1.0: withmartian/routerbench routerbench_0shot.pkl (36,497 prompts from ~85 named evaluations, 11 models with per-response correctness and cost), split 50 / 50 by a hash of sample_id. The catalogue (quality prior = mean correctness, cost = mean $ per response) and the SLM are built from the train half only (18,258 rows; the SLM's 10 % report holdout: accuracy 0.785 against a constant-predictor baseline of 0.804); everything below is scored on the test half (18,239 rows). The static task table is fitted on the train half; its in-sample variant (fitted on the rows it is scored on, which is what osr eval --baselines did by default when this run was made - it now splits by --seed and fits on the train half) is shown for reference.

Policy (test half, n=18,239)AccuracyRealised quality$ per 1k calls
Oracle (per-prompt best model)1.0000.9120.22
Static task table, fitted on train0.8300.7802.98
Static task table, in-sample0.8350.7842.98
Always gpt-4-1106-preview (= best prior = most expensive)0.8190.7803.31
Learned router, cost weight 00.8100.7863.25
Learned router, cost weight 0.10.805-2.08
Learned router, default objective (cost weight 0.15)0.7160.6820.34
Learned router, cost weight 0.30.603-0.14
Random0.5520.5210.84
Cheapest (mistral-7b)0.3170.3100.05
Declarative catalogue, no SLM0.3130.3150.05

Reading, in order of what matters:

  • The router does not beat the static task table on RouterBench. With real task labels the table is a strong, cheap-to-fit competitor: 0.830 on the train-fitted variant. The router reaches 0.810 when told that quality is all that matters (cost weight 0), with a higher realised quality than the table (0.786 vs 0.780 - it picks a better-than-gpt-4 model on some prompts) but 9 % higher spend. Per task it loses to the table on 78 of 85 evaluations at the default objective. The v0.4 criterion stays not met, now measured on the suite it was written for.
  • What the router buys is the cost axis. At the default objective it spends 9x less than the table ($0.34 vs $2.98 per 1k calls) for -11 pp; at cost weight 0.1 it spends 30 % less for -2.5 pp. Between weights 0.1 and 0.3 the frontier drops off a cliff (0.805 -> 0.603): on this catalogue the cheap models are much worse, so "a little cheaper" is not available - the operator has to choose the side of the cliff.
  • The label-noise floor cannot be measured here either. RouterBench 0-shot carries one score per (prompt, model); noise_floor() needs repeated samples and reports 0 by construction. The recipe's earlier claim that these rows carry several samples was wrong and has been removed.
  • Calibration. Raw confidence with 11 candidates is badly under-confident (mean 0.17-0.26 at 0.72-0.81 accuracy, ECE 0.55); an isotonic calibrator fitted on the even rows brings the odd rows to ECE 0.010 (temperature scaling alone: 0.28). Ship a fitted calibrator with any catalogue this wide.
  • The SLM's own skill is again nil against the constant predictor on its holdout (0.785 vs 0.804): the learned gain over the declarative catalogue (0.313 -> 0.716 / 0.810) comes from the priors, the cost term and the bandit / similarity ensemble, not from the SLM as a stand-alone classifier.

To reproduce: hf download withmartian/routerbench --repo-type dataset --local-dir <dir> (the dataset is no longer gated), then python examples/leaderboard/routerbench.py --pkl <dir>/routerbench_0shot.pkl --work <scratch> (needs pandas to read the pickle; about 15 minutes, no network after the download).

Listings

Where this run has been submitted. A submission links the exact commit, the SLM SHA-256 above and this page.

LeaderboardEntryStatusNotes
RouterArena-not submittedsubmission = a PR to the RouterArena repository with runs/*.json
LLMRouterBench-not submittedneeds the gated multi-sample suites (step 5) for the noise-floor comparison
xRouteBench-not submittedcomponent ablation report from osr eval --ablation

Something wrong or out of date on this page? Tell us - the page is named for you, so a one-line note is enough.