bRoutes

Your own routing. Lanes in plain words, each with a model, so easy prompts stop paying for expensive models.

A bRoute is a routing strategy you write yourself. You list lanes in plain words, each with a model, and a fast judge reads every new message and sends it to the lane it fits. Easy prompts go to cheap models, and only the hard ones reach the expensive model you would otherwise use for everything.

broute/my-coder

Lane 1   Hard coding work: design, many files, tricky bugs   ->  anthropic/claude-sonnet-5.5
Lane 2   Easy coding work: short questions, small edits      ->  deepseek/deepseek-v4.1-flash
Lane 3   Anything else                                       ->  openai/gpt-6-luna

Call one

Name the bRoute as the model, on chat completions, responses or messages, streamed or not:

{
  "model": "broute/coding",
  "messages": [{ "role": "user", "content": "How do I reverse a string in Python?" }],
  "max_tokens": 1024
}

The answer's model field names the model that ran. Two headers say how it got there:

HeaderHolds
x-brouteThe bRoute, like broute/coding
x-broute-laneThe lane's number. The last is "Anything else"

It works anywhere a model name goes: an SDK, Cursor, or Claude Code (claude --model broute/coding). GET /models lists the starters, and with your key it lists your own bRoutes too.

Starters

Three bRoutes anyone can call with any key:

bRouteLanes
broute/codingHard coding work to Claude Sonnet 5.5, easy coding work to DeepSeek V4.1 Flash, anything else to GPT-6 Luna
broute/chatSmall talk and quick asks to DeepSeek V4.1 Flash, hard thinking to GPT-6.1 Sol, anything else to GPT-6.1 Terra
broute/agentOpen-ended tasks to Claude Opus 5.5, simple well-defined tasks to Claude Haiku 5.5, anything else to DeepSeek V4.1 Flash

Each lane has backups, used when its model is busy. Starters move to newer models over time.

How a lane is picked

  • The judge reads the newest message and the chat before it (about 3,000 tokens), so "yes, do it" after a plan goes where the plan belongs.
  • It answers in well under a second, on hosts that keep nothing. Nothing of your chat is stored.
  • The chat is data to the judge: a prompt that says "use the best model" does not change its lane.
  • When the judge does not answer within 1.5 seconds, the call goes to "Anything else". A call never fails because of the judge.

A task stays on one model

A request whose newest turn is a tool's result continues a task, and runs on the model the task started on, without asking the judge. An agent's tool loop, or Claude Code at work, never switches model halfway. Each new message from the person is judged again.

Lanes skip what they can't take

When a lane's models can't take a request (images, files, tools, or a context too long for them), it goes to the next lane that can, then the ones before it. When no lane can, the call answers 400 no_capable_lane and says what was missing.

Free lanes

A lane may use a free model such as binference/free, with a paid backup that runs when the free limits are full.

What it costs

Each call is charged for the model it ran on, at your usual price. bRoutes need credit on the key's balance.

Make your own

On binference.io, open Account > bRoutes:

  • Up to 20 bRoutes a wallet, each with up to 8 lanes, "Anything else" included. Any key of the wallet can call them: its account's and its agents'.
  • Try it: type a message and see its lane, its model and about what it would cost, before you save.
  • Start from one sentence: describe your app, and lanes and models are drafted for you to edit.
  • Versions: every save is kept. Changes apply from the next message, and restoring an old version saves it again as the newest.
  • Savings: calls, spend and savings by lane over 7 or 30 days, against the model you would call without it.

Over MCP, list_routes lists the bRoutes a key can call and get_route_usage reads one's usage and savings.

Errors

CodeWhen
unknown_modelNo bRoute of that name is yours, and no starter has it
invalid_fallbackA bRoute named in models or fallbacks, or a bRoute call with a fallback list of its own
no_capable_laneNone of its lanes has a model for what the request needs

See Errors for every code.

On this page