geisten
← All research

Engineering

Jev-Style Decisions from Local Models: Turning a Chat Model into a Decision Model

Jev, TypeSafe's "System One" model, returns typed decisions instead of text. The same kind of decision can be read from a local language model with one prefill and no generated text. On JevBench's 231 public items, a local ternary 27B model gets 85.3 %, close to the 86.6 % published for the hosted Jev. But the real finding is a different one: asked clearly, a chat model answers just as well. What only the readout gives you is a probability you can trust, and that lets you automate the confident decisions and send the rest elsewhere. On speed, reading is only a little faster than a short chat answer; the real gains come from deciding where to think and from asking several questions over one read of a document.

26 October 202626 min readDr. Germar Schlegel

Here is something I noticed while building automation with language models: most of the time, I don’t actually need the model to write anything. I need it to decide. Which team gets this support ticket? Is this answer safe to send? Does this document belong in category A or category B?

A chat model can do all of that. But it answers in free text. Then I have to parse that text, the text can be malformed, and I have no idea how sure the model was. When I started, I thought the first two problems were the reason to do it differently. After measuring, I think the third one is: a decision is only useful in automation if you know when to trust it.

So this article is about reading decisions directly from a local model, and about what that really buys you, in accuracy, in trust and in speed:

  1. What Jev is, and how a decision can be read from any local model.
  2. How we do it in geistr, and what the community found.
  3. Whether the decisions are right, measured on JevBench.
  4. Whether you can trust the model’s confidence.
  5. Whether the model can think only when it is unsure, and leave the clear decisions to the fast readout.
  6. How fast it is, from reading the prompt to writing the answer.

Let’s get into it.

1. What is Jev?

Jev comes from a company called TypeSafe. They call it a “System One” model and describe it in one line: “unstructured state in, typed probabilistic decisions out”. You define the question and the allowed answers first; Jev returns a choice, a score or a yes/no probability. Jev is a hosted API in early access. TypeSafe has not published its weights, so you cannot run it yourself.

The same message sent to a generative model returns free text that must be parsed. Sent to a System One model with a defined question, it returns a typed decision: a choice, a score or a yes/no probability. All values are illustrative.

The independent developer guide at jevai.dev lists three output types: Choice (one option from a fixed list, with a probability per option), Score (a place on an ordered scale) and Noul (“a number from 0 (no) to 1 (yes) for a yes/no question”). Because the answer space is fixed before the call, the result always has the type you expect. But, as the same guide points out, “typed does not mean correct”.

2. Reading a decision instead of writing one

Think of a multiple-choice exam. You don’t ask the student to write an essay and then search the essay for the answer. You look at which box they tick.

A language model already does something like ticking boxes. At every position it computes a probability for every possible next token. So if the prompt lists the options with short keys, A, B, C, and ends exactly where the answer begins, the model’s probabilities for those keys are the decision. The model reads the prompt once, and nothing is generated. Two things follow:

  • The answer can never be malformed. It is always one of the options.
  • You get a probability per option for free. It tells you how sure the model is, which a written answer does not. Keep that in mind: it will turn out to be the most useful part.

The model itself is unchanged, so any open instruction model can be used this way. That is what makes the idea attractive for local hardware.

Quick recap. Instead of letting the model write, read its probabilities for the option keys where the answer would start. The result is always valid and comes with a probability per option.

3. How we do it in geistr

geistr is our open-source program for running language models on your own computer, built on our inference engine geistlib. You can install it from GitHub.

Decisions are an experimental feature. geistr decide renders the prompt in the model’s own chat template, with a fixed instruction, the optional context, the question and the options keyed A to Z, and stops right where the answer would start (for thinking models, with an empty thinking block). It checks that every key is exactly one token there and refuses the request otherwise; it never guesses. Then the engine reads the prompt once, and geistr turns the logits of the key tokens into probabilities over the options.

How geistr reads a decision: render the prompt, check that each key is one token, run one prefill, read the probabilities of the key tokens. The probabilities shown are illustrative.

$ geistr decide gemma4-e2b "I was charged twice. Which team handles this?" billing technical sales
billing
  billing    1.00
  technical  0.00
  sales      0.00

