Metadata-Version: 2.4
Name: strands-robots
Version: 0.5.3
Summary: AI-powered robot control, simulation, and training for Strands Agents - integrates with MuJoCo, Isaac Sim, Newton, and many more
Project-URL: Homepage, https://github.com/strands-labs/robots
Project-URL: Documentation, https://github.com/strands-labs/robots#readme
Project-URL: Repository, https://github.com/strands-labs/robots.git
Project-URL: Issues, https://github.com/strands-labs/robots/issues
Project-URL: Changelog, https://github.com/strands-labs/robots/releases
Author-email: AWS <opensource@amazon.com>
License: Apache-2.0
License-File: LICENSE
License-File: NOTICE
Keywords: agents,gr00t,imitation-learning,isaac-sim,lerobot,manipulation,mujoco,reinforcement-learning,robot-learning,robots,sdk,simulation,strands,strands-agents,teleoperation,vla
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: Intended Audience :: Science/Research
Classifier: License :: OSI Approved :: Apache Software License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
Classifier: Topic :: Scientific/Engineering :: Physics
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Classifier: Typing :: Typed
Requires-Python: >=3.12
Requires-Dist: numpy<3.0.0,>=1.21.0
Requires-Dist: opencv-python-headless<5.0.0,>=4.5.0
Requires-Dist: pillow<13.0.0,>=12.3.0
Requires-Dist: strands-agents<2.0.0,>=1.57.2
Provides-Extra: all
Requires-Dist: accelerate>=0.30.0; extra == 'all'
Requires-Dist: awscrt<1.0.0,>=0.20.0; extra == 'all'
Requires-Dist: awsiotsdk<2.0.0,>=1.21.0; extra == 'all'
Requires-Dist: bosdyn-client<6.0.0,>=5.0.0; extra == 'all'
Requires-Dist: boto3<2.0.0,>=1.34.0; extra == 'all'
Requires-Dist: boto3<2.0.0,>=1.43.17; extra == 'all'
Requires-Dist: botocore<2.0.0,>=1.43.17; extra == 'all'
Requires-Dist: cryptography>=50.0.0; extra == 'all'
Requires-Dist: device-connect-agent-tools>=0.1.0; extra == 'all'
Requires-Dist: device-connect-edge>=0.2.0; extra == 'all'
Requires-Dist: diffusers>=0.30.0; extra == 'all'
Requires-Dist: eclipse-zenoh<2.0.0,>=1.6.1; extra == 'all'
Requires-Dist: fastapi<1.0,>=0.110; extra == 'all'
Requires-Dist: foxglove-sdk<0.28.0,>=0.25.1; extra == 'all'
Requires-Dist: gymnasium<2.0,>=0.29; extra == 'all'
Requires-Dist: huggingface-hub<2.0.0,>=1.5; extra == 'all'
Requires-Dist: imageio-ffmpeg<1.0.0,>=0.4.0; extra == 'all'
Requires-Dist: imageio<3.0.0,>=2.28.0; extra == 'all'
Requires-Dist: json5<1.0.0,>=0.9.0; extra == 'all'
Requires-Dist: lerobot[dataset,feetech]<0.7.0,>=0.6.1; extra == 'all'
Requires-Dist: lerobot[groot]<0.7.0,>=0.6.1; extra == 'all'
Requires-Dist: lerobot[molmoact2]<0.7.0,>=0.6.1; extra == 'all'
Requires-Dist: lerobot[smolvla]<0.7.0,>=0.6.1; extra == 'all'
Requires-Dist: mcap<2.0.0,>=1.5.0; extra == 'all'
Requires-Dist: mink>=0.0.4; extra == 'all'
Requires-Dist: msgpack<2.0.0,>=1.0.0; extra == 'all'
Requires-Dist: mujoco<4.0.0,>=3.5.0; extra == 'all'
Requires-Dist: onnxruntime<2.0.0,>=1.17.0; extra == 'all'
Requires-Dist: opencv-python-headless<5.0,>=4.8; extra == 'all'
Requires-Dist: psutil<8.0.0,>=6.0.0; extra == 'all'
Requires-Dist: pycollada<1.0,>=0.8; extra == 'all'
Requires-Dist: pyjwt<3.0,>=2.0; extra == 'all'
Requires-Dist: pyserial<4.0,>=3.5; extra == 'all'
Requires-Dist: python-multipart<1.0,>=0.0.9; extra == 'all'
Requires-Dist: pyyaml<7.0.0,>=5.1; extra == 'all'
Requires-Dist: pyzmq<28.0.0,>=27.0.0; extra == 'all'
Requires-Dist: qpsolvers[daqp]>=4.0.0; extra == 'all'
Requires-Dist: rby1-sdk<0.11.0,>=0.10.0; extra == 'all'
Requires-Dist: requests<3.0.0,>=2.28.0; extra == 'all'
Requires-Dist: robot-descriptions<2.0.0,>=1.23.0; extra == 'all'
Requires-Dist: roslibpy<2.0.0,>=1.7.0; extra == 'all'
Requires-Dist: scipy>=1.10.0; extra == 'all'
Requires-Dist: strands-agents[ollama]<2.0.0,>=1.57.2; extra == 'all'
Requires-Dist: torch>=2.0.0; extra == 'all'
Requires-Dist: transformers>=4.40.0; extra == 'all'
Requires-Dist: trimesh<6.0.0,>=4.0.0; extra == 'all'
Requires-Dist: uvicorn[standard]<1.0,>=0.27; extra == 'all'
Requires-Dist: webauthn<4.0,>=2.0; extra == 'all'
Requires-Dist: websockets>=17.1; extra == 'all'
Requires-Dist: xacrodoc<3.0.0,>=2.0.0; extra == 'all'
Requires-Dist: xarm-python-sdk<2.0.0,>=1.18.0; extra == 'all'
Provides-Extra: cosmos3-diffusers
Requires-Dist: accelerate>=0.26; extra == 'cosmos3-diffusers'
Requires-Dist: diffusers>=0.39; extra == 'cosmos3-diffusers'
Requires-Dist: torch>=2.0; extra == 'cosmos3-diffusers'
Requires-Dist: transformers>=4.40; extra == 'cosmos3-diffusers'
Provides-Extra: cosmos3-service
Requires-Dist: msgpack<2.0.0,>=1.0.0; extra == 'cosmos3-service'
Requires-Dist: websockets>=17.1; extra == 'cosmos3-service'
Provides-Extra: cosmos3-sim
Requires-Dist: mink>=0.0.4; extra == 'cosmos3-sim'
Requires-Dist: mujoco<4.0.0,>=3.5.0; extra == 'cosmos3-sim'
Requires-Dist: qpsolvers[quadprog]>=4.0.0; extra == 'cosmos3-sim'
Provides-Extra: crazyflie
Requires-Dist: cflib<0.2.0,>=0.1.25; extra == 'crazyflie'
Provides-Extra: curobo
Provides-Extra: dashboard
Requires-Dist: fastapi<1.0,>=0.110; extra == 'dashboard'
Requires-Dist: huggingface-hub<2.0.0,>=1.5; extra == 'dashboard'
Requires-Dist: opencv-python-headless<5.0,>=4.8; extra == 'dashboard'
Requires-Dist: pyjwt<3.0,>=2.0; extra == 'dashboard'
Requires-Dist: pyserial<4.0,>=3.5; extra == 'dashboard'
Requires-Dist: python-multipart<1.0,>=0.0.9; extra == 'dashboard'
Requires-Dist: uvicorn[standard]<1.0,>=0.27; extra == 'dashboard'
Requires-Dist: webauthn<4.0,>=2.0; extra == 'dashboard'
Provides-Extra: dev
Requires-Dist: mypy<2.0.0,>=1.0.0; extra == 'dev'
Requires-Dist: pytest-cov<6.0.0,>=4.0.0; extra == 'dev'
Requires-Dist: pytest-timeout<3.0.0,>=2.0.0; extra == 'dev'
Requires-Dist: pytest-xdist<4.0.0,>=3.0.0; extra == 'dev'
Requires-Dist: pytest<10.0.0,>=6.0; extra == 'dev'
Requires-Dist: ruff<0.16.0,>=0.15.12; extra == 'dev'
Provides-Extra: device-connect
Requires-Dist: device-connect-agent-tools>=0.1.0; extra == 'device-connect'
Requires-Dist: device-connect-edge>=0.2.0; extra == 'device-connect'
Provides-Extra: earthrover
Requires-Dist: requests<3.0.0,>=2.28.0; extra == 'earthrover'
Provides-Extra: flux3
Provides-Extra: foxglove
Requires-Dist: foxglove-sdk<0.28.0,>=0.25.1; extra == 'foxglove'
Requires-Dist: mcap<2.0.0,>=1.5.0; extra == 'foxglove'
Provides-Extra: groot
Requires-Dist: lerobot[dataset,feetech]<0.7.0,>=0.6.1; extra == 'groot'
Requires-Dist: lerobot[groot]<0.7.0,>=0.6.1; extra == 'groot'
Requires-Dist: psutil<8.0.0,>=6.0.0; extra == 'groot'
Provides-Extra: holosoma
Requires-Dist: huggingface-hub<2.0.0,>=1.5; extra == 'holosoma'
Requires-Dist: onnxruntime<2.0.0,>=1.17.0; extra == 'holosoma'
Provides-Extra: inference
Requires-Dist: websockets>=17.1; extra == 'inference'
Provides-Extra: kimodo
Requires-Dist: accelerate>=0.30.0; extra == 'kimodo'
Requires-Dist: diffusers>=0.30.0; extra == 'kimodo'
Requires-Dist: huggingface-hub<2.0.0,>=1.5; extra == 'kimodo'
Requires-Dist: scipy>=1.10.0; extra == 'kimodo'
Requires-Dist: torch>=2.0.0; extra == 'kimodo'
Requires-Dist: transformers>=4.40.0; extra == 'kimodo'
Provides-Extra: lerobot
Requires-Dist: lerobot[dataset,feetech]<0.7.0,>=0.6.1; extra == 'lerobot'
Requires-Dist: psutil<8.0.0,>=6.0.0; extra == 'lerobot'
Provides-Extra: mesh
Requires-Dist: cryptography>=50.0.0; extra == 'mesh'
Requires-Dist: eclipse-zenoh<2.0.0,>=1.6.1; extra == 'mesh'
Requires-Dist: json5<1.0.0,>=0.9.0; extra == 'mesh'
Provides-Extra: mesh-iot
Requires-Dist: awscrt<1.0.0,>=0.20.0; extra == 'mesh-iot'
Requires-Dist: awsiotsdk<2.0.0,>=1.21.0; extra == 'mesh-iot'
Requires-Dist: boto3<2.0.0,>=1.43.17; extra == 'mesh-iot'
Requires-Dist: botocore<2.0.0,>=1.43.17; extra == 'mesh-iot'
Requires-Dist: cryptography>=50.0.0; extra == 'mesh-iot'
Requires-Dist: eclipse-zenoh<2.0.0,>=1.6.1; extra == 'mesh-iot'
Requires-Dist: json5<1.0.0,>=0.9.0; extra == 'mesh-iot'
Provides-Extra: microduck
Requires-Dist: huggingface-hub<2.0.0,>=1.5; extra == 'microduck'
Requires-Dist: onnxruntime<2.0.0,>=1.17.0; extra == 'microduck'
Provides-Extra: molmoact2
Requires-Dist: lerobot[dataset,feetech]<0.7.0,>=0.6.1; extra == 'molmoact2'
Requires-Dist: lerobot[molmoact2]<0.7.0,>=0.6.1; extra == 'molmoact2'
Requires-Dist: psutil<8.0.0,>=6.0.0; extra == 'molmoact2'
Provides-Extra: moveit2
Requires-Dist: msgpack<2.0.0,>=1.0.0; extra == 'moveit2'
Requires-Dist: pyzmq<28.0.0,>=27.0.0; extra == 'moveit2'
Provides-Extra: ollama
Requires-Dist: strands-agents[ollama]<2.0.0,>=1.57.2; extra == 'ollama'
Provides-Extra: protomotions
Requires-Dist: huggingface-hub<2.0.0,>=1.5; extra == 'protomotions'
Requires-Dist: onnxruntime<2.0.0,>=1.17.0; extra == 'protomotions'
Requires-Dist: pyyaml<7.0.0,>=5.1; extra == 'protomotions'
Provides-Extra: rby1
Requires-Dist: rby1-sdk<0.11.0,>=0.10.0; extra == 'rby1'
Provides-Extra: rl
Requires-Dist: gymnasium<2.0,>=0.29; extra == 'rl'
Requires-Dist: imageio-ffmpeg<1.0.0,>=0.4.0; extra == 'rl'
Requires-Dist: imageio<3.0.0,>=2.28.0; extra == 'rl'
Requires-Dist: mink>=0.0.4; extra == 'rl'
Requires-Dist: mujoco<4.0.0,>=3.5.0; extra == 'rl'
Requires-Dist: qpsolvers[daqp]>=4.0.0; extra == 'rl'
Requires-Dist: robot-descriptions<2.0.0,>=1.23.0; extra == 'rl'
Requires-Dist: torch>=2.0.0; extra == 'rl'
Provides-Extra: ros2
Requires-Dist: cyclonedds<12,>=0.10.2; extra == 'ros2'
Provides-Extra: rosbridge
Requires-Dist: roslibpy<2.0.0,>=1.7.0; extra == 'rosbridge'
Provides-Extra: sagemaker
Requires-Dist: boto3<2.0.0,>=1.34.0; extra == 'sagemaker'
Provides-Extra: serial
Requires-Dist: pyserial<4.0,>=3.5; extra == 'serial'
Provides-Extra: sim
Requires-Dist: robot-descriptions<2.0.0,>=1.23.0; extra == 'sim'
Provides-Extra: sim-gs
Requires-Dist: gsplat<2.0.0,>=1.4.0; extra == 'sim-gs'
Requires-Dist: plyfile<2.0.0,>=1.0.0; extra == 'sim-gs'
Requires-Dist: torch<3.0.0,>=2.2.0; extra == 'sim-gs'
Provides-Extra: sim-isaac
Requires-Dist: imageio-ffmpeg<1.0.0,>=0.4.0; extra == 'sim-isaac'
Requires-Dist: imageio<3.0.0,>=2.28.0; extra == 'sim-isaac'
Requires-Dist: mink>=0.0.4; extra == 'sim-isaac'
Requires-Dist: mujoco<4.0.0,>=3.5.0; extra == 'sim-isaac'
Requires-Dist: qpsolvers[daqp]>=4.0.0; extra == 'sim-isaac'
Requires-Dist: robot-descriptions<2.0.0,>=1.23.0; extra == 'sim-isaac'
Requires-Dist: usd-core<27.0.0,>=25.5; extra == 'sim-isaac'
Provides-Extra: sim-mjlab
Requires-Dist: imageio-ffmpeg<1.0.0,>=0.4.0; extra == 'sim-mjlab'
Requires-Dist: imageio<3.0.0,>=2.28.0; extra == 'sim-mjlab'
Requires-Dist: mink>=0.0.4; extra == 'sim-mjlab'
Requires-Dist: mjlab<2.0.0,>=1.6.0; extra == 'sim-mjlab'
Requires-Dist: mujoco-warp<3.12.0,>=3.11.0; extra == 'sim-mjlab'
Requires-Dist: mujoco<3.12.0,>=3.11.0; extra == 'sim-mjlab'
Requires-Dist: mujoco<4.0.0,>=3.5.0; extra == 'sim-mjlab'
Requires-Dist: onnxruntime<2.0.0,>=1.17.0; extra == 'sim-mjlab'
Requires-Dist: qpsolvers[daqp]>=4.0.0; extra == 'sim-mjlab'
Requires-Dist: robot-descriptions<2.0.0,>=1.23.0; extra == 'sim-mjlab'
Requires-Dist: warp-lang<2.0.0,>=1.14.0; extra == 'sim-mjlab'
Provides-Extra: sim-mujoco
Requires-Dist: imageio-ffmpeg<1.0.0,>=0.4.0; extra == 'sim-mujoco'
Requires-Dist: imageio<3.0.0,>=2.28.0; extra == 'sim-mujoco'
Requires-Dist: mink>=0.0.4; extra == 'sim-mujoco'
Requires-Dist: mujoco<4.0.0,>=3.5.0; extra == 'sim-mujoco'
Requires-Dist: qpsolvers[daqp]>=4.0.0; extra == 'sim-mujoco'
Requires-Dist: robot-descriptions<2.0.0,>=1.23.0; extra == 'sim-mujoco'
Provides-Extra: sim-newton
Requires-Dist: imageio-ffmpeg<1.0.0,>=0.4.0; extra == 'sim-newton'
Requires-Dist: imageio<3.0.0,>=2.28.0; extra == 'sim-newton'
Requires-Dist: mink>=0.0.4; extra == 'sim-newton'
Requires-Dist: mujoco-warp<3.12.0,>=3.11.0; extra == 'sim-newton'
Requires-Dist: mujoco<3.12.0,>=3.11.0; extra == 'sim-newton'
Requires-Dist: mujoco<4.0.0,>=3.5.0; extra == 'sim-newton'
Requires-Dist: newton<1.6.0,>=1.5.0; extra == 'sim-newton'
Requires-Dist: qpsolvers[daqp]>=4.0.0; extra == 'sim-newton'
Requires-Dist: robot-descriptions<2.0.0,>=1.23.0; extra == 'sim-newton'
Requires-Dist: trimesh<5.0.0,>=4.0.0; extra == 'sim-newton'
Requires-Dist: warp-lang<2.0.0,>=1.14.0; extra == 'sim-newton'
Provides-Extra: sim-urdf
Requires-Dist: imageio-ffmpeg<1.0.0,>=0.4.0; extra == 'sim-urdf'
Requires-Dist: imageio<3.0.0,>=2.28.0; extra == 'sim-urdf'
Requires-Dist: mink>=0.0.4; extra == 'sim-urdf'
Requires-Dist: mujoco<4.0.0,>=3.5.0; extra == 'sim-urdf'
Requires-Dist: pycollada<1.0,>=0.8; extra == 'sim-urdf'
Requires-Dist: qpsolvers[daqp]>=4.0.0; extra == 'sim-urdf'
Requires-Dist: robot-descriptions<2.0.0,>=1.23.0; extra == 'sim-urdf'
Requires-Dist: trimesh<6.0.0,>=4.0.0; extra == 'sim-urdf'
Requires-Dist: xacrodoc<3.0.0,>=2.0.0; extra == 'sim-urdf'
Provides-Extra: smolvla
Requires-Dist: lerobot[dataset,feetech]<0.7.0,>=0.6.1; extra == 'smolvla'
Requires-Dist: lerobot[smolvla]<0.7.0,>=0.6.1; extra == 'smolvla'
Requires-Dist: psutil<8.0.0,>=6.0.0; extra == 'smolvla'
Provides-Extra: spot
Requires-Dist: bosdyn-client<6.0.0,>=5.0.0; extra == 'spot'
Provides-Extra: ur
Requires-Dist: ur-rtde<2.0.0,>=1.6.0; extra == 'ur'
Provides-Extra: voice
Requires-Dist: strands-agents[bidi]<2.0.0,>=1.57.2; extra == 'voice'
Provides-Extra: wbc
Requires-Dist: huggingface-hub<2.0.0,>=1.5; extra == 'wbc'
Requires-Dist: onnxruntime<2.0.0,>=1.17.0; extra == 'wbc'
Requires-Dist: pyyaml<7.0.0,>=5.1; extra == 'wbc'
Provides-Extra: xarm
Requires-Dist: xarm-python-sdk<2.0.0,>=1.18.0; extra == 'xarm'
Description-Content-Type: text/markdown

