· 12 min read
System 1 Decision Models: Why TypeSafe's Jev is Displacing Generative LLMs for Enterprise Decisions
An architect's review of TypeSafe's Jev System One decision model: typed Choice, Score and Noul answers, confidence-gated routing, pricing and failure modes.
The Problem
Many enterprise AI deployments route categorical decisions (which team owns this ticket, is this message a cancellation, is this tool call safe) through the same large generative models used to draft emails and write code.
A typical example: a team classifies millions of inbound customer emails a month into four buckets (billing, technical support, security incident, sales) and routes each one downstream. The implementation sends a long prompt to a frontier chat model and asks for {"department": "..."} back. It works, so it ships.
It also has four structural problems that get worse with volume.
Latency from generation. Generative models produce output token by token. Even a short JSON answer means prompt processing plus several sequential decode steps, a network round trip, and often queueing at the provider. For a decision that sits synchronously in an event pipeline, that cost lands on every request.
Paying for formatting. On most frontier APIs, output tokens are list-priced at several times the input-token rate. When the answer is {"department": "billing"}, much of what you pay for is braces, quotes and key names.
Valid but wrong answers. Structured outputs and grammar-constrained decoding (OpenAI’s structured outputs guide is a good reference) guarantee that the output parses. They do not guarantee the label is correct. A message reading “our account has been locked for 18 hours and we are losing revenue every hour” can still come back as enterprise_sales, in perfect JSON.
Confidence you cannot use. Asking a chat model to “also return a confidence between 0 and 1” gets you a number it generated, not a measured probability. There is published evidence that post-training hurts calibration: the GPT-4 Technical Report shows the pre-trained model was well calibrated and the post-trained model much less so. Guo et al. (2017) showed that modern neural networks are often overconfident even before any alignment step. If your escalation logic gates on confidence, an overconfident number suppresses escalation for exactly the cases that need it.
Daniel Kahneman’s split between System 1 (fast, automatic pattern recognition) and System 2 (slow, deliberate reasoning) is a useful frame here. Many pipelines use System 2 machinery for System 1 work.
The Architectural Solution
The pattern is older than any one vendor: put a fast discriminative classifier in front, and send only the hard cases to an expensive generative model. Teams have built it for years with fine-tuned BERT-class models, logistic regression on embeddings, or small distilled LLMs. The new option in 2026 is a hosted, general-purpose decision model that needs no per-task training.
TypeSafe AI, co-founded by Diogo Almeida (a co-author of OpenAI’s InstructGPT paper), Erik Gafni and Sasha Sheng, released Jev in early access in September 2026 (TechCrunch, InfoQ). TypeSafe calls it a “System One model”. You send a state (text or JSON) and a set of typed questions, and you get back typed answers with probabilities. You do not get prose.
TypeSafe has not published Jev’s architecture. The company describes answers as produced in one pass, with all questions evaluated in parallel and in isolation against the same state. Outside observers suspect it is built on an open-weight LLM backbone. Treat the internals as unknown and judge the model on its interface and measured behaviour.
| Dimension | Generative LLM used as classifier | Jev (per TypeSafe docs) |
|---|---|---|
| Output | Text, optionally schema-constrained JSON | Typed answers: choice, score, noul |
| Uncertainty | Self-reported number, if prompted | Full probability distribution per question |
| Training objective | RLHF/RLVR on top of pre-training | “RLCD” (Reinforcement Learning for Calibrated Decisions); details unpublished |
| Pricing | Input + output tokens | $0.042 per 1M input tokens; output tokens free |
| Context | Typically 128k+ | 64k per request / 32k per question (262k with an opt-in header) |
| Can generate text | Yes | No |
Calibration: what it does and does not promise
TypeSafe says RLCD optimises probabilities against outcomes, and it does not claim more than that. Its own System One concept page states that calibration “is measured across groups of predictions; it does not guarantee that an individual answer is correct.” TypeSafe has not published the loss function. I have seen no public evidence for the claim that it minimises the Brier score specifically.
Two practical consequences:
confidenceis not “probability of being correct”. In Jev,confidenceis a statistic derived from the shape of the distribution. For a Choice with n options it is(p_max − 1/n) / (1 − 1/n)(Confidence docs). A 4-way Choice withp_max = 0.82has confidence 0.76, not 0.82.- Calibration has to be verified on your own data. Build a reliability diagram from a labelled sample of your own traffic before you trust any threshold, and do it again whenever the model version changes.
The question primitives
choice: pick one option from a map oflabel → description(up to 255 options). Returnschoice,probabilities(summing to 1) andconfidence.score: rate against an ordered array of level descriptions (2 to 10 levels). Returnsscoreas an expected value across levels (for example 1.43 on a 0–2 scale),probabilitieskeyed"0","1"and so on, alegend, andconfidence.noul: a yes/no question with optionaltrue/falsecriteria. Returns a single probabilitynoulin [0, 1] and no separate confidence.
An experimental box primitive for image localisation also exists behind an opt-in header.
Access
Calls go to POST https://api.typesafe.ai/v1/systemone with a bearer token. Official Python (typesafe-sdk) and JavaScript/TypeScript (@typesafe-ai/sdk, Node.js 22+) SDKs handle retries on 408/429/5xx. Model IDs as of this writing are jev-1.13.0 and jev-1.14.0. The jev-latest alias points to the latest stable release and jev-preview to the newest build (Models). If you tune thresholds, pin a versioned ID: an alias can move under you and shift your probability distributions.
Economics: do the arithmetic yourself
Jev bills input tokens only, and that includes your question instructions and criteria, not just the state. Take 10 million emails a month at roughly 500 input tokens per request including questions:
- 10M × 500 = 5 billion input tokens × $0.042 per million = about $210 per month at list price.
For the generative baseline, use calls × (input_tokens × input_price + output_tokens × output_price) with your provider’s current list prices and your real prompt length. Chat-style classification prompts are usually much longer than the email itself because of instructions and few-shot examples.
Treat vendor headline numbers with care. TypeSafe’s homepage advertises “193.6x faster, 444.6x cheaper” on its own workflows. An independent OpenChamber analysis of launch-week user reports, cited by InfoQ, found a median 7x speed-up and 30x cost saving, with median reported latency around 76 ms. The same article quotes TypeSafe at 70–500 ms end-to-end. One early adopter quoted there found Gemini slightly more accurate on email classification but 10–20x more expensive. That is the realistic shape of the trade-off: large savings, comparable but not always better accuracy.
Architecture Diagram
In production, the decision model works as a reflex gate at the front of the pipeline. Each event is evaluated once against several questions. Events that clear calibrated thresholds go straight to deterministic handlers. Ambiguous cases go to a generative model or a human. Low-confidence results and API failures both take that escalation path, so the gate fails closed.
The split between automated and escalated traffic is a result you measure, not a design constant. In my experience, a 70–95% automation rate is common for well-scoped routing tasks, but it depends on label quality, how many classes there are, and how aggressive your thresholds are.

