pi05-libero
Closed-loop VLA-policy skill backed by one model checkpoint: openpi's
π0.5 LIBERO checkpoint (pi05_libero). The skill is the model — it owns
its serving preset (pi05-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.
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 (vendored from openpi scripts/serve_policy.py)
and declares openpi as a git dep in its own pyproject.toml — so this
bundle is self-contained: no $GAP_OPENPI_DIR clone, no shared venv.
First-run setup is gap skills install pi05-libero, which uv syncs the
bundle's .venv/ with all model deps. The launcher then spawns the server
via uv run --project policies/pi05-libero -- python server.py ... (so the
bundle's own venv activates automatically) and downloads the checkpoint from
s3://openpi-assets/checkpoints/pi05_libero on first run.
Run it yourself with gap policy serve pi05-libero. A policies: config
entry named pi05-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".