Dynamic LLM Routers are Often Misguided
Organizations: Fastino Labs
Abstract
Dynamic LLM routers promise to cut inference costs by sending each query to the cheapest model that can answer it correctly. We analyze six commercial routers across 14 settings on a diverse benchmark spanning eight task categories, finding that none of them outperforms a router that randomly selects between two well-chosen models at matched cost. Some underperform by more than 10 percentage points. We trace this gap to four patterns prevalent across routers: difficulty blindness, length reversal, semantic matching, and roster suboptimality. We show that the first three are what the standard objective rewards: cost-accuracy Pareto efficiency on realized costs favors escalating moderately hard queries over the hardest ones, shorter queries over longer ones, and routing by a query's source over its difficulty. We also argue that the two assumptions that would justify large rosters, model granularity and model specialization, do not hold empirically. We propose an alternative evaluation methodology that does not reward these patterns, and as a proof of concept, we design a simple two-model router that avoids all four. Nevertheless, its gain over random routing is limited, because a well-chosen roster leaves little to route.
Figures & tables
| Accuracy | Difficulty blindness | Length reversal | Semantic matching | ||
| Router | (pp) | Source AMI | Within-source | ||
| OR auto (med) | |||||
| OR auto (high) | |||||
| OR auto (xhigh) | |||||
| OR auto- (med) | |||||
| OR auto- (high) | |||||
Appendix figures & tables18 assets
Supplementary material from the paper’s appendix.
Appendix
| Samples | ||||
| Category | Source | Description | Train | Eval |
| Coding | HumanEval ( Chen et al., 2021 ) | Python function synthesis with unit tests | ||
| HumanEvalFix ( Muennighoff et al., 2024 ) | Bug-fix coding tasks with unit tests | |||
| MBPP ( Odena et al., 2021 ) | Short Python programming tasks | |||
| BigCodeBench ( Zhuo et al., 2025 ) | Harder practical coding scenarios | |||
| Instruction | IFEval ( Zhou et al., 2023 ) | Instruction-following and formatting constraints | ||
| ID | OOD | |||
| Method | Global | Source | Global | Source |
| Linear probe | ||||
| Difference of means | ||||
| RankNet | ||||
| PCA logistic | ||||
| SharedTrunkNet | ||||
| Models | ||||
| Router | Cost ($/1k q.) | Acc. (%) | Chosen | Roster |
| OR auto (med) | ||||
| OR auto (high) | ||||
| OR auto (xhigh) | ||||
| OR auto- (med) | ||||
| OR auto- (high) | ||||
| vs. random router (pp) | ||||
| Price point | Random acc. (%) | Ours (ID) | Ours (OOD) | Difficulty oracle |
| Gemini 3.7 Flash Claude Opus 5 (high) | ||||
| $10/1k q. | ||||
| $20/1k q. | ||||
| $40/1k q. | ||||
| gpt-oss-20b (low) Claude Opus 5 (high) | ||||
| vs. random router (pp) | ||||
| Router | Cost ($/1k q.) | Acc. (%) | Luna / Sol | Flash / Opus |
| OR auto (med) | ||||
| OR auto (high) | ||||
| OR auto (xhigh) | ||||
| OR auto- (med) | ||||
| OR auto- (high) | ||||
| Difficulty blindness | Length reversal | Semantic matching | ||
| Router | Source AMI | Within-source | ||
| Ours, ID ($10/1k q.) | ||||
| Ours, ID ($20/1k q.) | ||||
| Ours, ID ($40/1k q.) | ||||
| Difficulty oracle ($10/1k q.) | ||||
| Difficulty oracle ($20/1k q.) | ||||
| Model | Effort | AA entry used | AAII | Match |
|---|---|---|---|---|
| Claude Opus 5 (high) | high | Claude Opus 5 (high) | Exact | |
| Grok 4.6 (high) | high | Grok 4.6 (high) | Exact | |
| GPT 5.6 Sol (xhigh) | xhigh | GPT-5.6 Sol (xhigh) | Exact | |
| Claude Opus 4.8 | high | Claude Opus 4.8 (max) | Only published effort | |
| Gemini 3.7 Flash | none | Gemini 3.7 Flash (high) | Default effort | |
| GLM-5.2 | none (behaves like high) | GLM-5.2 (max) | Only published effort |
| Model ID | Queries | AA entry used | AAII | Match |
|---|---|---|---|---|
| claude-fable-5 | Claude Fable 5 | Default effort | ||
| glm-5.3 | GLM-5.3 (max) | Default effort | ||
| kimi-k3 | Kimi K3 (max) | Default effort | ||
| qwen3.8-max | Qwen3.8 Max | Exact | ||
| gpt-5.6-sol-high | GPT-5.6 Sol (high) | Exact | ||
| muse-spark-1.2 | Muse Spark 1.2 (xhigh) | Default effort |