"""Introspect the installed reachy-mini SDK to confirm the API we depend on. Run with: pixi run verify-sdk No robot connection is made — this only inspects classes/signatures so we can lock down the exact calls before wiring up motion control. """ from __future__ import annotations import inspect def sig(obj, name: str) -> str: member = getattr(obj, name, None) if member is None: return f" - {name}: MISSING" try: return f" - {name}{inspect.signature(member)}" except (TypeError, ValueError): return f" - {name}: ({type(member).__name__})" def main() -> None: import reachy_mini print("reachy_mini version:", getattr(reachy_mini, "__version__", "?")) print("reachy_mini file :", reachy_mini.__file__) print("top-level exports :", sorted(n for n in dir(reachy_mini) if not n.startswith("_"))) print("\n== module-level helpers ==") for name in ("create_head_pose", "look_at", "look_at_image"): print(sig(reachy_mini, name)) print("\n== ReachyMini ==") RM = getattr(reachy_mini, "ReachyMini", None) if RM is not None: try: print(" __init__", inspect.signature(RM.__init__)) except (TypeError, ValueError): print(" __init__ ") methods = [n for n in dir(RM) if not n.startswith("_")] print(" members :", methods) for name in ( "goto_target", "look_at_image", "look_at_world", "set_target", "get_frame", ): print(sig(RM, name)) # media / camera accessors are usually instance attributes; report presence for attr in ("media", "camera"): print(f" has class attr/property '{attr}':", hasattr(RM, attr)) print("\n== ReachyMiniApp ==") App = getattr(reachy_mini, "ReachyMiniApp", None) if App is not None: print(sig(App, "run")) print(" members:", [n for n in dir(App) if not n.startswith("_")]) else: print(" ReachyMiniApp NOT found at top level — searching submodules...") import pkgutil for m in pkgutil.iter_modules(reachy_mini.__path__, reachy_mini.__name__ + "."): print(" submodule:", m.name) if __name__ == "__main__": main()