Skip to main content
Model auto-selection lets you name a set of models, describe what each one is for, and have jev choose which should answer a given conversation. jev is a small evaluation model built for structured decisions, available in the catalogue as typesafe-ai/jev. You use it when pinning a single model is wasteful. A support agent that pins a frontier model pays frontier prices for “what are your hours”; one that pins a cheap model handles that well and then fails the hard ticket. Auto-selection reads the conversation and picks per call. Nothing about routing changes. vetta/auto, pinned ids, completion windows and the live catalogue behave as they did before, whether or not you use selection.

How it works

You supply two to sixteen catalogue ids, each with a short description of what it is good for, plus the conversation so far. jev returns one of your ids. There are two ways to use the result. You can call POST /v1/models/auto_select to get the id back and do what you like with it. Or you can attach the same set of options to a proxy call or an agent as a model_selection policy, in which case Vetta runs the selection and the model call together. Both paths ask jev the same question. The difference is whether you act on the answer or Vetta does.

Select a model for a conversation

POST /v1/models/auto_select returns an id and stops. It does not call the model it selected.
Pass the returned model unchanged to the proxy, an agent or a session. The request requires the proxy:write scope, or sessions:write.

Select during a call

Attaching model_selection to a request runs the selection and the model call in one round trip. The reply’s model field names the model that was picked. On an agent, the policy applies to every turn. Each turn asks again over the transcript to that point, and no selection is stored on the agent.

Options

Each key of options must be a concrete catalogue id. Aliases, unknown ids and vetta/auto are rejected with validation_failed on options.<id>, and every id must be priced in the completion window you are using. An agent’s policy is checked again at the start of every session, so a policy that was valid when you saved it is refused with window_unavailable if the catalogue has since moved. messages accepts one to thirty-two user and assistant turns, up to 32,000 characters in total. min_confidence and default work together. When you set min_confidence, jev’s own confidence in its choice is compared against it, and default is returned instead when confidence falls below the threshold or is unavailable. The response sets defaulted to true when that happens, and confidence and probabilities still report what jev actually said. If you do not set min_confidence, default has no effect. default only covers low confidence. It is not returned when selection fails, which is covered below.

Pricing

Selection is billed as input tokens only, at the rate that appears on GET /v1/credits/ledger. A selection over two options, measured on production traffic: A one-shot selection gets its own ledger entry. A selection made during a proxy call or an agent turn adds one input line to the entry that call already produces. You are not billed for a selection that does not happen.

Errors

What happens when jev cannot answer depends on where the selection was made. The agent case differs deliberately. An agent turn has nobody waiting on it, and the turn loop retries, so failing the turn would retry an unavailable evaluator on every attempt and end the session. Adding a policy to an agent should not make that agent less available than it was without one. If you want a specific fallback when selection is unavailable, catch the error and apply it yourself. Vetta does not substitute default.
On a deployment with no evaluation model configured, POST /v1/agents rejects a model_selection policy with feature_not_configured (501) rather than storing one that no turn could act on.

Limitations

There is no CLI command and no dashboard control for selection, and it is withheld from MCP for the same reason the proxy is: it is a billed, credentialed call to a model.

Next: completion window

The three-price model, and why you choose it per request.