Skip to content
strands-labsPublic

About

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

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

181 stars

Watchers

5 watching

Forks

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.

About

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

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

181 stars

Watchers

5 watching

Forks

Releases

Used by

Contributors

Languages