Liquid AI Releases Open-Weight d1-3B and d1-omni-600M: Multimodal Decision Models With Zero Output Tokens


Liquid AI has released Open d1, two open-weight multimodal models in its d1 decision model family. d1-3B reads text and images. d1-omni-600M reads text with an image, or text with audio. Neither model writes text. Each returns calibrated, typed answers in one forward pass with zero output tokens. The target is real-time decisions on the NVIDIA stack: DGX servers, RTX workstations, and Jetson edge boards.

Is it deployable? Yes. Both checkpoints are on Hugging Face, load through Transformers, and have day-one llama.cpp support. The LFM Open License v1.0 allows free commercial use below $10 million in annual revenue. d1-omni-600M is an early research release with no published latency figures.

A generative LLM writes its answer token by token, and your code parses it. A decision model takes a state and a set of named questions. It reads them once and returns a probability for every allowed answer. The Liquid AI define three question types:

Several questions can share one state in a single call. Every response reports output_tokens: 0. Liquid AI recommends d1 for routing, moderation, intent classification, reranking, LLM-as-a-judge scoring, agent guardrails, and visual inspection. Neither checkpoint is a chat model.

/g,’>’)}
function fmt(v){return v>=0.01?v.toFixed(v>=0.995&&v<1?4:2):v.toPrecision(1)}
function barRow(lbl,v,top){return ‘

‘+esc(lbl)+’‘+fmt(v)+’

‘}
function renderEx(k){
var d=EX[k];
$(‘exState’).textContent=”””+d.state+'”‘;
$(‘exQs’).innerHTML=d.qs.map(function(q){return ‘

‘+q[0]+’‘+esc(q[1])+’: ‘+esc(q[2])+’

‘}).join(”);
var h=””,json={answers:{},usage:{output_tokens:0}};
d.out.forEach(function(o){
h+=’

‘+o.type+’‘+esc(o.name)+’

‘;
if(o.type===’noul’){h+=barRow(‘P(yes)’,o.p,true);json.answers[o.name]={type:’noul’,noul:o.p}}
if(o.type===’choice’){h+=’

‘+o.probs.map(function(p,i){return barRow(p[0],p[1],i===0)}).join(”)+’

‘;
var pr={};o.probs.forEach(function(p){pr[p[0]]=p[1]});json.answers[o.name]={type:’choice’,choice:o.choice,confidence:o.conf,probabilities:pr}}
if(o.type===’score’){var t=””;for(var i=0;i‘;
h+=’

‘+t+’

0 ‘+esc(o.ends[0])+’score ‘+o.score+’‘+(o.levels-1)+’ ‘+esc(o.ends[1])+’

‘;
var sp={};o.probs.forEach(function(p){sp[p[0]]=p[1]});json.answers[o.name]={type:’score’,score:o.score,confidence:o.conf,probabilities:sp}}
h+=’

‘;
});
if(d.gate){h+=”}
$(‘exOut’).innerHTML=h;
$(‘exJson’).textContent=JSON.stringify(json,null,2);
requestAnimationFrame(function(){requestAnimationFrame(function(){
$(‘exOut’).querySelectorAll(‘.tr i’).forEach(function(i){i.style.width=i.dataset.w+’%’});
$(‘exOut’).querySelectorAll(‘.mk’).forEach(function(m){m.style.left=m.dataset.l+’%’});
})});
if(d.gate){$(‘gR’).addEventListener(‘input’,function(){var p=this.value/1000,a=p>0.8?’block’:(p<0.2?’allow’:’human_review’);
$(‘gV’).textContent=p.toFixed(3);var e=$(‘gA’);e.textContent=a;e.className=”act “+(a===’block’?’block’:a===’allow’?’allow’:’rev’)})}
setTimeout(post,30);
}
R.querySelectorAll(‘#qtypes .chip’).forEach(function(c){c.addEventListener(‘click’,function(){
R.querySelectorAll(‘#qtypes .chip’).forEach(function(x){x.setAttribute(‘aria-pressed’,’false’)});
c.setAttribute(‘aria-pressed’,’true’);cur=c.dataset.x;renderEx(cur)})});

