Decision models

Your decisions, your model

On 15 September 2026 TypeSafe AI launched Jev, the first “System One model”: an AI model that never writes a sentence. It reads the state of your program and a set of typed questions and returns answers with probabilities in a single pass, in well under a second, for cents per million tokens. Within five days the open-source community had reproduced the contract six different ways. Jev itself remains closed, hosted and impossible to fine-tune. This is about the shape Jev proved, what the independent numbers say, and how you train, calibrate and govern your own.

STEAV10 min read

A model that never writes a sentence

A System One model evaluates a state and returns typed answers and probabilities. It does not write replies, produce code or generate explanations. TypeSafe borrowed the name from Kahneman: System 1 is the fast, instinctive judgment, System 2 the slow deliberation. The pitch is to keep a large language model for open-ended reasoning and generation, and to hand the thousands of small decisions around it — routing, gating, triage, judging — to a model built only for decisions.

TypeSafe AI, “System One” concept docs and “Introducing System One models and Jev”, 15 Sep 2026

The contract is small. You send a state, a string or a JSON document, and a set of named questions. A choice question offers up to 255 options and returns one, with a probability for each. A score question offers two to ten ordered levels. A noul question asks whether a proposition holds and returns the probability that it does. Questions are evaluated in parallel and in isolation, so a request carrying forty questions costs one pass and no question contaminates another.

That is also why it is fast and cheap. Nothing is decoded. The model reads the state once and produces a distribution over the answers you declared, so a decision costs a prefill rather than a generation, and the answer cannot fall outside the schema. The mechanism is not new. Reading a classification off the logits of a language model is how MMLU has been scored since 2020, and encoder classifiers are older still. What is new is the product: questions defined at run time, probabilities that are meant to be believed, and a price that makes it reasonable to ask a model something a hundred times per request.

Jev: 70–500 ms per request; $0.042 per million input tokens, output free; hosted API only — TypeSafe pricing and quickstart, Sep 2026
The System One contractEvidence and typed questions in. Distributions out. One decision for the caller.
Question names, answers and probabilities are invented. The contract shapes are the platform's own.

Five days to reproduce the contract

Jev shipped on a Monday. By Tuesday there was jevlike, a from-scratch option scorer under an MIT licence. By Thursday there were three serious open models: Convai's Laya, a 421-million-parameter ModernBERT with a marker-scoring head, trained with a re-implementation of TypeSafe's calibration objective; Jared Palmer's kev, a Qwen adapter with a pointer head trained on six public datasets rendered as questions; and trycua's CUA-S1-FORMS, a 706,048-parameter byte-level specialist that beat Jev on the one form-filling task it was built for and nothing else. By the weekend an awesome-list counted roughly a hundred projects.

Laya (Apache-2.0) · kev (Apache-2.0) · CUA-S1-FORMS (MIT) · cobanov/awesome-jev, 21 Sep 2026

Every one of them, independently, converged on the same architecture: encode the state once, then score each declared answer with a small head. The architecture is not the moat. Two things are: the training that makes the probabilities honest, and the breadth of decision data it was trained on. TypeSafe calls its training RLCD, reinforcement learning for calibrated decisions: the rewards are proper scoring rules against verifiable ground truth, so a model is paid for saying 0.7 only when it is right about seven times in ten. No paper, no weights and no reliability curve have been published for Jev, and that is exactly the gap the open models are racing to close.

TypeSafe launch post (RLCD, Brier scoring) · Laya model card (REINFORCE with logarithmic and spherical scoring rewards, per-bucket temperature) · kev README

What the independent numbers say

Vendor benchmarks are vendor-built, and TypeSafe says so: its four published workflows are labelled by LLM consensus. Third-party tests are more useful, and in the first week there were several with code and data.

  • Event moderation. NearHere, a UK events site, ran 132 hand-built cases through Jev, Gemini Flash-Lite and Mistral Small, each tuned separately. Jev scored 96% against 86% and 84%, rejected no valid event, and cost $0.043 per thousand decisions.
  • LLM-judge replacement. A writer at Every put 37 documents through 21 questions each: 777 judgments in under 0.7 seconds for about a quarter of a cent, with the honest caveat that he wanted an accuracy check before trusting it in production.
  • Clearing a review queue. A product-matching team ran 9,081 candidate pairs for $0.32 in 13 minutes. Jev refuted 49%, confirmed 21% and abstained on 30%, and the one case a human disagreed with went Jev's way on inspection.
  • Public classification sets. jev-benchmarks measured 0.910 on AG News, 0.870 on Banking77's 77 intents and 0.480 on DAIR Emotion, with coverage at 5% error of 0.83, 0.86 and zero. On the emotion set Jev put zero probability on the true label 16% of the time.
nearhere.events (n=132) · every.to · paddo.dev · AbdelStark/jev-benchmarks (n=100 per set), all Sep 2026

