Disclosure: I maintain 's router, most of the design ended up being about when not to save money. The parts that matter:
Weight the tools, not just their count. A request where Grep and Read are in play is research — paraphrase-tolerant, failure-tolerant, ideal for a local model. A request where Bash, Write, or Edit will fire is a mutation with exact-match requirements. Lynkr assigns each tool a risk weight (Bash 0.9, Write 0.8, Edit 0.7 … Grep 0.2) and scores the request's effective toolset. Two requests with five tools each can land tiers apart.
Treat mid-session as a signal. If the conversation already contains three tool results, you're inside an agentic flow with accumulated exact-state (file contents, error strings). Downgrading the model mid-flow throws away the one thing that was keeping the loop convergent. Prior tool usage and conversation depth push requests up-tier even when the latest message is short.
Subtract the harness baseline. Claude Code ships ~14 tool schemas with every request — including "hello." Count them naively and everything looks agentic, so nothing ever routes local and you save nothing. Score only the tools the request could plausibly use, and the safe majority routes down while the risky minority stays up.
Some patterns override everything. Greetings and "what does X do" questions force-route local, always. Security-sensitive analysis force-routes to the strong tier, always — a JWT architecture question is short, toolless, and precisely the wrong place to save four cents.
The result on my own traffic: 70–90% of requests route to free local models — but they're the right 70–90%, which is the entire difference between "my bill dropped" and "my agent broke."
Takeaways, router-agnostic
Route research down, mutations up. If your router can't tell aGreprequest from anEditrequest, it isn't routing — it's gambling on which sessions break.
Never downgrade mid-loop. Model consistency across an agentic sequence is worth more than the marginal savings of one cheap turn.
Measure session survival, not just cost. A routing setup that saves 60% and breaks one session in five is more expensive than the bill it replaced — you're paying in re-runs and rage.
The ceiling is rising. Local models' tool-calling improves every quarter; the set of safely-downgradable requests grows with it. A router with per-tool judgment gets to expand that set gradually. A token threshold has to guess again from scratch.
The router's job was never "pick the cheapest model." It's "pick the cheapest model that won't break the session" — and those five extra words are where all the engineering lives.
The scorer described here is ~1,000 lines of readable Apache-2.0 JavaScript: src/routing/complexity-analyzer.js. Steal the design, or file an issue telling me where it misjudges — the failure cases are the interesting part.
SOCIAL SHARE CARD GENERATOR