Metadata-Version: 2.4
Name: strands-robots
Version: 0.5.2
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
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,>=8.0.0
Requires-Dist: strands-agents<2.0.0,>=1.13.0
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: boto3<2.0.0,>=1.34.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: 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[async]<0.7.0,>=0.6.1; extra == 'all'
Requires-Dist: lerobot[dataset,feetech]<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: 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: psutil<8.0.0,>=6.0.0; extra == 'all'
Requires-Dist: pyjwt<3.0,>=2.0; 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: 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.13.0; extra == 'all'
Requires-Dist: torch>=2.0.0; extra == 'all'
Requires-Dist: transformers>=4.40.0; extra == 'all'
Requires-Dist: uvicorn<1.0,>=0.27; extra == 'all'
Requires-Dist: webauthn<4.0,>=2.0; extra == 'all'
Requires-Dist: websockets>=17.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.0; 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: pyjwt<3.0,>=2.0; extra == 'dashboard'
Requires-Dist: python-multipart<1.0,>=0.0.9; extra == 'dashboard'
Requires-Dist: uvicorn<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<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: groot-service
Requires-Dist: msgpack<2.0.0,>=1.0.0; extra == 'groot-service'
Requires-Dist: pyzmq<28.0.0,>=27.0.0; extra == 'groot-service'
Provides-Extra: inference
Requires-Dist: websockets>=17.0; 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: lerobot-async
Requires-Dist: lerobot[async]<0.7.0,>=0.6.1; extra == 'lerobot-async'
Requires-Dist: lerobot[dataset,feetech]<0.7.0,>=0.6.1; extra == 'lerobot-async'
Requires-Dist: psutil<8.0.0,>=6.0.0; extra == 'lerobot-async'
Provides-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.34.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.13.0; 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: 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: 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: 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-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: 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: ur
Requires-Dist: ur-rtde<2.0.0,>=1.6.0; extra == 'ur'
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'
Description-Content-Type: text/markdown

<div align="center">
  <div>
    <a href="https://strandsagents.com">
      <img src="https://strandsagents.com/latest/assets/logo-github.svg" alt="Strands Agents" width="55px" height="105px">
    </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 - perceive, reason, act, world: the closed control loop around a Strands Agent core" 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**.

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

robot = Robot("so100")              # MuJoCo sim by default; mode="real" for hardware
Agent(tools=[robot])("pick up the red cube")
```

## 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+. Everything else is an extra you pull in when you need it -
`lerobot` (hardware, local VLA inference, recording), `groot-service`,
`cosmos3-service`, `mesh`, `mesh-iot`, `sim-newton`, `sim-isaac`, `wbc` -
see [Installation](docs/getting-started/installation.md) for the full table.

## How it works

<p align="center">
  <img src="docs/assets/architecture_flow.svg" alt="Strands Robots architecture - 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 |
|---|---|
| **70+ robots across 8 categories** - arms, bimanual rigs, humanoids, quadrupeds, hands, drones - from one registry with asset auto-download | [Robots](docs/robots/index.md) |
| **Any policy** behind one ABC: NVIDIA GR00T, Cosmos 3, LeRobot (ACT / Pi0 / SmolVLA / Diffusion), MolmoAct2, whole-body control, cuRobo, MoveIt2, scripted | [Policies](docs/policies/overview.md) |
| **Teleoperate and record** LeRobotDataset episodes from leader arms, gamepads or WASD; stream to HF datasets or Storage Buckets | [Teleoperation](docs/hardware/teleoperation.md), [Recording](docs/recording.md) |
| **Train** with LeRobot, GR00T, Cosmos 3 or RL (PPO / FastSAC), locally or as a SageMaker job, then run the checkpoint in sim and on hardware | [Training](docs/training/overview.md) |
| **Simulate** with an agent-callable MuJoCo tool: worlds, terrain, domain randomization, rendering, dataset capture; Newton and Isaac backends | [Simulation](docs/simulation/overview.md) |
| **Mesh** every robot as a Zenoh peer: `tell()` another robot what to do, broadcast an E-STOP, bridge fleets over AWS IoT Core | [Mesh](docs/mesh.md) |
| **ROS 2** - observe and command any graph (`use_ros`), act as a node without rclpy (`use_rtps`), expose a running sim | [ROS 2](docs/ros2-integration.md) |
| **Configure** every environment variable the package reads, with its default and its guard | [Configuration](docs/reference/configuration.md) |

<p align="center">
  <img src="docs/assets/mesh_network.svg" alt="Strands Robots mesh - robot peers discovering and coordinating over the Zenoh mesh" 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](docs/getting-started/quickstart.md) and [Architecture](docs/architecture.md).

## Development

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

Conventions and review learnings are in [AGENTS.md](AGENTS.md);
[CONTRIBUTING](docs/contributing.md) 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`, the
mesh CA-pinning controls and the ordered
[CA Pin Rotation Runbook](docs/reference/configuration.md#ca-pin-rotation-runbook)
are documented in the [Configuration](docs/reference/configuration.md) matrix.

## License

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