In a terminal, geistr shows each option’s probability; piped into another program, it prints only the chosen option. In a chat, /decide question | option | option does the same, and the C API and the Python package return the probabilities. It works with every chat model geistr runs. In this article I use two: Gemma 4 E2B (Q4KM), a small model, and Bonsai 2 27B (ternary, PQ2_0), a large one.

What the community found

Since Jev launched, many people have tried to rebuild it in the open. The project list on jevai.dev shows two approaches: training a decision model (more than twenty projects fine-tune an open model, mostly Qwen3.5 between 0.8B and 9B; others train small encoder decision models, such as one on ModernBERT), and reading decisions from an unchanged model, as AnyJev (Nokia Applied Research), local-jev and geistr do. Many measure themselves on JevBench, an independent benchmark with 231 public items in three tiers. These are their own numbers, not reproduced by us:1

System JevBench (231 items) Approach
Jev 1.13.0, hosted 86.6 % TypeSafe’s model
Tacit-9B (Qwen3.5-9B) 82.3 % self-distilled fine-tune
SemIf, Qwen3.5-4B 81.0 % readout
local-jev, Qwen3.5-4B 80.5 % readout, no training
local-jev, DeBERTa (NLI) 54.1 % encoder

Three things stand out. Readout alone gets close: an untrained 4B model is about six points behind Jev. The order of the options changes the answer: AnyJev reports that reversing the options flips 23.0 % of Qwen3-8B’s answers, and that reading every rotation and dividing out the model’s preference for some labels raises accuracy from 74.7 % to 80.3 % without a single label. Trained models can win, but the board moves fast: JevBench’s score blends accuracy, calibration, speed and cost. On its board of 27 September, three trained open 4B models ranked above Jev; under the changed method of v1.5.4, Jev 1.13 is ahead of those three again, and two systems built on a 12B model lead.2 TypeSafe released Jev 1.14 on 14 October with only its own internal measurements and no JevBench result; every Jev number in this article is for 1.13.0.

So which route? Training gives the best model for one kind of decision, but it needs data and compute for every new base model, can overfit a public benchmark, and for geistr would mean new architecture (geistlib runs no encoder models). Reading out needs no training, works on any model on the day it is released, and uses the same weights for chat and decisions, which matters on a small device; its weaknesses are bias and overconfidence. For geisten, the readout is the foundation.

4. Are the decisions any good?

I ran JevBench’s 231 public items through geistr decide with both models and let JevBench’s runner and scoring method compute every number. Each item maps to one decision: instructions become the question, the item’s state the context, its labels with their criteria the options (yes/no items become no and yes, score items 0 to n). This is the raw readout: one prefill per item, no option rotation, no calibration.3 The raw data, the adapter and the method are in benchmarks/jevbench_geistr_2026-10-14/.

System Correct Easy Original Hard ECE
Bonsai 2 27B 85.3 % 48/48 69/72 80/111 0.050
Gemma 4 E2B 61.9 % 48/48 48/72 47/111 0.353
Jev 1.13.0, hosted (published) 86.6 % 48/48 71/72 81/111

The Jev row is the published number from local-jev’s README. ECE is the expected calibration error: how far the stated probabilities are from the actual hit rate (lower is better).

  • Bonsai 2 27B almost matches the hosted Jev on the public items: 197 of 231 against 200, with no training. And its probabilities are honest: of the 146 items where it was at least 90 % sure, it got 99 % right.
  • Gemma 4 E2B is overconfident. It is at least 99 % sure on 85 % of the items, and right on only two thirds of those. Easy items are no problem; the hard ones are.
  • What this does not show: these are only the public items (the official board also uses sealed ones), we cannot rule out that the models saw them in training, and the comparison with Jev compares different runs and machines.
  • Under JevBench’s current time limit, Bonsai would score lower. Since late October the board counts a decision over 10 seconds as wrong. On this Mac, 50 of Bonsai’s 231 readouts took longer, all of them hard items; under that rule its 85.3 % becomes 70.6 %. Gemma never took longer than 7 seconds.4

5. Can I trust the confidence value?

Reading the decision does not make a model smarter. Asked in chat for exactly one label, the same models were about as accurate: Bonsai 84.4 % against 85.3 %, Gemma even 68.8 % against 61.9 %.5 What only the readout adds is a probability per option. If I can trust it, I can automate the sure decisions and send the rest somewhere else, for example from a small model to a larger one.

