webAI has released TwIL-LM, a two-model family of formal-logic reasoners at 1.7B and 3B parameters. The 3B member, TwIL-LM3, is a merged fine-tune of SmolLM3-3B; the 1.7B member is a PEFT LoRA adapter for SmolLM2-1.7B-Instruct. Both target autoformalization: translating English into first-order logic and checking whether a conclusion follows from its premises. Both run locally, with a 1.06 GB quantized build for the 1.7B and a 1.78 GiB Q4_K_M GGUF for the 3B. webAI’s announcement frames the release around beating gpt-oss-120b on four of five formal-reasoning lanes.
Is it deployable?
Partially. Non-commercial use only, as of now.
Both checkpoints ship under the webAI Non-Commercial License ver. 1.0. Revenue-generating deployment requires a separate agreement with webAI.
- Company level: any size. The 3B
Q4_K_MGGUF is 1.78 GiB and runs on CPU or 4 GB of VRAM. The 1.7BQ4_K_Mis 1.06 GB. - Industries: compliance and RegTech, financial services, healthcare and pharma, legal and contract operations, formal-methods research. webAI positions local execution for environments where data cannot leave the device.
- Applications: first-order logic (FOL) translation, entailment classification over premise sets, natural language to structured query, Lean formalization drafting and critique, and a verifier layer that checks a larger model’s output.
How TwIL-LM3 was built?
Four stages sit on top of the base model. LoRA supervised fine-tuning on a synthetic formal-logic corpus. Checkpoint fusion, averaging intermediate SFT checkpoints in parameter space. WiSE-FT interpolation back toward the pretrained base at λ = 0.25. Then MGPO, an entropy-weighted GRPO stage run against a programmatic verifier. The published checkpoint is step 2071.
That λ is load-bearing: only a quarter of the fine-tuned delta is retained. A sibling arm that skipped the interpolation scored higher in-domain, at macro gate 0.515, but gave back roughly twelve points of held-out capability. webAI did not publish that arm.
<div class="pane" id="p2" role="tabpanel">
<p class="lede">Track A, in-domain formal logic, scores ×100. Toggle the arms. <b>TwIL-LM3*</b> is the version webAI’s press numbers come from, and its weights are not released yet.</p>
<div class="ctl">
<span class="lbl">Arms</span>
<button class="btn" data-s="ship" aria-pressed="true">TwIL-LM3 (shipping)</button>
<button class="btn" data-s="star" aria-pressed="true">TwIL-LM3* (unreleased)</button>
<button class="btn" data-s="oss" aria-pressed="true">gpt-oss-120b</button>
</div>
<div id="lanes"></div>
<div class="warn"><b>Read the column header.</b> webAI’s announcement cites 96.4 rule induction, 87.6 semantic parse, 64.6 Lean, 52.0 MCQ and 68.7 entailment. All five are TwIL-LM3* values. The shipping checkpoint scores 31.92, 44.16, 58.69, 11.00 and 57.50, and trails gpt-oss-120b on the six-lane average, 0.4488 to 0.5192.</div>
</div>
<div class="pane" id="p3" role="tabpanel">
<p class="lede">Four stages sit on top of SmolLM3-3B. Stage 3 is the one that decides whether general capability survives the fine-tune.</p>
<div class="steps" id="steps"></div>
<div class="detail" id="sdet"></div>
<div class="ctl" style="margin:18px 0 0">
<span class="lbl">WiSE-FT setting</span>
<button class="btn" data-l="0" aria-pressed="false">λ = 0 (base)</button>
<button class="btn" data-l="1" aria-pressed="true">λ = 0.25 (published)</button>
<button class="btn" data-l="2" aria-pressed="false">no interpolation</button>
</div>
<div class="gauges">
<div class="g"><div class="g-l">In-domain · macro gate</div><div class="g-v" id="gv1">0.4218</div>
<div class="g-b"><div class="g-f" id="gf1" style="background:var(–blue)"></div></div></div>
<div class="g"><div class="g-l">Held-out · macro, 10 CoT sets</div><div class="g-v" id="gv2">0.7339</div>
<div class="g-b"><div class="g-f" id="gf2" style="background:var(–amber)"></div></div></div>
</div>
<p class="note" id="lnote"></p>
</div>
<div class="pane" id="p4" role="tabpanel">
<p class="lede">Track B, answers per second. Each dot is one completed answer, released in real time at the measured rate over a two-second window. This is the gap that survives every caveat.</p>
<div class="ctl">
<button class="btn primary" id="race">Start ▶</button>
<button class="btn" id="reset">Reset</button>
<span class="lbl" style="margin-left:6px">Elapsed <span id="clock" style="color:var(–blue)">0.0s</span></span>
</div>
<div class="rt" id="rt"></div>
<table class="tbl">
<tr><th>Arm</th><th>ans/s</th><th>tok/s</th><th>mean gen length</th></tr>
<tr><td class="hi">TwIL-LM3</td><td class="hi">32.9</td><td>15880</td><td class="hi">482</td></tr>
<tr><td>Llama-3.2-3B</td><td>31.7</td><td>16160</td><td>510</td></tr>
<tr><td>SmolLM3-3B base</td><td>24.9</td><td>15564</td><td>626</td></tr>
<tr><td>Qwen3-8B</td><td>4.9</td><td>9420</td><td>≈1931</td></tr>
<tr><td>gpt-oss-120b</td><td>4.2</td><td>3374</td><td>801</td></tr>
</table>
<p class="note">gpt-oss-120b was run at MXFP4 on tensor-parallel 2, so its throughput is not directly comparable to the single-GPU bf16 arms. webAI’s blog frames this gap as 2.6× (32.9 vs 12.6); the Track B table implies roughly 8×.</p>
</div>
<div class="ft">
<span>Source: webAI model cards on Hugging Face, retrieved 10 Aug 2026</span>
<span class="mtp">Marktechpost<span>.</span>com</span>
</div>
</div>
<script>
(function(){
var root = document.getElementById(‘twil’);
var RM = window.matchMedia && window.matchMedia(‘(prefers-reduced-motion: reduce)’).matches;
/* ———- tabs ———- */
var tabs = root.querySelectorAll(‘.tab’);
for (var i=0;i<tabs.length;i++){
tabs[i].addEventListener(‘click’, function(){
for (var j=0;j<tabs.length;j++){ tabs[j].setAttribute(‘aria-selected’,’false’); }
this.setAttribute(‘aria-selected’,’true’);
var panes = root.querySelectorAll(‘.pane’);
for (var k=0;k<panes.length;k++){ panes[k].classList.remove(‘on’); }
document.getElementById(this.getAttribute(‘data-p’)).classList.add(‘on’);
if (this.getAttribute(‘data-p’)===’p2′){ drawLanes(); }
sizeUp();
});
}
/* ———- 1. autoformalize ———- */
var EX = [
{ nl:’All dogs are mammals. Rex is a dog.’,
fol:’u2200x (Dog(x) u2192 Mammal(x))nDog(rex)’,
cc:’Mammal(rex)’, lab:’entailment’,
note:’Universal instantiation, then modus ponens. This is the entailment_label lane, where the shipping model scores 0.5750 and gpt-oss-120b scores 0.7750.’ },
{ nl:’No reptile is warm-blooded. Every snake is a reptile.’,
fol:’u2200x (Reptile(x) u2192 u00ACWarmBlooded(x))nu2200x (Snake(x) u2192 Reptile(x))’,
cc:’u2203x (Snake(x) u2227 WarmBlooded(x))’, lab:’contradiction’,
note:’The candidate conclusion is refuted by the premise set, not merely unsupported. Distinguishing these two failure modes is the whole task.’ },
{ nl:’Some students passed the exam. Ana is a student.’,
fol:’u2203x (Student(x) u2227 Passed(x))nStudent(ana)’,
cc:’Passed(ana)’, lab:’neutral’,
note:’An existential premise does not license a claim about a named individual. Small models fail this lane by defaulting to entailment.’ }
];
var cur = 0;
var exBtns = document.querySelectorAll(‘#p1 .btn[data-ex]’);
for (var e=0;e<exBtns.length;e++){
exBtns[e].addEventListener(‘click’, function(){
for (var m=0;m<exBtns.length;m++){ exBtns[m].setAttribute(‘aria-pressed’,’false’); }
this.setAttribute(‘aria-pressed’,’true’);
cur = parseInt(this.getAttribute(‘data-ex’),10);
play();
});
}
document.getElementById(‘run’).addEventListener(‘click’, play);
var timers = [];
function clearT(){ for (var t=0;t<timers.length;t++){ clearTimeout(timers[t]); } timers=[]; }
function at(ms,fn){ timers.push(setTimeout(fn, RM ? 0 : ms)); }
function play(){
clearT();
var d = EX[cur];
var rows = [‘r1′,’r2′,’r3′,’r4’];
for (var r=0;r<rows.length;r++){ document.getElementById(rows[r]).classList.remove(‘in’); }
document.getElementById(‘bar’).classList.remove(‘in’);
document.getElementById(‘nlp’).innerHTML=”;
document.getElementById(‘folp’).textContent=”;
document.getElementById(‘concl’).textContent=”;
document.getElementById(‘badge’).textContent=”;
document.getElementById(‘note’).textContent=”;
at(60, function(){ document.getElementById(‘r1’).classList.add(‘in’); typeIn(‘nlp’, d.nl, 16); });
at(60 + d.nl.length*16 + 260, function(){
document.getElementById(‘r2’).classList.add(‘in’); typeIn(‘folp’, d.fol, 13);
});
var t2 = 60 + d.nl.length*16 + 260 + d.fol.length*13 + 320;
at(t2, function(){ document.getElementById(‘r3’).classList.add(‘in’);
document.getElementById(‘bar’).classList.add(‘in’); });
at(t2+500, function(){ typeIn(‘concl’, d.cc, 16); });
at(t2+500+d.cc.length*16+280, function(){
document.getElementById(‘r4’).classList.add(‘in’);
document.getElementById(‘badge’).textContent = d.lab;
document.getElementById(‘note’).textContent = d.note;
sizeUp();
});
if (RM){
document.getElementById(‘nlp’).textContent=d.nl;
document.getElementById(‘folp’).textContent=d.fol;
document.getElementById(‘concl’).textContent=d.cc;
}
}
function typeIn(id, txt, sp){
var el = document.getElementById(id);
if (RM){ el.textContent = txt; return; }
el.textContent=”; var n=0;
var iv = setInterval(function(){
n++; el.textContent = txt.slice(0,n);
if (n>=txt.length){ clearInterval(iv); sizeUp(); }
}, sp);
timers.push(iv);
}
play();
/* ———- 2. benchmarks ———- */
var LANES = [
{n:’lean_formalize’, u:’token F1′, ship:58.69, star:64.56, oss:63.06},
{n:’rule_induction’, u:’derivation’, ship:31.92, star:96.44, oss:65.18},
{n:’entailment_label’, u:’accuracy’, ship:57.50, star:68.67, oss:77.50},
{n:’mcq_answer’, u:’accuracy’, ship:11.00, star:52.00, oss:7.00},
{n:’semantic_parse’, u:’token F1′, ship:44.16, star:87.62, oss:43.31},
{n:’lean_critic’, u:’accuracy’, ship:66.00, star:52.00, oss:55.50}
];
var AVG = {n:’average, 6 lanes’, u:’summary’, ship:44.88, star:70.21, oss:51.92};
var SHOW = {ship:true, star:true, oss:true};
var NAMES = {ship:’TwIL-LM3′, star:’TwIL-LM3*’, oss:’gpt-oss-120b’};
var sBtns = document.querySelectorAll(‘#p2 .btn[data-s]’);
for (var s=0;s<sBtns.length;s++){
sBtns[s].addEventListener(‘click’, function(){
var k = this.getAttribute(‘data-s’);
SHOW[k] = !SHOW[k];
this.setAttribute(‘aria-pressed’, SHOW[k] ? ‘true’:’false’);
drawLanes();
});
}
function laneHTML(d, isAvg){
var h = ‘<div class="lane’+(isAvg?’ avg’:”)+’"><div class="lane-h"><span class="lane-n">’+d.n+
‘</span><span class="lane-u">’+d.u+'</span></div><div class="track">’;
var keys=[‘ship’,’star’,’oss’];
for (var q=0;q<keys.length;q++){
var k=keys[q];
if(!SHOW[k]) continue;
h += ‘<div class="b-wrap s-‘+k+’" title="’+NAMES[k]+’"><div class="b-out">’+
‘<div class="b-in" data-w="’+d[k]+’"></div></div><span class="b-val">’+d[k].toFixed(2)+'</span></div>’;
}
return h+'</div></div>’;
}
function drawLanes(){
var box = document.getElementById(‘lanes’); var h=”;
for (var q=0;q<LANES.length;q++){ h += laneHTML(LANES[q], false); }
h += laneHTML(AVG, true);
box.innerHTML = h;
var bars = box.querySelectorAll(‘.b-in’);
setTimeout(function(){
for (var b=0;b<bars.length;b++){ bars[b].style.width = bars[b].getAttribute(‘data-w’)+’%’; }
sizeUp();
}, RM ? 0 : 40);
}
drawLanes();
/* ———- 3. training ———- */
var STEPS = [
{k:’STAGE 01′, t:’LoRA SFT’, d:'<b>LoRA supervised fine-tuning</b> on a synthetic formal-logic corpus covering the Track A objectives: FOL translation, entailment labelling, semantic parsing, Lean formalisation and critique, procedural reasoning, rule induction.’},
{k:’STAGE 02′, t:’Checkpoint fusion’, d:'<b>Parameter-space averaging</b> of intermediate SFT checkpoints, selected by a diversity probe, rather than simply taking the final checkpoint.’},
{k:’STAGE 03′, t:’WiSE-FT, λ = 0.25′, d:'<b>Interpolation back toward the pretrained base:</b> W = (1 − λ)·W_base + λ·W_finetuned. Only a quarter of the fine-tuned delta is kept. λ was chosen by constrained optimisation: maximise in-domain score subject to minimal held-out degradation.’},
{k:’STAGE 04′, t:’MGPO’, d:'<b>Entropy-weighted GRPO</b> reinforcement learning against a programmatic verifier, with partial credit for loose matches and token-F1 so all-fail prompt groups still produce gradient. Published checkpoint is step 2071.’}
];
var sh=”;
for (var st=0;st<STEPS.length;st++){
sh += ‘<button class="step" data-i="’+st+’" aria-pressed="’+(st===2?’true’:’false’)+’">’+
‘<span class="k">’+STEPS[st].k+'</span><span class="t">’+STEPS[st].t+'</span></button>’;
}
document.getElementById(‘steps’).innerHTML = sh;
document.getElementById(‘sdet’).innerHTML = STEPS[2].d;
var stBtns = document.querySelectorAll(‘#steps .step’);
for (var y=0;y<stBtns.length;y++){
stBtns[y].addEventListener(‘click’, function(){
for (var z=0;z<stBtns.length;z++){ stBtns[z].setAttribute(‘aria-pressed’,’false’); }
this.setAttribute(‘aria-pressed’,’true’);
document.getElementById(‘sdet’).innerHTML = STEPS[parseInt(this.getAttribute(‘data-i’),10)].d;
sizeUp();
});
}
var LAM = [
{g:0.3466, h:0.7193, n:’λ = 0 keeps none of the fine-tune. This is the SmolLM3-3B base column, shown for reference.’},
{g:0.4218, h:0.7339, n:’The published release. It is the only arm in the project that gains on both tracks at once: +26% relative in-domain, and +0.022 on the held-out core average.’},
{g:0.5150, h:0.6139, n:’A sibling arm that skipped the conservative interpolation scored macro gate 0.515 but gave back roughly twelve points of held-out capability. webAI did not publish it; the held-out bar here is derived from that stated twelve-point drop, not a printed figure.’}
];
var lBtns = document.querySelectorAll(‘#p3 .btn[data-l]’);
for (var l=0;l<lBtns.length;l++){
lBtns[l].addEventListener(‘click’, function(){
for (var n=0;n<lBtns.length;n++){ lBtns[n].setAttribute(‘aria-pressed’,’false’); }
this.setAttribute(‘aria-pressed’,’true’);
setLam(parseInt(this.getAttribute(‘data-l’),10));
});
}
function setLam(i){
var d = LAM[i];
document.getElementById(‘gv1’).textContent = d.g.toFixed(4);
document.getElementById(‘gv2′).textContent = d.h.toFixed(4) + (i===2?’ *’:”);
document.getElementById(‘gf1′).style.width = (d.g*100)+’%’;
document.getElementById(‘gf2′).style.width = (d.h*100)+’%’;
document.getElementById(‘lnote’).innerHTML = d.n;
sizeUp();
}
setTimeout(function(){ setLam(1); }, RM?0:60);
/* ———- 4. throughput ———- */
var ARMS = [
{n:’TwIL-LM3′, r:32.9, c:’var(–blue)’},
{n:’Llama-3.2-3B’, r:31.7, c:’#6E7B8A’},
{n:’SmolLM3-3B base’, r:24.9, c:’#6E7B8A’},
{n:’Qwen3-8B’, r:4.9, c:’#6E7B8A’},
{n:’gpt-oss-120b’, r:4.2, c:’var(–amber)’}
];
var rh=”;
for (var a=0;a<ARMS.length;a++){
rh += ‘<div class="rl"><div class="rl-h"><span class="rl-n">’+ARMS[a].n+
‘</span><span class="rl-s"><span id="cnt’+a+’">0</span> answers · ‘+ARMS[a].r.toFixed(1)+
‘/s</span></div><div class="lane-t" id="tk’+a+’"></div></div>’;
}
document.getElementById(‘rt’).innerHTML = rh;
var raf=null, t0=0, acc=[], counts=[], running=false;
function resetRace(){
if(raf) cancelAnimationFrame(raf); raf=null; running=false;
acc=[]; counts=[];
for (var a2=0;a2<ARMS.length;a2++){
acc.push(0); counts.push(0);
document.getElementById(‘tk’+a2).innerHTML=”;
document.getElementById(‘cnt’+a2).textContent=’0’;
}
document.getElementById(‘clock’).textContent=’0.0s’;
document.getElementById(‘race’).textContent=’Start u25B6′;
}
var WINDOW = 2.0; // seconds of real-time playback
var MAXDOTS = Math.ceil(32.9*WINDOW) + 1;
function emit(i){
var tk = document.getElementById(‘tk’+i);
var w = tk.clientWidth || 300;
var gap = (w – 10) / MAXDOTS;
var dot = document.createElement(‘div’);
dot.className=’dot’;
dot.style.background = ARMS[i].c;
dot.style.left = (counts[i]*gap) + ‘px’;
dot.style.opacity = ‘0’;
tk.appendChild(dot);
setTimeout(function(){ dot.style.transition=’opacity .2s’; dot.style.opacity=’1′; },8);
counts[i]++;
document.getElementById(‘cnt’+i).textContent = counts[i];
}
function step(ts){
if(!t0) t0=ts;
var el=(ts-t0)/1000;
document.getElementById(‘clock’).textContent = el.toFixed(1)+’s’;
for (var i=0;i<ARMS.length;i++){
var want = Math.floor(el*ARMS[i].r);
var need = Math.min(want-counts[i], 4);
for (var q=0;q<need;q++){ emit(i); }
}
if (el < WINDOW){ raf=requestAnimationFrame(step); }
else { running=false; document.getElementById(‘clock’).textContent=WINDOW.toFixed(1)+’s’;
document.getElementById(‘race’).textContent=’Replay u21BA’; }
}
document.getElementById(‘race’).addEventListener(‘click’, function(){
resetRace(); t0=0; running=true;
this.textContent=’Running…’;
raf=requestAnimationFrame(step);
});
document.getElementById(‘reset’).addEventListener(‘click’, resetRace);
resetRace();
/* ———- auto-resize ———- */
function sizeUp(){
try{
var h = root.offsetHeight + 40;
if (window.parent && window.parent !== window){
window.parent.postMessage({twilHeight:h}, ‘*’);
}
}catch(err){}
}
window.addEventListener(‘load’, sizeUp);
setInterval(sizeUp, 1200);
sizeUp();
})();
</script>
</body>
</html>
“>
Performance
webAI's announcement lists 96.4 on rule induction, 87.6 on semantic parsing, 64.6 on Lean formalization, 52.0 on exact-format answering, and 68.7 on entailment labeling.
It reports two tracks. On Track A, in-domain formal logic, TwIL-LM3 scores 0.4488 on the six-lane average and 0.4218 on the macro gate, the metric the training pipeline gates on. It leads every arm up to and including LFM2.5-8B-A1B on all six objective lanes, at 0.4218 against 0.3757 with a third of the parameters. It does not lead the two largest arms. Qwen3-8B takes the gate 0.5336 to 0.4218, but most of that is loose-match credit; under strict-7 the two sit at 0.2093 and 0.1971. gpt-oss-120b takes the six-lane average 0.5192 to 0.4488.
Efficiency is where the model card is unambiguous. TwIL-LM3 produces the shortest generations of any arm, 482 tokens on Track B, and consequently the most answers per second at 32.9 against the 120B's 4.2.

Held-out transfer
TwIL-LM3 improves in-domain by +26% relative, macro gate 0.336 to 0.422, while also gaining +0.022 on the held-out core average. The model card calls it the only arm in the project that gains on both tracks. LogicBench moves to 0.7167 from 0.6467. GSM8K slips slightly to 0.8733 from 0.8833, and IFEval regresses to 0.6433 from 0.6767.
The 1.7B is a different trade. Its macro-primary score is 0.361 against 0.185 for the unadapted base. Out-of-distribution results are mixed: LogicBench BQA improves to 0.590 from 0.563, while GSM8K falls to 0.380 from 0.413 and ARC-C chain-of-thought falls to 0.463 from 0.587.
Key Takeaways
- TwIL-LM3 (3B) and TwIL-LM (1.7B) target formal logic, both under a non-commercial license.
- Shipping TwIL-LM3 trails gpt-oss-120b on the six-lane average, 0.4488 to 0.5192.
- Its real edge is efficiency: 32.9 answers/sec from 482-token generations.
- WiSE-FT at λ = 0.25 is why in-domain gains do not collapse held-out performance.
Check out the Model weights and Technical details. Also, feel free to follow us on Twitter and don’t forget to join our 150k+ML SubReddit and Subscribe to our Newsletter. Wait! are you on telegram? now you can join us on telegram as well.
Need to partner with us for promoting your GitHub Repo OR Hugging Face Page OR Product Release OR Webinar etc.? Connect with us
The post webAI Releases TwIL-LM: A 1.7B and 3B Formal-Logic Model Family for Autoformalization on Local Hardware appeared first on MarkTechPost.