<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Dravin AI · Blog · Calibration</title><description>Calibration on the Dravin AI blog: why a model’s probabilities need calibrating, how to fit temperature or Platt scaling, and how to test the result.</description><link>https://dravin.ai/blog/tags/calibration/</link><language>en-gb</language><image><url>https://dravin.ai/apple-touch-icon.png</url><title>Dravin AI · Blog · Calibration</title><link>https://dravin.ai/blog/tags/calibration/</link></image><lastBuildDate>Mon, 05 Oct 2026 18:30:00 GMT</lastBuildDate><atom:link href="https://dravin.ai/blog/tags/calibration/rss.xml" rel="self" type="application/rss+xml"/><item><title>Typed decisions on your own GPUs</title><link>https://dravin.ai/blog/typed-decisions-on-your-own-gpus/</link><guid isPermaLink="true">https://dravin.ai/blog/typed-decisions-on-your-own-gpus/</guid><description>How SGLang&apos;s /v1/decisions turns a chat model into a classifier, how to calibrate and test its probabilities, and when to self-host.</description><pubDate>Fri, 02 Oct 2026 18:30:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;SGLang 0.5.21’s /v1/decisions reads each label’s next-token probability from a chat model and renormalises over the labels, generating no text.&lt;/li&gt;&lt;li&gt;SGLang says those probabilities are not calibrated, and that they can shift with batching and prefix caching.&lt;/li&gt;&lt;li&gt;Fit a temperature or Platt scaling on your labelled data, test replay variance, and compare against a fine-tuned classifier.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;On 29 September 2026 OpenAI announced a Decisions API in limited preview &lt;a href=&quot;https://dravin.ai/blog/typed-decisions-on-your-own-gpus/#sources&quot;&gt;[1]&lt;/a&gt;. SGLang 0.5.21 now ships &lt;code&gt;/v1/decisions&lt;/code&gt;, which turns a chat model you already serve into a classifier with a probability for every option &lt;a href=&quot;https://dravin.ai/blog/typed-decisions-on-your-own-gpus/#sources&quot;&gt;[3]&lt;/a&gt;, &lt;a href=&quot;https://dravin.ai/blog/typed-decisions-on-your-own-gpus/#sources&quot;&gt;[5]&lt;/a&gt;. This follow-up to our post on &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/&quot;&gt;typed decision models&lt;/a&gt; shows how the endpoint reads those probabilities out of a decoder model, why they are not calibrated, how to calibrate and test them, and when to run decisions on your own GPUs.&lt;/p&gt;
&lt;h2 id=&quot;what-openai-and-sglang-shipped&quot;&gt;What OpenAI and SGLang shipped&lt;/h2&gt;
&lt;p&gt;OpenAI’s DevDay recap says the Decisions API focuses its model on “a specific set of user-defined questions with finite pre-defined answers”, given text or images, to classify content, route requests or choose an agent’s next action &lt;a href=&quot;https://dravin.ai/blog/typed-decisions-on-your-own-gpus/#sources&quot;&gt;[1]&lt;/a&gt;. Its developer account says the API runs on GPT-6 Luna &lt;a href=&quot;https://dravin.ai/blog/typed-decisions-on-your-own-gpus/#sources&quot;&gt;[2]&lt;/a&gt;. The recap also notes “a broad release planned in the coming days” &lt;a href=&quot;https://dravin.ai/blog/typed-decisions-on-your-own-gpus/#sources&quot;&gt;[1]&lt;/a&gt;. Unlike the other developer announcements in the recap, the Decisions API entry links to no documentation, and the recap says nothing about how it works, so nothing below describes OpenAI’s design &lt;a href=&quot;https://dravin.ai/blog/typed-decisions-on-your-own-gpus/#sources&quot;&gt;[1]&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;SGLang, the open-source serving engine, released 0.5.21 on PyPI on 1 October and on GitHub on 2 October &lt;a href=&quot;https://dravin.ai/blog/typed-decisions-on-your-own-gpus/#sources&quot;&gt;[4]&lt;/a&gt;, &lt;a href=&quot;https://dravin.ai/blog/typed-decisions-on-your-own-gpus/#sources&quot;&gt;[3]&lt;/a&gt;; the code had merged on 25 September, before DevDay &lt;a href=&quot;https://dravin.ai/blog/typed-decisions-on-your-own-gpus/#sources&quot;&gt;[7]&lt;/a&gt;. The route needs no special checkpoint: any generation model served with a Jinja chat template can answer if per-request checks pass &lt;a href=&quot;https://dravin.ai/blog/typed-decisions-on-your-own-gpus/#sources&quot;&gt;[5]&lt;/a&gt;. Two models are validated, Qwen3.8-27B and Qwen3.5-35B-A3B, each on one H200 in BF16 &lt;a href=&quot;https://dravin.ai/blog/typed-decisions-on-your-own-gpus/#sources&quot;&gt;[5]&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A request carries one input, as text or a JSON object or array, and a list of questions: a choice among 2 to 26 options, a score on 2 to 10 levels, or a yes or no. Release 0.5.21 has no image field &lt;a href=&quot;https://dravin.ai/blog/typed-decisions-on-your-own-gpus/#sources&quot;&gt;[5]&lt;/a&gt;. A second route, &lt;code&gt;/v1/systemone&lt;/code&gt;, accepts the request shape of TypeSafe’s System One API, which serves Jev, so TypeSafe’s official SDKs can point their base URL at your server, with documented exceptions &lt;a href=&quot;https://dravin.ai/blog/typed-decisions-on-your-own-gpus/#sources&quot;&gt;[5]&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;how-a-chat-model-returns-a-probability-per-option&quot;&gt;How a chat model returns a probability per option&lt;/h2&gt;
&lt;p&gt;The server writes each question as one user message: the input, a blank line, the question, one line per option with a letter label such as “A: billing”, and an instruction to answer with one label only &lt;a href=&quot;https://dravin.ai/blog/typed-decisions-on-your-own-gpus/#sources&quot;&gt;[5]&lt;/a&gt;, &lt;a href=&quot;https://dravin.ai/blog/typed-decisions-on-your-own-gpus/#sources&quot;&gt;[6]&lt;/a&gt;. Levels are labelled 0 to 9, and yes or no questions use the words yes and no. The message goes through the model’s chat template with thinking turned off, and the server checks that each label adds exactly one distinct token after the prompt, returning a 400 when one does not &lt;a href=&quot;https://dravin.ai/blog/typed-decisions-on-your-own-gpus/#sources&quot;&gt;[5]&lt;/a&gt;, &lt;a href=&quot;https://dravin.ai/blog/typed-decisions-on-your-own-gpus/#sources&quot;&gt;[6]&lt;/a&gt;. Letters keep every label to one token, whatever an option is called.&lt;/p&gt;
&lt;p&gt;For a ticket and three teams, the user message reads:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;The integration keeps failing.

