molmoact-libero
Closed-loop VLA-policy skill backed by one model checkpoint: AllenAI's
MolmoAct LIBERO checkpoint (allenai/MolmoAct-7B-D-LIBERO-0812). The skill
is the model — it owns its serving preset (molmoact-libero), so a policy
node names this skill, not a free-floating policy_id. The closed-loop
replan/execute/terminate body and the load-bearing LIBERO observation
encoding live in gap.runtime.policy.run_policy_loop; the websocket client
is resolved (and cached per preset) through the executor's PolicyExecutor.
This is the MolmoAct alternative to pi05-libero for the same task
family — the two are the policy A/B axis the benchmark ablates. Pick whichever
the task / experiment calls for; their capability envelope is the same.
Capability
- Embodiment: Franka Panda (LIBERO/robosuite), OSC_POSE delta action
space
[Δx, Δy, Δz, Δrx, Δry, Δrz, gripper]. No embodiment translation happens in the loop — the checkpoint's native action space is forwarded tosim.apply_policy_action. - Tasks: the LIBERO pick-and-place distribution — pick a tabletop rigid object, optionally place/drop it in a container. Works best steered: perceive the target and hover the end-effector above it (preserving the current rotation) before handing over, so the policy starts in-distribution.
- Not for: deformables / cloth folding, articulated objects, non-LIBERO embodiments, or tasks the checkpoint never saw. If the task is outside this envelope, pick a different skill or report a missing capability — do not delegate it here and hope.
Serving
The bundle ships its own server.py and declares MolmoAct-flavored openpi
as a git dep in its own pyproject.toml, so the bundle is self-contained:
no $GAP_OPENPI_DIR clone, no shared venv. First-run setup is
gap skills install molmoact-libero, which uv syncs the bundle's .venv/
with vLLM + MolmoAct deps. The launcher then spawns the server via
uv run --project policies/molmoact-libero -- python server.py ... (so the
bundle's own venv activates automatically) and downloads the checkpoint from
hf://allenai/MolmoAct-7B-D-LIBERO-0812 on first run.
The bundle's server.py is a placeholder that documents how to wire
up a vLLM-style server speaking the openpi websocket protocol; replace it
with your real serving script (e.g., from an internal MolmoAct fork) before
running the bundle for the first time. Run it yourself with
gap policy serve molmoact-libero. A policies: config entry named
molmoact-libero overrides the recipe (e.g. an external url:).
Termination & exits
The loop exits on whichever fires first — a commanded gripper
open→close→open cycle (gripper_cycle, the per-item terminator for
clean-all loops; set gripper_cycle_termination: true), a non-empty
termination_prompt answered yes by the VLM (completed_by_vlm), or the
max_windows backstop. These are the subgraph's success exits; the failure
exit is failed (the loop raised). Whether the task actually succeeded is
a checkpoint, not an exit — attach a postcondition that checks the world
(e.g. the object is in the container), never an exit value like "folded".