What are Decision AI Models?
Decision AI models are a new class of model that returns a decision, not a paragraph. You send text with typed questions. The model returns choices, scores or yes/no probabilities your code can branch on directly.
The category went mainstream when TypeSafe AI launched Jev after 2 years in stealth. TypeSafe calls it a ‘System One model,’ after Daniel Kahneman’s fast, intuitive System 1 thinking.
Within 3 weeks, Fastino Labs shipped 2 rival models, and open-source developers published several Jev-style reproductions. This article covers how the category works, where it fits, and how the options compare.
How Jev Works
Jev accepts a ‘state’ (a string, array or set of name-value pairs) and one or more questions. According to the TypeSafe docs, it supports 3 primitives:
- Choice: pick one option from a list, with probabilities and confidence. TypeSafe says Jev supports up to 255 options.
- Score: rate the state on a rubric of ordered levels, with probabilities and confidence.
- Noul: a 0 to 1 probability that a statement is true. The name is short for Bernoulli.
Every question is evaluated in parallel and in isolation against the same state. Adding questions barely changes response time. Because Jev never generates strings, TypeSafe says it cannot return a type error.
Under the hood, TypeSafe describes a new architecture, a parallel sampler and a training method called Reinforcement Learning for Calibrated Decisions (RLCD). RLHF optimizes for human preference. RLCD optimizes for calibrated probabilities, where higher confidence should mean higher accuracy.
Pricing is the key thing to watch. Jev costs $0.042 per million input tokens, and output is free. OpenRouter lists a 32K context window. TypeSafe reports end-to-end responses in 70 to 500 milliseconds.
Interactive Explainer
‘+q.t+’
‘;
q.o.forEach(function(o){var w=o.length===3?o[1]/o[2]:o[1];h+=’
‘+o[0]+’‘+(o.length===3?o[1].toFixed(2)+’ / ‘+o[2]:o[1].toFixed(2))+’
‘})});
$(‘qs’).innerHTML=h;setTimeout(function(){R.querySelectorAll(‘#qs .bar i’).forEach(function(x){x.style.width=x.dataset.w+’%’})},40);setTimeout(resize,100)}
S.forEach(function(s,i){var b=document.createElement(‘button’);b.className=”btn ghost”;b.textContent=s.n;b.onclick=function(){renderS(i)};$(‘sopts’).appendChild(b)});
renderS(0);
/* 3. thresholds */
var D=[[‘Tag ticket topic’,.97,0],[‘Show balance’,.91,0],[‘Route to billing’,.88,0],[‘Spam flag’,.95,0],[‘Issue refund’,.86,1],[‘Close alert’,.72,0],[‘Delete account’,.93,1],[‘Pick tool’,.81,0],[‘Escalate to on-call’,.66,0],[‘Block payment’,.84,1],[‘Rerank result’,.58,0],[‘Approve invoice’,.79,1]];
function gate(){var th=+$(‘th’).value,ir=+$(‘ir’).value;$(‘thv’).textContent=th.toFixed(2);$(‘irv’).textContent=ir.toFixed(2);
var a=””,h=””,na=0,nh=0;D.forEach(function(d){var need=Math.min(.99,th+(d[2]?ir:0));var html=”‘+d[0]+’ ‘+d[1].toFixed(2)+’‘;if(d[1]>=need){a+=html;na++}else{h+=html;nh++}});
$(‘ca’).innerHTML=a;$(‘ch’).innerHTML=h;$(‘na’).textContent=na;$(‘nh’).textContent=nh;resize()}
$(‘th’).oninput=gate;$(‘ir’).oninput=gate;gate();
/* 4. cost */
function money(x){return x>=1000?’$’+Math.round(x).toLocaleString():’$’+x.toFixed(2)}
function cost(){var d=Math.round(Math.pow(10,+$(‘d’).value)),t=+$(‘t’).value,p=+$(‘p’).value,o=+$(‘o’).value,op=+$(‘op’).value;
$(‘dv’).textContent=d.toLocaleString();$(‘tv’).textContent=t;$(‘pv’).textContent=”$”+p.toFixed(2);$(‘ov’).textContent=o;$(‘opv’).textContent=”$”+op.toFixed(2);
var j=d*30*t*0.042/1e6,l=d*30*(t*p+o*op)/1e6;$(‘jm’).textContent=money(j);$(‘lm’).textContent=money(l);
var mx=Math.max(j,l);$(‘jb’).style.width=(j/mx*100)+’%’;$(‘lb’).style.width=(l/mx*100)+’%’;
$(‘rt’).textContent=(l/j).toFixed(0)+’x cheaper on token price alone’;}
[‘d’,’t’,’p’,’o’,’op’].forEach(function(id){$(id).oninput=cost});cost();
window.addEventListener(‘load’,resize);window.addEventListener(‘resize’,resize);setTimeout(resize,300);
})();