<div align="center">
  <div>
    <a href="https://strandsagents.com">
      <picture>
        <source media="(prefers-color-scheme: dark)" srcset="https://strandsagents.com/latest/assets/wordmark-github-dark.svg">
        <img src="https://strandsagents.com/latest/assets/wordmark-github-light.svg" alt="Strands" width="320">
      </picture>
    </a>
  </div>

  <h1>
    Strands Robots
  </h1>

  <h2>
    Control, simulate, and train robots with natural language
  </h2>

  <div align="center">
    <a href="https://pypi.org/project/strands-robots/"><img alt="PyPI Version" src="https://img.shields.io/pypi/v/strands-robots"/></a>
    <a href="https://github.com/strands-labs/robots"><img alt="GitHub stars" src="https://img.shields.io/github/stars/strands-labs/robots"/></a>
    <a href="https://github.com/strands-labs/robots/blob/main/LICENSE"><img alt="License" src="https://img.shields.io/github/license/strands-labs/robots"/></a>
    <a href="https://github.com/google-deepmind/mujoco"><img alt="MuJoCo" src="https://img.shields.io/badge/MuJoCo-3.x-000000"/></a>
    <a href="https://github.com/NVIDIA/Isaac-GR00T"><img alt="GR00T" src="https://img.shields.io/badge/NVIDIA-GR00T-76B900?logo=nvidia"/></a>
    <a href="https://github.com/huggingface/lerobot"><img alt="LeRobot" src="https://img.shields.io/badge/🤗-LeRobot-yellow"/></a>
  </div>

  <p>
    <a href="https://strandsagents.com/">Strands Docs</a>
    ◆ <a href="https://github.com/google-deepmind/mujoco">MuJoCo</a>
    ◆ <a href="https://github.com/NVIDIA/Isaac-GR00T">NVIDIA GR00T</a>
    ◆ <a href="https://github.com/huggingface/lerobot">LeRobot</a>
    ◆ <a href="https://github.com/orgs/strands-labs/projects/2">Project Board</a>
  </p>