To measure that, I use one number throughout: automatable at ≤ 5 % error, the largest share of decisions, taken from the most confident down, whose error rate stays at or below 5 %.

Error rate among the automated decisions, taken from the most confident down, on 231 JevBench public items. Bonsai 2 27B stays at or below 5 % error up to 74 % of its decisions; Gemma 4 E2B only up to 25 %, then its error climbs to over 30 %.

Read the chart from left to right: the further a line stays flat at the bottom, the more decisions you can hand over without checking them.

For Bonsai, yes. It was at least 99 % sure in 42 % of the items and right in every one of them. Three out of four decisions can go through with at most one error in twenty.

For Gemma, no. A third of its “99 % sure” decisions were wrong. The two models differ by 23 points in accuracy, but by a factor of three in how much you can safely automate. Conformal prediction (Kumar et al.) gives the same picture: aiming to contain the right answer 90 % of the time (reached: Bonsai 91 %, Gemma 88 %), Gemma has to leave 2.1 of its 3.7 options open on average, Bonsai 1.2.6

But Gemma is not useless. Its own number cannot tell you when to trust it, but the kind of question can. JevBench’s tiers differ in how much work it takes to get from the text to the answer. Easy: the text names it (“The mug I received arrived smashed into pieces.” Intent? report_damage). Original: a short text and one rule to apply. Hard: a longer policy with several rules, exceptions and amendments to combine.

Gemma 4 E2B Items Correct Mean confidence Automatable at ≤ 5 % error
Easy: answer named in the text 48 100 % 1.00 100 %
Original: short text, one rule 72 67 % 0.99 17 %
Hard: long document, several rules 111 42 % 0.95 3 %
Prompt up to 300 tokens 137 77 % 0.99 40 %
Prompt over 300 tokens 94 40 % 0.94 about 2 %

Gemma is reliable when it only has to recognize the answer in a short text. As soon as it has to apply a rule, it is wrong in a third of the cases, on long documents in more than half, and still about 95 % sure. The form of the answer does not matter (choice and yes/no questions came out the same, 62.6 % and 62.2 %); the thinking the question needs does. This matches the literature: after RLHF tuning, token probabilities are poorly calibrated and typically overconfident (Kadavath et al., Tian et al.), and 4-bit quantization makes calibration worse still (Proskurina et al.).

Make the question easier first

Gemma is reliable when it only has to recognize the answer. So why not rewrite a question until the answer is in the text? Because that rewriting is the thinking. The question is who does it: code (dates, thresholds and lookups computed into the input), a split into recognition questions whose answers code combines, or the model itself, writing notes first. Only the last can be measured fairly on JevBench. So Gemma wrote at most 256 tokens of notes,7 and then geistr decide read its decision:

Gemma 4 E2B Correct Easy Original Hard AUROC Automatable at ≤ 5 % error Time for 231 items
Readout 61.9 % 48/48 48/72 47/111 0.73 25 % 3.4 min
Chat answer 68.8 % 47/48 65/72 47/111 3.9 min
Notes first, then readout 76.2 % 47/48 66/72 63/111 0.78 38 % 17 min

This is the one change that makes Gemma clearly better: +14.3 points,8 on the original items (48 to 66) as much as on the hard ones (47 to 63), and above its own chat answer. It is still overconfident, though: what it keeps at p ≥ 0.99 is wrong in 19 % of the cases. The price is about 4 seconds per decision instead of under one, the same trade as thinking on a smaller scale.

Quick recap. A good model’s confidence can be trusted: Bonsai was never wrong at p ≥ 0.99. A small model’s cannot: Gemma is sure of answers it gets wrong as soon as it has to apply a rule. What does make Gemma better is to let it write notes first.

6. Think only when unsure

Thinking makes a model more accurate, but it is slow: a thinking answer takes seconds to minutes, a readout a fraction of that. If the model’s probability can be trusted, it can decide for itself when to think: take the readout where it is sure, and think only where it is not.

Bonsai’s probability can be trusted (section 5), so I tried exactly that. Its 85 decisions below p = 0.9 (37 % of the items) went back to Bonsai in chat mode:

Bonsai 2 27B, its 85 uncertain items Correct
Readout (decide) 52
Chat, thinking off 50
Chat, thinking on 83

