Skip to content

Submitting Jobs

Use execute() to submit a job and wait for the result:

from armnet_client import execute

result = execute(
    image="registry.example/my-runtime:tag",
    embodiment="lerobot/so-101",
    task="push_green_button",
    args={"calibrate": False},
    timeout_seconds=1200,
)

Arguments

All arguments are keyword-only.

Argument Default Purpose
image (required) Image ref, usually returned by Image.build(...).push().
embodiment (required) Robot embodiment used for cell routing.
task None Task used for cell routing. Omit to let any cell of that embodiment run the job.
args None JSON-serializable values exposed as ctx.args.
secrets None Mapping of env var name to armnet secret name.
detach False When False, disconnecting the client requests job cancellation.
stream_logs True Stream container stdout/stderr to your terminal.
use_rerun False Replay the job's ctx.log_rerun_data packets into a local Rerun viewer.
timeout_seconds 120 Max container runtime. Raise this for evals — the default is only enough for a smoke test.
allow_queue True Queue the job when no cell is free instead of failing immediately.

Cell Routing

Jobs are routed to robot cells by (embodiment, task). See Environments and Tasks for the task list and what each environment guarantees about scoring, resets, and availability.

If no matching cell is online the job queues rather than failing, so a manual-environment job can sit for days before an operator picks it up. Check availability first when that matters:

from armnet_client import OrchestratorClient

print(OrchestratorClient().get_cell_status(
    embodiment="lerobot/so-101",
    task="push_green_button",
))

Manual-environment tasks always queue, even when their cell is available. An operator must first stage the physical scene and then press Dispatch in the FMS. Use detach=True for these submissions. Passing allow_queue=False rejects a manual task rather than bypassing the setup requirement. Teleoperation and recording set skip_operator_dispatch so they start immediately instead.

For LeRobot policy evaluation, prefer the higher-level armnet-lerobot-eval command. It wraps Image.build, Image.push, and execute with a LeRobot-like CLI.