</div>

<p align="center">
  <img src="docs/assets/hero_loop.svg" alt="Strands Robots: one Robot object, any robot. A Strands Agent perceives, reasons and acts; the world, MuJoCo or a real arm, answers" width="100%">
</p>

`strands-robots` gives a [Strands Agent](https://github.com/strands-agents/harness-sdk)
hands. One `Robot()` call returns a **MuJoCo simulation** (default: no GPU, no
hardware) or a **real robot** - same code, same natural-language control, same
opt-in peer-to-peer **mesh**. Learned policies from the Hugging Face Hub, from
vision-language-action models to world foundation models and whole-body
controllers, run through the same `run_policy` call in the simulator and on
the physical robot.

```python
from strands import Agent
from strands_robots import Robot

robot = Robot("so100")              # MuJoCo sim by default; mode="real" for hardware
robot.add_object(name="red_cube", shape="box", size=[0.05, 0.05, 0.05],
                 position=[0.0, -0.2, 0.025], color=[1.0, 0.0, 0.0])  # the arm faces -Y
robot.add_camera(name="front", position=[0.3, -0.7, 0.45], target=[0.0, -0.2, 0.03])
Agent(tools=[robot])("pick up the red cube")
```

In MuJoCo the SO-100 jaw cannot squeeze the cube hard enough to lift it, so the
agent carries it with `attach_bodies(mode="weld")`, a grasp assist that
`set_gripper` names as soon as the jaw closes.

## Install

```bash
uv venv --python 3.12 && source .venv/bin/activate
uv pip install "strands-robots[sim-mujoco]"   # plain pip works too
```

Python 3.12+. `from strands import Agent` comes from the `strands-agents`
dependency, installed for you; the PyPI package named `strands` is an
unrelated physics solver, so do not `pip install strands`. Everything else is
an extra you pull in when you need it -
`lerobot` (hardware, local VLA inference, recording), `groot` (GR00T N1.7),
`cosmos3-service`, `mesh`, `mesh-iot`, `sim-newton`, `sim-isaac`, `wbc` -
see [Installation](https://strands-labs.github.io/robots/start/install/) for the full table.

## How it works

<p align="center">
  <img src="docs/assets/architecture_flow.svg" alt="How strands-robots is layered: Strands Agent, policies, backends, robots; actions flow down, observations flow up" width="100%">
</p>

A prompt reaches the agent; the agent calls the robot tool; a policy turns the
observation into an action chunk; the backend (MuJoCo, Newton, Isaac, or the
hardware driver) executes it and returns the next observation. Sim and hardware
share the policy interface, the mesh, and the tool surface, so a workflow proven
in sim runs on the metal by changing `mode`.

## What you get

| | Read |
|---|---|
| **150+ robots across 8 categories** - arms, bimanual, hands and grippers, humanoids, mobile bases, mobile manipulators, aerial, expressive - from one registry with asset auto-download | [Robots](https://strands-labs.github.io/robots/robots/) |
| **Any policy** behind one ABC: LeRobot (ACT / Pi0 / SmolVLA / Diffusion / GR00T N1.7), Cosmos 3, MolmoAct2, whole-body control, cuRobo, MoveIt2, scripted | [Policies](https://strands-labs.github.io/robots/learn/policies/) |
| **Teleoperate and record** LeRobotDataset episodes from leader arms, gamepads or WASD; push to a Hub dataset repo or sync to an HF Storage Bucket | [Teleoperation](https://strands-labs.github.io/robots/learn/hardware/teleoperation/), [Recording](https://strands-labs.github.io/robots/learn/data/record/) |
| **Train** with LeRobot (ACT to GR00T N1.7, `strands_robots.training.create_trainer("lerobot_local")`), Cosmos 3 (`"cosmos3"`) or RL (`"ppo"` / `"fast_sac"` / `"fast_td3"`), locally or as a SageMaker job (`"sagemaker"`), then run the checkpoint in sim and on hardware | [Training](https://strands-labs.github.io/robots/learn/training/lerobot/) |
| **Simulate** with an agent-callable MuJoCo tool: worlds, terrain, domain randomization, rendering, dataset capture; Newton and Isaac backends | [Simulation](https://strands-labs.github.io/robots/learn/simulation/) |
| **Mesh** every `Robot(mesh=True)` as a Zenoh peer (on one machine set `STRANDS_MESH_LOCAL_DEV=true`; across hosts, mTLS and an ACL): `robot.mesh.tell(peer, instruction, policy_provider=...)` asks another robot to run a policy; broadcast an E-STOP, bridge fleets over AWS IoT Core | [Mesh](https://strands-labs.github.io/robots/learn/mesh/fleet/) |
| **ROS 2** - observe and command any graph (`use_ros`), act as a node without rclpy (`use_rtps`), bridge a real arm (rclpy or DDS) or, on a sourced distro, a running sim | [ROS 2](https://strands-labs.github.io/robots/learn/ros2/) |
| **Configure** every environment variable the package reads, with its default and its guard | [Configuration](https://strands-labs.github.io/robots/reference/configuration/) |

<p align="center">
  <img src="docs/assets/mesh_network.svg" alt="Strands Robots mesh: every Robot(mesh=True) is a Zenoh peer; an agent lists peers, tells one what to do, and an emergency stop reaches all of them" width="100%">
</p>

Real servos never move by accident: `mode="real"` is an explicit opt-in.

## Documentation

Full guide, API reference and per-robot pages:
**[strands-labs.github.io/robots](https://strands-labs.github.io/robots)** -
start with the [Quickstart](https://strands-labs.github.io/robots/start/first-robot/) and [Architecture](https://strands-labs.github.io/robots/concepts/architecture/).

## Development

```bash
uv venv --python 3.12 && source .venv/bin/activate
uv pip install -e ".[all,dev]" hatch   # hatch is the task runner, in no extra
hatch run test && hatch run lint       # pytest; ruff + mypy
```

Conventions and review learnings are in [AGENTS.md](AGENTS.md);
[CONTRIBUTING](https://strands-labs.github.io/robots/reference/project/contributing/) covers the workflow. Work is tracked on the
[project board](https://github.com/orgs/strands-labs/projects/2).

## Security

Found a vulnerability? **Do not** open a public issue - follow
[SECURITY.md](SECURITY.md). The `trust_remote_code` gate on `lerobot_local` and `kimodo`, the
mesh CA-pinning controls and the ordered
[CA Pin Rotation Runbook](https://strands-labs.github.io/robots/reference/configuration/#ca-pin-rotation-runbook)
are documented in the [Configuration](https://strands-labs.github.io/robots/reference/configuration/) matrix.

## License

Apache-2.0 - see [LICENSE](LICENSE).
