LLM Semantic Router: Inference Routing Pattern for 2026

LLM Semantic Router: Inference Routing Pattern for 2026

LLM Semantic Router: Inference Routing Pattern for 2026

Most production LLM traffic is easy, and most LLM budgets are spent as if it were hard. A greeting, a field extraction, a three-line rewrite and a multi-step proof all arrive at the same endpoint and, in a single-model deployment, all get billed at frontier rates and frontier latency. An LLM semantic router attacks that mismatch directly: a thin, fast tier reads each request, infers its intent and difficulty from its meaning rather than its keywords, and dispatches it to the cheapest model that can answer it well. It is not load balancing, which spreads identical work over identical replicas. It is deliberate heterogeneity.

The pattern has matured quickly. The vLLM Semantic Router shipped v0.1 “Iris” in January 2026 and had reached v0.4 “Hermes” by late September, while the research lineage from RouteLLM and FrugalGPT keeps supplying the cost-quality math.

Last Updated: November 2026

What this covers: the economics of routing with worked numbers, a reference architecture, the layered decision flow (rules, embeddings, LLM-as-router), the cascade as a correction mechanism, runnable code, evaluation and drift monitoring, and the failure modes that bite in production.

Context and Background

Plot a real product’s requests by difficulty and the shape is nearly always the same: a long, fat head of trivial work (classification, extraction, formatting, FAQ lookups, short rewrites) and a thin tail of genuinely hard reasoning. If one frontier model serves the whole distribution, you pay frontier price and frontier latency on the head, which is where the volume lives. The waste is structural, not a tuning error.

The obvious fix, “use a cheaper model for everything”, fails on the tail. The hard slice is exactly where a small model produces fluent, confident, wrong answers, and those answers cost more in trust and support load than the tokens saved. The real objective is conditional: serve each request from the smallest model that clears a quality bar for that request. That is a routing problem, and the routing key has to be what the request means.

The research base is solid. The RouteLLM paper (Ong et al., LMSYS and UC Berkeley, first posted June 2024) trained routers on human preference data to choose between a strong and a weak model per query. Its headline results, measured against a GPT-4-only baseline at roughly 95 percent of GPT-4 quality, were cost reductions of over 85 percent on MT Bench, 45 percent on MMLU and 35 percent on GSM8K, with the routers still working when the strong and weak models were swapped at test time. Those numbers belong to specific model pairs and 2024 prices, so treat them as evidence the effect is real, not as a forecast for your traffic. For a deeper treatment of that lineage, see our post on LLM routing, model cascades, RouteLLM and FrugalGPT; this article focuses on the semantic-router implementation tier and its operations.

On the tooling side, two families dominate. Library-style routers such as the MIT-licensed semantic-router from Aurelio Labs define a Route as a name plus example utterances and match queries by vector similarity, returning None when nothing matches. Gateway-style routers such as the Apache-2.0 vLLM Semantic Router sit in the request path, expose a single OpenAI-compatible model ID (vllm-sr/auto) and choose a backend per call under operator policy. The project’s own timeline, taken from its blog and README, is v0.1 Iris on 5 January 2026, v0.2 Athena on 10 March, v0.3 Themis on 5 June and v0.4 Hermes announced on 24 September 2026. If an older write-up told you v0.3 was the current line, it is out of date.

Why does this matter more in 2026 than in 2024? Because model pools got wider and spreads got larger. Between small open-weight models, mid-tier hosted models, reasoning models that burn thousands of hidden tokens, and frontier APIs, the price gap between the cheapest acceptable model and the most capable one for a given request can exceed two orders of magnitude. A router is the lever that converts that spread into savings, and it is also the natural seam for safety policy, tenancy rules and failover.

The Semantic Routing Architecture

A semantic router is a stateless decision tier in front of a heterogeneous model pool. It embeds or classifies each request, scores it against configured routes, applies policy, dispatches to one backend, and logs the outcome so that drift can be detected. The router never generates the answer itself; it only decides who does.

LLM semantic router reference architecture showing gateway, router service, encoder, route registry, safety plugins, model pools and telemetry loop

Figure 1: Reference architecture for an LLM semantic router. The telemetry loop on the right is what keeps the registry honest.

The diagram shows five cooperating parts. A client asks for a generic model name and never names a backend. A gateway terminates the connection; in gateway-style deployments this is typically Envoy or an API proxy that hands the request to the router through an external-processing hook (Envoy’s ext_proc filter lets an external gRPC service inspect and mutate requests and responses). The router service computes signals, consults the registry and returns a decision. The pools execute. The telemetry store closes the loop. If you already run an API gateway, our comparison of Kong, Envoy Gateway and Apache APISIX covers where such a hook fits.

