Repository navigation
Add iq-routing submission - #209
George-Avila wants to merge 5 commits into
Conversation
Judge-based complexity routing over a fixed 5-model pool (gemini-3-flash-preview, gemini-3.8-flash, gpt-5-nano, gpt-5.6-luna, gpt-5.6-terra). 8400 rows + 420 routing-only robustness rows. Adds 3 required model rows to universal_model_names.py and model_cost.json at public list prices.
|
/evaluate |
Router Evaluation ResultsRouter: RouterArena Metrics
Evaluation completed by RouterArena automated workflow |
Re-served the 15 rows the evaluation flagged as having no valid generation (4 HTTP 503, 1 read timeout, 9 cap-truncated generations, 1 output-blocked 400) through the same routing policy; 13 now carry valid generations (one via the gpt-5.6-luna fallback rung), 2 remain cap-truncated and stay failed. The two GeoBench image rows remain honest failed rows. All other rows byte-identical.
|
/evaluate |
Router Evaluation ResultsRouter: RouterArena Metrics
Evaluation completed by RouterArena automated workflow |
…e v2 The routing rule's multiple-choice detector required the literal header "Options:" before reading the lettered option block; the robustness split renames that header on 253 of 420 prompts while keeping the options, which flipped 248 rows. Version 2 of the feature drops the header requirement. It selects exactly the same rows on all 8,400 original prompts (the 8,400-row prediction file is unchanged), and the 420-row routing file is recomputed from the recorded judge decisions with no new model calls.
|
/evaluate |
Router Evaluation ResultsRouter: RouterArena Metrics
Evaluation completed by RouterArena automated workflow |
|
The current automated result excludes the routing-decision call to |
|
Thanks, @George-Avila, and sorry for the slow answer. There isn't a field for this yet, and we're adding one. Routers that call an LLM to make the routing decision will record that call's model and its reasoning and response tokens in the prediction file, and a tool will compute its cost from the price table. Once that's in, please add your gpt-4o-mini routing calls in that format; a short note is fine for the two failed attempts without usage. We'll re-price all routers together once the rebuilt price table is in place, and we'll post here when the format is ready. |
…rra alias Each of the 8,400 prediction rows now carries router_usage with the routing call its decision made, copied from the run's per-query routing logs (model, input_tokens, output_tokens; the routing model reported 0 reasoning tokens). 8,397 rows have one call. Three rows have none: GeoBench_841 and GeoBench_1080 made no routing call, and LiveCodeBench_375's only routing attempt timed out with no usage returned. PubMedQA_311's first attempt was cancelled with no usage returned; its completed re-route is recorded. Answers, generated results and every other field are byte-identical. Adds the bare gpt-5.6-terra spelling as an alias of openai/gpt-5.6-terra and to universal_model_names.py; model_cost.json regenerated.
|
Thanks @yl231. Yes, I still have the per-query routing logs, with query IDs and per-call token counts for all 8,400 rows. I've updated the PR to the new format:
One mismatch to flag: Requesting another evaluation below. |
|
/evaluate |
Router Evaluation ResultsRouter: RouterArena Metrics
Evaluation completed by RouterArena automated workflow |
Add IQ Routing submission
Router
IQ Routing (https://iq-routing.com) is a closed-source, general-purpose production
gateway. It is not a research prototype built for this benchmark — its main workloads are coding
turns and cache protection, not QA benchmarks. The answers in this submission were generated by
IQ's routing pipeline, executed in an offline experiment harness against IQ's own provider
accounts. The gateway build carrying this
configuration is being deployed separately.
For this benchmark, each prompt was answered by exactly one of the five pool models, chosen by
IQ's routing. One routing decision and one generation per query — no cascade, no answer-side
ensembling, and no re-routing on a wrong answer.
The one exception is a provider-side content block: on 4 of the 8,400 rows (four NarrativeQA
queries) the selected model returned HTTP 400 for prohibited content before generating anything, and
IQ's fallback rung (the same rung the production gateway uses) served
gpt-5.6-lunainstead. Theblocked attempt produced no tokens and no cost; those rows are billed only at the model that actually
answered, which every row reports in
model_used.After the first
/evaluaterun flagged 17 rows with no valid generation, the 15 that had failedtransiently were re-run once through the same routing policy and the prediction file was updated in place (commit
b9ce3f0); 13 nowcarry valid generations and 2 still have no valid generation. The two GeoBench image rows stay failed.
Robustness file recomputed (2026-09-22).
iq-routing-robustness.jsonwas regenerated after correcting adefect in how one of our routing features read reworded prompts. The 8,400 predictions in
iq-routing.jsonare unchanged: the corrected feature makes the same decisions on all 8,400 originalprompts, so the served model, accuracy and cost on every full-split row are untouched. Only the
robustness split moves, recomputed offline from the robustness pass's already-recorded routing decisions
with no new generations (commit
dab1fe6). The same feature version was deployed in the productiongateway on 2026-09-22.
All five pool models were served internally, against IQ's own provider accounts (BYOK), by that
same pipeline. Costs on this leaderboard are therefore computed by RouterArena from reported token
counts at public list prices, not from anything IQ was billed.
gemini-3-flash-previewgemini-3.8-flashgpt-5-nanogpt-5.6-lunagpt-5.6-terraFiles
router_inference/predictions/iq-routing.jsongenerated_resultandrouter_usagerouter_inference/predictions/iq-routing-robustness.jsongenerated_result(unchanged)router_inference/config/iq-routing.jsonmodel_cost/model_profiles.yamlgpt-5.6-terraonopenai/gpt-5.6-terramodel_cost/model_cost.jsonpython scripts/pricing/build_model_cost.pyuniversal_model_names.pygpt-5.6-terraThe branch is merged with current
main(44cc1ff), and the pricing comes frommain's table.gemini-3-flash-preview,gemini-3.8-flash,gpt-5-nano,gpt-5.6-lunaandgpt-4o-minialreadyhad profiles there. The only missing spelling was the bare
gpt-5.6-terra, which is now an alias ofopenai/gpt-5.6-terra($2.00/$12.00 per 1M). The earlier price rows this PR added are gone.Routing calls (
router_usage)IQ makes one LLM call per query to decide the route. Every row now records that call in
router_usageas{"model": "openai/gpt-4o-mini", "input_tokens", "output_tokens", "purpose": "routing"}.The values come from the run's per-query routing logs, matched to rows by
global index.output_tokensis the provider'scompletion_tokens, which includes any reasoning. The routing modelreported 0 reasoning tokens on every call. Nothing else in the file changed: with
router_usageremoved, the prediction file is byte-identical to the previously evaluated commit
dab1fe6.router_usage: []:GeoBench_841andGeoBench_1080made no routing call. The gateway returned theno-image notice before routing.
LiveCodeBench_375: the only routing attempt timed out (see below), so the row took the default route.Two routing attempts failed with no usage returned. We don't have their token counts, so we
recorded no count for them. We did not enter zero:
LiveCodeBench_375TimeoutErrorrouter_usageis[]PubMedQA_311CancelledError(run interrupted, then resumed)router_usageCost on current
mainscripts/pricing/compute_cost.py iq-routingon this branch:The $8.35 I posted earlier ($5.650297 answers + $2.698778 routing) was a historical figure. It used
the earlier
gemini-3.8-flashprice of $0.75/$3.75.mainnow prices that model at $0.825/$4.125.Evaluator mismatch: please check.
compute_cost.pybills every row. The official score(
llm_evaluation/run.py) skips rows that have no valid generation, so it bills neither their answer nor their routercalls. Four rows have no valid generation here. The two GeoBench rows have no cost either way. The two
cap-truncated QANTA rows (
QANTA_Fine Arts_1531,QANTA_Literature_620) each made one real routingcall, and that call stays in
router_usage. The two methods give these totals:compute_cost.py(all rows)The $0.017803 gap is $0.000606 of routing and $0.017197 of answer tokens on those two QANTA rows.
We left the usage as recorded. Whether to charge failed rows is your call.
Two GeoBench queries (
GeoBench_841,GeoBench_1080) reference an image that the text-onlydataset does not carry. The production gateway answers those with a "no image attached" notice
rather than guessing. They are submitted honestly as failed rows:
success: false,empty
generated_answer,error: "no_image_attached", zero tokens. They score 0 and contributeno cost. We did not substitute a guessed answer.
Evaluation Integrity
learned router, no classifier fitted to RouterArena labels, and no weights of any kind derived
from this dataset. The label files were used for scoring only.
turns and cache protection, not QA benchmarks. The outputs submitted here come from a fixed
routing configuration of that gateway, served internally through IQ's own provider accounts.
recomputes cost from the reported token counts at public list prices.
Reproducibility
Every row carries the provider-reported
model_used,provider, and token counts from theoriginal generation.
token_usagereportsinput_tokens,output_tokens, andtotal_tokens;total == input + outputon every row, so RouterArena's reasoning-token residual is zero byconstruction. Routing calls are recorded separately in
router_usage, as described above.Prompts are byte-identical to
dataset/router_data.json. The routing-only robustness file wasproduced by the same routing, over the 420 prompts of
dataset/router_robustness.json.