Strands Labs GitHub avatar

Strands Labs

Strands Robots

strands-labs/robots

Control robots and physical hardware with natural language through Strands Agents.

Strands Robots

Control, simulate, and train robots with natural language

PyPI Version GitHub stars License MuJoCo GR00T LeRobot

Strands Docs ◆ MuJoCo ◆ NVIDIA GR00T ◆ LeRobot ◆ Project Board

Strands Robots: one Robot object, any robot. A Strands Agent perceives, reasons and acts; the world, MuJoCo or a real arm, answers

strands-robots gives a Strands Agent 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.

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

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 for the full table.

How it works

How strands-robots is layered: Strands Agent, policies, backends, robots; actions flow down, observations flow up

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
Any policy behind one ABC: LeRobot (ACT / Pi0 / SmolVLA / Diffusion / GR00T N1.7), Cosmos 3, MolmoAct2, whole-body control, cuRobo, MoveIt2, scripted 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, Recording
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
Simulate with an agent-callable MuJoCo tool: worlds, terrain, domain randomization, rendering, dataset capture; Newton and Isaac backends 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
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
Configure every environment variable the package reads, with its default and its guard Configuration

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

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 - start with the Quickstart and Architecture.

Development

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; CONTRIBUTING covers the workflow. Work is tracked on the project board.

Security

Found a vulnerability? Do not open a public issue - follow SECURITY.md. The trust_remote_code gate on lerobot_local and kimodo, the mesh CA-pinning controls and the ordered CA Pin Rotation Runbook are documented in the Configuration matrix.

License

Apache-2.0 - see LICENSE.

View README on GitHub

COMMUNITY

Save, rate, and discuss

Loading community data…