The router tier: cheap, stateless, fast

The router’s overhead is a tax on every request, including the trivial ones you are routing precisely to make cheap. The working target is single-digit milliseconds at the median and a hard ceiling in the tens of milliseconds at p99. A 5 ms router in front of a model with a 400 ms time to first token is noise; a 150 ms router in front of a small model that would have answered in 120 ms makes the “cheap path” slower than the “expensive path”. Statelessness matters for the same reason: routing decisions should be reproducible from the request plus a versioned registry, so replicas scale horizontally and a decision can be replayed later for debugging. v0.3 of the vLLM project leaned into exactly this, emphasising a canonical configuration format, inspectable signal-decision flows and replayable routing behavior.

The encoder and the route registry

The encoder turns the prompt, or its most recent turns, into a vector. Two requests with the same meaning and no shared words land near each other, which is what makes the router semantic rather than a keyword switch. The encoder should be far smaller than anything in the serving pool: tens to a few hundred million parameters, running on CPU or a small GPU slice. A 384-dimension model such as all-MiniLM-L6-v2 encodes a short prompt in single-digit milliseconds on a modern CPU core, while ModernBERT-class encoders trade a little more latency for better long-context behavior.

The registry is the part you actually maintain. Each route carries a name, either reference examples or a trained centroid or classifier, a target model, a confidence threshold and a policy block (timeout, fallback, safety class). Adding a route means adding examples and a target, not redeploying code. The registry is data, so it should be versioned, reviewed and rolled out like a deploy: a bad centroid can misroute a fifth of your traffic as effectively as a bad release.

Signals, not just embeddings

The 2026 shift is from “one embedding, one nearest route” to signals. The v0.1 release described six signal types: domain classification, keyword (regex) matching, embedding similarity, factual-claim classification, user feedback and user preference. A decision engine then combines signals with AND/OR logic and priority-based selection. That framing is more useful than a pure vector match because real policy mixes evidence of different strength: a regex that detects a tool schema is certain, an embedding match is probabilistic, and a tenant preference is a rule. Treat each signal as a feature with its own reliability, and let a small, auditable decision layer combine them.

The model pool

The pool is deliberately diverse: a small fine-tuned classifier or extractor, a mid-size open-weight chat model, a code-specialised model, a reasoning model with a large thinking budget, and a hosted frontier API as the court of last resort. Uniformity would defeat the point. Keep the pool small enough to reason about. Every added model multiplies the number of route boundaries you must evaluate, and each boundary is a place where the router can be wrong. Three to five tiers is a sensible ceiling for most products.

Safety belongs in the router

A router is the only place that sees every request before any model does, which makes it the natural enforcement point for policy that must not depend on which model answers. The Iris release bundled jailbreak and prompt-injection detection, PII protection and semantic caching as per-decision plugins. The design principle is more important than the specific plugin list: some classes of request must reach a guarded model or be refused regardless of how cheap an unguarded model would be, and that rule is only reliable if it is evaluated before cost optimisation. For the mechanics of detection, see our posts on PII detection and redaction pipelines and LLM red-teaming and jailbreak defense.

Deeper Analysis: How the Decision Is Actually Made

The layered decision flow

No single strategy is adequate, and production routers combine several in a fixed order of cost: cheapest and most certain first, most flexible and most expensive last.

Layered LLM semantic router decision flow with rules, safety signals, embedding scoring and a small LLM fallback

Figure 2: The layered decision flow. Each stage either decides or passes a smaller, harder residue to the next.

Rules first. Before touching an encoder, run deterministic checks: a request carrying a specific tool-call schema, a tenant whose contract pins them to a particular model or region, a known-malicious template. Rules cost microseconds, never drift and form a safety floor. They are brittle as a general strategy, which is why they stay a thin first layer rather than the whole system.

Safety signals second. PII and jailbreak classifiers run before cost routing so that a blocked or sensitive request cannot be “optimised” onto an unguarded cheap model. Blocked requests go to refusal or a guarded model; clean ones continue.

Embedding scoring third. This is the workhorse. Offline, you collect labelled examples per route, embed them and compute either a centroid (the mean vector) or a lightweight classifier such as logistic regression or a small MLP. Online, you embed the prompt once and take the nearest centroid by cosine similarity or the classifier’s argmax. Centroids are trivially interpretable and easy to update; classifiers capture non-spherical boundaries. The output that matters is not the label but the margin: the gap between the top route’s score and the runner-up’s. A wide margin is safe to act on. A narrow margin means the request sits between routes, which is exactly where mistakes live.

