Policy providers¶
strands_robots ships several policy providers. The registry is the ground
truth - list every provider that create_policy("<name>") accepts with:
python -c 'from strands_robots.policies import list_providers; print(list_providers())'
# ['cosmos3', 'curobo', 'groot', 'lerobot_async', 'lerobot_local', 'mock', 'motionbricks', 'moveit2', 'remote', 'vera', 'wbc', 'wbc_gait']
from strands_robots.policies import create_policy, list_policy_types, list_providers
print(list_providers()) # sorted provider names (registry ground truth)
print(list_policy_types()) # lerobot_local policy_type strings: ['act', 'diffusion', 'smolvla', ...]
policy = create_policy("mock") # always works, no model
policy = create_policy("groot", port=5555, data_config="so100_dualcam")
policy = create_policy("lerobot_local", pretrained_name_or_path="lerobot/pi0_so100")
policy = create_policy("cosmos3", embodiment="droid", port=8000)
policy = create_policy("remote", endpoint="ws://gpu-box:8765")
Providers¶
Every row below is a registered provider (create_policy("<name>")). The table
is kept in sync with list_providers() by a regression test
(tests/test_docs_policy_coverage.py), so it can never silently drift.
| Provider | Class | Install extra | When to use |
|---|---|---|---|
mock |
MockPolicy |
(core) | Tests, smoke checks; sinusoidal joints, no GPU. Reference minimal Policy (documented inline + custom-policies) |
groot |
Gr00tPolicy |
groot-service |
NVIDIA GR00T N1.5/N1.6/N1.7 over ZMQ |
lerobot_local |
LerobotLocalPolicy |
lerobot |
HF LeRobot in-process (ACT, Pi0, SmolVLA, MolmoAct2, ...) |
lerobot_async |
LerobotAsyncPolicy |
lerobot-async |
Offload a LeRobot policy to a GPU box over lerobot's native async-inference gRPC transport; the robot host stays light. Edge-device inference |
cosmos3 |
Cosmos3Policy |
cosmos3-service |
NVIDIA Cosmos 3 omnimodal VLA over WebSocket |
vera |
VeraPolicy |
vera |
MIT VERA video-to-action (DFoT/WAN planner + Jacobian IDM) over a containerized GPU server |
remote |
RemotePolicy |
inference |
Offload a large policy to a GPU box: forward observations to a remote PolicyServer over WebSocket, get back action chunks. Edge-device inference |
curobo |
CuroboPolicy |
curobo |
NVIDIA cuRobo collision-aware motion planning, in-process CUDA (non-VLA) |
moveit2 |
MoveIt2Policy |
moveit2 |
MoveIt2 motion planning over a ROS 2 sidecar (ZMQ), no in-venv ROS 2 deps (non-VLA) |
wbc |
WBCPolicy |
wbc |
NVIDIA GR00T Whole-Body-Control (SONIC) Unitree G1 humanoid locomotion, in-process ONNX, no GPU (non-VLA) |
wbc_gait |
WBCGaitPolicy |
wbc |
WBC gait-clock variant: single ONNX policy, 95-dim obs + bipedal phase clock (non-VLA) |
motionbricks |
MotionBricksPolicy |
motionbricks |
Generative kinematic Unitree G1 motion (style-driven: walk/stealth_walk/...), in-process torch (non-VLA) |
Policy ABC¶
from strands_robots.policies import Policy # strands_robots/policies/base.py
class MyPolicy(Policy):
# three abstract methods - must implement all:
async def get_actions(self, observation_dict: dict, instruction: str, **kw) -> list[dict]: ...
def set_robot_state_keys(self, keys: list[str]) -> None: ...
@property
def provider_name(self) -> str: ...
# optional overrides:
@property
def requires_images(self) -> bool: return True # False for state-only policies
def reset(self, seed=None): pass # clear episode state; default no-op
# sync helper provided by base: get_actions_sync(obs, instruction, **kw) -> list[dict]
Factory¶
from strands_robots.policies import register_policy
register_policy("my_prov", lambda: MyPolicyClass, aliases=["mp"])
policy = create_policy("my_prov")
Smart URI strings also resolve: "zmq://localhost:5555" → groot; "cosmos3://host:8000" → cosmos3.
In simulation¶
# Provider name + kwargs in policy_config={}
sim.run_policy(robot_name="so100", instruction="pick up the cube",
policy_provider="groot",
policy_config={"port": 5555, "data_config": "so100_dualcam"},
duration=10.0)
# Pre-built instance via policy_object=
sim.run_policy(robot_name="so100", instruction="pick up the cube",
policy_object=create_policy("groot", port=5555, data_config="so100_dualcam"),
duration=10.0)
policy_config must be a dict (it is forwarded to create_policy with **); the same holds for the
per-call policy_kwargs. Any other shape - a "port=5555" string, a list of pairs, an unparsed JSON
blob - is rejected by run_policy / start_policy / eval_policy / evaluate_benchmark with a
structured error naming the parameter, before any policy is created.
LerobotLocalPolicy requires export STRANDS_TRUST_REMOTE_CODE=1 (raises UntrustedRemoteCodeError otherwise).
See also¶
- GR00T - ZMQ server, 27 embodiments, container lifecycle.
- LeRobot Local - in-process HF models, RTC.
- LeRobot Async - offload a LeRobot policy to a gRPC
PolicyServer(edge offload). - MolmoAct2 (SO-100/101) - action/observation contract for the SO-arm checkpoints.
- Persistent worker - load once, reuse across rollouts; cache controls + telemetry.
- Cosmos 3 - NVIDIA Cosmos 3 omnimodal VLA.
- VERA - MIT video-to-action planner + Jacobian IDM over a GPU server.
- Remote - forward observations to a remote
PolicyServerover WebSocket (edge offload). - cuRobo - in-process collision-aware motion planning (non-VLA, GPU).
- MoveIt2 - ROS 2 sidecar collision-aware planning (non-VLA, no in-venv ROS 2).
- WBC - GR00T Whole-Body-Control (SONIC) G1 locomotion (non-VLA, in-process ONNX).
- WBC gait-clock variant - single-ONNX gait-clock G1 controller (non-VLA).
- MotionBricks - generative kinematic G1 motion (non-VLA, in-process torch).
- Custom policies - implement the ABC.