Ant Group’s Robbyant has released LingBot-VLA 2.0, a Vision-Language-Action (VLA) foundation model for robots. The release includes a technical report, an Apache-2.0 codebase, and a 6B checkpoint. The research team targets a well-known gap: VLA models often work in labs but stumble in deployment. LingBot-VLA 2.0 advances the prior version along three practical axes. These are generalization, an expanded action space, and predictive dynamics modeling.

What is LingBot-VLA 2.0?

LingBot-VLA 2.0 is a generalist robot policy built on a vision-language backbone. It converts camera images and a language instruction into robot actions. The public model is lingbot-vla-v2-6b, a 6B ‘native depth’ checkpoint. It uses Qwen3-VL-4B-Instruct as the VLM backbone. Two teacher models, LingBot-Depth and DINO-Video, supervise training through distillation.

One inference call takes about 130 ms on an NVIDIA GeForce RTX 4090D. That measurement uses 10 denoising steps. The action expert uses a Mixture-of-Experts (MoE) design for scaling.

Data pipeline: 60,000 hours across 20 configurations

Generalization starts with data. The research team curates roughly 60,000 hours of pre-training data. This covers 50,000 hours of robot trajectories and 10,000 hours of egocentric human videos. The robot data spans 20 robot configurations, from single-arm rigs to full humanoids. The raw pool is larger: about 90,000 robot hours and 20,000 egocentric hours. A redesigned pipeline filters noisy samples down to the high-quality set.

Filtering is explicit and measurable. The research team computes third-order jerk along with velocity and acceleration Z-scores per embodiment. Episodes with abnormal smoothness or over 95% static signals are dropped. Videos are checked against replayed states using each robot’s URDF. Annotators remove blur, occlusion, dropped frames, and multi-view misalignment. Egocentric clips pass a VLM filter, then egocentric SLAM and MANO hand-pose reconstruction.

Annotation is automated with a vision-language model. Qwen3.6-27B segments each video into temporally contiguous subtasks. Each subtask gets an atomic action from a closed vocabulary of 18 categories. That vocabulary holds 15 primitive actions plus transit, idle, and other. Across the corpus, move and transit dominate by frequency.

Unified action representation

Different robots expose different joints, so LingBot-VLA 2.0 unifies them. It uses a 55-dimensional canonical vector for both states and actions. The layout is fixed across every embodiment in the dataset.

ComponentDimensions
Arm joint position14
End-effector pose14
Gripper position2
Hand joint position12
Waist position4
Head position2
Mobility signal3
Reserved4

Each arm end-effector pose uses XYZ coordinates plus a rotation quaternion, giving 7 dimensions per arm. Robots that lack a body part simply pad the corresponding dimensions. This lets one model control arms, hands, grippers, waists, heads, and mobile bases.

MoE action expert

The action expert replaces its feed-forward network with sparse MoE layers. Each MoE layer keeps one shared expert along with several routed experts. Only the top-K routed experts activate per token, so active compute stays bounded. Each expert is a SwiGLU MLP with a smaller intermediate width.

Routing follows a sigmoid-based, auxiliary-loss-free strategy inspired by DeepSeek-V3. A per-expert bias corrects load imbalance without adding a load-balancing loss. Routing confidence still comes from the model’s original, unbiased affinity scores. Under matched active parameters, the MoE model reaches lower training loss than a dense baseline. It also reaches lower validation action error on GM-100 tasks.

Dual-query distillation for predictive dynamics

Real execution needs anticipation, not just reaction to the current frame. LingBot-VLA 2.0 appends two learnable queries to the visual and text tokens. Qt targets the current observation, and Qt+T targets a future observation. The horizon T equals the action chunk size.

Two teachers supervise these queries. LingBot-Depth supplies explicit geometric cues through depth prediction. DINO-Video supplies temporally grounded semantic priors. DINO-Video is built on the DINOv3 backbone with block-wise causal temporal attention and 3D-RoPE. It is trained on 5M video clips spanning internet, egocentric, and robotic data. On the LARYBench evaluation, DINO-Video leads on three of four metrics.

Benchmark results

Robbyant evaluates the model in a generalist setting on the GM-100 (Great March 100) bimanual benchmark. A single policy is jointly trained on nine tasks per embodiment. Results are reported as progress score / success rate.

