refactor(recipes): rename recipes, drop pi05_hirobot

- hirobot.yaml            -> subtasks_vqa.yaml
- hirobot_memory.yaml     -> subtask_mem_vqa_speech.yaml
- pi05_hirobot.yaml       -> deleted (stale: uses plan, top-camera names;
  superseded by the two recipes above)
- smolvla2_hirobot.yaml   -> deleted (was untracked stale junk)

Updated the smolvla2 / pi052 `recipe_path` config defaults, all
docstring / comment references, the annotation-pipeline + recipe docs,
and the three tests that loaded pi05_hirobot.yaml (repointed to the
renamed recipes; the low-level-branch and pipeline-render assertions
now accept a flow-only `low_level` stream as valid supervision, since
the new recipes' low_level_execution has no text-CE target).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Pepijn
2026-05-18 16:02:15 +02:00
parent 426d48dbbf
commit 0f5f0e4091
15 changed files with 46 additions and 103 deletions
@@ -41,7 +41,12 @@ from lerobot.datasets.language_render import render_sample
from ._helpers import make_canned_responder
_RECIPE_PATH = (
Path(__file__).resolve().parents[2] / "src" / "lerobot" / "configs" / "recipes" / "pi05_hirobot.yaml"
Path(__file__).resolve().parents[2]
/ "src"
/ "lerobot"
/ "configs"
/ "recipes"
/ "subtask_mem_vqa_speech.yaml"
)
@@ -105,22 +110,29 @@ def test_pr1_canonical_recipe_renders_nonempty_from_pipeline_output(
recipe = TrainingRecipe(**loaded)
rendered_any = False
for ts, persistent, events in zip(timestamps, persistent_lists, events_lists, strict=True):
for sample_idx, (ts, persistent, events) in enumerate(
zip(timestamps, persistent_lists, events_lists, strict=True)
):
result = render_sample(
recipe=recipe,
persistent=persistent,
events=events,
t=float(ts),
sample_idx=0,
sample_idx=sample_idx,
dataset_ctx={"task": "Pour water from the bottle into the cup."},
)
if result is None:
continue
if result["messages"]:
rendered_any = True
assert result["target_message_indices"]
# A valid render supervises something: a text-CE target turn
# OR a flow-only ``low_level``-stream turn (action loss).
assert (
result["target_message_indices"]
or "low_level" in result["message_streams"]
)
break
assert rendered_any, "PR 1 recipe rendered no messages from pipeline output"
assert rendered_any, "recipe rendered no messages from pipeline output"
# Sanity: speech atom appears in events column intact
flat_events = [r for ev in events_lists for r in ev]
+4 -2
View File
@@ -18,7 +18,9 @@ def test_message_recipe_validates_unknown_binding():
def test_canonical_recipe_loads():
recipe = TrainingRecipe.from_yaml(Path("src/lerobot/configs/recipes/pi05_hirobot.yaml"))
recipe = TrainingRecipe.from_yaml(
Path("src/lerobot/configs/recipes/subtask_mem_vqa_speech.yaml")
)
assert recipe.blend is not None
assert set(recipe.blend) == {
@@ -29,4 +31,4 @@ def test_canonical_recipe_loads():
"ask_vqa_top",
"ask_vqa_wrist",
}
assert sum(component.weight for component in recipe.blend.values()) == pytest.approx(0.96)
assert sum(component.weight for component in recipe.blend.values()) == pytest.approx(1.0)
+6 -3
View File
@@ -449,7 +449,10 @@ def test_vqa_frame_is_consumed_over_the_weighted_blend():
def test_canonical_recipe_can_render_low_level_branch():
recipe = TrainingRecipe.from_yaml(Path("src/lerobot/configs/recipes/pi05_hirobot.yaml"))
"""The shipped ``subtasks_vqa.yaml`` recipe's ``low_level_execution``
branch renders — a flow-only ``user(${subtask})`` turn (no text-CE
target; its supervision is the action-expert flow loss)."""
recipe = TrainingRecipe.from_yaml(Path("src/lerobot/configs/recipes/subtasks_vqa.yaml"))
low_level = TrainingRecipe(blend={"low": recipe.blend["low_level_execution"]})
rendered = render_sample(
@@ -461,6 +464,6 @@ def test_canonical_recipe_can_render_low_level_branch():
task="clean kitchen",
)
assert rendered["messages"][-1] == {"role": "assistant", "content": "subtask 0"}
assert rendered["messages"][-1] == {"role": "user", "content": "subtask 0"}
assert rendered["message_streams"][-1] == "low_level"
assert rendered["target_message_indices"] == [1]
assert rendered["target_message_indices"] == []