Core Implementation
The TypeScript below uses the official @typesafe-ai/sdk package. It asks four questions in one request: department, active SLA breach, churn intent, and frustration level. Routing stays in code. Note three choices in it:
- The model version is pinned.
- Asymmetric costs get asymmetric thresholds: a 30% chance of a security incident pages someone, while ordinary routing needs high confidence.
- Any API failure fails closed to escalation.
import { choice, noul, score, TypeSafeClient } from "@typesafe-ai/sdk";
// Pin the version your thresholds were tuned on; `jev-latest` can move.
const client = new TypeSafeClient({ defaultModel: "jev-1.13.0", timeout: 2_000 });
// Placeholder thresholds: derive real values from a labelled sample of your traffic.
const T = { securityPage: 0.3, slaPage: 0.85, autoRoute: 0.6, churnFlag: 0.75 };
const questions = {
department: choice("Which team should handle this customer message?", {
security_incident: "Account takeover, suspected breach, leaked credentials, unauthorised access",
billing: "Invoices, refunds, chargebacks, failed payments, cancellations of billing",
technical_support: "Bugs, API errors, outages, integration failures",
sales: "Licensing, procurement, pricing, contract or volume questions",
other: "None of the above",
}),
slaBreach: noul("Does the customer report a production outage or ongoing business loss happening now?"),
churnIntent: noul("Does the customer explicitly say they intend to cancel or switch to a competitor?"),
frustration: score("How frustrated does the customer sound?", [
"Calm or neutral",
"Concerned but polite",
"Clearly upset",
"Hostile or threatening",
]),
};
export type RoutingAction = "PAGE_ON_CALL" | "AUTO_ROUTE" | "ESCALATE_TO_SYSTEM_2";
export interface TriageVerdict {
action: RoutingAction;
department?: string;
departmentConfidence?: number;
churnFlag?: boolean;
frustration?: number; // expected level, 0..3
model?: string;
error?: string;
}
export async function triageEmail(body: string, sender: Record<string, string>): Promise<TriageVerdict> {
try {
const { answers, model } = await client.systemOne({
state: { email: body, sender },
questions,
});
const dept = answers.department;
const verdict = {
department: dept.choice,
departmentConfidence: dept.confidence,
churnFlag: answers.churnIntent.noul >= T.churnFlag,
frustration: answers.frustration.score,
model, // log the resolved version alongside every decision
};
// Asymmetric cost: page on modest probability of a security incident.
const pSecurity = dept.probabilities["security_incident"] ?? 0;
if (pSecurity >= T.securityPage || answers.slaBreach.noul >= T.slaPage) {
return { ...verdict, action: "PAGE_ON_CALL" };
}
if (dept.choice === "other" || dept.confidence < T.autoRoute) {
return { ...verdict, action: "ESCALATE_TO_SYSTEM_2" };
}
return { ...verdict, action: "AUTO_ROUTE" };
} catch (err) {
// SDK has already retried 408/429/5xx with backoff. Fail closed.
return { action: "ESCALATE_TO_SYSTEM_2", error: err instanceof Error ? err.message : String(err) };
}
}
Detecting secrets such as API keys, private keys and card numbers is deliberately left out. That job belongs to deterministic scanners (regex, entropy checks, Luhn validation) that run before the model. TypeSafe’s own jaggedness notes say Jev is weak at numeric and character-level tasks.
An illustrative response shape for a high-urgency outage email is below. The values are hand-written to show the structure and are not captured output:
{
"model": "jev-1.13.0",
"answers": {
"department": {
"type": "choice",
"choice": "technical_support",
"confidence": 0.775,
"probabilities": { "technical_support": 0.82, "security_incident": 0.11, "billing": 0.04, "sales": 0.02, "other": 0.01 }
},
"slaBreach": { "type": "noul", "noul": 0.97 },
"churnIntent": { "type": "noul", "noul": 0.41 },
"frustration": {
"type": "score",
"score": 2.72,
"confidence": 0.7,
"legend": { "0": "Calm or neutral", "1": "Concerned but polite", "2": "Clearly upset", "3": "Hostile or threatening" },
"probabilities": { "0": 0.01, "1": 0.04, "2": 0.17, "3": 0.78 }
}
},
"usage": { "input_tokens": 512, "output_tokens": 48 }
}
Here slaBreach.noul = 0.97 clears 0.85, so the email pages on-call. usage.output_tokens is reported but not billed.
Edge Cases & Limitations
It does not generate. Jev cannot draft replies, summarise or write code. Use it to decide what should happen, and use a generative model to write the response.
Documented failure modes. TypeSafe’s jev-1.13 jaggedness page lists them candidly:
- Literal reading of instructions.
- Unreliable counting, arithmetic and date comparison.
- Weaker multi-hop or indirect questions.
- Lower accuracy when the state is large and mostly irrelevant.
- Susceptibility to adversarial content in the state.
- A bias toward the first Choice option.
Keep math and dates in code, filter the state before sending it, and test with shuffled option order.
Prompt injection is not solved. The state is untrusted user content, and text written to argue for its own classification can move the answer. Never let a single Noul be the only control on a security-relevant action.
Questions are independent. Every question in a request sees the same state and none sees the others’ answers. If question B depends on the answer to A, either make two calls or ask every speculative variant up front and choose in code.
Context limits. The defaults are 64k tokens per request and 32k per question. The long-context header raises both to 262k, but TypeSafe says it is slower and less accurate. Retrieve and trim instead.
Language and domain coverage. English is the primary training language. For other languages, or for niche vocabularies such as internal product codes or pharmaceutical and legal taxonomies, measure accuracy and calibration on labelled samples before automating.
Vendor and maturity risk. This is an early-access product from a young company. No independent peer-reviewed benchmark exists yet, and there is no fine-tuning: the same weights serve every customer. Keep the integration behind an interface so you can fall back to a generative model or your own classifier. Log every request, the resolved model version and the outcome, so you can re-tune thresholds when versions change.
When not to use it. Skip it if you already have a fine-tuned in-house classifier that is accurate, cheap and well understood. Skip it if your data cannot leave your boundary (check the zero-data-retention terms first). Skip it where decisions need an explanation chain for regulators, because a probability is not a rationale.
Key Strategic Takeaways
The point is not that Jev is a better LLM. For bounded decisions, free-text generation was the wrong output contract in the first place. Design the pipeline in two tiers:
- Tier 1, the reflex layer: a decision model or classifier that returns typed answers with distributions, for routing, triage, guardrails and filtering.
- Tier 2, the reasoning layer: generative models for synthesis, open-ended reasoning, and the cases Tier 1 escalates.
Three principles carry over whichever vendor you choose:
- Gate on measured uncertainty, not on self-reported confidence. A model whose probabilities you have checked on your own data is safer to automate than a more accurate model whose confidence you cannot interpret.
- Set thresholds per action by cost of error. Paging on a 30% security signal and auto-routing at high confidence can both be right in the same pipeline.
- Fail closed and log everything. API failures, low confidence and “other” all escalate. Every decision records its model version so a silent alias change cannot quietly move your error rates.
For broader guardrail design around agentic systems, see Agentic AI enterprise guardrails.
Recommended Industry Reading & References
- TypeSafe docs: Models, pricing and context limits. Model IDs, aliases, per-input-token pricing and long-context behaviour.
- TypeSafe docs: Confidence. Exact formulas for Choice and Score confidence and how they differ from probability.
- TypeSafe docs: Jev 1.13 jaggedness. The vendor’s own list of failure modes and mitigations.
- InfoQ (2026): TypeSafe AI Releases Jev. Launch coverage with independent user-reported latency and cost figures and practitioner criticism.
- Ouyang et al. (2022): Training language models to follow instructions with human feedback. The InstructGPT paper, the RLHF approach that TypeSafe positions RLCD against.
- OpenAI (2023): GPT-4 Technical Report. Includes the calibration comparison between pre-trained and post-trained models.
- Guo et al. (2017): On Calibration of Modern Neural Networks. The standard reference on overconfidence, reliability diagrams and temperature scaling.
- Brier (1950): Verification of Forecasts Expressed in Terms of Probability. The original proper scoring rule for probabilistic forecasts.
- Anthropic (2024): Building Effective Agents. Routing and orchestration patterns where a fast decision layer fits.
- Daniel Kahneman (2011): Thinking, Fast and Slow (Farrar, Straus and Giroux). The source of the System 1 / System 2 framing.