Median elapsed time between sending the request and receiving the first output token over the streaming connection, including any cross-region penalty for the selected user region.
TTFT = t(first_output_token) − t(request_sent)How InferenceBench measures, normalizes and ranks AI inference infrastructure.
InferenceBench measures how the same model behaves on different inference infrastructure. The unit of observation is the execution path — Model × Provider × Region × Deployment configuration — because that is what an engineering team actually ships against. Provider rankings are an explicit aggregation over those paths, never the raw unit.
A benchmark is only as credible as its measurement process. This page specifies what is measured, how it is executed, how results are normalized and aggregated, what is excluded, and where the limits are.
Every number on InferenceBench belongs to exactly one of three classes. The class is part of the metric's definition and is shown in the metrics registry below.
ModelProviderCombination = {
modelId, providerId,
regionId?, endpointId?, deploymentConfig?
}Benchmarks run as raw HTTPS requests from dedicated runner locations — no provider SDKs, so client-library overhead cannot differ between providers. The first runner operates from Falkenstein (DE); additional client regions are planned and every observation records its client region.
| Dimension | Specification |
|---|---|
| HTTP client | Raw HTTPS/2, no provider SDKs |
| Streaming | Enabled; token timestamps captured on arrival |
| Connection | TLS session and connection reuse within a run batch; DNS resolved and pinned per batch |
| Timeout | 60 s hard; recorded as a reliability failure, not discarded |
| Retries | Disabled — a failed request is a data point |
| Warm-up | One untimed warm-up request per endpoint per batch; cold-start behaviour is tracked separately (see Limitations) |
| Concurrency | Low-concurrency interactive profile; stress testing is out of scope for the public ranking |
| Timestamps | Monotonic clock, sub-millisecond precision, taken in the runner process |
| Rate limits | Runs are paced under published provider limits; throttled responses count against reliability only when within stated limits |
Workloads are versioned entities, not ad-hoc prompt sets. Each defines its prompt corpus size, input-length range, target output length, sampling parameters and the capabilities it exercises. Scores always name the workload profile they were computed under.
| Workload | Cases | Input tokens | Output budget | Temp. | Capabilities |
|---|---|---|---|---|---|
| General generation v0.1 | 12 | ≤400 | 90–420 | 0 | general |
| Tool calling v0.1 | 7 | ≤600 | 160 + tool calls | 0 | tool_calling |
| Structured output v0.2 | 6 | ≤400 | schema-bound, 200 | 0 | structured_output |
| Realtime v0.1 | 6 | ≤200 | 20–40 | 0 | general (latency-weighted) |
Corpus sizes are deliberately small and versioned. Statistical weight comes from repetition — every case runs on every sweep, so a path accumulates roughly 215 samples per 7-day window at daily cadence, which crosses the high-confidence threshold below. Suites are hash-locked: changing any case without a version bump makes the loader refuse to run. Corpus growth is a funded-capacity decision and arrives as new suite versions, never as silent edits.
TTFT = t(first_output_token) − t(request_sent)TTFT includes DNS/TLS (amortized by connection reuse), provider queueing, prompt processing and the first token's generation. It excludes benchmark-client processing. The table shows p50 as the primary metric; p95 is reported alongside because tail latency determines how a provider feels under production load. Percentiles are computed over the rolling sampling window per path, never pooled across models.
| Statistic | Role |
|---|---|
| p50 TTFT | Primary table metric |
| p95 TTFT | Tail metric, shown as P95 |
E2E = TTFT + (400 / throughput) × 1000 [ms]End-to-end latency is only comparable when output length is controlled, so InferenceBench normalizes it to a 400-output-token response using each path's observed sustained throughput. It is a derived metric and is labelled as such.
throughput = output_tokens / (t(last_token) − t(first_token))Measured between the first and last output token — TTFT is explicitly excluded, so the metric captures generation speed rather than queueing. Unit: tokens per second.
reliability = valid_completed_requests / eligible_requests| Counts against the provider | Excluded from the denominator |
|---|---|
| HTTP 5xx responses | Benchmark client crash |
| Timeouts (60 s) | Runner scheduler error |
| Malformed or truncated streams | Known benchmark platform outage |
| Empty responses | Invalid benchmark configuration |
| Invalid API responses / internal provider errors | — |
Retries are disabled in the runner, so reliability reflects first-attempt behaviour — what an application without aggressive retry logic would experience.
Structured output is not reduced to 'the JSON parses'. Each run is validated in four stages; a run only passes if every applicable stage passes.
Tool-calling runs present a tool inventory and a task. A run passes only when all of the following hold:
Input and output prices are tracked separately, in USD per million tokens, from official provider documentation for the public serverless tier. Cost efficiency inside the score uses the effective cost of the workload actually benchmarked:
effectiveCost = (input_tokens / 1e6) × price_in + (output_tokens / 1e6) × price_outDedicated, batch and cached-input pricing are recorded when published but do not enter the public serverless ranking.
The overall score is a weighted sum of normalized metric values under the active workload profile, adjusted by deployment fit and measurement confidence. The weights below are read from the exact configuration the engine executes — the General profile is the homepage default; each workload has its own published profile.
score = Σ ( weight_i × normalize(metric_i) ) × fit × confidenceNormalization is min–max within the filtered candidate set with a floor of 55, so the weakest candidate in scope reads 'weak', not 'zero', and the score stays contextual to the query. An optimization tilt shifts 12 points of weight toward the user's selected priority. Deployment fit applies a 1.5% penalty when execution leaves the user's region; confidence applies the factors in the Sampling section.
A provider ranking must not reward cherry-picking (three excellent models) or punish coverage (seventy-five mixed models). Provider rows aggregate the provider's included paths as follows — these constants are the ones the engine runs:
Every path carries a run count and a confidence level over the rolling window. Confidence shades the score multiplicatively and gates winner eligibility.
| Level | Score factor | Effect |
|---|---|---|
| High | ×1.000 | Fully eligible, including #1 badges |
| Medium | ×0.988 | Ranked; shown with medium confidence |
| Low | ×0.968 | Visible but flagged; not eligible for #1 badges |
Confidence levels map to eligible results in the rolling window: high at 200 or more, medium at 50 or more, low below 50. Run counts are shown in score breakdowns and tooltips. Measured paths report real counts; fixture rows remain labelled DEV DATA until measured.
Bad results are never silently deleted. Provider-attributable failures stay in reliability. Latency samples are winsorized at the 99th percentile within each path's window before percentile computation — extreme values are capped, not removed — and every exclusion under the client-fault rules of the Reliability section is logged with a reason.
'Europe' is not one property. InferenceBench tracks six distinct geographic dimensions per path and never collapses them:
Benchmarks are scheduled adaptively rather than on a flat cycle. Priority rises with observation age, metric volatility, path popularity, confidence deficit and detected provider changes (price edits, new endpoints, version bumps). Exact scheduler parameters are withheld to reduce gaming; the principles are public.
priority ≈ freshness_deficit + volatility + popularity + change_signals + confidence_deficitEvery surface shows freshness: global ('Updated 12m ago'), provider ('last benchmark 8m ago') and path level ('126 runs · last run 4m ago'). Data ages through fresh → aging → stale states.
The following principles are structural, not aspirational — the pipeline has no code path that lets any of them be violated:
Honest limits of the current design — none of these are hidden from readers of the numbers:
The methodology is specified so that a third party could reimplement it: raw HTTPS, streaming timestamps, the formulas above, published workload parameters and the scoring configuration. A public runner CLI is planned but not yet available — no claim of current public tooling is made.
# planned public runner (not yet available)
inferencebench run --model deepseek-v3 --provider nebius --suite generalEvery observation and score records its methodology version. Historical rankings remain reconstructable under the methodology that produced them; a methodology change never silently rewrites the past. Research articles pin both a methodology version and a dataset snapshot.
InferenceBench is funded through commercial partnerships that do not influence benchmark results. Partners support the engineering, infrastructure and research behind the benchmark; they cannot purchase ranking position, influence methodology, change scores, suppress results or control editorial conclusions.
InferenceBench is operated by SnowStorm Solutions S.L. and may be funded through commercial partnerships and related services.
One definition per metric. The benchmark table tooltips and detail pages read from this registry — no surface redefines a metric locally.
Median elapsed time between sending the request and receiving the first output token over the streaming connection, including any cross-region penalty for the selected user region.
TTFT = t(first_output_token) − t(request_sent)95th percentile of TTFT across the sampling window. Reveals tail latency that a median hides; a provider with a low p50 but high p95 will stall a meaningful share of production requests.
P95 = percentile(TTFT_samples, 0.95)Total time for a normalized 400-output-token response: TTFT plus generation time at the observed sustained throughput. Only comparable across providers because the output length is normalized.
E2E = TTFT + (400 / throughput) × 1000Sustained output tokens per second between the first and last token of the stream. TTFT is excluded — the metric measures generation speed, not queueing.
throughput = output_tokens / (t(last_token) − t(first_token))Share of eligible requests that complete with a valid, well-formed response, with client retries disabled. Provider-attributable failures (5xx, timeouts, malformed or truncated streams, empty responses) count against it; benchmark-client faults are excluded from the denominator.
reliability = valid_completed_requests / eligible_requestsShare of tool-calling runs where the correct tool is selected with a schema-valid argument object, all required arguments present, no hallucinated arguments, and a correct no-tool decision when no tool applies.
Share of structured-output runs that produce valid JSON, comply with the requested schema, and satisfy the stated constraints. JSON that parses but violates the schema counts as a failure.
Provider-published price per million input tokens for the public serverless tier, as listed in official documentation at observation time.
Provider-published price per million output tokens for the public serverless tier. Cost efficiency in the score uses the effective workload cost formula, combining input and output prices.
effectiveCost = (input_tokens / 1e6) × price_in + (output_tokens / 1e6) × price_outWeighted sum of normalized metric values under the active workload profile, adjusted for deployment fit and measurement confidence. Contextual: it is computed within the filtered candidate set, so it answers 'best for this query', not 'best in the abstract'.
score = Σ(weight_i × normalized_i) × fit × confidenceDifference between the current score and the score 30 days ago under the same methodology version. Direction and magnitude are both shown.
Read directly from the scoring configuration the engine executes. The General profile is the homepage default; every workload page shows its own profile.
| Workload profile | Weights |
|---|---|
| General (default) | Quality 25% · Reliability 25% · Latency 20% · Structured output 15% · Cost 15% |
| Agents | Tool reliability 30% · Structured output 25% · Multi-step success 20% · Production reliability 15% · Latency 10% |
| Coding | Tool reliability 30% · Structured output 20% · Context handling 20% · Latency 15% · Cost 15% |
| Realtime | TTFT 30% · p95 latency 25% · Stream stability 20% · Availability 15% · Cost 10% |
| Voice | TTFT 35% · Stream stability 25% · p95 latency 20% · Availability 20% |
| RAG | Structured output 25% · Quality 25% · Caching 20% · Cost 15% · Latency 15% |
| Structured output | Schema adherence 40% · JSON validity 20% · Reliability 15% · Latency 15% · Cost 10% |
| Batch | Cost 30% · Throughput 30% · Reliability 25% · Batch support 15% |
| Long context | Context handling 30% · Caching 25% · Input cost 25% · Throughput 20% |
The deterministic pipeline that consumes these weights — normalization floor, optimization tilt, deployment fit and confidence shading — is specified in Scoring and Provider aggregation.
| Version | Date | Changes |
|---|---|---|
| 0.10-dev | Aug 17, 2026 | Measurement engine live: monotonic-clock runner, hash-locked suites (corpus sizes now published as measured, with repetition-based sampling), scoring pipeline with winsorized percentiles, change detector, dataset snapshots. Confidence thresholds published (high ≥200, medium ≥50 eligible results per window). First measured paths render real numbers; unmeasured rows stay labelled. |
| 0.9-dev | Aug 15, 2026 | Added P95 TTFT, E2E latency and split input/output pricing to the public table; provider aggregation formalized (coverage + freshness factors, medians); geography taxonomy expanded to six dimensions; metrics registry published. |
| 0.8-dev | Aug 15, 2026 | Provider ranking mode introduced as an aggregation layer; awards separated from provider properties; confidence gating for #1 badges. |
| 0.7-dev | Aug 14, 2026 | Deterministic decision engine: hard filters with published exclusion reasons, min–max normalization with floor 55, optimization tilt, deployment fit, confidence shading. |
| 0.5-dev | Aug 12, 2026 | Initial workload profiles (General, Agents, Structured, Realtime) and metric set; registry-driven catalogue (providers, models, endpoints) went live. |