PlatformGR00T N1.7π0.5LingBot-VLA-1.0LingBot-VLA-2.0
AgileX Cobot Magic36.3 / 17.859.1 / 32.258.2 / 30.066.2 / 34.4
Galaxea R1Pro16.4 / 5.627.4 / 8.932.7 / 15.634.6 / 15.6

On long-horizon mobile manipulation, the model is tested under two settings. In-domain (ID) uses the training distribution, while OOD perturbs pose and objects.

EmbodimentTaskSettingLingBot-VLA-2.0π0.5
Astribot S1Refrigerator sortingIn-domain77.1 / 60.065.3 / 46.7
Astribot S1Refrigerator sortingOOD37.0 / 13.330.3 / 6.7
Cobot Magic-ARX X5Stove cleaningIn-domain84.3 / 66.779.9 / 60.0
Cobot Magic-ARX X5Stove cleaningOOD67.5 / 40.062.5 / 33.3

Gains are largest on tasks needing accurate object grounding. On Agilex Retrieve keychain, success moves from 60.0 to 100.0 versus version 1.0. Some tasks still show a gap between progress and success. That gap points to failures at the final precise placement or release step.

Getting started

The repository ships install, download, and deployment scripts. The example below downloads the released weights.

# Environment: Python 3.12, PyTorch 2.8.0, flash-attn 2.8.3
python3 scripts/download_hf_model.py --repo_id robbyant/lingbot-vla-v2-6b --local_dir lingbot-vla

Real-robot deployment runs the policy server with compiled inference.

export QWEN3VL_PATH=path_to_Qwen3-VL-4B-Instruct
python -m deploy.lingbot_vla_v2_policy \
  --model_path path_to_posttraining_ckpt \
  --use_compile \
  --use_length 25 \
  --port port

Post-training uses LeRobot v2.1 or v3.0 datasets. The provided example fine-tunes on RoboTwin 2.0 across 50 tasks. Routing can use sequence-wise auxiliary loss with z-loss, or a loss-free setup. The config also exposes the Muon optimizer, with AdamW as the default.

Use cases with examples

The expanded action space maps to concrete deployment scenarios.

  • Kitchen mobile manipulation: Astribot S1 sorts fruits and drinks into a refrigerator. This needs base movement, door opening, and object placement together.
  • Surface cleaning: Cobot Magic-ARX X5 wipes foam off a stove with a sponge. This chains grasping, wiping, and tool repositioning.
  • Bimanual packing and sorting: GM-100 tasks include egg packing, tool packing, and block sorting.
  • Dexterous-hand control: Unitree G1, Fourier GR-2, and AgiBot A2 use 12-DoF hands, not grippers.

Interactive Dynamic Explainer


‘+v+’