Asking again without thinking adds nothing. With thinking on the uncertain ones and the readout for the rest, Bonsai got 228 of 231 items right (98.7 %), against 85.3 % for the readout alone. Thinking on the other 146 items as well changed not a single answer:9 the confidence picked exactly the decisions that needed it. The community saw the same direction: Tacit-9B passes 15.2 % of the items to its own reasoning and goes from 82.3 % to 88.7 %. One run on public items cannot rule out that the model has seen them, so I would not compare this number with Jev’s.

In geistr (0.4.0 or later), a threshold does this on the command line. Below it, decide either leaves the decision open (exit code 3, so a script can hand it to a person), or thinks:

geistr decide bonsai2-27b-pq2 "Which team handles this?" billing technical sales \
  --context "$TICKET" --threshold 0.9 --escalate chat

Pick the threshold on your own labelled examples, log the probabilities, and cap the share that goes to thinking, so that a flood of unclear inputs cannot stall the system.

What does not work: a small model first. The obvious variant, a small model deciding and a large one taking over where it is unsure, needs the small model’s “unsure” to be reliable, and Gemma’s is not (section 5). Tested on the stored runs, Gemma’s probability below 0.99 passed on only 15 % of the items, and what it kept was still wrong in a third of the cases. Only with three extra warning signs (option orders that disagree, a long prompt, a written chat answer that disagrees) did the combination come close to Bonsai’s accuracy (84.4 % against 85.3 %; I chose those signals on the same items, so on new data it will be worse), and on one machine it saved no time:10

Accuracy against total time for 231 decisions on one M1 Max. Gemma alone: 61.9 % in 3 minutes. Gemma with Bonsai for the items a trigger flags: 67.5 % (probability below 0.99), 74.0 % (chat answer disagrees, or long prompt), 84.4 % with all three warning signs in 46 minutes. Bonsai alone: 85.3 % in 30 minutes. Bonsai with thinking on its uncertain decisions: 98.7 % in 146 minutes.

A small model first could only pay off where the second step is much more expensive than both models here, such as a paid API or a person, and even then only with a trigger better than its own probability.

Quick recap. A model whose confidence can be trusted picks its own hard cases: Bonsai thinking on just its uncertain 37 % went from 85.3 % to 98.7 %, the same as thinking everywhere. An overconfident small model cannot do that for a large one.

7. How fast is it?

Speed is the other half of the promise: a decision that needs no written answer should also be faster. Here is what I measured, and where the time goes.11

Reading is only a little faster than a short answer. Writing costs one step through the whole model per token, and a readout writes nothing. But a chat model told to answer with only a label writes a handful of tokens; the time goes into reading the prompt, which both modes have to do:

Median time per decision (M1 Max, Metal) Gemma 4 E2B Bonsai 2 27B
Readout (decide) 0.18 s 2.1 s
Chat, answer is one label 0.29 s 2.7 s
Chat with thinking 10 s (confident items), 68 s (uncertain items)

The large speed-ups often shown for decision models compare against a model that explains itself in hundreds of tokens. Asking for a label only avoids most of that.

Where the readout saves time: deciding where to think. Thinking only below p = 0.9 gave the same 228 of 231 as thinking everywhere. How much time that saves depends on how many decisions are uncertain:12

Share of uncertain decisions Thinking on every decision Readout first, thinking only when uncertain Time saved
37 % (JevBench) 42 s 38 s 11 %
20 % 32 s 22 s 30 %
5 % 23 s 8 s 63 %
0 % 20 s 4 s 81 %

On JevBench, built to be hard, the saving is small: the uncertain decisions are the long ones, and an escalated prompt is currently read twice. On a workload where most inputs are routine, the readout pays off quickly.

Several questions, one read. Jev answers several questions about the same input in one call. geistr can do the same, so far as an experimental build option:13 geistr decide-batch --shared-context reads a document once and asks each question on top of it. On eight long JevBench documents, two to four questions took 224 seconds this way and 544 seconds one by one, 2.4 times less.14 It also makes asking the same question in several option orders affordable.

