A model that answers, but never writes
Jev is TypeSafe AI’s System One model: you give it a state and a set of typed questions, and it returns typed answers with calibrated probabilities. No prompt engineering for output formats, no parsing, no hallucinated prose, because there is no prose. This page explains the idea, the three question types, the patterns TypeSafe recommends, what it costs, and the three ways to call it. Then go and poke it in the playground.
System 1, not System 2
The name borrows Daniel Kahneman’s split between System 1 (fast, intuitive, automatic: “is this email spam?”, “is this customer angry?”) and System 2 (slow, deliberate, step-by-step). A large language model is a System 2 machine: it reasons token by token and hands you a paragraph that your code then has to parse and trust.
A System One model gives up text generation entirely. The input is a state (a string, a JSON object or an array, such as a chat transcript) plus a map of typed questions. Every question is evaluated against the state in parallel, in one call, and the output is a typed value per question together with a probability distribution over the answer space you defined. Because the answer space is fixed up front, the model cannot invent an option, and because every answer comes with a probability, your code can branch on “how sure”, not just “what”.
TypeSafe pitches Jev as the first model of this class and describes it as calibrated: higher reported confidence should mean higher accuracy, and similar inputs should get similar answers. That is a vendor claim; the playground shows you the numbers per call so you can judge on your own data.
Three question types
Every question has an instructions string and a type. The type decides what the criteria look like and
what comes back. Question ids are yours; answers come back under the same ids.
Choice pick one
criteria is an object of option → description (description may be null). The model picks one option.
→ choice + probabilities per option + confidence
Classification, routing, intent detection, “which handler should take this?”.
Score rate on a scale
criteria is an ordered array of level descriptions, low to high. The answer is interpolated between levels.
→ score + legend (index → level) + probabilities per level + confidence
Severity, quality, relevance, mood: anything with a gradient. Weighted sums of several scores make a composite.
Noul true or false
A yes/no question with optional criteria: { true, false } to pin down what each side means (give both or neither).
→ noul: probability of true, from 0 to 1
Guards, checks, gates. The Vercel AI SDK calls this type boolean and returns it as probability.
TypeSafe’s advice is to keep each question atomic: one specific, well-scoped thing that a knowledgeable person could answer in a few seconds. If a judgment needs reasoning, split it into factors, ask each as its own question, and combine the answers in code.
Patterns TypeSafe recommends
Speculative fan-out
Ask every independent question you might need in one call, including the speculative ones (“if this is a bug, how severe?”), and let code keep only the answers that matter. Output is free and questions run in parallel, so extra questions cost little more than the state tokens you already paid for.
Confidence-gated routing
Use confidence as a second axis. High confidence: act automatically. Low confidence: fall back to a broader category, ask a stronger model, or hand the case to a human. Choice and score answers report confidence; for noul, distance from 0.5 plays the same role.
Keep control in code
Rules, lookups, thresholds and execution stay in ordinary code. The model answers narrow questions; your program decides what to do with them. That keeps systems testable and makes “why did it do that?” a question about your thresholds, not about a prompt.
The playground’s ticket-triage scenario is a fan-out: five questions in one call, including “if this is a bug,
how severe?”. The playground shows every answer; an app would read the severity only when the category came back as bug. The docs go further with composite scoring, intent routing and self-consistency checks; see docs.typesafe.ai.
Pricing and vendor claims
| What | TypeSafe says | Note |
|---|---|---|
| Input tokens | $0.042 / M | List price; the playground estimates cost per call from input tokens unless the provider reports it. |
| Output tokens | free | There is no generated text to meter, so the number of questions does not change the price. |
| Latency | 70–500 ms | Claimed end-to-end. The playground shows server-side and end-to-end latency for every call, so you can compare on your own network. |
| Calibration | “calibrated” | Higher confidence should mean higher accuracy, and similar inputs similar answers. Worth checking against a labelled sample before you rely on it. |
Prices, latency and calibration figures above are TypeSafe’s own statements from its announcement post and docs, as of 2026-09-20. This site is an independent playground and has not benchmarked them; treat them as vendor claims. Providers other than TypeSafe may charge differently.
Three ways to call it
The playground talks to Jev through three providers, and the snippets below are trimmed straight from its adapter code. The same request works everywhere; only model ids, the noul spelling and usage field names differ.
The request
{
"state": "Support issued a full refund of $42.50 to the customer and closed the ticket.",
"questions": {
"refunded": { "type": "noul", "instructions": "Has the refund been completed?" },
"category": {
"type": "choice",
"instructions": "Main category of this ticket",
"criteria": { "billing": "Charges, payments or refunds", "bug": "Product failure", "other": null }
},
"urgency": {
"type": "score",
"instructions": "How urgent is this for the customer",
"criteria": ["low: can wait", "medium: this week", "high: right now"]
}
}
} OpenRouter
import { OpenRouter } from '@openrouter/sdk';
const client = new OpenRouter({ apiKey });
const d = await client.alpha.decisions.create({
decisionsRequest: { model: 'typesafe/jev-1.13', state, questions }
});
// d.answers · d.usage.inputTokens · d.model · d.id · d.providerVercel AI Gateway
import { experimental_evaluate as evaluate } from 'ai';
import { createGateway } from '@ai-sdk/gateway';
const gateway = createGateway({ apiKey });
const r = await evaluate({
model: gateway.evaluationModel('typesafe-ai/jev'),
state,
questions // noul is spelled { type: 'boolean', ... } in the AI SDK
});
// r.answers.refunded → { type: 'boolean', probability: 0.97 }
// r.providerMetadata.typesafe.confidence → { category: 0.91, urgency: 0.62 }
// r.usage.inputTokens · r.response.modelIdTypeSafe API
const res = await fetch('https://api.typesafe.ai/v1/systemone', {
method: 'POST',
headers: { authorization: `Bearer ${apiKey}`, 'content-type': 'application/json' },
body: JSON.stringify({ model: 'jev-latest', state, questions })
});
const d = await res.json();
// d.answers · d.usage.input_tokens (snake_case here) · d.modelThe response, normalized
OpenRouter and TypeSafe return this shape natively (TypeSafe with input_tokens); the playground maps the AI SDK’s boolean / probability and providerMetadata.typesafe.confidence onto it. Values are
illustrative.
{
"answers": {
"refunded": { "type": "noul", "noul": 0.97 },
"category": {
"type": "choice", "choice": "billing",
"probabilities": { "billing": 0.94, "bug": 0.02, "other": 0.04 },
"confidence": 0.91
},
"urgency": {
"type": "score", "score": 0.31,
"probabilities": { "0": 0.72, "1": 0.25, "2": 0.03 },
"legend": { "0": "low: can wait", "1": "medium: this week", "2": "high: right now" },
"confidence": 0.62
}
},
"usage": { "inputTokens": 118, "outputTokens": 0 },
"model": "typesafe/jev-1.13"
}When to use it, and when not to
Reach for Jev when
- You need a decision, not a document: classify, route, score, verify, extract from a fixed set.
- The answer space can be designed up front as options, levels or a yes/no.
- Latency and cost matter: real-time paths, guardrails in front of or behind an LLM, map-reduce over large data.
- You want probabilities to threshold, sort by, or gate on, rather than a confident-sounding sentence.
Look elsewhere when
- You need an explanation: Jev gives numbers, never a rationale.
- You need generation: summaries, rewrites, code, replies. Pair it with an LLM instead.
- The set of possible answers is open-ended or unknown until you see the input.
- You need to self-host or inspect weights: Jev is a hosted, closed-weights API.
Try it in one minute
- Get a key from OpenRouter, Vercel AI Gateway or TypeSafe.
- Open the playground, pick the provider in the top bar and paste the key. It stays in your browser’s localStorage and is forwarded per request; this site never stores it.
- Pick a scenario, swap the state with one of the variants, hit Evaluate, and watch the probabilities move.