LLM-as-router last. When vector confidence is low, hand the decision to a small instruction-tuned model that sees the request and the route descriptions and picks one. It handles novel requests no example covered, at the cost of tens to hundreds of milliseconds and some tokens, so you reserve it for the ambiguous minority. Using a small model purely to route rather than to answer is a useful inversion: the router can be cheaper than anything it dispatches to.

A runnable centroid router with margin

The following sketch is vendor-neutral and uses only sentence-transformers and NumPy. It builds centroids from a few examples per route, scores a prompt and returns the route plus margin, escalating to a default when confidence is low. Replace the toy examples with a few dozen real, labelled prompts per route before trusting it.

import numpy as np
from sentence_transformers import SentenceTransformer

enc = SentenceTransformer("all-MiniLM-L6-v2")  # 384-dim, CPU friendly

ROUTES = {
    "extract_small": ["extract the invoice number from this text",
                      "pull the email address out of this message",
                      "classify this ticket as billing or technical"],
    "code_mid": ["write a python function that parses a csv",
                 "why does this typescript promise never resolve",
                 "refactor this sql query to avoid a subquery"],
    "reason_large": ["prove that the sum of two odd numbers is even",
                     "design a migration plan with rollback for a sharded database",
                     "analyse the trade-offs between these three architectures"],
}
TARGET = {"extract_small": "small-8b", "code_mid": "code-32b",
          "reason_large": "frontier"}

def unit(v):
    return v / np.linalg.norm(v, axis=-1, keepdims=True)

centroids = {r: unit(unit(enc.encode(ex)).mean(axis=0))
             for r, ex in ROUTES.items()}

def route(prompt, min_score=0.35, min_margin=0.05, default="frontier"):
    q = unit(enc.encode([prompt]))[0]
    scores = sorted(((float(q @ c), r) for r, c in centroids.items()),
                    reverse=True)
    (s1, r1), (s2, _) = scores[0], scores[1]
    margin = s1 - s2
    if s1 < min_score or margin < min_margin:
        return default, s1, margin, "escalated"
    return TARGET[r1], s1, margin, "confident"

print(route("pull the order id out of this email"))
print(route("explain why this quicksort variant is quadratic on sorted input"))

Two design choices are worth defending. First, the default on low confidence is the largest model, not the smallest: when the router does not know, spending more is the safer error. Second, both a floor on the absolute score and a floor on the margin are required. A prompt can score 0.6 against two routes at once (high absolute, tiny margin) or 0.2 against all of them (low absolute, wide margin by luck). The thresholds are not universal constants; they depend on the encoder, so calibrate them on a held-out set by plotting accuracy against margin and choosing the point where mis-routes become unacceptable.

If you prefer a library, the Aurelio semantic-router package expresses the same idea with Route(name=..., utterances=[...]), a SemanticRouter and an encoder such as OpenAI, Cohere or a local Hugging Face model. Its call returns a route object or None, so “no match” becomes your explicit fall-through to the strong model.

Worked cost example (illustrative prices)

Numbers make the case better than adjectives. The prices below are illustrative, not any vendor’s current list price; substitute your own. Assume an average request of 1,000 input and 300 output tokens and three tiers:

Tier Input $/M tokens Output $/M tokens Cost per request
Small 0.15 0.60 $0.00033
Mid 1.00 4.00 $0.0022
Frontier 5.00 20.00 $0.0110

Serving one million requests per day from the frontier tier costs $11,000. Now suppose a router sends 60 percent to small, 25 percent to mid and 15 percent to frontier. The blended cost per request is 0.6 x 0.00033 + 0.25 x 0.0022 + 0.15 x 0.011 = $0.0024, or about $2,400 per day, a 78 percent reduction. The encoder adds a rounding error: even at a generous $0.02 per million tokens equivalent, embedding 1,000 tokens costs $0.00002 per request.

The result is only as good as the quality it preserves. Suppose 15 percent of traffic, 150,000 requests, is genuinely frontier-class. If the router leaks 3 percent of those (4,500 requests) to the small tier and each wrong answer costs a $2 support interaction, the leakage costs $9,000 per day, which exceeds the roughly $8,600 daily saving. Savings can be erased by a small leakage rate. This is why the evaluation sections below matter more than the architecture.

