Skip to content

Policy providers

from strands_robots.policies import create_policy, list_providers

print(list_providers())   # ['cosmos3', 'groot', 'lerobot_local', 'mock', ...]

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)

Providers

Provider Class Install extra When to use
mock MockPolicy (core) Tests, smoke checks; sinusoidal joints, no GPU
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, …)
cosmos3 Cosmos3Policy cosmos3-service NVIDIA Cosmos 3 VLA over WebSocket
curobo CuroboPolicy curobo NVIDIA cuRobo collision-aware planning, in-process CUDA
moveit2 MoveIt2Policy moveit2 MoveIt2 motion planning over a ROS 2 sidecar (ZMQ), no in-venv ROS 2 deps

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)

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.
  • Cosmos 3 - NVIDIA Cosmos 3 omnimodal VLA.
  • cuRobo - in-process collision-aware motion planning (non-VLA, GPU).
  • MoveIt2 - ROS 2 sidecar collision-aware planning (non-VLA, no in-venv ROS 2).
  • Custom policies - implement the ABC.