Meet Needle 2: An Open 45M-Parameter Tool-Calling Model That Ships as a 14MB Binary and Runs a Full Session in 28MB of RAM


Cactus Compute has released Needle 2, an open 45M-parameter model for tool calling, device use, and structured extraction. The entire model ships as a single 14MB binary that runs a full session in about 28MB of RAM. Weights are trained and deployed at CQ2-bit using Cactus Quants, and the model is sealed inside the company’s own C++ engine, so there is no runtime to install and no download at inference time. Reported decode throughput is 500 tokens/sec on a Raspberry Pi 5, 400–1,500 tokens/sec on Meta Quest 3S and Apple Vision Pro, and 300–700 tokens/sec on sub-$200 phones. The design premise is narrow and stated plainly by the team: mapping a messy sentence onto a typed function signature needs no world knowledge and no open-ended prose. That framing is why 45M parameters are enough here, and why the model targets hardware with no GPU and no NPU.

Is it deployable?

Yes, Needle 2 ships as prebuilt binaries and a static library for macOS, Linux (x86-64, ARM64, ARMv7, RISC-V, MIPS32el), Windows, Android, iOS/watchOS/tvOS, and WebAssembly. Cactus says Pebble already runs Needle locally in the Index 01 app for offline voice actions.

  • Which companies: Any team shipping firmware or apps on constrained hardware. Seed-stage wearable and IoT startups, mid-market consumer-electronics OEMs, robotics teams, and large device makers needing an offline fallback. Cloud-first SaaS teams gain less.
  • Industries: smart home, wearables, low-end mobile, automotive in-cabin control, service robotics, retail kiosks and POS, routers and IP cameras, and regulated settings where audio cannot leave the device.
  • Applications: voice-to-action on screenless devices, offline appliance control, receipt and invoice field extraction, enum tagging, and local routing that escalates to the cloud only on low confidence.

Architecture: Simple Attention Network

Needle 2 uses what Cactus team calls a Simple Attention Network. The recipe replaces the FFN with a Hadamard MLP, keeps GQA attention, adds engram key-value memory from hashed n-gram tables, and uses multi-lane hyper-connections. The network is 27 layers and 512 wide. The underlying study is on arXiv as A Controlled Study of Attention-Only Transformers.

Pretraining used a proprietary 115B-token corpus, with 38B tokens of post-training. The research team notes LFM2.5-230M was pretrained on 19 trillion tokens.

Needle 2 spends 70 MFLOPs per token, with 35M of 45M parameters matmul-active. LFM2.5 230M spends 460, FunctionGemma 270M spends 540, and Apple FM sits near 6,000.

Engine, grammar, retrieval, and confidence

Weights never decompress into RAM. The 2-bit codes expand inside vector registers and fuse into integer dot products, so the arithmetic path stays int8. One binary probes the CPU at startup and selects a kernel tier: SDOT, NEON, AVX2, RISC-V vectors, wasm SIMD, or scalar.

A byte-level grammar compiled from your JSON schemas constrains every emitted token. Because the matcher knows which tokens are legal before logits exist, the engine skips up to 98% of the vocabulary projection on structural tokens.

Attention uses a 256-token sliding window, and the system turn plus tool declarations are pinned as KV sinks. Memory stays near 28MB regardless of conversation length.

Declare five or fewer tools and they render directly. Above five, a contrastive retrieval head embeds each schema once, scores the query per turn, and admits only the top five. Unselected tools are unreachable, not merely unlikely.

Every response carries a confidence value, the minimum of a calibrated post-hoc head and the decoding probability of the call tokens. Off-topic requests return the empty call []. The contract is a threshold: act above it, re-ask or escalate below it.

Evaluation

Cactus team evaluates on five public function-calling benchmarks using ordered strict exact match, where names, call order, and every argument must match. Needle 2 runs end-to-end through the shipped engine at CQ2-bit with retrieval on; baselines run f16 under vLLM.

BenchmarkNeedle 2 (CQ2)LFM2.5 230MFunctionGemma 270MApple FM
Mobile Actions (961)63.769.164.057.6
DroidCall (200)17.011.017.5
Seal-Tools in-domain (700)32.626.916.3
Seal-Tools OOD (654)28.717.015.6
BFCL v4 single-turn (3,641), overall42.660.846.161.7

Needle 2 leads both Seal-Tools splits and posts 98.3 function-name accuracy on Mobile Actions. It trails on BFCL v4, which Cactus attributes to distribution: its corpus is consumer device actions, not general or enterprise APIs. Well-formed output rate across the 3,641 BFCL rows is 93.4. The team states two asymmetries upfront: f16 baselines favor them, and task specialization favors Needle.

‘;
}).join(”);
noteEl.textContent=d.note;
var fills=barsEl.querySelectorAll(‘.n2-bar-f’);
d.rows.forEach(function(r,i){
var w=Math.max(2,(r[1]/max)*100);
if(reduce){fills[i].style.width=w+’%’;}
else setTimeout(function(){fills[i].style.width=w+’%’;},60*i+40);
});
post();
}
root.querySelectorAll(‘[data-m]’).forEach(function(b){
b.addEventListener(‘click’,function(){
root.querySelectorAll(‘[data-m]’).forEach(function(x){x.classList.remove(‘is-on’)});
b.classList.add(‘is-on’); metric=b.dataset.m; drawBars(metric);
});
});
drawBars(‘params’);