‘;}
function renderEmb(){
var e=EMB[+sel.value], ee=e[2], body=e[4]>0, isEgo=e[1]===’Egocentric’;
var act={arm:true,eef:!isEgo,grip:(ee.indexOf(‘Gripper’)>-1),hand:(ee.indexOf(‘Hand’)>-1),
waist:body,head:body,mob:body,res:false};
if(isEgo){act.grip=false;act.hand=true;act.waist=false;act.head=false;act.mob=false;}
$$(‘#strip .grp’).forEach(function(g){g.classList.toggle(‘act’,!!act[g.dataset.k]);});
var eeTxt=ee===’Gripper/Hand’?’Gripper / Hand’:ee;
$(‘#embstats’).innerHTML=st(‘Type’,e[1])+st(‘End-effector’,eeTxt)+st(‘Arm DoF’,e[3])+
st(‘Body DoF’,e[4])+st(‘Total DoF’,e[5],1)+st(‘Policy freq’,e[6]+’ Hz’);
}
sel.onchange=renderEmb; sel.value=11; renderEmb();

/* ===== SHARED RENDERERS ===== */
function bars(host,rows,hotIdx){
host.innerHTML=”;
rows.forEach(function(r,i){
var div=document.createElement(‘div’);div.className=”row”+(i===hotIdx?’ hi’:”);
div.innerHTML=’

‘+r[0]+’

‘+r[1].toFixed(1)+’

‘;
host.appendChild(div);
var f=div.querySelector(‘.fill’);
requestAnimationFrame(function(){f.style.width=Math.max(1.5,r[1])+’%’;});
});
}
function segBtns(host,items,active,cb){
host.innerHTML=”;
items.forEach(function(it,i){
var b=document.createElement(‘button’);b.className=”chip”+(i===active?’ on’:”);b.textContent=it;
b.onclick=function(){cb(i);};host.appendChild(b);
});
}

/* ===== PANEL 2 : ABLATION ===== */
var TASKS=[‘Barcode’,’Scoop Rice’,’Ketchup’,’Microwave Bowl’,’Avg’];
var ABL={
‘Action target’:{best:1,note:’Relative joint actions turn global regression into local motion regression. That lowers variance and lifts average success from 33.7 to 55.0.’,
sets:[[‘Absolute (abs)’,[13.3,22.7,55.0,43.8,33.7]],[‘Relative (rel)’,[58.7,42.7,41.7,76.8,55.0]]]},
‘Action space’:{best:1,note:’EEF and joint actions score similarly on average (56.0 vs 55.0). The best space depends on task physics, not distribution stats alone.’,
sets:[[‘EEF’,[24.0,60.0,81.7,58.3,56.0]],[‘Joint’,[58.7,42.7,41.7,76.8,55.0]]]},
‘Normalization’:{best:2,note:’MeanStd keeps the largest effective dynamic range and best preserves long-tailed corrective motions, reaching 55.0 average success.’,
sets:[[‘MinMax’,[48.0,26.7,61.7,53.6,47.5]],[‘Q01-Q99’,[42.7,44.7,63.3,39.1,47.4]],[‘MeanStd’,[58.7,42.7,41.7,76.8,55.0]]]},
‘Loss’:{best:1,note:’L2 fits the high-density region of small corrective targets. It improves average success over L1 from 46.4 to 55.0.’,
sets:[[‘L1’,[45.0,28.7,61.7,50.0,46.4]],[‘L2’,[58.7,42.7,41.7,76.8,55.0]]]}
};
var ablKeys=Object.keys(ABL),curStudy=ablKeys[0],curSet=1;
function renderAbl(){
var s=ABL[curStudy];
segBtns($(‘#ablStudy’),ablKeys,ablKeys.indexOf(curStudy),function(i){curStudy=ablKeys[i];curSet=ABL[curStudy].best;renderAbl();});
$(‘#ablSetLab’).textContent=”Setting · “+curStudy;
segBtns($(‘#ablSet’),s.sets.map(function(x){return x[0];}),curSet,function(i){curSet=i;renderAbl();});
var vals=s.sets[curSet][1];
bars($(‘#ablBars’),TASKS.map(function(t,i){return [t,vals[i]];}),4);
var chosen=(curSet===s.best)?’ This is the configuration LingBot-VLA 2.0 ships with.‘:”;
$(‘#ablNote’).innerHTML=s.note+chosen;
resize();
}
renderAbl();

/* ===== PANEL 3 : BENCHMARK ===== */
var MODELS=[‘GR00T N1.7′,’π0.5′,’LingBot-VLA-1.0′,’LingBot-VLA-2.0’];
var BM={
‘AgileX Cobot Magic’:{prog:[36.3,59.1,58.2,66.2],succ:[17.8,32.2,30.0,34.4]},
‘Galaxea R1Pro’:{prog:[16.4,27.4,32.7,34.6],succ:[5.6,8.9,15.6,15.6]}
};
var bmKeys=Object.keys(BM),curPlat=bmKeys[0],curMet=”prog”;
function renderBm(){
segBtns($(‘#bmPlat’),bmKeys,bmKeys.indexOf(curPlat),function(i){curPlat=bmKeys[i];renderBm();});
segBtns($(‘#bmMet’),[‘Progress score’,’Success rate’],curMet===’prog’?0:1,function(i){curMet=i?’succ’:’prog’;renderBm();});
$(‘#bmCap’).textContent=(curMet===’prog’?’Progress score’:’Success rate’)+’ (%)’;
var vals=BM[curPlat][curMet];
bars($(‘#bmBars’),MODELS.map(function(m,i){return [m,vals[i]];}),3);
resize();
}
renderBm();

/* ===== AUTO-RESIZE ===== */
function resize(){
var h=R.offsetHeight+40;
try{parent.postMessage({type:’lbv2-resize’,height:h},’*’);}catch(e){}
}
window.addEventListener(‘load’,resize);
if(window.ResizeObserver){new ResizeObserver(resize).observe(R);}
setTimeout(resize,300);
})();