From 5ee01047392aefa055e1fe9faba8e30bf45753c6 Mon Sep 17 00:00:00 2001 From: Pepijn Date: Thu, 30 Apr 2026 13:34:00 +0200 Subject: [PATCH] log(annotate): surface resolved frame-provider cameras at startup Print the default and full camera list once at the top of every run so a silent Module-3-no-op (cam_keys=[]) is visible in the job log instead of only being discoverable by counting parquet rows after upload. Also warn loudly when Module 3 is enabled but no cameras resolved, with a hint about the --vlm.camera_key fallback. Co-Authored-By: Claude Opus 4.7 (1M context) --- src/lerobot/scripts/lerobot_annotate.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/lerobot/scripts/lerobot_annotate.py b/src/lerobot/scripts/lerobot_annotate.py index 61790b1bb..61148b1a4 100644 --- a/src/lerobot/scripts/lerobot_annotate.py +++ b/src/lerobot/scripts/lerobot_annotate.py @@ -66,6 +66,22 @@ def annotate(cfg: AnnotationPipelineConfig) -> None: vlm = make_vlm_client(cfg.vlm) frame_provider = make_frame_provider(root, camera_key=cfg.vlm.camera_key) + # Surface the resolved cameras up front so silent Module-3-no-op + # regressions are obvious in job output rather than discovered post-hoc + # by counting parquet rows. + cam_keys = list(getattr(frame_provider, "camera_keys", []) or []) + logger.info( + "annotate: frame_provider default camera=%r, all cameras=%s", + getattr(frame_provider, "camera_key", None), + cam_keys, + ) + if cfg.module_3.enabled and not cam_keys: + logger.warning( + "annotate: Module 3 (VQA) is enabled but no cameras were " + "resolved — Module 3 will produce zero VQA rows. Check " + "meta/info.json for observation.images.* features, or pass " + "--vlm.camera_key= to seed the cameras list." + ) module_1 = PlanSubtasksMemoryModule(vlm=vlm, config=cfg.module_1, frame_provider=frame_provider) module_2 = InterjectionsAndSpeechModule( vlm=vlm, config=cfg.module_2, seed=cfg.seed, frame_provider=frame_provider