/* ———- 02 grammar ———- */
var CALL=[
[‘{“name”:”‘,1],[‘set_lights’,0],[‘”,”arguments”:{“room”:”‘,1],[‘living room’,0],
[‘”,”on”:’,1],[‘true’,0],[‘,”brightness”:’,1],[’30’,0],[‘}}’,1]
];
var term=document.getElementById(‘n2-term’), m1=document.getElementById(‘n2-m1’), m2=document.getElementById(‘n2-m2′);
var timer=null;
function resetG(){
if(timer){clearInterval(timer);timer=null;}
term.innerHTML=’> dim the living room to 30‘;
m1.textContent=”0%”; m2.textContent=”0″; post();
}
document.getElementById(‘n2-reset-g’).addEventListener(‘click’,resetG);
document.getElementById(‘n2-decode’).addEventListener(‘click’,function(){
if(timer){clearInterval(timer);timer=null;}
var flat=[]; CALL.forEach(function(seg){
for(var i=0;i=flat.length){ if(timer){clearInterval(timer);timer=null;} caret.remove();
m1.textContent=”2%”; m2.textContent=forced; post(); return; }
var ch=flat[i][0], isF=flat[i][1];
var s=document.createElement(‘span’); s.className=isF?’n2-forced’:’n2-free’;
s.textContent=ch; out.appendChild(s);
if(isF) forced++;
var pct=Math.round(100-(forced/(i+1))*98);
m1.textContent=pct+’%’; m2.textContent=forced;
i++;
}
if(reduce){ while(i‘+t+”}).join(”);
function retrieve(qi){
var sel=PICKS[qi];
[].slice.call(chipsEl.children).forEach(function(c,i){
c.classList.remove(‘is-sel’,’is-out’);
var d=sel.indexOf(i)>-1?0:180;
setTimeout(function(){ c.classList.add(sel.indexOf(i)>-1?’is-sel’:’is-out’); }, reduce?0:d);
});
}
root.querySelectorAll(‘[data-q]’).forEach(function(b){
b.addEventListener(‘click’,function(){
root.querySelectorAll(‘[data-q]’).forEach(function(x){x.classList.remove(‘is-on’)});
b.classList.add(‘is-on’); retrieve(+b.dataset.q);
});
});
retrieve(0);

/* ———- 04 confidence ———- */
var TURNS=[
[‘dim the living room to 30’,0.94,false],
[‘make it warmer in here’,0.81,false],
[‘put the thing on the other thing’,0.58,false],
[‘text Ada that I am running late’,0.88,false],
[‘what is the capital of Peru?’,null,true]
];
var rowsEl=document.getElementById(‘n2-rows’), slider=document.getElementById(‘n2-slider’), tv=document.getElementById(‘n2-tv’);
function renderRows(){
var th=(+slider.value)/100; tv.textContent=th.toFixed(2);
rowsEl.innerHTML=TURNS.map(function(t){
if(t[2]) return ‘

‘+t[0]+
[ ]empty call

‘;
var ok=t[1]>=th;
return ‘

‘+t[0]+
‘+t[1].toFixed(2)+’execute’:’v-esc”>escalate’)+’

‘;
}).join(”);
post();
}
slider.addEventListener(‘input’,renderRows); renderRows();

/* ———- 05 memory ———- */
var turns=1, gv=document.getElementById(‘n2-gv’), gf=document.getElementById(‘n2-gf’);
var win=document.getElementById(‘n2-win’), grow=document.getElementById(‘n2-grow’);
var memv=document.getElementById(‘n2-memv’), growv=document.getElementById(‘n2-growv’);
var ofEl=document.getElementById(‘n2-of’), turnsEl=document.getElementById(‘n2-turns’);
function renderMem(){
turnsEl.textContent=”turns: “+turns;
var w=Math.min(24, 12+turns*2.5);
win.style.width=w+’%’;
memv.textContent=”28.0 MB”;
gf.style.width=”78%”; gv.innerHTML=’28.0 MB / hard ceiling 28 MB’;
var g=Math.min(100, 18+turns*7);
grow.style.width=g+’%’;
growv.textContent=(Math.round((18+turns*7)*0.62*10)/10)+’ MB’;
ofEl.textContent = g>=78 ? ‘Unbounded KV has crossed the 28MB ceiling. Needle 2 has not moved.’ : ”;
post();
}
document.getElementById(‘n2-turn’).addEventListener(‘click’,function(){turns++;renderMem();});
document.getElementById(‘n2-reset-m’).addEventListener(‘click’,function(){turns=1;renderMem();});
renderMem();
})();



Source link

  • Related Posts

    Create a Reasoning-Focused LLM: A Practical Guide to Streaming, Curating, and Fine-Tuning the SupraLabs Reasoning Corpus

    In this tutorial, we build an end-to-end workflow for working with the SupraLabs reasoning corpus. We stream a representative subset directly from the Hugging Face Hub, inspect its source distribution,…

    Google AI Just Released Gemini 3.7 Flash: A Coding and Agent Model at $0.75/1M Input Tokens

    “> Pricing is the real argument Gemini 3.7 Flash lists at $0.75 per 1M input tokens and $3.75 per 1M output tokens. That rate is introductory and expires December 31,…

    Leave a Reply

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