Is this true?
“Does the customer report a charge they did not authorize?”
Returns one probability from 0 to 1. Use it for flags, gates and yes/no checks.
Agentic AI / Models
A practical guide · Updated November 2026
A System 1 model, also called a decision model, takes some text and a set of typed questions. It doesn't write a reply. It returns a number for each question: how likely something is true, which option fits best, or where the case sits on a scale. The answer usually arrives in well under a second, and your software can set thresholds on it, test it, and act on it.
Every organisation makes a steady stream of small judgement calls about text. A support agent reads a ticket and decides how urgent it is. A claims handler decides whether a claim needs an adjuster. A lawyer skims a contract to see who should review it. Each call takes a person a minute, but there are thousands of them, and they don't fit simple rules because the input is free text.
A System 1 model is a language model built for these calls. You give it the text, the questions you want answered, and the answers it is allowed to give. In return you get a probability for each allowed answer, and your software decides what to do with those numbers.
You will see two names for this category. System 1 comes from Daniel Kahneman's Thinking, Fast and Slow, where System 1 is fast, intuitive judgement and System 2 is slow, deliberate reasoning. TypeSafe AI introduced the term with its Jev model in September 2026. Microsoft, OpenAI, Perplexity and others call the same thing a System 1 model. This guide treats the two names as the same thing, and calls chat and reasoning models System 2.
Helpful for a person to read. But your code has to interpret “fairly” and “probably”, and the next run may word it differently.
You chose the questions and the allowed answers. Each comes back as a number your code can compare with a threshold.
These work together rather than compete: code checks the hard facts, the System 1 model judges the text, and people handle what stays uncertain. If you already have thousands of labelled examples for one narrow task, a purpose-trained classifier is another option.
Many chat models can reply in a fixed JSON shape. That fixes the format of the answer, not the information in it. You still get one answer the model wrote, and a “confidence” field is just more generated text: the model's description of how sure it is, not a measured probability.
{
"team": "billing",
"confidence": 0.9
}
One answer. The 0.9 is written like any other word, so nothing shows that “payments” was a close second, and a threshold on it means little.
Every allowed answer gets a probability you can check against labelled cases. The near tie is visible, so this case can go to a person.
The two combine well. Use structured outputs to extract facts such as names, amounts and dates, check those facts in code, then put them in the state and let the System 1 model make the judgement.
Pick a cut-off such as 0.8 and act automatically above it.
Compare outputs with labelled cases and measure accuracy and calibration.
Send work to a queue, a team or a person based on the answer.
Store the inputs, questions and probabilities so you can explain every decision later.
The next two sections cover where these models pay off and how they work alongside chat and reasoning models. After that the guide turns technical.
A System 1 model earns its place where software makes the same kind of judgement about text thousands of times a day. Five kinds of work cover most uses so far.
Send each ticket, claim or email to the right team, queue or workflow.
Check an AI agent's inputs, planned actions and answers before they go further.
Pick the tool, skill or model for a request, and send only the hard ones to an expensive model.
Filter out what doesn't need a reasoning model or a person at all.
Ask the same questions of a million reviews, records or log lines and analyse the answers.
System 1 models work beside chat and reasoning models. In the usual design the fast model handles the routine cases and passes the rest up, to a reasoning model or to a person.
| System 1 model | System 2 model (chat, reasoning) | |
|---|---|---|
| Returns | Probabilities for answers you define | Written language, plans, code |
| Speed | One pass, usually tens to hundreds of milliseconds | Seconds, and longer with reasoning |
| Billing | Input tokens only, at most providers | Input and output tokens |
| Strong at | Routing, gating, scoring, checking | Reasoning, drafting, explaining, using tools |
| Weak at | Writing, multi-step reasoning, numbers and dates | Cost and speed at volume; its self-reported confidence is just more generated text |
| Role in an agent | The reflex around each step: route, check, gate | The deliberate worker inside the step |
The defaults are illustrative: about 700 input tokens at $0.04 per million for System 1, and a one-cent, eight-second reasoning call for System 2. Every request pays for the System 1 call; escalated requests pay for both. Replace the figures with your own. The agentic design pattern library on this site covers System 1 / System 2 escalation alongside the other patterns.
In depth
Every request has two parts: the state, which is the text being judged, and the questions, each with a type, instructions and criteria. The response has one answer per question, plus token usage.
The values are invented. The shape follows the /v1/systemone format used by TypeSafe and Microsoft Foundry. Other providers use different field names, so check the documentation for the model you use.
A chat model runs once for every token it writes. A System 1 model reads the input once and returns the distribution for every question.
Each question is judged against the same state without seeing the others, so adding questions barely changes response time.
The answer is always one of the answers you defined. That guarantees the format. It says nothing about whether the answer is right.
Providers train these models so that stated probabilities track how often answers are right. TypeSafe calls its method RLCD. Check the result on your own data.
Standard library only. The later code examples reuse this ask() helper.
import json, os, urllib.request
# Microsoft Foundry: https://<resource>.services.ai.azure.com/providers/microsoft/v1/systemone
URL = os.environ["S1_ENDPOINT"]
TOKEN = os.environ["S1_TOKEN"]
MODEL = os.environ["S1_MODEL"] # model name, or your deployment name on Foundry
def ask(state, questions):
body = json.dumps({"model": MODEL, "state": state, "questions": questions}).encode()
req = urllib.request.Request(URL, body, {
"Content-Type": "application/json",
"Authorization": f"Bearer {TOKEN}",
})
with urllib.request.urlopen(req, timeout=30) as r:
return json.load(r)["answers"]
a = ask(
"My account payment has failed twice today. I need help before the end of the day.",
{
"urgent": {"type": "noul", "instructions": "Does the customer need help today?"},
"team": {
"type": "choice",
"instructions": "Which team should handle the request?",
"criteria": {"billing": "Payment and invoice issues",
"technical": "Software and integration issues"},
},
},
)
print(a["urgent"]["noul"], a["team"]["choice"], a["team"]["probabilities"])
Most decisions fit one of three shapes. APIs that follow TypeSafe's format call them noul (a yes/no probability), choice and score. Other providers say binary or boolean for the first. The type you choose determines what the answer looks like and what you can do with it.
“Does the customer report a charge they did not authorize?”
Returns one probability from 0 to 1. Use it for flags, gates and yes/no checks.
“Which team should handle this request?”
Returns the most likely option and a probability for every option, adding up to 1. Use it for routing and categories with no natural order.
“How quickly does this need a response?”
Returns a probability for each level and a score, which is the probability-weighted average (1.83 here). Use it for severity, priority and risk.
The model only knows what the question tells it. Clear instructions and well-separated options matter more than anything else you control.
“Bad” for whom, and judged on what? The answer will drift with tone and wording.
Names the condition and limits the evidence to the input.
A failed card payment fits all three, so probability gets spread across them.
Each option has a definition, and the definitions don't overlap.
“Medium” means different things to different readers, and to the model.
Each level is tied to something observable.
Several judgements hide in one question, and you can't see or adjust how they were weighed.
Three narrow answers, combined in your code with weights you control.
Six patterns cover most production use. Each keeps the model's job narrow and leaves control flow, weights and thresholds in your code. The snippets use the ask() helper from section 04.
The same three question types cover very different work. These are invented examples with illustrative results.
A probability becomes an action once you choose thresholds. A common pattern uses two: act automatically when the model is confident in either direction, and send the uncertain middle to a person. Drag the sliders to see the trade-off on 16 labelled example cases.
A model is calibrated when its probabilities match reality. Of all the cases scored 0.8, about 80% should turn out true. You check this by grouping labelled cases by predicted probability and comparing each group's prediction with how often it was actually true.
The chart shows two models. The blue one follows the diagonal, so its numbers can be read at face value. The orange one is overconfident: when it says 0.9, it's right only about 70% of the time. Thresholds set on an uncalibrated model don't mean what they appear to mean.
For choices and scores, look at the gap between the top two answers. “Billing 0.48, payments 0.44” is a near tie and a good candidate for review, even though billing technically wins.
For a noul, use the probability itself. For a choice, use the probability of the option you are about to act on. For a score, first check that the distribution is settled, then route on the score. Set a higher bar for actions that are harder to undo.
Send the exact same request many times and the answers may vary slightly. Before you automate anything, measure how much. The example below shows 20 identical runs of one noul question, with a 0.70 cut-off.
The category is weeks old, and the first independent tests are in. These are the failures reported so far, with what each one means for your design.
| What goes wrong | What was found | What to do |
|---|---|---|
| Manipulated input changes the decision | Check Point added plausible fake evidence to a due-diligence report. Jev's verdict flipped in 59% of attempts, and in 25 of 27 for the strongest attacker, at about $0.50 per success. A written warning against manipulation changed almost nothing. | Screen untrusted text before the model sees it. Typed output limits the format of an answer, not what can influence it. Keep irreversible actions behind a person, and attack the whole system before launch. |
| Confident and wrong on unfamiliar input | A small open model scored 0.000 accuracy on Khmer text while reporting 0.952 confidence. | Check language, script and format in code before the call. A confidence threshold cannot catch this. |
| Numbers, dates and counting | TypeSafe's documentation says Jev “is not a calculator”, treats dates as text, and counts less reliably as lists grow. | Do arithmetic, date logic and counting in code and pass the results in the state. |
| Literal reading | The model answers the wording, not the intent. Double negatives and questions that need several hops lower accuracy. | Write direct instructions with boundary cases. Split an interpretive question into literal ones. |
| Forced choice and option order | A choice always returns one of your options, even when none fits. Jev's documentation notes a lean toward the first option. | Add a “none of these” option or a companion noul (section 07). Shuffle the order in testing and check answers hold. |
| Too much state | Irrelevant detail lowers accuracy. Context limits run from 512 tokens on small encoder models to tens of thousands on hosted ones, and oversized requests are rejected. | Give each question only the context it needs. Filter in code or with a noul first. |
| Bundled questions on very small models | In one audit, putting several questions in one request flipped 11.7% to 22.4% of yes/no decisions on a 0.8B model, against 0.1% to 0.2% on a 4B model. | Use models of about 4B parameters or more for bundled requests, or compare bundled and separate answers on your own cases. |
| No explanation | You get numbers and no rationale. The same audit found attribution methods fast enough to use interactively, at 1.3 to 3.2 seconds per input. | Log state, questions and probabilities. Where an explanation is required, escalate to a System 2 model or a person. |
| Small models without fine-tuning | The 421M-parameter Laya model is reported at 0.362 accuracy zero-shot, close to a 0.318 random baseline, and 0.766 after fine-tuning. | Fine-tune small models on labelled data, or start with a larger one. |
Under shifted wording, models of 4B parameters or more had calibration error of 0.030 to 0.087. Generative baselines scored 0.144 using token probabilities and 0.378 using JSON output.
Asked to spot prompt-injection attempts aimed at an LLM, the same models reached 0.988 to 0.998 AUROC at 48 to 60 ms per decision.
The reported confidence was an exact function of the probabilities, such as how evenly they are spread. It is not an estimate of accuracy.
Sources: Check Point (manipulation test), Delaunay, arXiv 2611.12521 (audit), TypeSafe documentation (known rough edges), Sanjay Shankar (Khmer result, context limits), 47Billion (Laya figures). Retrieved November 2026.
A System 1 model reads your text and returns a few numbers. A chat model reads the same text and then writes its answer one token at a time. Most of the difference in cost and speed comes from that writing step.
Decision APIs typically bill input tokens only, because nothing is written back. Chat models bill every output token, usually at several times the input price.
Chat latency grows with every output token, and more again with reasoning. A System 1 model's answers arrive in one pass.
Extra questions add a little input, not a longer answer. One provider reports 67 ms for one question and 81 ms for fifty. In an independent test, one call judged 20 transactions in 0.4 s.
Open models in this category range from under half a billion to 27 billion parameters, so many are cheap to serve and can run on your own hardware.
Defaults: $0.04 is typical of the hosted decision APIs in section 15. $0.10 and $0.50 are the published input and output prices for OpenAI's GPT-6 Luna as reported in October 2026. Both sides include the questions in the input tokens. Sampling a chat model several times and counting the answers is the usual way to get rough probabilities from it.
| Model | Median latency | Measured by |
|---|---|---|
| System 1 models | ||
| Cloudflare Clef-flash | 39 ms | Cloudflare, on its own platform |
| Celeris-1 Decision | 67 ms | Celeris, from AWS us-east-1 (81 ms with 50 questions) |
| Microsoft-Decision-1 | 85 ms | Microsoft (P95: 125 ms) |
| TypeSafe Jev | 135–524 ms | Celeris measured 135 ms; Cloudflare measured 524 ms; TypeSafe states 70–500 ms |
| Chat model | ||
| GPT-6 Luna, strict JSON schema, reasoning off | 1.3–2.6 s | eesel.ai test |
| GPT-6 Luna, single short answer | 110 ms | Celeris |
Sources: benchlm.ai (Celeris figures), eesel.ai (Cloudflare figures, Luna test and price), MarkTechPost (Microsoft figures), Dave Kerr (20-transaction test). Retrieved November 2026.
A System 1 model is good at judgement calls on messy text. It shouldn't be the only thing standing between a request and an irreversible action.
Money limits, date comparisons, eligibility rules and anything mandatory should be checked with ordinary code. Pass the results to the model as part of the state.
Use the output to route, prioritise and pre-fill. Keep people in charge of approvals, especially for legal, financial and safety decisions.
A routing answer picks where the work starts. Steps your process requires, such as a compliance or security check, still happen whatever the model says.
Measure accuracy and calibration on real examples before you set thresholds, and keep measuring after launch.
Store the state, questions, model version and probabilities. Without that record you can't explain or correct a decision later.
The state often holds personal or confidential data. Treat logs, stored requests and exports with the same care as the source.
Each section above covers one piece. This is the order to use them in, from first draft to production.
System 1 models became a product category in autumn 2026, and new ones appear every few weeks. These are widely discussed options as of November 2026. Prices are reported list prices per million input tokens; none of these providers lists a charge for output. Check each provider's page before you rely on a figure.
| Model | Provider | Notes | Input, per 1M tokens |
|---|---|---|---|
| Hosted APIs | |||
| Jev | TypeSafe AI | Launched the category in September 2026 (launch post). Text, JSON and image state; up to 255 options per choice | $0.042 |
| Microsoft-Decision-1 | Microsoft Foundry | Deployed in your own Foundry resource; same /v1/systemone request shape; docs include a labelled-example test script | $0.042 reported |
| Decisions API | OpenAI | Runs on GPT-6 Luna with text and image input; opened in October 2026 | $0.10 reported |
| Celeris-1 Decision | Celeris | Cached input billed at the same rate (pricing) | $0.04 |
| d1-ultra | Liquid AI | Hosted on the Liquid API (docs) | $0.042 |
| Decider v1.2 and Decider Flash | Perplexity | 27B and 4B models (pricing) | $0.02 |
| GLiDE | Fastino | Described by Fastino as a decision model that reasons before it answers; weights under a community licence (pricing) | $0.04 |
| Drex Max | Nace.AI | Listed on BenchLM; hosted, with open weights for one version | $0.03 reported |
| Clef and Clef-flash | Cloudflare Workers AI | 27B and 9B; image and video input; open weights too (announcement) | $0.24 / $0.09 |
| Open weights: run on your own hardware | |||
| Strands Decider 2B | AWS Strands Labs | Apache 2.0; runs on a single consumer GPU (announcement) | Your hardware |
| d1 open models | Liquid AI | Small text, image and speech models from about 600M to 3B; LFM Open License | Your hardware |
| Decider v1 27B | Perplexity | Apache 2.0 weights of the hosted model | Your hardware |
| Laya | Convai Innovations | Apache 2.0; 421M-parameter encoder with a 512-token context; about 33 ms on a GPU; needs fine-tuning for good accuracy | Your hardware |
| SemIf | Community (formerly OpenJev) | MIT licence; built on a 4B base model; serves a Jev-compatible endpoint | Your hardware |
The Microsoft-Decision-1 price is not on its documentation page; the figure shown is from press coverage. The OpenAI price is from press coverage of the October release. Several community fine-tunes of 4B open models sit near the top of the JevBench leaderboard alongside Jev; they are not listed here because they change weekly.
LiteLLM exposes several providers behind one decisions endpoint, so you can test models without rewriting your code.
BenchLM tracks JevBench, a composite of accuracy, calibration, speed and cost, and links each provider's own results.
Sources: provider pages linked above; prices as reported by benchlm.ai and eesel.ai, October and November 2026.