/* 03 latency (d1-3B model card) */
var DEV=[
{n:’NVIDIA RTX 4090′,g:’GPU’,v:[8,21,102,17],tp:’475 / s’,nv:1},
{n:’AMD MI325X’,g:’GPU’,v:[9,14,44,18],tp:’1,106 / s’},
{n:’Jetson AGX Thor’,g:’Edge’,v:[16,20,220,35],tp:’262 / s’,nv:1},
{n:’Jetson AGX Orin 64 GB’,g:’Edge’,v:[26,35,560,83],tp:’110 / s’,nv:1},
{n:’Apple M5 Pro’,g:’Edge’,v:[30,41,640,62],tp:’78 / s’},
{n:’Jetson Orin Nano’,g:’Edge’,v:[50,73,1640,202],tp:’38 / s’,nv:1}
];
var WL=[‘1 question’,’3 questions, one pass’,’3.4K-token state’,’384px image’],w=0,sel=0;
function renderLat(){
var mx=Math.max.apply(null,DEV.map(function(d){return d.v[w]}))*1.06,ref=33.3/mx*100;
$(‘lat’).innerHTML=DEV.map(function(d,i){
return ‘

‘+d.n+’‘+d.g+’‘+(ref<100?’‘:”)+’‘+d.v[w].toLocaleString(‘en-US’)+’ ms

‘}).join(”);
requestAnimationFrame(function(){requestAnimationFrame(function(){$(‘lat’).querySelectorAll(‘.tr i’).forEach(function(i){i.style.width=i.dataset.w+’%’})})});
$(‘lat’).querySelectorAll(‘.lrow’).forEach(function(r){
function pick(){sel=+r.dataset.i;renderLat()}
r.addEventListener(‘click’,pick);r.addEventListener(‘keydown’,function(e){if(e.key===’Enter’||e.key===’ ‘){e.preventDefault();pick()}})});
var d=DEV[sel];$(‘kDev’).textContent=d.n.replace(‘NVIDIA ‘,”);$(‘kMs’).textContent=d.v[w].toLocaleString(‘en-US’)+’ ms’;$(‘kWl’).textContent=WL[w];$(‘kTp’).textContent=d.tp;
setTimeout(post,30);
}
R.querySelectorAll(‘#wl .chip’).forEach(function(c){c.addEventListener(‘click’,function(){
R.querySelectorAll(‘#wl .chip’).forEach(function(x){x.setAttribute(‘aria-pressed’,’false’)});
c.setAttribute(‘aria-pressed’,’true’);w=+c.dataset.w;renderLat()})});

/* 04 picker */
var on={text:true,image:false,audio:false};
function renderPick(){
var img=on.image,aud=on.audio,ok3=!aud,okO=!(img&&aud);
$(‘m3b’).className=”mod “+(ok3?’ok’:’no’);$(‘momni’).className=”mod “+(okO?’ok’:’no’);
$(‘v3b’).textContent=ok3?’Supports this request’:’No audio input’;
$(‘vomni’).textContent=okO?’Supports this request’:’One request carries images or audio, not both’;
var n;
if(img&&aud)n=’No single d1 request takes image and audio together. Split it into two calls to d1-omni-600M.’;
else if(aud)n=’Audio routes to d1-omni-600M: up to 30 s of 16 kHz mono speech, trained on English speaker-assistant requests.’;
else if(img)n=’Both fit. d1-3B scores 74.1 on 11 image benchmarks and has published latency. d1-omni-600M is 5x smaller.’;
else n=’Both fit. d1-3B leads on quality (text benchmark mean 82.9 vs 78.4). d1-omni-600M fits where footprint matters.’;
$(‘pickNote’).textContent=n;setTimeout(post,30);
}
R.querySelectorAll(‘#mods .chip’).forEach(function(c){c.addEventListener(‘click’,function(){
var k=c.dataset.m;if(k===’text’)return;on[k]=!on[k];c.setAttribute(‘aria-pressed’,on[k]?’true’:’false’);renderPick()})});

renderEx(cur);renderLat();renderPick();
if(window.ResizeObserver)new ResizeObserver(post).observe(R);
window.addEventListener(‘load’,post);setTimeout(post,300);
})();



Source link

Leave a Reply

Your email address will not be published. Required fields are marked *