Can the decision be read before the thinking is done? That is the readout idea applied to thinking: read the decision from the thinking so far and stop when it is clear. Recent research says reasoning models often know their answer long before they stop writing. Goodfire read the answers of DeepSeek-R1 and GPT-OSS-120B during their thinking, with trained probes and by forcing an answer. On easy questions the answer was readable almost from the start; on hard ones it formed gradually. Stopping when the probe was 95 % sure saved DeepSeek-R1 68 % of the tokens on easy questions (MMLU) and 33 % on hard ones (GPQA-Diamond), keeping over 95 % of the accuracy (GPT-OSS-120B: 61 % and 26 %; the arXiv version reports other operating points) (Goodfire, “Reasoning Theater”, 2026, arXiv). In math, a trained probe checking the model’s own intermediate answers saved 24 % (Zhang et al. 2025). A cost-aware study of stopping rules that, like mine below, work without the model’s hidden states adds two cautions: on Qwen3’s multiple-choice runs (MMLU-Pro) a calibrated confidence threshold beat the authors’ learned stopper, and the saving depends on how the model is served. On GSM8K with Qwen3-8B, the same rule saved 32 % of the tokens when the thinking stays in the cache and cost 121 % extra when it is read again for every check (Dong et al. 2026).

I tried the untrained version, the forced answer, on Bonsai: cut its thinking at a fraction of its length, close it, and read the decision.15 On 20 decisions Bonsai was sure about, the answer was there before the first word of thinking (20 of 20 right, at p = 0.999): the easy case from the research, and exactly what the readout already uses. On the 85 uncertain ones:

Bonsai’s thinking used 0 % 25 % 50 % 75 % 100 %
Correct (of 85 uncertain items) 48 51 59 67 83
Stop as soon as the readout reaches … Correct Share of full accuracy Thinking text used
p ≥ 0.9 74 of 85 89 % 65 %
p ≥ 0.95 78 of 85 94 % 74 %
p ≥ 0.99 81 of 85 98 % 86 %

The answer forms late, as for the hard questions in the research, but the saving is smaller: keeping about 95 % of the accuracy saves about a quarter of the writing, against a third for Goodfire. Their trained probes, my selection of the hardest third of the items and the much smaller model may explain that. For decisions, the two methods add up: the readout sends only the hard cases to thinking, and reading along saves another 15 to 25 % of the writing on those, at the cost of a few answers.

Summary

  • The readout gets a Jev-style decision from any local chat model: read the probabilities of the option keys where the answer would start. geistr does this as an experimental feature, for every model it runs.
  • Accuracy: on JevBench’s public items, Bonsai 2 27B gets 85.3 %, against 86.6 % published for the hosted Jev; Gemma 4 E2B gets 61.9 %. Asked for one label, the same models do as well (Gemma even better, 68.8 %). Under JevBench’s new 10-second limit, Bonsai’s slow long documents on this Mac would count as wrong (70.6 %).
  • Trust: what only the readout adds is a probability. Bonsai’s can be trusted: 74 % of its decisions can be automated at ≤ 5 % error. Gemma’s cannot. Letting Gemma write notes first raised its accuracy from 61.9 % to 76.2 %.
  • Think only when unsure: a model with trustworthy confidence picks its own hard cases. Bonsai thinking only on its decisions below p = 0.9 got 228 of 231 right (98.7 %), as many as thinking everywhere. A small model first does not work: its confidence is not reliable enough to hand over.
  • Speed: a readout is only a little faster than a one-label chat answer (Bonsai: 2.1 against 2.7 seconds). The gains come from thinking only where needed (30 % less time at 20 % uncertain decisions, by estimate), from several questions over one read (2.4 times faster), and from reading the decision during thinking (about a quarter of the writing saved on hard cases, at 94 % of the accuracy).

If you try this on your own hardware, or if you work on decision models yourself, I would love to hear what you find.