Question: Which team should handle this ticket?
A: billing
B: technical
C: sales
Answer with the letter of one option only.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;With thinking off, Qwen’s chat template then renders a closed reasoning block, so the next token is the answer &lt;a href=&quot;https://dravin.ai/blog/typed-decisions-on-your-own-gpus/#sources&quot;&gt;[5]&lt;/a&gt;, &lt;a href=&quot;https://dravin.ai/blog/typed-decisions-on-your-own-gpus/#sources&quot;&gt;[6]&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The model runs one prefill pass per question, the phase where it reads the prompt, and generates nothing: usage reports zero completion tokens &lt;a href=&quot;https://dravin.ai/blog/typed-decisions-on-your-own-gpus/#sources&quot;&gt;[5]&lt;/a&gt;. At the answer position it holds a probability for every token in its vocabulary. The server keeps only the label tokens’ log-probabilities, divides them by the request’s temperature T (default 1) and takes a softmax over them. Every log-probability carries the same vocabulary-wide normalising term, so it cancels &lt;a href=&quot;https://dravin.ai/blog/typed-decisions-on-your-own-gpus/#sources&quot;&gt;[5]&lt;/a&gt;, &lt;a href=&quot;https://dravin.ai/blog/typed-decisions-on-your-own-gpus/#sources&quot;&gt;[6]&lt;/a&gt;. A choice answer is the most probable option, and a score is the probability-weighted mean level &lt;a href=&quot;https://dravin.ai/blog/typed-decisions-on-your-own-gpus/#sources&quot;&gt;[5]&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Renormalising hides how much probability sat elsewhere, so the server also reports &lt;code&gt;label_mass&lt;/code&gt;, the raw probability of all the labels together; a low value means most of it sits outside the offered answers &lt;a href=&quot;https://dravin.ai/blog/typed-decisions-on-your-own-gpus/#sources&quot;&gt;[5]&lt;/a&gt;.&lt;/p&gt;
&lt;figure&gt;&lt;p&gt;From a typed question to a probability&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Render each question: thinking off, labels one token each&lt;/li&gt;&lt;li&gt;Prefill per question: no tokens generated&lt;/li&gt;&lt;li&gt;Softmax over labels: divided by T, plus label_mass&lt;/li&gt;&lt;li&gt;Calibrate, then threshold: on your labelled data&lt;/li&gt;&lt;/ol&gt;&lt;figcaption&gt;Steps 1 to 3 run inside SGLang 0.5.21. Step 4 is yours: the returned probabilities are not calibrated.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Questions are answered independently and batched together; each is its own prompt that repeats the input, so prompt tokens grow with the number of questions &lt;a href=&quot;https://dravin.ai/blog/typed-decisions-on-your-own-gpus/#sources&quot;&gt;[5]&lt;/a&gt;. Laya, from our Jev post, answers every question in one forward pass.&lt;/p&gt;
&lt;p&gt;Constrained decoding reaches the same numbers. In SGLang, a one-token regex such as &lt;code&gt;(A|B|C)&lt;/code&gt; at temperature 0, with log-probabilities returned, gives the same probabilities as the &lt;code&gt;/v1/score&lt;/code&gt; path this route uses, for one-character labels in the same cache state &lt;a href=&quot;https://dravin.ai/blog/typed-decisions-on-your-own-gpus/#sources&quot;&gt;[5]&lt;/a&gt;. A JSON schema with enum fields gives no clean probability per option, because an enum value can span several tokens &lt;a href=&quot;https://dravin.ai/blog/typed-decisions-on-your-own-gpus/#sources&quot;&gt;[5]&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;what-the-endpoint-refuses-and-what-that-rules-out&quot;&gt;What the endpoint refuses, and what that rules out&lt;/h2&gt;
&lt;p&gt;Most of the rules protect the answer position, the one place a number is read. Qwen3.8-27B and Qwen3.5-35B-A3B think by default; the route turns thinking off, refuses requests that turn it back on, and refuses prompts that leave a reasoning block open, so the answer is never read inside the reasoning &lt;a href=&quot;https://dravin.ai/blog/typed-decisions-on-your-own-gpus/#sources&quot;&gt;[5]&lt;/a&gt;. That means the model answers without working anything out first. Compute arithmetic, dates and multi-step logic in code and pass the result in, as TypeSafe advises for Jev.&lt;/p&gt;
&lt;p&gt;The server also refuses built-in conversation templates, servers started with &lt;code&gt;--enable-mis&lt;/code&gt; or &lt;code&gt;--dllm-algorithm&lt;/code&gt;, and a &lt;code&gt;model&lt;/code&gt; field that names a LoRA adapter, so decisions cannot run on one &lt;a href=&quot;https://dravin.ai/blog/typed-decisions-on-your-own-gpus/#sources&quot;&gt;[5]&lt;/a&gt;. It does not check where a new model’s template puts the answer, so before relying on a model beyond the validated two, the docs say to inspect the prompt token ids the route can return &lt;a href=&quot;https://dravin.ai/blog/typed-decisions-on-your-own-gpus/#sources&quot;&gt;[5]&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A decision takes a single input, not a chat history; a conversation goes in as text or a JSON array &lt;a href=&quot;https://dravin.ai/blog/typed-decisions-on-your-own-gpus/#sources&quot;&gt;[5]&lt;/a&gt;. A choice stops at 26 options. &lt;code&gt;/v1/systemone&lt;/code&gt; accepts up to 255 with two-letter labels where the tokeniser and chat template allow it, as the Qwen models’ do; SGLang warns that these labels include common words with unequal priors, so answers above 26 options can depend on option order &lt;a href=&quot;https://dravin.ai/blog/typed-decisions-on-your-own-gpus/#sources&quot;&gt;[5]&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;why-the-probabilities-are-not-calibrated&quot;&gt;Why the probabilities are not calibrated&lt;/h2&gt;
&lt;p&gt;SGLang’s documentation says “None of these values is a calibrated probability that the decision is correct” &lt;a href=&quot;https://dravin.ai/blog/typed-decisions-on-your-own-gpus/#sources&quot;&gt;[5]&lt;/a&gt;. Four effects pull a chat model’s label probabilities away from calibration.&lt;/p&gt;
&lt;p&gt;Post-training comes first. In a 2022 study, Anthropic found its large base models well calibrated when options were shown with letters and scored by the letter, as this route does, in prompts with a few worked examples; with no examples, which is how this route asks, calibration was weaker. Its RLHF-tuned versions looked badly miscalibrated until one temperature, T = 2.5, largely fixed them on several evaluations, though the authors warn that heavier RL training might distort calibration beyond that repair &lt;a href=&quot;https://dravin.ai/blog/typed-decisions-on-your-own-gpus/#sources&quot;&gt;[9]&lt;/a&gt;. Both validated Qwen models are chat models &lt;a href=&quot;https://dravin.ai/blog/typed-decisions-on-your-own-gpus/#sources&quot;&gt;[5]&lt;/a&gt;, so test the same repair on yours.&lt;/p&gt;
&lt;p&gt;Letter priors add a second skew. Across 20 LLMs, a 2023 study traced a preference for particular option letters to token bias: whatever the content, the model puts more probability on some letter tokens than on others, so the letter an option lands on can move its probability &lt;a href=&quot;https://dravin.ai/blog/typed-decisions-on-your-own-gpus/#sources&quot;&gt;[10]&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Wording is the third. In a 2021 study of few-shot prompts, the format, the examples and even their order swung accuracy from near chance to near the state of the art. On one sentiment prompt, the default 0.5 threshold gave frequent false positives where a threshold of 0.68 would have been 94% accurate on its validation set &lt;a href=&quot;https://dravin.ai/blog/typed-decisions-on-your-own-gpus/#sources&quot;&gt;[11]&lt;/a&gt;. SGLang owns the wording around your question and ships each change as a new &lt;code&gt;prompt_format_version&lt;/code&gt; &lt;a href=&quot;https://dravin.ai/blog/typed-decisions-on-your-own-gpus/#sources&quot;&gt;[5]&lt;/a&gt;; the question and option text are yours, so test rewordings on labelled data.&lt;/p&gt;
&lt;p&gt;Finally, probability can sit outside the labels. The probabilities always sum to 1 over the offered labels, so a choice picks an option even when none fits. &lt;code&gt;label_mass&lt;/code&gt; shows the leak, though on yes or no questions it reads low even on clear cases, because it counts only the lowercase yes and no tokens while the model also puts probability on “Yes” and “No” &lt;a href=&quot;https://dravin.ai/blog/typed-decisions-on-your-own-gpus/#sources&quot;&gt;[5]&lt;/a&gt;. Anthropic’s models were also reluctant to use a “none of the above” option, while their true or false judgements stayed well calibrated &lt;a href=&quot;https://dravin.ai/blog/typed-decisions-on-your-own-gpus/#sources&quot;&gt;[9]&lt;/a&gt;. Of the Jev post’s two fixes, that favours a separate yes or no question before the choice.&lt;/p&gt;
&lt;h2 id=&quot;calibrating-on-your-own-server&quot;&gt;Calibrating on your own server&lt;/h2&gt;
&lt;p&gt;Fit calibration per question, on labelled examples from your own traffic kept apart from the test set.&lt;/p&gt;
&lt;p&gt;Temperature scaling fits a single number T by minimising log loss on held-out data, and never changes which option wins &lt;a href=&quot;https://dravin.ai/blog/typed-decisions-on-your-own-gpus/#sources&quot;&gt;[12]&lt;/a&gt;. Here it maps onto the request’s &lt;code&gt;temperature&lt;/code&gt;, which divides the label logits before the softmax &lt;a href=&quot;https://dravin.ai/blog/typed-decisions-on-your-own-gpus/#sources&quot;&gt;[5]&lt;/a&gt;. Fit T offline and pass it in that field: the chosen option stays put, the probabilities and so the score’s weighted mean move, and &lt;code&gt;label_mass&lt;/code&gt; does not change &lt;a href=&quot;https://dravin.ai/blog/typed-decisions-on-your-own-gpus/#sources&quot;&gt;[5]&lt;/a&gt;, &lt;a href=&quot;https://dravin.ai/blog/typed-decisions-on-your-own-gpus/#sources&quot;&gt;[12]&lt;/a&gt;. One temperature covers every question in a request &lt;a href=&quot;https://dravin.ai/blog/typed-decisions-on-your-own-gpus/#sources&quot;&gt;[6]&lt;/a&gt;, so send questions with different temperatures separately, or apply T on your side: raise each probability returned at the default T of 1 to the power 1/T, renormalise, and recompute any score. SDK users have to do the latter, since &lt;code&gt;/v1/systemone&lt;/code&gt; refuses a temperature field &lt;a href=&quot;https://dravin.ai/blog/typed-decisions-on-your-own-gpus/#sources&quot;&gt;[5]&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A temperature cannot correct a lean towards one label. For yes or no, Platt scaling fits a slope and an intercept on the log-odds, and the intercept absorbs a model that says yes too often; for choices, vector scaling fits a weight and a bias per option &lt;a href=&quot;https://dravin.ai/blog/typed-decisions-on-your-own-gpus/#sources&quot;&gt;[12]&lt;/a&gt;. Isotonic regression can correct any monotone distortion but overfits small sets: with fewer than about 200 to 1,000 labelled cases, Platt scaling did better for all nine learning methods in a 2005 study &lt;a href=&quot;https://dravin.ai/blog/typed-decisions-on-your-own-gpus/#sources&quot;&gt;[13]&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Two corrections go after label priors directly. Contextual calibration scores a content-free input such as “N/A” and rescales the outputs so that input comes out uniform &lt;a href=&quot;https://dravin.ai/blog/typed-decisions-on-your-own-gpus/#sources&quot;&gt;[11]&lt;/a&gt;. PriDe estimates the letter prior by permuting options on a small sample, for example 5% of the test set, and removes it from the remaining predictions &lt;a href=&quot;https://dravin.ai/blog/typed-decisions-on-your-own-gpus/#sources&quot;&gt;[10]&lt;/a&gt;. Both remove bias, and the 2021 paper separates that goal from statistical calibration &lt;a href=&quot;https://dravin.ai/blog/typed-decisions-on-your-own-gpus/#sources&quot;&gt;[11]&lt;/a&gt;, so measure calibration again afterwards.&lt;/p&gt;
&lt;p&gt;Refit when you change the model or its &lt;a href=&quot;https://dravin.ai/services/#inference&quot;&gt;quantisation&lt;/a&gt;, upgrade SGLang, or receive a new &lt;code&gt;prompt_format_version&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;testing-replay-and-drift&quot;&gt;Testing replay and drift&lt;/h2&gt;
&lt;p&gt;The general evaluation is in the &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/&quot;&gt;Jev post&lt;/a&gt;; a self-hosted endpoint adds its own tests.&lt;/p&gt;
&lt;p&gt;Start with replay variance. On the two validated models, which mix full and linear attention, SGLang saw probabilities move by up to 0.07, and &lt;code&gt;label_mass&lt;/code&gt; by up to about 0.14, between cold and prefix-cached requests and across batch compositions; the chosen option did not change in its checks &lt;a href=&quot;https://dravin.ai/blog/typed-decisions-on-your-own-gpus/#sources&quot;&gt;[5]&lt;/a&gt;. One general cause: batch size changes how GPU kernels split their sums, and floating-point addition is not associative, so identical inputs can score differently &lt;a href=&quot;https://dravin.ai/blog/typed-decisions-on-your-own-gpus/#sources&quot;&gt;[8]&lt;/a&gt;. Send your test set several times, cold and warm, alone and mixed with chat traffic, and route a band around each threshold, at least as wide as the movement you measure, to a person. On Qwen3.5-35B-A3B, &lt;code&gt;--disable-radix-cache&lt;/code&gt; gave identical values across sequential repeats, at the cost of prefix reuse &lt;a href=&quot;https://dravin.ai/blog/typed-decisions-on-your-own-gpus/#sources&quot;&gt;[5]&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Keep every decision replayable. With &lt;code&gt;return_prompt_token_ids&lt;/code&gt;, an answer carries its exact prompt and label token ids, and &lt;code&gt;/v1/score&lt;/code&gt; re-scores them to the same values when temperature and cache state match &lt;a href=&quot;https://dravin.ai/blog/typed-decisions-on-your-own-gpus/#sources&quot;&gt;[5]&lt;/a&gt;. Store them with the decision, and send &lt;code&gt;prompt_format_version&lt;/code&gt; so that an upgrade which changes the wording fails loudly instead of shifting answers &lt;a href=&quot;https://dravin.ai/blog/typed-decisions-on-your-own-gpus/#sources&quot;&gt;[5]&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Shuffle option order on a sample and compare, since letter priors move answers &lt;a href=&quot;https://dravin.ai/blog/typed-decisions-on-your-own-gpus/#sources&quot;&gt;[10]&lt;/a&gt;. Set a &lt;code&gt;label_mass&lt;/code&gt; floor per question type from labelled data, remembering that yes or no reads low. Leave any temperature in &lt;code&gt;--preferred-sampling-params&lt;/code&gt; unset, since it can scale the probabilities and &lt;code&gt;label_mass&lt;/code&gt; when a decision shares a batch with generation or runs under speculative decoding &lt;a href=&quot;https://dravin.ai/blog/typed-decisions-on-your-own-gpus/#sources&quot;&gt;[5]&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;hosted-preview-or-your-own-gpus&quot;&gt;Hosted preview or your own GPUs&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://dravin.ai/services/#self-hosted&quot;&gt;Self-hosting&lt;/a&gt; makes most sense when you already serve an open model: decisions run on the same server, with no extra flag, alongside chat traffic &lt;a href=&quot;https://dravin.ai/blog/typed-decisions-on-your-own-gpus/#sources&quot;&gt;[5]&lt;/a&gt;. Inputs stay on your hardware, any answer can be replayed from stored token ids, and you choose the model, its version and the calibration. The work is all prefill, so the prefix caching and chunk size levers in our &lt;a href=&quot;https://dravin.ai/blog/raising-llm-serving-throughput/&quot;&gt;serving playbook&lt;/a&gt; apply, though prefix caching is also one source of the drift SGLang measured. TypeSafe’s SDKs time out after 10 seconds and retry, so raise that timeout for many questions over a long input &lt;a href=&quot;https://dravin.ai/blog/typed-decisions-on-your-own-gpus/#sources&quot;&gt;[5]&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Code written for Jev can switch to &lt;code&gt;/v1/systemone&lt;/code&gt; by changing its base URL. Its thresholds should not come along unchecked: the confidence that route returns is uncalibrated, and SGLang warns that thresholds tuned on another provider may not transfer &lt;a href=&quot;https://dravin.ai/blog/typed-decisions-on-your-own-gpus/#sources&quot;&gt;[5]&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A hosted API suits low volume, or a team that will not run GPUs; once OpenAI’s preview opens up, test it on the same labelled set.&lt;/p&gt;
&lt;p&gt;Neither replaces a trained classifier where one fits. With labelled data and a stable label set, a small &lt;a href=&quot;https://dravin.ai/services/#training&quot;&gt;fine-tuned&lt;/a&gt; model is the stronger default: a 2024 study found smaller fine-tuned models beat larger zero-shot prompted models on every text classification task it tested &lt;a href=&quot;https://dravin.ai/blog/typed-decisions-on-your-own-gpus/#sources&quot;&gt;[14]&lt;/a&gt;. Our default is unchanged: &lt;a href=&quot;https://dravin.ai/services/#beyond-llms&quot;&gt;a small classifier fine-tuned on your labels, calibrated and thresholded&lt;/a&gt;, with the uncertain tail sent to an LLM or a person. A decision endpoint fits where that default cannot yet: when labels change per request, when no labelled data exists, or to draft labels, checked by people, for the classifier you train next.&lt;/p&gt;
&lt;h2 id=&quot;checklist&quot;&gt;Checklist&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Pin the SGLang version, model and quantisation, send &lt;code&gt;prompt_format_version&lt;/code&gt; with every request, and refit when any of them changes.&lt;/li&gt;
&lt;li&gt;On a new model, check the returned prompt token ids for the answer position.&lt;/li&gt;
&lt;li&gt;Leave the temperature in &lt;code&gt;--preferred-sampling-params&lt;/code&gt; unset on servers that take decisions.&lt;/li&gt;
&lt;li&gt;Fit a temperature per question on held-out labelled traffic, apply it per request or on your side, and add Platt or vector scaling if one label is over-predicted.&lt;/li&gt;
&lt;li&gt;Shuffle option order on a sample, and correct letter priors if answers move.&lt;/li&gt;
&lt;li&gt;Measure replay variance cold, warm and under load, and send a band at least that wide around each threshold to a person.&lt;/li&gt;
&lt;li&gt;Set a &lt;code&gt;label_mass&lt;/code&gt; floor per question type, and gate choices with a yes or no question where no option may fit.&lt;/li&gt;
&lt;li&gt;Store each decision’s prompt and label token ids for replay.&lt;/li&gt;
&lt;li&gt;Compare against a classifier fine-tuned on the same labels before you commit.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;sources&quot;&gt;Sources&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://openai.com/index/devday-2026-recap/&quot;&gt;OpenAI, “DevDay 2026 Recap” (29 Sep 2026)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://x.com/OpenAIDevs/status/2105003318917697873&quot;&gt;OpenAI Developers on X, Decisions API announcement (29 Sep 2026)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/sgl-project/sglang/releases/tag/v0.5.21&quot;&gt;SGLang, “v0.5.21” release notes (2 Oct 2026)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pypi.org/project/sglang/0.5.21/&quot;&gt;PyPI, “sglang 0.5.21” (1 Oct 2026)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/sgl-project/sglang/blob/v0.5.21/docs/docs/supported-models/decision_models.mdx&quot;&gt;SGLang docs, “Decision models”, at the v0.5.21 tag (2 Oct 2026)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/sgl-project/sglang/blob/v0.5.21/python/sglang/srt/entrypoints/openai/serving_decisions.py&quot;&gt;SGLang source, “serving_decisions.py”, at the v0.5.21 tag (2 Oct 2026)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/sgl-project/sglang/pull/41208&quot;&gt;SGLang, pull request 41208, “Add a System One compatible /v1/systemone route” (merged 25 Sep 2026)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/sgl-project/sglang/blob/v0.5.21/docs/docs/advanced_features/deterministic_inference.mdx&quot;&gt;SGLang docs, “Deterministic Inference”, at the v0.5.21 tag (2 Oct 2026)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://arxiv.org/abs/2207.05221&quot;&gt;Anthropic, “Language Models (Mostly) Know What They Know” (Jul 2022)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://arxiv.org/abs/2309.03882&quot;&gt;Tsinghua University and WeChat AI, “Large Language Models Are Not Robust Multiple Choice Selectors” (ICLR 2024)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://arxiv.org/abs/2102.09690&quot;&gt;UC Berkeley, University of Maryland and UC Irvine, “Calibrate Before Use: Improving Few-Shot Performance of Language Models” (ICML 2021)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://arxiv.org/abs/1706.04599&quot;&gt;Cornell University, “On Calibration of Modern Neural Networks” (ICML 2017)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://doi.org/10.1145/1102351.1102430&quot;&gt;Cornell University, “Predicting Good Probabilities With Supervised Learning” (ICML 2005)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://arxiv.org/abs/2406.08660&quot;&gt;Stanford University and University of Zurich, “Fine-Tuned ‘Small’ LLMs (Still) Significantly Outperform Zero-Shot Generative AI Models in Text Classification” (Jun 2024)&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This post first appeared on &lt;a href=&quot;https://dravin.ai/blog/typed-decisions-on-your-own-gpus/&quot;&gt;Dravin AI&lt;/a&gt;.&lt;/p&gt;</content:encoded><category>Typed decision models</category><category>Classification</category><category>Calibration</category><category>Self-hosted LLMs</category><author>info@dravin.ai (Dravin AI)</author></item><item><title>Typed decision models: what early tests show</title><link>https://dravin.ai/blog/jev-and-typed-decision-models/</link><guid isPermaLink="true">https://dravin.ai/blog/jev-and-typed-decision-models/</guid><description>Models that answer typed questions with a probability in one pass: what they are, what the first independent tests found, and how to test one.</description><pubDate>Tue, 22 Sep 2026 18:30:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Jev and Laya answer typed questions (a choice, a score or a yes/no) with a probability attached, instead of writing text.&lt;/li&gt;&lt;li&gt;In one independent benchmark Jev was the fastest model measured; Laya is near chance until it is fine-tuned.&lt;/li&gt;&lt;li&gt;Before adopting one, test it on a held-out set from your own traffic, against a classifier fine-tuned on your own data.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;On 15 September 2026 TypeSafe AI released Jev in early access. It calls Jev its first “System One Model”, a name taken from Daniel Kahneman’s fast, intuitive System 1 thinking &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[1]&lt;/a&gt;. Jev does not write text. You give it a piece of state (a ticket, an email, a JSON object) and a set of typed questions, and it returns a choice, a score or a yes/no drawn from options you defined, with a probability attached. Three days later Convai Innovations published Laya, an open-weight model built on the same idea &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[11]&lt;/a&gt; &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[13]&lt;/a&gt;. Since version 0.3.7 it also ships a server that accepts the same request shape as Jev &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[11]&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Both launched in mid-September 2026, so there is little independent evidence yet. The idea still deserves attention, because it describes what many production AI systems do on every request: make a small decision, such as routing a ticket, moderating a message or checking an agent’s tool call, and know when to leave it alone.&lt;/p&gt;
&lt;p&gt;The short version: Jev is fast, though the gap is large only against LLMs left in their slowest default modes &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[15]&lt;/a&gt;. On calibration, which is the point of the product, the independent tests are mixed, and one benchmark’s authors have since said its calibration figures for Jev are not directly comparable with the LLMs’ &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[14]&lt;/a&gt; &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[15]&lt;/a&gt;. Laya is near chance until it is &lt;a href=&quot;https://dravin.ai/services/#training&quot;&gt;fine-tuned&lt;/a&gt; &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[11]&lt;/a&gt;. The comparison that should decide adoption is against a classifier fine-tuned on your own data, and the only one we have found is Laya’s own, on a benchmark its checkpoint was fine-tuned on &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[11]&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;what-a-typed-decision-model-is&quot;&gt;What a typed decision model is&lt;/h2&gt;
&lt;p&gt;TypeSafe describes Jev as “a frontier-intelligence function call: unstructured state in, typed probabilistic decisions out” &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[1]&lt;/a&gt;. A request has two parts. The state is the input: a string, a JSON object or an array of text. Images, audio and video are not supported yet &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[2]&lt;/a&gt;. The questions use three primitives &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[2]&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Choice&lt;/strong&gt; picks one option from a list you supply, such as which team should handle a ticket.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Score&lt;/strong&gt; places the state on a rubric, for example customer frustration on a scale from 0 to 2.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Noul&lt;/strong&gt; is TypeSafe’s name for a yes/no question: it asks whether a statement is true and returns a probability between 0 and 1.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The Register gave an example of what a three-department routing question might return &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[17]&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{&amp;quot;billing&amp;quot;: 0.08, &amp;quot;technical&amp;quot;: 0.85, &amp;quot;sales&amp;quot;: 0.07}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It paired that answer with a confidence of 0.82. The probabilities are per option. The confidence is a separate summary that TypeSafe derives from the shape of the whole distribution, and it is the number you set thresholds on; a Noul returns only its probability &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[5]&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Jev’s internals are unpublished. TypeSafe says it built “a new model architecture, parallel sampler for maximum efficiency, and training method we call Reinforcement Learning for Calibrated Decisions (RLCD)” &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[1]&lt;/a&gt;. TechCrunch reports that the company has said little about that architecture, that outside observers suspect it sits on top of an open-weight LLM, and that the former OpenAI researcher who started the company says Jev is trained only on synthetic data &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[16]&lt;/a&gt;. So Jev can be judged only by what it returns, which is what the rest of this post does.&lt;/p&gt;
&lt;p&gt;Laya is the clearest public account of how such a model can work, because its model card spells it out &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[11]&lt;/a&gt;. The English checkpoint is ModernBERT-large, a bidirectional encoder (it reads the whole input at once), fully fine-tuned, with a small decision head on top: 421M parameters in total. A multilingual checkpoint built on mmBERT has 322M. Each option in a question is scored at its own &lt;code&gt;[MASK]&lt;/code&gt; token, the placeholder slot a BERT-style model is trained to fill, and the scores are normalised across that question’s options. The options arrive with the request, so a new schema needs no retraining, and every question in a call is answered in a single forward pass. Training rewards the model with strictly proper scoring rules, which pay the most only when the reported probabilities are honest.&lt;/p&gt;
&lt;p&gt;Laya, then, is a BERT-style classifier whose label set arrives with each request, trained with an objective that rewards honest probabilities. That places the category between two tools most teams already know. A fine-tuned classifier is fast and accurate, but it needs labelled data and knows only its fixed labels. A zero-shot classifier takes its labels at request time, and one served as the baseline in an independent test below &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[14]&lt;/a&gt;. What typed decision models add is calibration as a training objective, several typed questions answered in one call, and an interface built for software to branch on &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[1]&lt;/a&gt; &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[11]&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;how-this-differs-from-asking-an-llm-to-classify&quot;&gt;How this differs from asking an LLM to classify&lt;/h2&gt;
&lt;p&gt;Any LLM will produce a label from a prompt and a JSON schema. Three things are different, and the first is narrower than it looks.&lt;/p&gt;
&lt;p&gt;The format is guaranteed by construction. “By providing typed, structured values, Jev can avoid the parsing and validating that must be done to process text responses from LLMs,” as The Register put it &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[17]&lt;/a&gt;. An LLM gets most of that guarantee from constrained decoding, which limits its output to a JSON schema or a forced tool call. The independent benchmark below asked every LLM for structured output, through a JSON schema, a forced tool call or plain JSON mode: seven of the eight returned malformed answers on at most 0.7% of decisions in any suite, one small model reached 6.2% on one suite, and Jev returned none &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[15]&lt;/a&gt;. The format advantage is real but small, so the differences that matter are the next two.&lt;/p&gt;
&lt;p&gt;The work happens in one step. An LLM writes its answer token by token; a typed decision model scores every option of every question at once. TypeSafe credits this parallel design for the speed &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[1]&lt;/a&gt; &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[3]&lt;/a&gt;. The design pays most when one call asks several questions: Laya answers all of them in a single forward pass &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[11]&lt;/a&gt;, and TypeSafe says adding questions “barely changes the response time” &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[9]&lt;/a&gt;.&lt;/p&gt;
&lt;figure&gt;&lt;p&gt;&lt;em&gt;Two lanes answer the same ticket routing question. On the left an LLM writes a JSON answer one token at a time, route technical, and a parser then checks it. On the right a typed decision model reads the ticket once and fills a probability for every option: billing 0.08, technical 0.85, sales 0.07, then a confidence of 0.82. The right lane returns every probability in one step; the left lane writes its answer in order and then checks it.&lt;/em&gt; &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/&quot;&gt;See the animated diagram in the post.&lt;/a&gt;&lt;/p&gt;&lt;figcaption&gt;The same routing question, asked two ways. The LLM writes its answer one token at a time, then a parser checks it. The typed decision model scores every option in one pass and adds a confidence value. Values from The Register’s example [17].&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;The probability is the product. A typed decision model is trained so that its per-option probabilities match outcomes, which is the aim of both TypeSafe’s RLCD and Laya’s proper scoring rules &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[1]&lt;/a&gt; &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[11]&lt;/a&gt;. LLMs asked to state their confidence tend to be overconfident, which Xiong and colleagues found across several models &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[20]&lt;/a&gt;. The research is mixed: Tian and colleagues found verbalised confidence from RLHF-tuned models can be better calibrated than their token probabilities &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[21]&lt;/a&gt;. Where an API exposes token log-probabilities, an LLM’s probabilities over the labels can also be read directly, and Kadavath and colleagues found large models well calibrated on multiple-choice and true/false questions posed in the right format &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[22]&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Type safety guarantees the shape of the answer and says nothing about whether the answer is right. TypeSafe says Jev “can’t hallucinate” &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[1]&lt;/a&gt;; The Register noted that structured output with probabilities “does not preclude the possibility of being incorrect” &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[17]&lt;/a&gt;. And because the caller fixes the options, a Choice always picks one of them, even when none fits. TypeSafe’s own documentation says “the Choice is relative, settling &lt;em&gt;which&lt;/em&gt; option, while each Noul is absolute and can be low for all of them” &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[4]&lt;/a&gt;. The practical fix is to add a “none of these” option, or to put a separate Noul in front of the Choice as a gate.&lt;/p&gt;