Two lessons matter more than any single number. First, the model is strongest on narrow, well-posed questions and weakest on ordinal and emotional ones. Second, it is sensitive to how a question is asked. In one phishing test a single question scored 62.6%; the same task split into five questions and weighted with a logistic regression fitted on a thousand labels scored 95.0%. The decomposition helped Jev and hurt the LLM it was compared with. A System One model rewards question design and a small labelled set, which is another way of saying it rewards an evaluation harness.

Fifty hand-labelled rows cannot test whether 0.85 means 85%.

That is the third lesson, and the one we care about most. Calibration is a property you measure on your own decisions, with enough of them to see whether the confident ones are right more often than the hesitant ones. A third-party measurement put Jev's expected calibration error at 0.144 on one typed-decision set; TypeSafe has not published its own. Neither number tells you what Jev does on your data.

ECE 0.144 on typed-decisions: Convai's Laya evaluation of Jev, Sep 2026 · TypeSafe confidence docs

You cannot fine-tune Jev

Search for “fine-tune Jev” and the honest answer is that you cannot. Jev is a hosted model with no published weights, a waitlist and a vendor-run evaluation. You can prompt it, decompose questions for it and fit a logistic layer on top of it. You cannot change what it learned, run it inside your own network, or show an auditor what made a decision. For a routing hint that is fine. For a decision that gates a claim, a transfer or a clinical handoff, it is the wrong side of your boundary.

There are three ways to get a System One model you own, and CID supports all of them on the same contract.

Three paths to a decision model you ownServe, fine-tune or train. Every path ends on the same route, audit trail and policy layer.
An illustrative map of the options, not a claim that every base model or dataset fits every path.
  1. Serve an open model as a decision model. Any open language model can answer typed questions today by reading the answer off its next-token logits. No training, one afternoon, and uncalibrated out of the box.
  2. Fine-tune an open System One model. Laya and kev are Apache-2.0. Fine-tune one on your decision logs, add a calibration stage, and you have a model that knows your questions.
  3. Train your own from a base model. Start from a small base model, render public labelled sets and your own audit trail as questions, and train the head and adapter with the objective TypeSafe describes.

Path 1 on CID today: register, serve, calibrate

CID has spoken the contract since 18 September. Register a model with model_type: probabilistic and CID exposes POST /v1/systemone for it, validated server-side and behind the same authentication, rate-limit, attribute-based access control and tenant chain as every other route. A chat turn on a probabilistic model becomes a typed decision, and the reply carries the decision next to the text. Every decision is a platform event, attributed to a caller and admitted by a policy.

/v1/systemoneRequest and response · abridged
POST /v1/systemone
{
  "model": "claims-triage",
  "state": { "claim_id": "C-4471", "amount": 18400, "notes": "…" },
  "questions": {
    "route":  { "type": "choice", "description": "Who should handle this claim?",
                "options": [ { "id": "auto_approve" }, { "id": "adjuster" }, { "id": "fraud_review" } ] },
    "urgent": { "type": "noul", "description": "Does this claim need a response today?" }
  }
}

{
  "decisions": {
    "route":  { "type": "choice", "value": "adjuster", "confidence": 0.81,
                "probabilities": { "auto_approve": 0.11, "adjuster": 0.81, "fraud_review": 0.08 } },
    "urgent": { "type": "noul", "value": false, "confidence": 0.77,
                "probabilities": { "true": 0.23, "false": 0.77 } }
  },
  "backend": "cid/model-studio-system-one/s1-v1"
}
Shapes are the platform's request and response contract. Names, amounts and probabilities are invented.

The serving side is a scoring backend. Ours today is a llama.cpp fork that prefills the state once, evaluates every question against the cached prefix and reads a distribution off the answer slots, with thinking disabled so the first token is the answer. On a Qwen3.5-4B base it agrees with the OpenJev reference on 94.1% of its fixture. It is not calibrated, and it says so. Calibration is the afternoon's second task: score a thousand of your recorded decisions, fit a temperature per question shape, and you have a baseline every trained candidate has to beat.

steav-platform PR #319: probabilistic model type, /v1/systemone, chat dispatch · llama.cpp fork steav/openjev-systemone · contextual calibration after Zhao et al., ICML 2021

Paths 2 and 3: Model Studio trains it

Model Studio is CID's training pipeline: data_prep -> train -> aggregate -> eval -> benchmark -> validate -> deploy, with signed artifacts, retained evaluation sets and readiness checks at every handoff. As of this week it has a decision-model recipe. Set training.method to system_one and the same pipeline trains, evaluates and publishes a System One candidate instead of a text adapter.

steav-platform PR #329, merged 21 Sep 2026: Model Studio System One recipe, trainer profile s1-v1

