Skip to content

Separator

Type the request. Then send it.

Separator is the routing layer. It does not try to be every model. It decides, in a checked and fast step, which model should do the work — and when the work should be split.

Decision plane

4.2 ms

explanationreason-1

reason-1code-1write-1search-1vision-1speech-1ops-1

Chat

One question, one typed hop.

Chat is the single-hop case. The request enters the gateway, receives a type, and is checked against a contract before a model is chosen. You see the type, the lane, and the decision. A second model is not invited in to round out the paragraph.

The packet below is drawn in the browser. It does not call reason-1.

Why is the sky blue?

reason-1

Explanation

Route<Question, Explanation>

When the message is mixed

The extra job leaves. The question remains.

Ask why the sky is blue and also ask for a patch. The shape changes from Route to Fanout. reason-1 still owns the explanation. code-1 owns the diff. The original question is not rewritten to include the file change.

Why is the sky blue, and patch the docs

reason-1 keeps the question

docs · code-1

+ Why the sky is blue

01 Chat

One question, one typed hop.

  • The request gets a type before a model is chosen.
  • The type selects the model that is built for that work.
  • The hop is visible: input type, model, decision time.

separator / chat

YouWhy is the sky blue?

Separatorexplanation → reason-1 · 3.2 ms

reason-1Shorter blue wavelengths scatter more off air molecules than longer red ones.

02 Build

Code stays on the code lane.

  • Patches, reviews, and explanations are different types.
  • code-1 receives the part that changes the repository.
  • A mixed engineering ask fans out instead of blurring the types.
src/routes.tscode-1

14 export async function handler(req) {

15+ await limit(req, { max: 100 });

16 const session = await getSession(req);

17 return schema.parse(session);

type patch · Route<ChangeRequest, Diff>

03 Bot

Complex work becomes a list of small requests.

  • Each part has its own type, model, and contract.
  • The parts run as separate calls.
  • The audit shows which model handled which sentence of the ask.

fan-out

Close the month and file the report.

  • Match each charge to a receiptdone · ops-1
  • Write the month-end notedone · write-1
  • Ask where a receipt is missingdone · reason-1

04 Imagine

A picture prompt does not land on a text model.

  • Stills and video share the vision lane.
  • A caption request is a second, typed call.
  • The media call never inherits a code or speech contract.

media → vision-1 · Route<Prompt, Media>

05 Voice

Speech in. Actions beside it, not inside it.

  • Transcripts stay on speech-1.
  • A booking or a summary becomes another typed part.
  • You can allow or refuse each lane on its own.

speech-1

Transcribe the call and book the follow-up.

speech-1 + ops-1 · fan-out

What the router is for

01

Describe the estate

Tell us which models you already call, and which kinds of requests show up.

02

Pin the allow-list

Separator only routes to lanes you permit. A mismatch is a refusal.

03

Call /v1/route

Read the type, the model, and the parts. Switch on the contract in your app.

One hop

A plain question stays a plain question.

Chat on Separator is the single-hop case. The request is typed, checked against Route<In, Out>, and handed to the lane that answers that type. You see the type, the model, and the milliseconds spent choosing. You do not see a second model invited in to round out the paragraph.

If the same message also asks for a diff, a booking, or a picture, the shape changes to Fanout<Request, Part[]> and the extra jobs leave. The original question is still its own part.

Type first

Explanation, patch, prose, lookup, media, speech, or workflow. The type is assigned before a model is selected.

Then the contract

One type that fits an allowed lane is a Route. Several types are a Fanout. Neither is pending.

Then the lane

reason-1, code-1, write-1, search-1, vision-1, speech-1, or ops-1. A lane outside the allow-list is not a candidate.

Then the record

Type, contract, model, latency, and parts. Prompt text is omitted unless you enable that logging.

A decision

What /v1/route returns when the work splits.

The block is the shape, not a capture from production. latency_ms is the decision. It is not the time the models spend generating. The API is in preview. The consoles on this site draw the same shape in the browser and do not call a model.

Callers that already speak the OpenAI-compatible base can point at api.veloxity.si/v1 and set the model to separator. Callers that want a lane pinned send that lane id instead, and a mismatch is refused.

{
  "id": "rte_01",
  "latency_ms": 4.6,
  "type": "fan-out",
  "contract": "Fanout<Request, Part[]>",
  "model": null,
  "parts": [
    { "type": "workflow", "model": "ops-1" },
    { "type": "prose", "model": "write-1" },
    { "type": "explanation", "model": "reason-1" }
  ]
}

Outside the router

Separator does not pretend to be the model, the bill, or an audit.

  • Generation

    The answer, the diff body, the still, and the transcript take as long as the lane takes. That time is not folded into the decision target.

  • A private map of models

    Applications stop keeping their own table of which screen calls which vendor. They post to one route and read the contract.

  • A certification

    Nothing on this page is a SOC report, a HIPAA assessment, or a penetration test. The security statement says the same thing in formal language.

  • A measured benchmark

    Under 10 ms is the design target for the routing choice. It is not a number we are publishing from a production trace on this website.

Separator

Put a typed route in front of the models you already call.

Decision

explanation

reason-1

4.2 ms

reason-1code-1write-1ops-1intake