The Cascade: Correcting the Router’s Mistakes

Semantic routing predicts which model is right. The cascade is the correction mechanism for when the prediction is wrong: try a cheap model first, check the result with a quality gate, and escalate only on failure.

LLM model cascade with quality gates escalating from small to mid to frontier model, with timeout fallback edges

Figure 3: A three-tier cascade. Solid edges escalate on a failed quality gate; dotted edges escalate on timeout or error for reliability.

The gate is where cascades succeed or fail. Cheap gates use heuristics: refusal patterns, malformed structured output, length anomalies, or the model’s own token-level confidence where logprobs are exposed. Stronger gates use a verifier model, a self-consistency check across a few samples, or a rubric scored by an LLM-as-a-judge, which carries its own biases that you must calibrate. A gate that is too lenient lets wrong small-model answers through; one that is too strict escalates everything and destroys the savings.

Break-even escalation rate

Let the small-tier cost be c_s, the gate cost g, and the frontier cost c_f. Ignoring the mid tier, sending a request through the small tier and then to the frontier on a fraction e of requests costs c_s + g + e x c_f, which beats going straight to the frontier when e < 1 – (c_s + g) / c_f. With the illustrative numbers, a verifier call of about $0.0002 and c_s = $0.00033 give (0.00053 / 0.011) = 4.8 percent, so the cost break-even escalation rate is about 95 percent. Cost alone is almost never the binding constraint. Latency is: each escalation adds a full generation plus a gate, so a request that escalates twice may take three times longer than going direct. The practical break-even is set by your latency budget, not your invoice.

Take a full three-tier cascade with no upfront routing: every request hits small (0.00033), the gate on all requests costs 0.0002, 35 percent reach mid (0.00077 average contribution), mid-tier gating on those adds 0.00007, and 12 percent reach frontier (0.00132). The total is roughly $0.0027 per request, about 76 percent below the frontier-only $0.011. That is similar to the router’s $0.0024, and the two compose: use the router to skip the small tier for requests it is confident are hard, and the cascade to catch the router’s misses. This is also how the combined RouteLLM-style research frames the problem: a quality threshold sets the strong-model call fraction, and you pick the operating point on a cost-quality curve rather than a single configuration.

Streaming breaks naive cascades

If you stream tokens to the user as they are generated, you cannot take them back when a gate fails at the end. Options are to buffer the small-tier response (adding its full generation time to time to first token), to gate on the first N tokens and a structural check, or to restrict cascades to non-streaming or background workloads. Interactive chat usually favours routing with a conservative confidence threshold over a post-hoc cascade for exactly this reason.

Reliability is a second job

The dotted edges in the figure matter independently of quality. A router that knows backend health can fail over a request when the small-model replica is unhealthy or a provider is rate-limiting, applying per-tier timeouts and circuit breakers. Treat quality escalation and reliability escalation as separate policies with separate counters; conflating them hides whether a rise in frontier traffic is caused by harder prompts or by a sick replica.

Walk-through: One Request, and How the Router Gets Judged

Tracing one prompt end to end shows where the decision, the evidence and the feedback each live.

Sequence diagram of an LLM semantic router request path with embedding, dispatch, telemetry logging, shadow comparison and drift alert

Figure 4: Request path and evaluation side channel. The synchronous path ends at the client; the asynchronous path is what keeps the router trustworthy.

The client sends a standard chat-completion request naming a virtual model such as vllm-sr/auto. Because the interface is OpenAI-compatible, existing SDKs work unchanged:

from openai import OpenAI

client = OpenAI(base_url="http://router.internal:8801/v1", api_key="unused")
resp = client.chat.completions.create(
    model="vllm-sr/auto",  # the router, not the client, picks the backend
    messages=[{"role": "user",
               "content": "Convert this JSON to a CSV header row: {...}"}],
)
print(resp.choices[0].message.content)
print(resp.model)  # many routers echo the selected backend here or in a header

The router embeds the prompt, scores routes and forwards to the selected backend, streaming the response back. Crucially, it also emits a decision record: route name, top score, margin, selected model, latency, input and output token counts, and the registry version. Returning the chosen route in a response header makes debugging far easier, since “why was this answered by the small model?” becomes a lookup, not an investigation.

Three evaluation layers separate a router you can trust from one that quietly degrades.

Offline route accuracy. Keep a labelled holdout of request and correct-route pairs, and measure accuracy plus the full confusion matrix on every registry change. The confusion matrix is the useful artefact: it shows when a new route cannibalises an old one, for example a new “legal summary” route stealing traffic from “general summarization”. Run this in CI so a registry change that drops accuracy on any route below a floor cannot merge.

