Skip to content

GR00T

uv pip install "strands-robots[groot-service]"
from strands_robots.policies import create_policy

# Service mode (container running separately)
policy = create_policy("groot", port=5555, data_config="so100_dualcam")

# Local mode (load model in-process)        # requires GPU
policy = create_policy("groot", model_path="/checkpoint", data_config="so100_dualcam", device="cuda")

Parameters

Gr00tPolicy(
    data_config="so100_dualcam",    # embodiment config (required)
    host="localhost",
    port=5555,
    model_path=None,                # set for local mode; None = service mode
    embodiment_tag="NEW_EMBODIMENT",
    device="cuda",                  # local mode only
    groot_version=None,             # override auto-detection (N1.5/N1.6/N1.7)
    strict=False,
    api_token=None,                 # fallback: GROOT_API_TOKEN env var
    observation_mapping=None,
    action_mapping=None,
    language_key=None,
    strict_keys=False,             # raise instead of positional key-guessing
)

Strict key matching

When no explicit observation_mapping/action_mapping is given, GR00T auto-infers the robot<->model key mapping: exact name matches first, then positional fallback for any leftover keys (with a log line). On a multi-camera or multi-DOF rig, positional fallback can silently bind the wrong camera or action column. Pass strict_keys=True to raise a ValueError (listing the unmatched robot keys vs available model keys) instead of guessing:

policy = create_policy("groot", data_config="so100_dualcam",
                       model_path="nvidia/GR00T-N1.6-3B", strict_keys=True)

strict_keys defaults to False (positional fallback preserved) and is a no-op when an explicit mapping is supplied.

Versions

Version Transport Notes
GR00T N1.5 ZMQ (K, ...) observation shape
GR00T N1.6 ZMQ (K, ...) observation shape
GR00T N1.7 ZMQ (B, T, ...) float32; auto-detected

27 data_configs

so100               so100_dualcam          so100_4cam
so101               so101_dualcam          so101_tricam
bimanual_panda_gripper                     single_panda_gripper
libero_panda        oxe_droid              oxe_widowx
oxe_google          fourier_gr1_arms_only  fourier_gr1_arms_waist
fourier_gr1_full_upper_body
unitree_g1          unitree_g1_full_body   unitree_g1_locomanip
unitree_g1_real     unitree_g1_sonic
agibot_*            galaxea_r1_pro

Container lifecycle

from strands_robots.tools import gr00t_inference

gr00t_inference(action="build_image",         tag="gr00t-n1.7:latest")
gr00t_inference(action="download_checkpoint", model_id="nvidia/GR00T-N1.7-3B")
gr00t_inference(action="start_container",     tag="gr00t-n1.7:latest",
                                              model_id="nvidia/GR00T-N1.7-3B",
                                              data_config="so100_dualcam")
# ... run policy ...
gr00t_inference(action="stop", container_name="gr00t-inference")  # stop only
gr00t_inference(action="lifecycle", lifecycle="teardown",
                container_name="gr00t-inference",
                remove_volumes=True)  # stop + remove container (and volumes)

See also