Methodology
How the Fronset Benchmark scores LLMs: quality scores, confidence intervals, fan-out, cost — and what the judges can and cannot tell you.
What this site does
Until September 2026 this benchmark was published as llm-bench. The name changed; the methodology below, the rubrics and the snapshot history did not.
Most production LLM tasks have a quality threshold, not a quality maximum. Once a model clears the bar, additional capability is unused — you’re paying for headroom your pipeline doesn’t exercise. This site shows you which models meet your quality step on each stage of your pipeline, and ranks them by cost ascending so you can pick the right-sized model rather than reaching for the best-performing model by default.
Quality Score (the metric)
Every model on every task gets a quality score on a 0–10 scale (the internal judge rubric). On the absolute rail it comes from LLM-judge verdicts aggregated via confidence-interval (CI) gates and normalized per-judge offset so a stricter judge doesn’t sink models it rated. Scores are displayed as “X.X / 10” on individual task pages.
Confidence (how much to trust the score)
A quality score of 8.4 isn’t worth much if it could just as easily be 7.0 or 9.8 — same number, very different meaning. Confidence is our answer to “how sure are we?”, derived from how many of the model’s outputs on this task have been graded and how closely those grades agree with each other.
A polling analogy
Think of each graded output as a survey response. The model’s true quality is what an unlimited number of graded outputs would converge on; what we see is a sample. More responses + tighter agreement = narrower margin of error. On a 0–10 scale:
RANKED— like a major-network political poll the day before an election: thousands of responses, the result holds to within ±2 points on a 100-point scale. We’re as sure as we can practically get. (ci_half ≤ 0.20, i.e. ±0.20 on the 0–10 scale.)HIGH— like a restaurant rated by several hundred guests with pretty consistent reviews. Within ±3% of the truth. Order-of-finish vs similar models is stable. (ci_half ≤ 0.30, ±0.30 on the 0–10 scale.)MEDIUM— like a small book with thirty reviews that mostly agree. Tight enough to publish — and tight enough that the qualification decision (does it clear the bar?) usually doesn’t depend on the uncertainty — but treat fine-grained rankings of two MEDIUM models with a small grain of salt. Within ±5%. (ci_half ≤ 0.50, ±0.50 on the 0–10 scale.)LOW— like a niche restaurant with three reviews ranging from one star to five. Not enough signal yet — hidden everywhere on the site so it can’t mislead. (ci_half > 0.50.)
How it’s computed
Each cell carries a 95% confidence interval (ci_low, point estimate,
ci_high). The discrete level above is set by the half-width of that
interval: ci_half = 1.96 · σ / √n, where n is the number of distinct
graded calls and σ is how far those calls’ scores spread around their
mean. A call graded by several judges counts once, at the average of
their strictness-corrected scores. Fewer than five graded calls is always
LOW. Lower σ and higher n both tighten the band — that’s why more
graded calls with more consistent scores mean higher confidence.
Only MEDIUM-or-better cells appear in the qualifying set, regardless of the quality step. This is the same gate the internal selector uses to admit models to production traffic — the public ranking is the subset of cells the system itself trusts.
Quality steps (the slider)
The slider asks: how good does a model need to be to handle this task
well? That differs by stage and by team: one stage needs the very best
model, another is fine a little below it. The slider has six named stops,
the quality steps. Each step sets the bar at a share of the
best-performing model’s score on the task. A model is good enough at a
step when its score reaches that share, with MEDIUM evidence or better;
the leaderboard lists those models by cost, cheapest first. The
best-performing model stays on every chart as the reference point.
This is the one place the site gives the numbers behind the names:
| Step | A model is good enough when its score is at least | In the API |
|---|---|---|
| Best only | 100% of the best model’s score: only a model level with the best | best_only |
| Near-best | 95% of the best model’s score | near_best |
| Balanced | 90% of the best model’s score | balanced |
| Saver | 85% of the best model’s score | saver |
| Extra saver | 80% of the best model’s score | extra_saver |
| Max saver | 75% of the best model’s score | max_saver |
Max saver is not “the cheapest model”. It still asks for 75% of the
best model’s score; a model below that does not qualify however cheap it
is. The cheapest model regardless of quality is a different rule (the API’s
strategy: "cost"), which applies no step at all.
Relative-to-best instead of absolute, because task difficulty varies wildly. On a hard task where the best model scores 6.5, Balanced asks for 5.85; on a saturated easy task, it might ask for 9.5. Absolute thresholds would leave hard tasks empty and flood easy tasks. A step means “right-sized for this task” everywhere.
The default step is chosen at each snapshot from the savings curve (see
“Default step” below). They are the
same six steps you choose by name in the Fronset API
("selection": {"quality_step": "balanced"}). Links to this site that give a
step as a number (?q=90) keep working; the page rewrites them to the step’s
name (?q=balanced).
Cost (the rank key)
Within the qualifying set, rows sort ascending by observed, all-in cost per task run (displayed per 1,000 runs — single runs are sub-cent). This is not a per-token list price: it is what running the task on that model actually costs on our production workload. Each model’s cost comes from its own measured usage on the task — averaged over its recent production calls — including output verbosity, thinking/reasoning tokens, cache reads and writes, server-tool searches, and the spend on its billed failures (a model that wastes money on rejected outputs pays for its own waste). That usage shape is priced at current list rates, band-selected by the real call size, and scaled by the actual-billed-vs-list overhead we reconcile against provider invoices.
Two consequences worth being explicit about. First, the figure is not
comparable to providers’ advertised $/1M rates — a model with cheap
tokens that thinks at length, or answers verbosely, can cost more per run
than a pricier-per-token model that answers tersely. Measuring per run is
the point. Second, cache-hit rates depend on our prompt architecture and
call cadence, so the number is “cost on a workload like ours” — we publish
each task’s typical call shape alongside for context. Where a model has
too little recent traffic on a task to measure, we fall back to a modelled
estimate at the task’s typical call shape and flag it (cost_basis in the
published data: observed, observed_repriced for a stale-but-real
shape repriced at current rates, or modelled).
Every model row also shows its cost relative to the cheapest qualifier
— the cheapest model that meets the quality step on that task. That cheapest
good-enough model is the reference (marked ★); every other model is shown as
a multiple of it: 16x means it costs 16× the cheapest qualifier for no
quality benefit the step asks for. The cheapest model good enough for the job is
the baseline; everything else is what you’d overpay.
We anchor to the cheapest qualifier — not the best-performing model — for two reasons. It answers the question the site is built around (what does the cheapest good-enough model cost, and how much more does everything else?), and it spreads the multiples across a readable range instead of bunching them near one extreme. The reference moves with the slider: choose a stricter step and fewer — usually pricier — models qualify, so the cheapest-qualifier baseline shifts with it. The best-performing model still appears on every chart (marked best) as the quality reference; it just no longer sets the cost baseline.
Batch vs sync pricing
The cost mode toggle switches the price each model is shown at. Sync only prices every model at standard synchronous rates. Batch if supported uses batch pricing wherever the provider offers it; a model without batch support shows its sync figure in batch mode — running it inside a batch-when-possible pipeline simply costs its sync price, so every model stays in scope and comparable. Both figures are reconciliation-adjusted: the observed usage shape priced at that tier’s list rates, scaled by the actual-billed-vs-list overhead we measure for each provider and model. So the batch-vs-sync gap you see is the discount we actually observe when reconciling provider bills for that model — a per-provider, per-model figure that can sit above or below a provider’s nominal headline batch rate, not a flat list-price discount.
Default step — chosen by the data
The default step isn’t picked by us; it’s computed at each snapshot via knee detection on the savings curve. For each of the six steps, from Max saver to Best only, we compute total pipeline savings at that step; the curve’s elbow — where loosening further yields diminishing returns — becomes the default. Clamped to the range Extra saver to Near-best to avoid the extremes.
When a new best-performing model lands and the curve reshapes, the default reshapes with it. No human-tuned defaults; just the step where the biggest savings live at this snapshot.
Excluded data
- Cells flagged
excluded_from_stats(account suspension, quota exhaustion, infrastructure failures). - LOW-confidence cells (never qualify, never set anchors).
- Cells with fewer graded outputs than the task’s threshold for a settled measurement.
- Deprecated models.
- Meta-evaluation capabilities (judges scoring judges).
Judge panel
The table below lists the current judge panel — the LLMs whose verdicts produce quality scores — by name, provider and role. Only the current panel is shown; retired judges live in the snapshot record but aren’t published.
How a verdict is produced
Grades reach a score by two routes, and they differ in how many judges look at one output:
- A sampled production call. By default every judge on the panel grades the output independently, except a judge whose own model produced it — that judge is left out for that call. The call’s datapoint is the average of the remaining judges’ scores.
- A comparison (fan-out). Mainly while a task is still being measured, and occasionally afterwards to re-check it, one live input is sent to several candidate models, and one judge from the panel grades all of their outputs in a single call. That judge can be grading an output from its own model: on this route the rule above does not apply.
Most of the grades behind the published scores come from comparisons, so most individual verdicts are one judge’s. A published score pools many such verdicts across many calls, from different judges on the panel.
Before verdicts are averaged, each is corrected for its judge’s strictness: for every judge and task we measure how far that judge’s average score sits from the panel’s average on the same task, and subtract the difference. The correction is recomputed daily. It removes a judge’s overall leniency or harshness on a task; it does not tell a strict judge apart from one that happened to grade weaker outputs. A corrected verdict can land outside 0–10. Below 0 it is counted as 0. When a task’s best average comes out above 10, every model on that task is scaled by the same factor (10 divided by that average), so the scores stay on the 0–10 scale and the ratios between them do not change.
Judges are also checked nightly: how often each one agrees with the rest of the panel, how often it returns no usable score, and whether its average is drifting. A judge that crosses the severe thresholds is removed from the panel automatically, unless removing it would leave its provider with no judge — then an operator is alerted to replace it by hand.
What the judges can and cannot tell you
There is no human-label calibration. Every score on this site is an LLM-judge verdict, normalized per judge and confidence-gated; none has been calibrated against human labels, and no human baseline exists behind the numbers. Judges can be older than the models they grade — a known limitation of any LLM-judge panel. Self-preference is not currently corrected for: a judge may favour outputs from its own model family.
What limits it, and what does not:
- On a sampled production call, a judge never grades its own model’s output. A judge from the same vendor can: the rule is per model, not per family.
- On a comparison, the one grading judge can be grading its own model. Those verdicts are counted like any other.
- The strictness correction above adjusts a judge’s overall level on a task. It does not correct a preference for one model over another, so it does not correct self-preference.
- A model from a vendor with no judge on the panel is never graded by a judge of its own family.
What the site does do: every score carries its confidence
interval, and scores with too little evidence — a LOW band, or fewer
graded outputs than the task needs before its numbers settle — are not
published at all (see Excluded data). A narrow interval says the
judges were consistent; it does not say they were right.
Whose calls are graded. The pool that feeds these rankings includes
verdicts produced when customers’ own calls are evaluated on the free and
shared_anon tiers of the API, alongside our own production traffic. What
pools is the verdict — a score about a model — never the prompt, the output,
or the customer’s identity. Pooling can’t be undone
(Terms §8).
On the free plan we also keep the prompts customers send, word for word, and
may re-run them on new models
(Terms §6.5).
Current judge panel
| Judge | Provider | Role |
|---|---|---|
| GPT-6 Sol | OpenAI | primary |
| Claude Sonnet 5.5 | Anthropic | primary |
| DeepSeek V4.1 Flash | DeepSeek | primary |
| Gemini 3.8 Flash | Gemini | primary |