Perception-planning loop
New observations update belief and memory, so the planner reasons over the latest task state instead of a stale prompt snapshot.
A programming model and runtime for composing closed-loop asynchronous robot programs with explicit clocks, synchronization policies, and deterministic replay.
Retriever spans an asynchronous decision model, a programming model, and a runtime for closed-loop robot agents. Agents are graphs of stateful Flows executed on explicit clocks; each edge declares how upstream history is consumed. The same graph can be stepped locally or executed asynchronously across supported backends while preserving its temporal meaning.
General-purpose robot agents need perception, memory, planning, monitoring, learned skills, and low-level control to keep running together while the world changes — all at very different rates. Existing middleware operates at the message-passing level; Retriever raises the abstraction to the behavior level, where the programmer describes what the agent does and when, not how messages are routed. The core challenge is giving the whole agent a programming model where composition, feedback, timing, and replay are explicit parts of the program rather than hidden in callback glue or scheduler behavior.
Three trends shape this bet:
Retriever-0 is our real-robot case study built inside one Retriever pipeline. It combines a VLM planner, belief and memory, an execution monitor, a VLA skill policy, and a joint controller in one coordinated loop — slow reasoning, medium-rate learned skills, and high-rate control all exchanging information during execution.
The Retriever-0 pipeline: slow VLM planning (with belief and memory), execution monitoring, medium-rate VLA skill execution, and high-rate control — all running simultaneously at mismatched clocks inside one program.
The same asynchronous pipeline supports two distinct long-horizon behaviors: belief-guided search across closed drawers and bimanual retrieval from a deformable shopping bag.
The Retriever-0 pipeline is not a feedforward stack — feedback loops keep belief, plans, and control state current during execution:
New observations update belief and memory, so the planner reasons over the latest task state instead of a stale prompt snapshot.
The execution monitor connects plan chunks and progress-prediction handoff, allowing replanning and skill switching while execution continues.
Slow planning, medium-rate skill inference, and high-rate control run together because clocks and sync policies define the timing contract.
Retriever centers the program around a small vocabulary: Flow is the compositional unit, Clock says when each Flow runs, Sync policy says what upstream history is consumed at each step, and Pipeline wires Flows into a closed-loop graph. The runtime maps the graph onto supported backends without changing its semantics.
Define clocked Flows, connect them with edge-level sync policies, then run the same graph locally for debugging or on a deployment backend.
# 1) Define Flows (what computes) and clocks (when they run)top_cam = CameraSource(id=0) @Rate(hz=30)wrist_cam = CameraSource(id=1) @Rate(hz=30)belief = BeliefMemoryFlow() @Trigger("inspection_done")monitor = ExecutionMonitorFlow() @Trigger("belief_updated", "progress_prediction")planner = VLMPlanFlow("gemini") @Trigger("replan")vla = VLASkillFlow("pi05") @Rate(hz=2)robot = ControllerFlow(id=0) @Rate(hz=200)
# 2) Compose the graph and declare sync policies on edgespipe = Pipeline("Closed-loop Agent")with pipe: wrist_cam.then(vla, sync=Latest()) \ .then(robot, sync=ActionChunking())
top_cam.then(belief, sync=Latest()) \ .then(planner, sync=Latest()) \ .then(monitor, sync=Latest()) \ .then(vla, sync=Latest())
# 3) Debug locally or deploy asynchronouslypipe.step(dt=0.1)pipe.run(backend="dora")This is one robot program shown as time moving left to right. Each row is a Flow that wakes up on its own clock; arrows are computation, and blocks are outputs that remain usable until replaced.
Dots mark Flow starts. Dashed links show one event causing another; they are not regular global ticks.