TL;DR
An LLM router chooses a model per request, so short lookups go to a fast, cheap model and multi-step reasoning goes to a frontier model, with no application code changes.
The Bifrost complexity router classifies each request as SIMPLE , MEDIUM , or COMPLEX and exposes the result as complexity_tier to CEL routing rules.
Since v2.3.0 the classifier can be a decision model (Typesafe Jev by default, typically 600 to 800 ms) that judges the work itself, or a semantic classifier that matches your reference phrases.
Requests that get no tier fall through to normal routing, and session-aware routing keeps an agent conversation on a tier that only moves up.
An LLM router is a component that inspects each incoming request and sends it to the model best suited to it, rather than sending every request to one fixed model. Bifrost , the open-source LLM gateway built in Go , implements this as the complexity router : it assigns a complexity tier to each request and lets routing rules pick a target per tier.…