The data is your decisions. Each row carries a state, the evidence the decision saw; a question in the same shape the API accepts; and a gold answer, which may be an option, a yes or no, a probability, or a full distribution when the right answer is genuinely uncertain. Rows that share evidence and a question never straddle a split, so the held-out set is really held out.

Training runs in three stages. A supervised stage teaches a small scoring head, attached to a low-rank adapter on the base model, to put probability on the recorded answer. A reinforcement stage then does what TypeSafe describes: it samples perturbed versions of each decision, scores them with proper scoring rules — the logarithmic and spherical scores, plus a ranked score for ordered levels — and pushes the model toward the distributions that would have been rewarded, with the supervised loss kept in the objective so the reward cannot be gamed. A calibration stage fits one temperature per question type and answer count on the validation split, and records which buckets were fitted and which were left alone because the data could not support a fit.

RecipeTraining and evaluation · abridged
"training": {
  "method": "system_one",
  "lora_rank": 16, "learning_rate": 0.0002, "epochs": 3,
  "system_one": {
    "head": "pointer", "head_hidden_size": 256, "head_learning_rate": 0.001,
    "rlcd_epochs": 1, "group_size": 8,
    "sigma_start": 0.4, "sigma_end": 0.1,
    "spherical_weight": 0.75, "rps_weight": 1, "ce_weight": 1
  }
},
"compute":    { "profile": "s1-v1" },
"evaluation": { "min_accuracy": 0.85, "max_ece": 0.05, "max_latency_ms": 100 }
Field names are the shipped schema. The head and RLCD values are the reviewed defaults; the gates are an example, not a recommendation for your data.

Evaluation is where a decision model earns its name. The held-out set is scored for accuracy, for the loss of its probabilities, for expected calibration error and Brier score, and for coverage: the largest share of decisions the model can take on its own while keeping selective error under five percent. Two more numbers guard against fooling ourselves. The loss is compared with the untrained readout baseline from Path 1, so a candidate has to beat what you could have had without training. And every question is scored a second time against another row's evidence; if accuracy barely drops, the model is reading the question and not the state.

GateWhat it checks
min_accuracyHeld-out decision accuracy after calibration.
max_eceExpected calibration error on the holdout: 0.7 has to mean about 70%.
max_loss, max_regressionDecision cross-entropy, absolute and relative to the untrained readout baseline.
max_latency_msMeasured decision latency, p50, on the runner that will serve it.
Shuffled-evidence controlReported with every run: accuracy against the wrong state should collapse.

A candidate that passes is published to the registry as a probabilistic model, tagged for decision dispatch, signed, and carrying its scoring head and calibration sidecar next to the adapter. A serving script loads it behind the same /v1/systemone route, and refuses to load a candidate whose recorded trainer hash differs from the one retained with the run.

steav-platform docs/model-studio.md, “System One decision models”: metrics accuracy, ece, brier, coverage_at_error_5, shuffled_state_accuracy; gates evaluation.min_accuracy, evaluation.max_ece

The decision stays inside your boundary

Hosted decision APIs put the decision on the wrong side of the line. The state you send is the most sensitive thing your application holds, because it is the thing the decision is about: the claim, the message, the account, the record. On CID the model runs where your data already is, the caller is authenticated and authorised by attribute policy before the question is asked, the tenant boundary holds, and the decision is written to the audit trail with the policy that admitted it and the version of the model that made it. When a regulator asks why a transfer was flagged, the answer is a record, not a support ticket.

The same boundary makes improvement safe. Outcomes become labels. Temperatures are refitted on a schedule. A retrained candidate has to pass the same gates as the first one, against a baseline that is now yesterday's model.

What we will publish next

We have said nothing here about how good a CID-trained System One model is, because we do not yet have a number worth printing. The recipe has been verified end to end on a small fixture, which proves the pipeline and nothing about quality. The next post will carry accuracy, calibration error and coverage on real decision families, measured the way we would ask a vendor to measure, and the public jev-benchmarks sets scored the same way, so the comparison is a fine-tuned model against a zero-shot API and labelled as such.

Questions we keep getting

  • Can I fine-tune Jev? No. Fine-tune an open System One model, or train one. Both run on CID.
  • Is this just a classifier? Mechanically, yes: a scoring head over an encoding of the state. The differences are that the questions are defined at run time, the probabilities are trained to be calibrated, and many questions share one pass.
  • How many labels do I need? Tens of thousands of questions across ten or more decision families is the working range in the open reproductions. With fewer, start with Path 1 and calibrate on what you have; a thousand recorded decisions is enough to fit temperatures.
  • What about images? Not yet, for Jev or for our recipe. Text and structured state only.
  • How do I know my confidences are calibrated? Measure it: expected calibration error and a reliability curve on held-out decisions, refitted as the data moves. If a vendor will not show you theirs, that is your answer.
All news

Own the decision layer.

Explore CIDTalk to STEAV