Online quality by route. Track answer quality per route, not only in aggregate. A healthy global score can mask one rotting route because the others carry it. Signals include gate pass rates, user thumbs, task completion downstream, escalation rate and rework rate. A rising escalation rate on one route is often the earliest symptom of drift.

Shadow routing. For a small sampled fraction of traffic, send the request to both the chosen model and a stronger reference, then compare with a judge model or human audit. This gives a continuous estimate of what routing is costing you in quality, and it finds the requests where the cheap model was wrong but nothing flagged it. Sample 1 to 5 percent, stratify by route, and size the sample for the question: to detect a 3-point drop in a route’s win rate against the reference at reasonable confidence you typically need on the order of a thousand paired comparisons per route per window (a standard binomial power calculation; compute it for your own variance). Shadow traffic costs real money, so budget it explicitly.

Where semantic caching and KV reuse fit

Routing composes with the rest of the stack but the layers interact. A semantic cache answers near-duplicate queries from stored responses and can sit before or after the routing decision; the Iris release included it as a per-decision plugin. Placing it per route, with a tighter similarity threshold for risky routes, avoids serving a stale or subtly wrong cached answer to a different question. Behind the router, the pools still depend on prefix and KV-cache efficiency: a router that scatters one conversation’s turns across different models destroys prefix reuse, so use session affinity where multi-turn state matters. Our post on disaggregated serving with NVIDIA Dynamo and LMCache covers the serving side of this interaction.

Multi-turn and agentic traffic

Single-prompt routing is the easy case. In a conversation, the first turn may be a trivial greeting and the fifth a hard analysis; routing on the latest turn alone loses context (“and what about the second one?” embeds as nothing). Two workable approaches are to embed a window of recent turns with the latest weighted more heavily, or to re-route each turn but pin the model after a hard turn so the conversation does not oscillate between models with different styles. Agent loops add a further dimension: tool-selection steps are usually easy and cheap, while planning and synthesis steps are hard, so routing per step with step-type metadata in the request beats routing per task. The v0.1 release also described tool selection, filtering irrelevant tools before they reach the model, which both cuts prompt tokens and reduces tool-call errors.

Trade-offs, Gotchas, and What Goes Wrong

Silent mis-routing. The most damaging failure is the one that looks like success: the request returns quickly, the answer is fluent and wrong, and your latency dashboards are green. Without per-route quality tracking you are mis-routing at an unknown rate. Mitigate with margin thresholds that escalate ambiguity, a real gate on cascaded routes and continuous shadow comparison.

Semantic drift. Centroids trained on last quarter’s traffic age. New features, new user cohorts and new world events produce requests no route covers, and they land on whichever centroid is nearest in a stale space. Drift shows up first as shrinking margins and rising fallback rates, which is why those two numbers belong on the main dashboard. Refresh examples from recent logged traffic on a cadence, and alarm on the distribution of margins, not just the mean.

Embedding model changes invalidate everything. Swapping or upgrading the encoder changes every vector, so all centroids, thresholds and the semantic cache must be rebuilt and re-calibrated together. Version the encoder inside the registry and never hot-swap it.

Embeddings measure topic, not difficulty. Two prompts can be about the same subject (“explain this contract clause”) while one is a definition lookup and the other requires cross-referencing five clauses. A purely topical embedding routes them identically. Complexity needs additional signals: prompt length, number of constraints, presence of multi-step language, or a learned difficulty classifier trained on outcomes rather than topics. This is the central reason preference-trained routers like RouteLLM’s matrix-factorization approach exist.

Adversarial and gaming behaviour. Users, or attackers, can craft prompts that look easy to the router yet request something hard or harmful, or that push cheap routes into expensive ones to inflate your bill. Keep safety classification independent of cost routing, rate-limit per tenant by cost, and monitor for prompts with suspicious score patterns such as high similarity to an easy route and an unusually long length.

Style and behaviour inconsistency. Different models have different tone, formatting habits and refusal behaviour. If routing flips between models mid-conversation, users notice. Normalise with a shared system prompt and output-format contract, and pin within a session.

Operational surface area. The router is now a critical single point of failure on the hot path. Run it redundantly, give it its own SLOs, make the fallback on router failure explicit (route to a default model, never fail closed without intent) and test that behaviour. Also consider the compliance angle: routing to external APIs may move data across regions or vendors, which is why policy features such as keeping calls within approved locations matter in regulated settings.

