| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| [build-system] |
| requires = ["setuptools"] |
| build-backend = "setuptools.build_meta" |
|
|
| [project.urls] |
| homepage = "https://huggingface.co/lerobot" |
| documentation = "https://huggingface.co/docs/lerobot/index" |
| source = "https://github.com/huggingface/lerobot" |
| issues = "https://github.com/huggingface/lerobot/issues" |
| discord = "https://discord.gg/s3KuuzsPFb" |
|
|
| [project] |
| name = "lerobot" |
| version = "0.6.1" |
| description = "🤗 LeRobot: State-of-the-art Machine Learning for Real-World Robotics in Pytorch" |
| dynamic = ["readme"] |
| license = { text = "Apache-2.0" } |
| requires-python = ">=3.12" |
| authors = [ |
| { name = "Rémi Cadène", email = "re.cadene@gmail.com" }, |
| { name = "Simon Alibert", email = "alibert.sim@gmail.com" }, |
| { name = "Alexander Soare", email = "alexander.soare159@gmail.com" }, |
| { name = "Quentin Gallouédec", email = "quentin.gallouedec@ec-lyon.fr" }, |
| { name = "Steven Palma", email = "imstevenpmwork@ieee.org" }, |
| { name = "Pepijn Kooijmans", email = "pepijnkooijmans@outlook.com"}, |
| { name = "Michel Aractingi", email = "michel.aractingi@gmail.com"}, |
| { name = "Adil Zouitine", email = "adilzouitinegm@gmail.com" }, |
| { name = "Dana Aubakirova", email = "danaaubakirova17@gmail.com"}, |
| { name = "Caroline Pascal", email = "caroline8.pascal@gmail.com"}, |
| { name = "Martino Russi", email = "nopyeps@gmail.com"}, |
| { name = "Thomas Wolf", email = "thomaswolfcontact@gmail.com" }, |
| ] |
| classifiers = [ |
| "Development Status :: 3 - Alpha", |
| "Intended Audience :: Developers", |
| "Intended Audience :: Education", |
| "Intended Audience :: Science/Research", |
| "License :: OSI Approved :: Apache Software License", |
| "Programming Language :: Python :: 3.12", |
| "Programming Language :: Python :: 3.13", |
| "Topic :: Software Development :: Build Tools", |
| "Topic :: Scientific/Engineering :: Artificial Intelligence", |
| ] |
| keywords = ["lerobot", "huggingface", "robotics", "machine learning", "artificial intelligence"] |
|
|
| dependencies = [ |
| |
| "torch>=2.7,<2.12.0", |
| "torchvision>=0.22.0,<0.27.0", |
| "numpy>=2.0.0,<2.3.0", |
| "opencv-python-headless>=4.9.0,<4.14.0", |
| "Pillow>=10.0.0,<13.0.0", |
| "einops>=0.8.0,<0.9.0", |
|
|
| |
| "draccus==0.10.0", |
| "huggingface-hub>=1.0.0,<2.0.0", |
| "requests>=2.32.0,<3.0.0", |
|
|
| |
| |
| |
| |
| "gymnasium>=1.1.1,<2.0.0", |
|
|
| |
| "safetensors>=0.4.3,<1.0.0", |
|
|
| |
| "packaging>=24.2,<26.0", |
| "termcolor>=2.4.0,<4.0.0", |
| "tqdm>=4.66.0,<5.0.0", |
|
|
| |
| "cmake>=3.29.0.1,<4.2.0", |
| "setuptools>=71.0.0,<81.0.0", |
| ] |
|
|
| |
| [project.optional-dependencies] |
|
|
| |
| dataset = [ |
| "datasets>=4.7.0,<5.0.0", |
| "pandas>=2.0.0,<3.0.0", |
| "pyarrow>=21.0.0,<30.0.0", |
| "lerobot[av-dep]", |
|
|
| |
| |
| |
| |
| |
| |
|
|
| |
| "torchcodec>=0.3.0,<0.12.0; (sys_platform == 'linux' and (platform_machine == 'x86_64' or platform_machine == 'AMD64')) or (sys_platform == 'darwin' and platform_machine == 'arm64')", |
| "torchcodec>=0.7.0,<0.12.0; sys_platform == 'win32'", |
| "torchcodec>=0.11.0,<0.12.0; sys_platform == 'linux' and (platform_machine == 'aarch64' or platform_machine == 'arm64')", |
| "jsonlines>=4.0.0,<5.0.0", |
| ] |
| training = [ |
| "lerobot[dataset]", |
| "wandb>=0.24.0,<0.28.0", |
| "lerobot[accelerate-dep]", |
| ] |
| hardware = [ |
| "lerobot[pynput-dep]", |
| "lerobot[pyserial-dep]", |
| "lerobot[deepdiff-dep]", |
| ] |
| viz = [ |
| "rerun-sdk>=0.24.0,<0.34.0", |
| "foxglove-sdk>=0.25.1,<0.26.0", |
| ] |
| |
| |
| core_scripts = ["lerobot[dataset]", "lerobot[hardware]", "lerobot[viz]"] |
| |
| |
| evaluation = ["lerobot[av-dep]"] |
| |
| dataset_viz = ["lerobot[dataset]", "lerobot[viz]"] |
|
|
| |
| av-dep = ["av>=15.0.0,<16.0.0"] |
| pygame-dep = ["pygame>=2.5.1,<2.7.0"] |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| placo-dep = ["placo>=0.9.6,<0.9.16", "cmeel-urdfdom>=4,<5", "cmeel-tinyxml2<11"] |
| transformers-dep = ["transformers>=5.4.0,<5.6.0"] |
| grpcio-dep = ["grpcio>=1.73.1,<2.0.0", "protobuf>=6.31.1,<8.0.0"] |
| accelerate-dep = ["accelerate>=1.14.0,<2.0.0"] |
| can-dep = ["python-can>=4.2.0,<5.0.0"] |
| peft-dep = ["peft>=0.18.0,<1.0.0"] |
| scipy-dep = ["scipy>=1.14.0,<2.0.0"] |
| diffusers-dep = ["diffusers>=0.27.2,<0.36.0"] |
| qwen-vl-utils-dep = ["qwen-vl-utils>=0.0.11,<0.1.0"] |
| matplotlib-dep = ["matplotlib>=3.10.3,<4.0.0", "contourpy>=1.3.0,<2.0.0"] |
| pyserial-dep = ["pyserial>=3.5,<4.0"] |
| deepdiff-dep = ["deepdiff>=7.0.1,<9.0.0"] |
| pynput-dep = ["pynput>=1.7.8,<1.9.0"] |
| pyzmq-dep = ["pyzmq>=26.2.1,<28.0.0"] |
| motorbridge-dep = ["motorbridge>=0.3.2,<0.4.0"] |
| motorbridge-smart-servo-dep = ["motorbridge-smart-servo>=0.0.4,<0.1.0"] |
| timm-dep = ["timm>=1.0.0,<1.1.0"] |
|
|
| |
| feetech = ["feetech-servo-sdk>=1.0.0,<2.0.0", "lerobot[pyserial-dep]", "lerobot[deepdiff-dep]"] |
| dynamixel = ["dynamixel-sdk>=3.7.31,<3.9.0", "lerobot[pyserial-dep]", "lerobot[deepdiff-dep]"] |
| damiao = ["lerobot[can-dep]"] |
| robstride = ["lerobot[can-dep]"] |
|
|
| |
| openarms = ["lerobot[damiao]"] |
| gamepad = ["lerobot[pygame-dep]", "hidapi>=0.14.0,<0.15.0"] |
| hopejr = ["lerobot[feetech]", "lerobot[pygame-dep]"] |
| lekiwi = ["lerobot[feetech]", "lerobot[pyzmq-dep]"] |
| unitree_g1 = [ |
| |
| "lerobot[pyzmq-dep]", |
| "lerobot[pyserial-dep]", |
| "onnxruntime>=1.16.0,<2.0.0", |
| "onnx>=1.16.0,<2.0.0", |
| "meshcat>=0.3.0,<0.4.0", |
| "lerobot[matplotlib-dep]", |
| "lerobot[pygame-dep]", |
| ] |
| |
| reachy2 = [ |
| "reachy2_sdk>=1.0.15,<1.1.0", |
| "grpcio<=1.73.1", |
| "protobuf<=6.32.0", |
| ] |
| |
| |
| rebot = ["lerobot[motorbridge-dep]", "lerobot[motorbridge-smart-servo-dep]"] |
| kinematics = ["lerobot[placo-dep]"] |
| intelrealsense = [ |
| "pyrealsense2>=2.55.1.6486,<2.57.0 ; sys_platform != 'darwin'", |
| "pyrealsense2-macosx>=2.54,<2.57.0 ; sys_platform == 'darwin'", |
| ] |
| phone = ["hebi-py>=2.8.0,<2.12.0", "teleop>=0.1.0,<0.2.0", "fastapi<1.0", "lerobot[scipy-dep]"] |
|
|
| |
| diffusion = ["lerobot[diffusers-dep]"] |
| wallx = [ |
| "lerobot[transformers-dep]", |
| "lerobot[peft-dep]", |
| "lerobot[scipy-dep]", |
| "torchdiffeq>=0.2.4,<0.3.0", |
| "lerobot[qwen-vl-utils-dep]", |
| ] |
| pi = ["lerobot[transformers-dep]", "lerobot[scipy-dep]"] |
| molmoact2 = ["lerobot[transformers-dep]", "lerobot[peft-dep]", "lerobot[scipy-dep]"] |
| smolvla = ["lerobot[transformers-dep]", "num2words>=0.5.14,<0.6.0", "lerobot[accelerate-dep]"] |
| multi_task_dit = ["lerobot[transformers-dep]", "lerobot[diffusers-dep]"] |
| groot = [ |
| "lerobot[transformers-dep]", |
| "lerobot[peft-dep]", |
| "lerobot[diffusers-dep]", |
| "lerobot[dataset]", |
| "dm-tree>=0.1.8,<1.0.0", |
| "lerobot[timm-dep]", |
| "decord>=0.6.0,<1.0.0; (platform_machine == 'AMD64' or platform_machine == 'x86_64')", |
| ] |
| sarm = ["lerobot[transformers-dep]", "pydantic>=2.0.0,<3.0.0", "faker>=33.0.0,<35.0.0", "lerobot[matplotlib-dep]", "lerobot[qwen-vl-utils-dep]"] |
| robometer = ["lerobot[transformers-dep]", "lerobot[qwen-vl-utils-dep]", "lerobot[peft-dep]"] |
| topreward = ["lerobot[transformers-dep]"] |
| xvla = ["lerobot[transformers-dep]"] |
| eo1 = ["lerobot[transformers-dep]", "lerobot[qwen-vl-utils-dep]"] |
| fastwam = [ |
| "lerobot[transformers-dep]", |
| "lerobot[diffusers-dep]", |
| ] |
| evo1 = ["lerobot[transformers-dep]"] |
| hilserl = ["lerobot[transformers-dep]", "lerobot[dataset]", "gym-hil>=0.1.14,<0.2.0", "lerobot[grpcio-dep]", "lerobot[placo-dep]"] |
| vla_jepa = ["lerobot[transformers-dep]", "lerobot[diffusers-dep]", "lerobot[qwen-vl-utils-dep]"] |
| lingbot_va = ["lerobot[transformers-dep]", "lerobot[diffusers-dep]", "lerobot[accelerate-dep]"] |
|
|
| |
| async = ["lerobot[grpcio-dep]", "lerobot[matplotlib-dep]"] |
| peft = ["lerobot[transformers-dep]", "lerobot[peft-dep]"] |
|
|
| |
| |
| |
| |
| annotations = [ |
| "lerobot[dataset]", |
| "lerobot[transformers-dep]", |
| "openai>=1.40,<2.0", |
| |
| |
| |
| |
| |
| ] |
|
|
| |
| dev = ["pre-commit>=3.7.0,<5.0.0", "debugpy>=1.8.1,<1.9.0", "lerobot[grpcio-dep]", "grpcio-tools>=1.73.1,<2.0.0", "mypy>=1.19.1", "ruff>=0.14.1", "lerobot[notebook]"] |
| notebook = ["jupyter>=1.0.0,<2.0.0", "ipykernel>=6.0.0,<7.0.0"] |
| test = ["pytest>=8.1.0,<9.0.0", "pytest-timeout>=2.4.0,<3.0.0", "pytest-cov>=5.0.0,<8.0.0", "mock-serial>=0.0.1,<0.1.0 ; sys_platform != 'win32'"] |
| video_benchmark = ["scikit-image>=0.23.2,<0.26.0", "pandas>=2.2.2,<2.4.0"] |
|
|
| |
| |
| aloha = ["lerobot[dataset]", "gym-aloha>=0.1.4,<0.2.0", "lerobot[scipy-dep]"] |
| pusht = ["lerobot[dataset]", "gym-pusht>=0.1.5,<0.2.0", "pymunk>=6.6.0,<7.0.0"] |
| libero = ["lerobot[dataset]", "lerobot[transformers-dep]", "hf-libero>=0.1.4,<0.2.0; sys_platform == 'linux'", "lerobot[scipy-dep]"] |
| metaworld = ["lerobot[dataset]", "metaworld==3.0.0", "lerobot[scipy-dep]"] |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| |
| all = [ |
| |
| "lerobot[dataset]", |
| "lerobot[training]", |
| "lerobot[hardware]", |
| "lerobot[viz]", |
| |
| |
| |
| |
| "scipy>=1.14.0,<2.0.0", |
| "lerobot[dynamixel]", |
| "lerobot[feetech]", |
| "lerobot[damiao]", |
| "lerobot[robstride]", |
| "lerobot[gamepad]", |
| "lerobot[hopejr]", |
| "lerobot[lekiwi]", |
| "lerobot[openarms]", |
| "lerobot[reachy2]", |
| "lerobot[rebot]", |
| "lerobot[kinematics]", |
| "lerobot[intelrealsense]", |
| "lerobot[diffusion]", |
| "lerobot[multi_task_dit]", |
| "lerobot[wallx]", |
| "lerobot[pi]", |
| "lerobot[molmoact2]", |
| "lerobot[smolvla]", |
| "lerobot[fastwam]", |
| "lerobot[groot]", |
| "lerobot[xvla]", |
| "lerobot[evo1]", |
| "lerobot[hilserl]", |
| "lerobot[vla_jepa]", |
| "lerobot[lingbot_va]", |
| "lerobot[async]", |
| "lerobot[dev]", |
| "lerobot[test]", |
| "lerobot[video_benchmark]", |
| "lerobot[aloha]", |
| "lerobot[pusht]", |
| "lerobot[phone]", |
| "lerobot[libero]; sys_platform == 'linux'", |
| "lerobot[metaworld]", |
| "lerobot[sarm]", |
| "lerobot[robometer]", |
| "lerobot[topreward]", |
| "lerobot[peft]", |
| |
| ] |
|
|
| [project.scripts] |
| lerobot-calibrate="lerobot.scripts.lerobot_calibrate:main" |
| lerobot-find-cameras="lerobot.scripts.lerobot_find_cameras:main" |
| lerobot-find-port="lerobot.scripts.lerobot_find_port:main" |
| lerobot-record="lerobot.scripts.lerobot_record:main" |
| lerobot-replay="lerobot.scripts.lerobot_replay:main" |
| lerobot-setup-motors="lerobot.scripts.lerobot_setup_motors:main" |
| lerobot-teleoperate="lerobot.scripts.lerobot_teleoperate:main" |
| lerobot-eval="lerobot.scripts.lerobot_eval:main" |
| lerobot-train="lerobot.scripts.lerobot_train:main" |
| lerobot-train-tokenizer="lerobot.scripts.lerobot_train_tokenizer:main" |
| lerobot-dataset-viz="lerobot.scripts.lerobot_dataset_viz:main" |
| lerobot-info="lerobot.scripts.lerobot_info:main" |
| lerobot-find-joint-limits="lerobot.scripts.lerobot_find_joint_limits:main" |
| lerobot-imgtransform-viz="lerobot.scripts.lerobot_imgtransform_viz:main" |
| lerobot-edit-dataset="lerobot.scripts.lerobot_edit_dataset:main" |
| lerobot-setup-can="lerobot.scripts.lerobot_setup_can:main" |
| lerobot-annotate="lerobot.scripts.lerobot_annotate:main" |
| lerobot-rollout="lerobot.scripts.lerobot_rollout:main" |
|
|
| |
|
|
| |
| |
| |
| |
| [[tool.uv.index]] |
| name = "pytorch-cu128" |
| url = "https://download.pytorch.org/whl/cu128" |
| explicit = true |
|
|
| [tool.uv.sources] |
| torch = [{ index = "pytorch-cu128", marker = "sys_platform == 'linux'" }] |
| torchvision = [{ index = "pytorch-cu128", marker = "sys_platform == 'linux'" }] |
|
|
| [tool.setuptools.package-data] |
| lerobot = ["envs/*.json", "annotations/steerable_pipeline/prompts/*.txt"] |
|
|
| [tool.setuptools.packages.find] |
| where = ["src"] |
|
|
| [tool.ruff] |
| target-version = "py312" |
| line-length = 110 |
| exclude = ["tests/artifacts/**/*.safetensors", "*_pb2.py", "*_pb2_grpc.py"] |
|
|
| [tool.ruff.lint] |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| select = [ |
| "E", "W", "F", "I", "B", "C4", "T20", "N", "UP", "SIM" |
| ] |
| ignore = [ |
| "E501", |
| "T201", |
| "T203", |
| "B008", |
| ] |
|
|
| [tool.ruff.lint.per-file-ignores] |
| "__init__.py" = ["F401", "F403", "E402"] |
| |
| "src/lerobot/scripts/convert_dataset_v21_to_v30.py" = ["E402"] |
| "src/lerobot/policies/wall_x/**" = ["N801", "N812", "SIM102", "SIM108", "SIM210", "SIM211", "B006", "B007", "SIM118"] |
|
|
| [tool.ruff.lint.isort] |
| combine-as-imports = true |
| known-first-party = ["lerobot"] |
|
|
| [tool.ruff.lint.pydocstyle] |
| convention = "google" |
|
|
| [tool.ruff.format] |
| quote-style = "double" |
| indent-style = "space" |
| skip-magic-trailing-comma = false |
| line-ending = "auto" |
| docstring-code-format = true |
|
|
| [tool.bandit] |
| exclude_dirs = [ |
| "tests", |
| "benchmarks", |
| "src/lerobot/datasets/push_dataset_to_hub", |
| ] |
| skips = ["B101", "B311", "B404", "B603", "B615"] |
|
|
| [tool.typos] |
| default.extend-ignore-re = [ |
| "(?Rm)^.*(#|//)\\s*spellchecker:disable-line$", |
| "(?s)(#|//)\\s*spellchecker:off.*?\\n\\s*(#|//)\\s*spellchecker:on", |
| ] |
| default.extend-ignore-identifiers-re = [ |
| |
| "2nd", |
| "pn", |
| "ser", |
| "ein", |
| "thw", |
| "inpt", |
| "arange", |
| "is_compileable", |
| "ROBOTIS", |
| "OT_VALUE", |
| "VanderBilt", |
| "seperated_timestep", |
| ] |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| |
| |
|
|
| [tool.mypy] |
| python_version = "3.12" |
| ignore_missing_imports = true |
| follow_imports = "skip" |
| |
| |
| |
| |
| |
| |
|
|
| [[tool.mypy.overrides]] |
| module = "lerobot.*" |
| ignore_errors = true |
|
|
| [[tool.mypy.overrides]] |
| module = "lerobot.envs.*" |
| ignore_errors = false |
|
|
|
|
| |
| |
| |
|
|
| [[tool.mypy.overrides]] |
| module = "lerobot.configs.*" |
| ignore_errors = false |
|
|
| |
| disallow_untyped_defs = true |
| disallow_incomplete_defs = true |
| check_untyped_defs = true |
|
|
| [[tool.mypy.overrides]] |
| module = "lerobot.optim.*" |
| ignore_errors = false |
|
|
| [[tool.mypy.overrides]] |
| module = "lerobot.model.*" |
| ignore_errors = false |
|
|
| |
| |
| |
|
|
| |
| |
| |
|
|
| [[tool.mypy.overrides]] |
| module = "lerobot.cameras.*" |
| ignore_errors = false |
|
|
| [[tool.mypy.overrides]] |
| module = "lerobot.motors.*" |
| ignore_errors = false |
|
|
| |
| |
| |
|
|
| |
| |
| |
|
|
| |
| |
| |
|
|
| |
| |
| |
|
|
|
|
| |
| |
| |
|
|
| [[tool.mypy.overrides]] |
| module = "lerobot.transport.*" |
| ignore_errors = false |
|
|
| |
| |
| |
|
|