$npx -y skills add graph-robots/open-robot-skills --skill molmoact-liberoRun the MolmoAct LIBERO checkpoint
| 1 | # molmoact-libero |
| 2 | |
| 3 | Closed-loop VLA-policy skill backed by **one model checkpoint**: AllenAI's |
| 4 | MolmoAct LIBERO checkpoint (`allenai/MolmoAct-7B-D-LIBERO-0812`). The skill |
| 5 | *is* the model — it owns its serving preset (`molmoact-libero`), so a policy |
| 6 | node names this skill, not a free-floating `policy_id`. The closed-loop |
| 7 | replan/execute/terminate body and the load-bearing LIBERO observation |
| 8 | encoding live in `gap.runtime.policy.run_policy_loop`; the websocket client |
| 9 | is resolved (and cached per preset) through the executor's `PolicyExecutor`. |
| 10 | |
| 11 | This is the **MolmoAct alternative to `pi05-libero`** for the same task |
| 12 | family — the two are the policy A/B axis the benchmark ablates. Pick whichever |
| 13 | the task / experiment calls for; their capability envelope is the same. |
| 14 | |
| 15 | ## Capability |
| 16 | |
| 17 | - **Embodiment:** Franka Panda (LIBERO/robosuite), OSC_POSE delta action |
| 18 | space `[Δx, Δy, Δz, Δrx, Δry, Δrz, gripper]`. No embodiment translation |
| 19 | happens in the loop — the checkpoint's native action space is forwarded to |
| 20 | `sim.apply_policy_action`. |
| 21 | - **Tasks:** the LIBERO pick-and-place distribution — pick a tabletop rigid |
| 22 | object, optionally place/drop it in a container. Works best *steered*: |
| 23 | perceive the target and hover the end-effector above it (preserving the |
| 24 | current rotation) before handing over, so the policy starts in-distribution. |
| 25 | - **Not for:** deformables / cloth folding, articulated objects, non-LIBERO |
| 26 | embodiments, or tasks the checkpoint never saw. If the task is outside this |
| 27 | envelope, pick a different skill or report a missing capability — do not |
| 28 | delegate it here and hope. |
| 29 | |
| 30 | ## Serving |
| 31 | |
| 32 | The bundle ships its own `server.py` and declares MolmoAct-flavored openpi |
| 33 | as a git dep in its own `pyproject.toml`, so the bundle is **self-contained**: |
| 34 | no `$GAP_OPENPI_DIR` clone, no shared venv. First-run setup is |
| 35 | `gap skills install molmoact-libero`, which `uv sync`s the bundle's `.venv/` |
| 36 | with vLLM + MolmoAct deps. The launcher then spawns the server via |
| 37 | `uv run --project policies/molmoact-libero -- python server.py ...` (so the |
| 38 | bundle's own venv activates automatically) and downloads the checkpoint from |
| 39 | `hf://allenai/MolmoAct-7B-D-LIBERO-0812` on first run. |
| 40 | |
| 41 | The bundle's `server.py` is a **placeholder** that documents how to wire |
| 42 | up a vLLM-style server speaking the openpi websocket protocol; replace it |
| 43 | with your real serving script (e.g., from an internal MolmoAct fork) before |
| 44 | running the bundle for the first time. Run it yourself with |
| 45 | `gap policy serve molmoact-libero`. A `policies:` config entry named |
| 46 | `molmoact-libero` overrides the recipe (e.g. an external `url:`). |
| 47 | |
| 48 | ## Termination & exits |
| 49 | |
| 50 | The loop exits on whichever fires first — a commanded gripper |
| 51 | open→close→open cycle (`gripper_cycle`, the per-item terminator for |
| 52 | clean-all loops; set `gripper_cycle_termination: true`), a non-empty |
| 53 | `termination_prompt` answered yes by the VLM (`completed_by_vlm` |