Skip to main content

Smart Routing (hpprouter/auto)

Smart routing answers one question:

"Can this request be handled by a cheaper model without sacrificing quality?"

When you send model: "hpprouter/auto", the gateway classifies the request and routes it to a real provider/model defined by rules — in the style of OpenRouter's virtual model IDs. Your client only ever specifies hpprouter/auto; the gateway does the rest.

Using it

curl -sS -D /tmp/headers.txt -o /tmp/out.json \
-X POST https://router.hpp.io/llm/v1/chat/completions \
-H "apikey: $HPPROUTER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "hpprouter/auto",
"messages": [{ "role": "user", "content": "Summarize this in one sentence." }],
"max_tokens": 128,
"stream": false
}'

grep -i x-hpp-router /tmp/headers.txt
# X-HPP-Router-Resolved-Model: openai/gpt-4o-mini (example; depends on rules)

You do not need to read the resolved model — server-side billing and logging handle it for you. The header is there for observability and optional logging.

How requests are classified

Routing is rule-based (no ML scoring): a fixed set of rules plus configuration stored in the database. A request falls into one of three baskets, evaluated in order:

BasketMatches whenRoutes to
A — Toolthe request has a tools array or tool_choicethe configured tool model
B — Simplea known keyword matches, or estimated input tokens ≤ a configured thresholdthe configured simple-text model
C — Complexnone of the abovea tier (T1/T2/T3) chosen by token bands

Token counts are estimated with a tokenizer (not raw character count), plus a configurable margin used for the complex token bands.

Streaming exception

If stream: true, basket classification is skipped and the request always uses the configured streaming fallback model. This prioritizes the stability of the streaming (SSE) pipeline. See Streaming.

Response metadata

For direct API callers, smart-routing metadata is returned as HTTP response headers:

HeaderMeaning
X-HPP-Router-Resolved-ModelThe actual provider/model used for routing and billing.
X-HPP-Router-BasketThe basket the request was classified into.
X-HPP-Router-Rule-IdThe rule that matched.
X-HPP-Router-Rules-VersionThe active rules version (for auditing).
X-HPP-Router-TierThe tier (when applicable).

:::tip Reading headers in the browser To read X-HPP-Router-* headers from browser JavaScript, the gateway must expose them via CORS. The browser DevTools Network tab shows the headers regardless of CORS. :::

Billing

Billing always uses the resolved model's pricing and the upstream usage — there is no separate price for hpprouter/auto. The resolved model is recorded in your usage logs.

Notes for client apps

To adopt smart routing, change the request model to hpprouter/auto — nothing else. Clients that only read choices/usage need no changes; extra metadata lives in headers and is optional to consume.