Sources


  1. Sources: local-jev’s README for Jev, SemIf and local-jev; AnyJev’s README for Tacit and the rotation results (Qwen3-8B, BANKING77). Community sources checked on 14 October 2026. ↩

  2. JevBench release v1.4.2.2 (27 September 2026): Imajev-4B 67.37, Plumb-4B 65.84 and decider-4b v2 64.13 against 63.29 for Jev 1.13.0; on the Intelligence axis, Jev 53.1 against 49.4 for decider-4b v2. JevBench v1.5.4 (as listed by benchlm.ai, retrieved 25 October 2026): Cygnet 73.70 (on a frozen Gemma 4 12B), Winnow-12B Q8 73.23 (Gemma 4 12B), Jev 1.13.0 72.13, Plumb-4B 71.56, decider-4b v2 71.28, Imajev-4B 70.39. Since method v1.7 (from JevBench v1.7.0, 24 October 2026) a decision that takes longer than 10 seconds counts as wrong (methodology), and the public set has grown; our runs use the 231 public items of commit 7625ecb. ↩

  3. Apple M1 Max (64 GB), Metal. geist-runtime main at 8a468e5 (geistlib e78f9ee), Python package geistr 0.3.4, JevBench 7625ecb, context limit 8192 tokens, 14 to 21 October 2026. Every run held the machine’s benchmark lock, except for three items of the early-readout run, of which only probabilities are used. The exceptions, measured on the earlier geistlib 3841fa6, are named where they appear: Bonsai’s thinking answers and the earlier shared-context times. The exact builds are listed in the data README. ↩

  4. Per-item latency_s in runs/main-8a468e5-full/bonsai2-27b-decide/results.jsonl (longest 53 s); the chat run also has 50 items over 10 s, 49 of them the same (84.4 % becomes 71.4 %). Gemma’s longest readout took 6.3 s, its longest chat answer 6.6 s. The times are ours on one M1 Max; on other hardware the share over 10 s differs, so this shows the order of magnitude, not a board score. ↩

  5. The same 231 items, each a fresh conversation: context, question and the allowed labels with their criteria, and the instruction to answer with exactly one label. Greedy decoding, at most 32 answer tokens, thinking off. Gemma wrote a valid label in 230 of 231 items, Bonsai in all 231. ↩

  6. Split conformal prediction at 90 % coverage, calibrated on half of the items and tested on the other half, and the other way round. Bonsai commits to a single option in 83 % of the items (92 % of those correct), Gemma in 46 % (76 % correct). ↩

  7. Chat mode, thinking off, greedy, with the instruction not to name a label. The notes are appended to the context under “Notes:”. ↩

  8. Paired bootstrap over the 231 items, 95 % interval +8.7 to +20.3 points; 43 answers fixed and 10 broken. ↩

  9. Chat mode, thinking on, greedy, answer up to 4096 tokens, measured on the earlier geistlib 3841fa6; the 85 uncertain items are the same on the current version. ↩

  10. Times are the measured latencies of these runs: the Gemma steps a trigger needs for every item, plus Bonsai for the items passed on; Bonsai’s thinking from the earlier version. Not shown: passing on where Gemma’s option orders disagree (35 % passed on, 74.0 %). ↩

  11. Measured on the current geistr, except the thinking times (earlier geistlib 3841fa6); the shared-context times come from the build merged as 8a468e5, with the same geistlib e78f9ee. ↩

  12. Averages per decision: readout 3.7 s on the 146 items Bonsai was sure about and 15.1 s on the 85 uncertain ones (the uncertain ones are longer); thinking 19.6 s and 81.4 s, from the earlier version. The rows other than 37 % assume that confident and uncertain decisions in your data take as long as here. Reusing the prompt already read for the readout would raise the saving to about 24 % at 37 % and 40 % at 20 % (an estimate). ↩

  13. make geistr DECISION=1 DECISION_CONTEXT=1 from the source; the release binaries do not include it yet. geistr decide-batch --help says whether a build has it. ↩

  14. Each document’s question in two to four cyclic option rotations, once as a batch of one question and once as one batch of all rotations; the CLI reports the time for reading the document and for the questions. On the earlier version: 707 s one by one, 324 s shared. ↩

  15. Bonsai’s stored thinking texts (greedy, thinking on), cut at 0, 10, 25, 50, 75 and 100 % of their characters at a word boundary, and at 60, 80, 85, 90 and 95 % for 67 items (37 of the first 55 whose readout was still below 0.99 at 75 %, and all of the last 30); every allowed label scored as a whole (sum of its token log-probabilities, followed by the end-of-turn token), in Prism’s llama.cpp fork, because geistr has no interface for scores after free text yet. The 20 confident items are a stratified sample (7 easy, 7 original, 6 hard). A stop takes the first cut at or above the threshold, else the full thinking. ↩