When not to route. If your traffic is narrow and homogeneous, or your volume is low enough that model spend is not a material line item, the engineering and evaluation cost of a router can exceed its savings. A single well-chosen mid-tier model is a perfectly defensible architecture below a few thousand dollars of monthly inference spend (a rule of thumb, not a measured threshold).

Practical Recommendations

Start with measurement, not a router. Log a sample of production prompts with token counts and costs, label a few hundred by difficulty and intent, and compute how much of your spend a perfect router could save. If the headroom is under 30 percent, a router is probably not your best next project; above that, the pattern pays.

Then build in this order. First, define two tiers only and one escalation rule, and make the default always the strong model. Second, build the holdout set and the CI check before shipping the first route. Third, add shadow routing so that you have a quality number from day one. Only then expand to more routes, signals and an LLM-as-router fallback. Prefer an off-the-shelf gateway router when you need policy, safety and Kubernetes tooling, and a small library or your own centroid code when you only need a handful of intents inside an application. Whichever you choose, keep the decision logic inspectable: the first time an executive asks why a customer got a weak answer, you want a one-line explanation from a log.

Checklist

  • [ ] Quantified the easy-traffic share and the potential saving from real logs
  • [ ] Default route on low confidence is the strongest model
  • [ ] Both an absolute score floor and a margin floor, calibrated on held-out data
  • [ ] Safety and PII checks run before cost routing
  • [ ] Holdout set with confusion matrix gated in CI
  • [ ] Quality tracked per route, not only in aggregate
  • [ ] Shadow routing on 1 to 5 percent of traffic, stratified by route
  • [ ] Encoder, registry and cache versioned and rebuilt together
  • [ ] Session pinning for multi-turn conversations and prefix reuse
  • [ ] Router has its own SLO, redundancy and explicit failure fallback
  • [ ] Alerts on margin distribution, fallback rate and per-route escalation rate

Frequently Asked Questions

What is an LLM semantic router?

An LLM semantic router is a decision layer in front of a pool of language models. It converts each request into an embedding or classification, matches it against configured routes by meaning rather than keywords, and forwards it to the model best suited to the intent, difficulty, cost and safety class. The client asks for a generic model and never chooses a backend. Its goal is to serve each request from the cheapest model that still meets the quality bar.

How is a semantic router different from an LLM load balancer?

A load balancer distributes identical requests across identical replicas to maximise utilisation and availability. A semantic router sends different requests to different models on purpose, based on what each request needs. The two are complementary: the router picks the model pool, and a load balancer inside each pool picks the replica. Routers also add policy that balancers lack, such as safety filtering, tenant pinning and quality-driven escalation.

How much money does LLM routing save?

It depends on your traffic mix and price spread, so measure before promising anything. The RouteLLM paper reported cost reductions of over 85 percent on MT Bench, 45 percent on MMLU and 35 percent on GSM8K at about 95 percent of GPT-4 quality, using 2024 model pairs. In our illustrative example, a 60/25/15 split saved about 78 percent, but quality leakage can erase that. Savings are real only net of mis-routing.

Should I use embeddings, a classifier or an LLM to route?

Use all three in layers. Deterministic rules handle known and dangerous patterns at microsecond cost. Embedding centroids or a lightweight classifier handle the bulk cheaply and give a margin score. A small LLM-as-router handles only the low-confidence residue, because it adds latency and tokens. Start with centroids, add a trained classifier once you have a few thousand labelled examples, and keep the LLM fallback for ambiguous cases.

Is the vLLM Semantic Router production ready?

It is an actively developed Apache-2.0 project that reached v0.4 Hermes by late September 2026, following v0.1 Iris in January, v0.2 Athena in March and v0.3 Themis in June, with emphasis on a canonical config, Kubernetes tooling and replayable routing. A 0.x version line signals that interfaces may still change, so pin versions, read the release notes, load-test against your own traffic and keep a direct-to-model fallback path.

How do I detect that my router has drifted?

Track four things per route: the distribution of confidence margins, the fallback or escalation rate, quality scores from gates, user feedback and shadow comparisons, and offline accuracy on a fresh labelled sample. Drift usually appears first as shrinking margins and rising escalation on one route while the aggregate stays flat. Alert on shifts in the margin distribution, refresh route examples from recent logged traffic, and re-run the holdout confusion matrix after every registry change.

Further Reading

Internal:

External primary sources:

By Riju — about

1 Comment

Leave a Reply

Your email address will not be published. Required fields are marked *