&lt;h2 id=&quot;why-calibrated-probabilities-matter-in-production&quot;&gt;Why calibrated probabilities matter in production&lt;/h2&gt;
&lt;p&gt;A model is calibrated when its probabilities match reality across many predictions. TypeSafe’s primer puts it plainly: “Outcomes assigned a probability of &lt;code&gt;0.2&lt;/code&gt; should occur about 20% of the time. Outcomes assigned a probability of &lt;code&gt;0.8&lt;/code&gt; should occur about 80% of the time” &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[7]&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Each small decision a production system makes carries two questions: what is the answer, and is it safe to act on. The CTO of Earendil, quoted by TechCrunch, described the trade: “The user has to say, okay, if this only comes back with 50% probability, maybe this is a coin toss, and I disregard it. But if it’s 95%, sure, then I can do something with it” &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[16]&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;TypeSafe’s documentation recommends three bands: act automatically when confidence is high; proceed with caution in the middle, for example by asking a person to confirm; and below that, route to a person, ask for clarification or fall back to another system. It adds that “a confidence threshold is not one number”, since actions with worse consequences deserve a stricter bar &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[5]&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The operating number that follows is coverage at an error budget, an idea from selective classification, where a model is allowed to abstain &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[23]&lt;/a&gt;. Choose the error rate you can accept, say 5%. Set the threshold on labelled data so that errors among the items acted on stay within that rate, then measure what share of traffic the model handles alone. Everything else goes to a person or a larger model. One limit applies throughout: calibration is a property of groups of predictions, and in TypeSafe’s words it “does not guarantee that an individual answer is correct” &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[2]&lt;/a&gt;.&lt;/p&gt;
&lt;figure&gt;&lt;p&gt;&lt;em&gt;Tickets flow into a tagging gate, each with a confidence score. At 0.75 or above the item is acted on, from 0.50 it goes to confirm, and below 0.50 it goes to a person or an LLM. Four of six tickets clear the act threshold and are handled automatically. A stricter payment gate acts only at 0.97 or above, so a decision at 0.80, acted on at tagging, is held for confirmation before any money moves. Set your own thresholds on labelled data, one per action.&lt;/em&gt; &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/&quot;&gt;See the animated diagram in the post.&lt;/a&gt;&lt;/p&gt;&lt;figcaption&gt;A confidence gate turns a confidence value into an action. The bar rises with the cost of a mistake, so a decision at 0.80 is acted on at tagging and held before any money moves. Set your own thresholds on labelled data, one per action.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2 id=&quot;what-the-first-tests-show&quot;&gt;What the first tests show&lt;/h2&gt;
&lt;p&gt;TypeSafe’s blog gives end-to-end response times of 70 to 500 ms. Its home page claims Jev is “193.6x faster”, a figure the blog says comes from its workflow evals, in which each LLM ran at its provider’s default reasoning setting, and TypeSafe expects these “are on the higher end of real world gains” &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[1]&lt;/a&gt; &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[10]&lt;/a&gt;. The same post says the evals were made by its own capability team, “so some bias could exist”, and that the reference answers are the average of GPT-6 Astra and Claude Fable 5.1 &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[1]&lt;/a&gt; &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[10]&lt;/a&gt;. Accuracy in those evals therefore means agreement with two frontier LLMs, where most buyers would assume human labels. TypeSafe argues that this reference, if anything, favours the OpenAI and Anthropic models in the comparison &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[1]&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Two independent benchmarks with published protocols followed within days. &lt;strong&gt;decision-model-benchmark&lt;/strong&gt; ran Jev against eight LLMs from five providers, each asked for its answer through a JSON schema, a forced tool call or plain JSON mode, with thinking off on the Anthropic models and at the lowest level on GLM. It declares no vendor sponsorship and publishes its raw logs &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[15]&lt;/a&gt;. Calibration error below is expected calibration error (ECE), the average gap between stated confidence and observed accuracy; lower is better and 0 is perfect.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;Jev&lt;/th&gt;
&lt;th&gt;The eight LLMs&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Accuracy, 77-way banking intent&lt;/td&gt;
&lt;td&gt;76.3%&lt;/td&gt;
&lt;td&gt;70.9% to 81.3%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Accuracy, SMS spam&lt;/td&gt;
&lt;td&gt;93.0%&lt;/td&gt;
&lt;td&gt;66.1% to 94.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Median latency per request&lt;/td&gt;
&lt;td&gt;264 to 276 ms&lt;/td&gt;
&lt;td&gt;303 ms to 5.6 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Most options accepted in one question&lt;/td&gt;
&lt;td&gt;255&lt;/td&gt;
&lt;td&gt;512 (the most tested)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Low confidence (0.5 or below) when no option is correct&lt;/td&gt;
&lt;td&gt;49.7%&lt;/td&gt;
&lt;td&gt;97.3% to 100% for seven; 64.7% for one&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Answers changed across shuffled option orders and repeat runs&lt;/td&gt;
&lt;td&gt;13%&lt;/td&gt;
&lt;td&gt;15% to 37%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Calibration error, banking intent&lt;/td&gt;
&lt;td&gt;0.083&lt;/td&gt;
&lt;td&gt;0.043 to 0.226&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Calibration error, SMS spam&lt;/td&gt;
&lt;td&gt;0.249&lt;/td&gt;
&lt;td&gt;0.042 to 0.197&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Calibration error, suite built to force uncertainty (items with a hidden reference answer only)&lt;/td&gt;
&lt;td&gt;0.246&lt;/td&gt;
&lt;td&gt;0.039 to 0.122&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The authors’ summary at the time was that “no class wins on quality”. Jev was the fastest model measured, about 1.2 times faster than the fastest LLM set-up (an open-weight model on specialised inference hardware) and 10 to 16 times faster than models in thinking mode, and they concluded that “the vendor’s speedup claim holds only against LLMs left in their slowest default mode” &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[15]&lt;/a&gt;. On calibration error, Jev sits inside the LLMs’ range on banking intent and above it on spam and on the forced-uncertainty suite, though the correction below limits what that comparison shows.&lt;/p&gt;
&lt;p&gt;On 26 September 2026 the authors corrected the report &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[15]&lt;/a&gt;. Jev’s confidence score is provider-defined, while each LLM was prompted for the probability that its answer was right, so the three calibration rows are not like-for-like. The LLMs, unlike Jev, had been told to report low confidence when unsure, so the 49.7% row is not like-for-like either. And the shuffle row also counts answers that changed between identical repeats; across option orders, with repeats matched, the disagreement rate is 11.7% for Jev against 12.0% to 30.0% for the LLMs.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;jev-benchmarks&lt;/strong&gt;, a pre-registered pilot on 300 held-out examples against an open zero-shot classifier, found Jev more accurate on two of three tasks, where it could handle 83% and 86% of items alone at a 5% error budget &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[14]&lt;/a&gt;. On the third, emotion labelling, Jev put zero probability on the true label for 16% of examples and could automate none of them at that budget; the open classifier managed 2%. The authors fitted those thresholds on the same small slice, so they describe this sample only &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[14]&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Laya documents its own limits unusually well &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[11]&lt;/a&gt; &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[12]&lt;/a&gt;. Its English base checkpoint scores 0.362 on a benchmark of four typed-decision workflows without fine-tuning: above the 0.318 random baseline, and below the 0.461 you would get by always guessing the most common answer. The headline 0.766 belongs to a checkpoint fine-tuned on that benchmark’s own training split. As shipped, the probabilities are overconfident. Fitting one temperature (a single number that sharpens or softens every probability) per question type and option count moves mean ECE from 0.466 to 0.081, per its model card &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[11]&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Held-out results are weaker than in-training ones. On held-out toxic chat, moderation accuracy is 0.530, barely above chance on a balanced split, and the authors put it bluntly: “hand-picked examples work, real traffic does not” &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[12]&lt;/a&gt;. The English checkpoint scored 0.000 accuracy on Khmer, and its authors warn that it stays confident while wrong, which is why their router picks a checkpoint by script before the model runs &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[11]&lt;/a&gt; &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[12]&lt;/a&gt;. The confidence figures from that language sweep predate a later change that clamped the model’s temperatures; the maker has since re-run the sweep, and the English checkpoint’s accuracy reproduced exactly while its confidence figures moved &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[12]&lt;/a&gt;. A confidence gate protects you only on inputs like the ones the model was trained and calibrated on, so check the language and shape of inputs before the gate.&lt;/p&gt;
&lt;p&gt;Laya’s card also has a table that puts it ahead of Jev on most rows, while stating that the Jev figures are “third-party published, never measured here” &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[11]&lt;/a&gt;. Its Jev calibration figure is the 0.246 from the forced-uncertainty suite above, and its own figure is measured after the temperature refit. Each side’s table suits its maker, and neither is a like-for-like comparison.&lt;/p&gt;
&lt;p&gt;Both products are young. At Jev’s launch, access was through a waitlist &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[1]&lt;/a&gt;, and TechCrunch reports that TypeSafe “briefly lost the ability to serve users from its API because demand was so high” &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[16]&lt;/a&gt;. Jev’s rate limits “can change without notice”, and the same weights serve every account, so it cannot be fine-tuned on your data. TypeSafe says “Jev is not trained on customer requests or responses”, and that English is where its accuracy is best &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[3]&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Laya’s first release reached PyPI on 18 September 2026 &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[13]&lt;/a&gt;. Its weights and code are open under Apache 2.0, so you can inspect and run it yourself. It needs fine-tuning and a temperature fit on your task first. Its escalation head, &lt;code&gt;action.act_probability&lt;/code&gt;, “carries no usable signal yet”, and the card advises gating on confidence instead. Its bundled server listens on every network interface (&lt;code&gt;0.0.0.0&lt;/code&gt;) with no authentication unless &lt;code&gt;LAYA_API_KEY&lt;/code&gt; is set &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[11]&lt;/a&gt;, so set the key before the port is reachable.&lt;/p&gt;
&lt;p&gt;The evidence so far is vendor evals, one 300-example independent pilot and one independent benchmark of five small suites.&lt;/p&gt;
&lt;h2 id=&quot;choosing-between-an-llm-a-typed-model-and-a-fine-tuned-classifier&quot;&gt;Choosing between an LLM, a typed model and a fine-tuned classifier&lt;/h2&gt;
&lt;p&gt;TypeSafe’s list of failure modes for &lt;code&gt;jev-1.13&lt;/code&gt; covers literal reading, arithmetic, date comparisons, questions whose answer depends on first answering another question, and counting: “&lt;code&gt;jev-1.13&lt;/code&gt; does not count reliably” &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[4]&lt;/a&gt;. Its advice is to keep arithmetic, dates and counting in code &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[4]&lt;/a&gt;, and to have each question ask one well-scoped thing, composing the answers in code &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[8]&lt;/a&gt;.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Option&lt;/th&gt;
&lt;th&gt;When it fits&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;An LLM&lt;/td&gt;
&lt;td&gt;The output is language, code or an explanation someone will read, or the decision needs several steps of reasoning. Jev “does not generate text, write code, or hold a conversation” &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[6]&lt;/a&gt;. An LLM can also draft labels for training a classifier, with people checking a sample, and give a second opinion on a low-confidence case before it reaches a person.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A typed decision model&lt;/td&gt;
&lt;td&gt;The options are fixed per request, one call asks several questions, and you have no labelled data yet. Used zero-shot, Jev beat an open zero-shot classifier on two of three tasks in one pilot &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[14]&lt;/a&gt;. Laya fits only after fine-tuning, since its base checkpoints are near chance &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[11]&lt;/a&gt;, and its authors advise keeping Choice questions under about 20 options &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[12]&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A fine-tuned classifier&lt;/td&gt;
&lt;td&gt;You have labelled data and the label set is stable. A 2024 study by Bucher and Martini found small fine-tuned models consistently outperformed zero-shot prompted LLMs on text classification &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[24]&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;how-we-evaluate-a-decision-model-before-trusting-it&quot;&gt;How we evaluate a decision model before trusting it&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Build a held-out set from your own traffic&lt;/strong&gt;, labelled by people and never used for prompt tuning or threshold fitting. Laya’s results show why: spam, which was in its training mix, scores 0.993, against the held-out moderation result above &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[12]&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Measure discrimination and probability quality separately.&lt;/strong&gt; Accuracy and macro-F1 (which counts rare labels as much as common ones) for the first. For the second, Brier score and log loss, which penalise confident wrong answers, and calibration error with a reliability diagram like the one below.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fit a temperature on a separate calibration split&lt;/strong&gt; and report calibration before and after. A hosted model’s weights cannot be tuned, but its output probabilities can still be recalibrated on your split. Temperature scaling has a single parameter and is often enough &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[18]&lt;/a&gt;. Laya found overconfidence on some tasks and underconfidence on others &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[12]&lt;/a&gt;, so check each question type.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Report coverage at your error budget for each action separately&lt;/strong&gt;, since each action has its own threshold &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[5]&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Probe the edges.&lt;/strong&gt; Shuffle option order, include items with no correct option, ask a question and its negation, and plant instructions inside the state. TypeSafe’s own docs show a question and its negation on the same ticket returning 0.72 and 0.47, which sum to 1.19 &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[4]&lt;/a&gt;. They also note that injected content “can move the answer” &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[4]&lt;/a&gt;, which matters most when the model is a guardrail.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Measure latency on the real path&lt;/strong&gt;, at the median and the 95th percentile. Laya’s 33 to 40 ms is one question on a T4 GPU, depending on the checkpoint; on CPU its card gives 193 to 464 ms &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[11]&lt;/a&gt;. Jev’s figures are hosted round trips.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Plan for drift.&lt;/strong&gt; Pin the model version, since TypeSafe warns that an alias moves when a new release ships &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[3]&lt;/a&gt;. Log every probability, and recheck calibration on fresh labelled samples on a schedule. Calibration fitted on past data degrades when the inputs shift &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[19]&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;figure&gt;&lt;p&gt;&lt;em&gt;A reliability diagram plots predicted probability against observed frequency, with the diagonal as perfect calibration. The bins start below the diagonal, meaning the model is overconfident. A single temperature dial turns and the bins settle close to the diagonal: for Laya&apos;s English checkpoint the model card reports mean expected calibration error falling from 0.466 to 0.081. The bars sketch the pattern; only the error figures are measured. In general, when the inputs shift, a fit made on past data drifts off the diagonal again, so calibration has to be rechecked on fresh labels.&lt;/em&gt; &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/&quot;&gt;See the animated diagram in the post.&lt;/a&gt;&lt;/p&gt;&lt;figcaption&gt;One temperature, fitted on a calibration split, pulls the bins close to the diagonal. A shift in the inputs pulls them off again, so the fit needs rechecking on fresh labels. The bars sketch the pattern; the error figures are from Laya’s model card [11].&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2 id=&quot;where-this-fits-in-how-we-build&quot;&gt;Where this fits in how we build&lt;/h2&gt;
&lt;p&gt;We send classification to small trained classifiers and keep LLMs for work that needs language. Typed decision models share that view: a decision your software branches on should come from a model trained to return a calibrated label. Our view is that the most dependable path is still a small model fine-tuned on your own labelled data, for the reasons in the table above, and the gap between Laya’s zero-shot and fine-tuned results points the same way. We have not found a comparison of Jev with a classifier fine-tuned on a buyer’s own data, so that is the test worth running. Since Jev’s weights cannot be tuned per account &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/#sources&quot;&gt;[3]&lt;/a&gt;, the tuning moves into how you word the questions and criteria, and into the thresholds in your code.&lt;/p&gt;
&lt;p&gt;In practice we fine-tune encoder classifiers on a client’s data, calibrate and threshold their outputs, gate each action by confidence, and send the uncertain tail to an LLM or a person. Jev and Laya are worth testing against that baseline, on a held-out set, before either replaces it. If you have a classification step that is slow, expensive or hard to trust, &lt;a href=&quot;https://dravin.ai/contact/&quot;&gt;tell us about it&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;sources&quot;&gt;Sources&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;TypeSafe AI, “Introducing System One Models &amp;amp; Jev”, 15 September 2026. &lt;a href=&quot;https://typesafe.ai/blog/introducing-system-one-models-and-jev&quot;&gt;typesafe.ai&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;TypeSafe docs, “System One”. &lt;a href=&quot;https://docs.typesafe.ai/concepts/system-one&quot;&gt;docs.typesafe.ai/concepts/system-one&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;TypeSafe docs, “Models” (jev-1.13.0, rate limits, fine-tuning, data handling, version pinning). &lt;a href=&quot;https://docs.typesafe.ai/models&quot;&gt;docs.typesafe.ai/models&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;TypeSafe docs, “Jev 1.13 jaggedness”, last reviewed 17 September 2026, as archived on 22 September 2026. &lt;a href=&quot;https://web.archive.org/web/20260922230520/https://docs.typesafe.ai/model-jaggedness/jev-1.13&quot;&gt;web.archive.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;TypeSafe docs, “Confidence”. &lt;a href=&quot;https://docs.typesafe.ai/confidence&quot;&gt;docs.typesafe.ai/confidence&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;TypeSafe docs, “Jev with coding agents”. &lt;a href=&quot;https://docs.typesafe.ai/introduction/coding-agents&quot;&gt;docs.typesafe.ai/introduction/coding-agents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;TypeSafe docs, “AI primer”. &lt;a href=&quot;https://docs.typesafe.ai/introduction/machine-learning-primer&quot;&gt;docs.typesafe.ai/introduction/machine-learning-primer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;TypeSafe docs, “Introduction”. &lt;a href=&quot;https://docs.typesafe.ai/introduction&quot;&gt;docs.typesafe.ai/introduction&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;TypeSafe docs, “Primitives”. &lt;a href=&quot;https://docs.typesafe.ai/primitives&quot;&gt;docs.typesafe.ai/primitives&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;TypeSafe, workflow evals. &lt;a href=&quot;https://evals.typesafe.ai/&quot;&gt;evals.typesafe.ai&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Convai Innovations, Laya model card (v0.3.7), revision of 23 September 2026. &lt;a href=&quot;https://huggingface.co/convaiinnovations/laya/blob/5e7b2b1b8ca2ecdd3f2322d94069c9b6ce7e844b/README.md&quot;&gt;huggingface.co/convaiinnovations/laya&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Laya, BENCHMARKS.md, as of 4 October 2026. &lt;a href=&quot;https://github.com/NandhaKishorM/laya/blob/7446c6993ac0925df06028c67966d90cdd769537/BENCHMARKS.md&quot;&gt;github.com/NandhaKishorM/laya&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Laya on PyPI, first release 18 September 2026. &lt;a href=&quot;https://pypi.org/project/laya/&quot;&gt;pypi.org/project/laya&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;jev-benchmarks, pre-registered pilot, September 2026. &lt;a href=&quot;https://github.com/AbdelStark/jev-benchmarks&quot;&gt;github.com/AbdelStark/jev-benchmarks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;decision-model-benchmark: &lt;a href=&quot;https://github.com/nibzard/decision-model-benchmark/tree/8404980de041f38c2f5cc84cc4a617345091bf40&quot;&gt;README and v2 report of record, 18 September 2026&lt;/a&gt; and &lt;a href=&quot;https://github.com/nibzard/decision-model-benchmark/blob/c4fdf554d069e00796988a549048ac63ef70b5d0/results/v3/v3.md&quot;&gt;v3 correction notice and report, 26 September 2026&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Tim Fernholz, “A new kind of AI model from a ChatGPT inventor is thrilling developers”, TechCrunch, 18 September 2026. &lt;a href=&quot;https://techcrunch.com/2026/09/18/a-new-kind-of-ai-model-from-a-chatgpt-inventor-is-thrilling-developers/&quot;&gt;techcrunch.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Thomas Claburn, “TypeSafe AI debuts model for machines that plays Doom”, The Register, 16 September 2026. &lt;a href=&quot;https://www.theregister.com/ai-and-ml/2026/09/16/typesafe-ai-debuts-model-for-machines-that-plays-doom/5296711&quot;&gt;theregister.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Guo, Pleiss, Sun and Weinberger, “On Calibration of Modern Neural Networks”, ICML 2017. &lt;a href=&quot;https://arxiv.org/abs/1706.04599&quot;&gt;arXiv:1706.04599&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Ovadia et al., “Can You Trust Your Model’s Uncertainty? Evaluating Predictive Uncertainty Under Dataset Shift”, NeurIPS 2019. &lt;a href=&quot;https://arxiv.org/abs/1906.02530&quot;&gt;arXiv:1906.02530&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Xiong et al., “Can LLMs Express Their Uncertainty?”, ICLR 2024. &lt;a href=&quot;https://arxiv.org/abs/2306.13063&quot;&gt;arXiv:2306.13063&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Tian et al., “Just Ask for Calibration”, 2023. &lt;a href=&quot;https://arxiv.org/abs/2305.14975&quot;&gt;arXiv:2305.14975&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Kadavath et al., “Language Models (Mostly) Know What They Know”, 2022. &lt;a href=&quot;https://arxiv.org/abs/2207.05221&quot;&gt;arXiv:2207.05221&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Geifman and El-Yaniv, “Selective Classification for Deep Neural Networks”, NeurIPS 2017. &lt;a href=&quot;https://arxiv.org/abs/1705.08500&quot;&gt;arXiv:1705.08500&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Bucher and Martini, “Fine-Tuned ‘Small’ LLMs (Still) Significantly Outperform Zero-Shot Generative AI Models in Text Classification”, 2024. &lt;a href=&quot;https://arxiv.org/abs/2406.08660&quot;&gt;arXiv:2406.08660&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This post first appeared on &lt;a href=&quot;https://dravin.ai/blog/jev-and-typed-decision-models/&quot;&gt;Dravin AI&lt;/a&gt;.&lt;/p&gt;</content:encoded><category>Typed decision models</category><category>Classification</category><category>Calibration</category><category>Model evaluation</category><author>info@dravin.ai (Dravin AI)</author></item></channel></rss>