Install
openclaw skills install @huaweiclouddev/huawei-cloud-cloudrobo-robotManage CloudRobo robot instances — register robots, query robot lists and details, update robot metadata, delete offline robots, export robot certificates for secure access, and fetch the latest robot-side SDK package information. Robots are the physical carriers of embodied intelligence tasks and serve as execution targets for the robo-dispatcher (dispatch) and embodied services. Triggers include: robot registration, robot management, robot type, robot certificate, export certificate, robot SDK, latest SDK, robot_model, manufacturer, 机器人注册, 机器人管理, 机器人类型, 机器人证书, 导出证书, 机器人SDK, 机器人型号, 制造商.
openclaw skills install @huaweiclouddev/huawei-cloud-cloudrobo-robotWindows / PowerShell: Examples use bash syntax. To run on Windows PowerShell:
- Flatten
\line continuations to a single line, or end lines with a backtick.- Set env vars with
$env:NAME="value"instead ofexport NAME="value".- Single-quoted JSON
'{"a":"b"}'works as-is.
The cloudrobo-robot skill manages the full lifecycle of CloudRobo robot instances. A
robot is the physical carrier that executes embodied intelligence tasks, covering six
types: HUMANOID (人形), QUADRUPED (四足), ARM (机械臂), OPERATION (作业), WHEELED (轮式), and
OTHER (其他). This skill covers robot registration, list/detail query, metadata update,
offline-device deletion, certificate export (for robot-side secure access to the platform),
and latest robot-side SDK package retrieval (for software upgrade).
Applicable scenarios:
list → show to check status and attributesexport-certificate → write the zip bundle to a file and store it securely for robot-side onboardingshow-sdk to fetch the latest robot-side SDK package (file_name/version/signed_url)robo-dispatcher
(dispatch tasks need a robot_id) and by robots that run embodied services deployed via
cloudrobo-infer.Architecture:
Agent / LLM
│
├── CLI → cloudrobo robot <command>
└── SDK → RobotClient (Python)
│
▼
cloudrobo-service (REST API)
/v1/robots/*
All operations target the cloudrobo-service backend and require a valid workspace_id
(default workspace is used unless explicitly provided). Robot metadata management is a pure
asset-level operation (no compute billing); certificate export returns binary content protected
by a user-provided password.
references/cli-installation-guide.md for CLI installation, AK/SK authentication, and
workspace configuration.workspace_id (default workspace or explicit --workspace-id) is required for robot
create / list / update operations.r2c_sdk; use export-certificate to produce the robot's
接入配置 (access-config zip / credential bundle) used in robot-side onboarding. The 本体配置
(body config) is already built into r2c_sdk or distributed with the robot adapter, and is not
what export-certificate downloads.Every workflow below starts from a user intent (1-2 sentences), not from manual CLI/SDK orchestration. The skill then drives the matching command chain and reports state feedback.
Scenario: the user wants to register and onboard a new robot.
cloudrobo workspace current or ask user for
workspace_id. Robot create/list require a workspace context (workspace is a foundational
resource container).cloudrobo robot create --name <name> --type <TYPE> --manufacturer <mfg> --robot-model <model> --workspace-id <ws>. Confirm the config before
submitting. Output the returned robot_id.cloudrobo robot list --name <name> or cloudrobo robot show --robot-id <id> to
confirm registration and current status.Asset note: robot_model/manufacturer uniquely identify a robot model. Do not hardcode them; obtain from the user or prior queries.
Scenario: "Is my inspection robot online?" / "List all robots in this workspace."
cloudrobo robot list [--workspace-id <ws>] [--status <status>] [--type <TYPE>]
to get an overview with pagination (--limit/--offset) and sorting (--sort).--name, --manufacturer, --robot-model, --type,
--status, --user-id, --user-name.cloudrobo robot show --robot-id <id> for a full config snapshot (hardware
model, current status). The client passes through backend status (REGISTERED/OFFLINE/ONLINE...);
no local state machine is maintained.Scenario: "Rename robot X" / "Update its description."
cloudrobo robot show --robot-id <id> to verify it exists and get current metadata.cloudrobo robot update --robot-id <id> [--name <name>] [--description <desc>] [--workspace-id <ws>]. Confirm before executing (mutating operation).cloudrobo robot show --robot-id <id> to confirm the field changed."导出配置文件" = 导出接入配置(证书). A robot has two configurations:
- 本体配置(robot body/main config) — built into
r2c_sdk, or distributed together with the robot adapter alongside other robots. It is not what "download/export config" refers to.- 接入配置(access config) — the robot's access credential bundle used to connect to the platform. This is the one you download/export, and it is produced by
export-certificate.The downloaded access config is a zip package — treat it as a sensitive credential bundle and store it securely (avoid commits to source control, shared drives, or unencrypted locations).
Scenario: "Export this robot's access certificate / 导出机器人的接入配置文件 for secure onboarding."
cloudrobo robot show --robot-id <id> to confirm the robot
exists and check its current status. Export is a one-off job; the robot must not have a
running job to export. Robot state is dynamic: a robot that was INACTIVE/idle earlier may now
be OFFLINE/ONLINE or have a running job, so always re-confirm with show right before exporting.cloudrobo robot export-certificate --robot-id <id> [--password <pwd>] --output <directory>.
The backend returns the access-config zip binary; the CLI auto-generates the filename as
cert_config_{robot_name}_{timestamp}.zip (queries show_robot for the name, uses
datetime.now().strftime("%Y%m%d%H%M%S") for the timestamp) and writes it to the --output
directory in binary (wb) mode. --password is optional; --output is required and
must be an existing directory.
CloudRobo.04010007 "The robot can only have one running job." (HTTP 400;
error code sourced from backend behavior, not in the local SDK — backend-verified, pending live
confirmation):
the robot currently has a running job (dispatch/debug task) or otherwise cannot start a new
export job. Because state is dynamic, a robot that exported fine before (e.g. was INACTIVE)
may now be OFFLINE/ONLINE with a running job and fail this time — re-check show and pick a
robot with no running job (e.g. an INACTIVE/idle robot), or wait until the current job
finishes, then retry. Do not treat a failed export as "certificate not available" and
continue with an empty/partial file — verify the output file is a non-empty zip before using
it.r2c_sdk / the R2C client)
together with the body config already carried inside the SDK or adapter.r2c_sdk.cloudroboclient).Scenario: "What is the latest robot-side SDK version?"
cloudrobo robot show-sdk (no parameters).file_name, version, signed_url for the robot to pull the upgrade package.Scenario: "Register a robot, deploy a perception model as an inference service, and run tasks on the robot using it."
robot_id.robot show --robot-id <id>).cloudrobo-infer (infer deploy-and-wait);
record the service_id / exec_model_id.robot_id and model to robo-dispatcher: cloudrobo dispatch create-task --session-id <sid> --name <name> --task "<task>" --constraints-json '{"model":{"exec_model_id":"<exec_model_id>"},"robot_id":"<robot_id>","exec_constraints":{"max_run_time":10,"max_iter_num":100}}'.
This skill does not call cloudrobo-infer/dispatch by name; the agent orchestrates across skills by first obtaining the robot_id here, then using the infer and dispatch skills.
Scenario: "Remove this decommissioned robot."
cloudrobo robot show --robot-id <id> to verify it can be safely deleted
(deletion is irreversible; the backend validates running status and business dependencies).cloudrobo robot delete --robot-id <id>. Confirm before executing.cloudrobo robot show --robot-id <id> → expect ResourceNotFoundError/not found.cloudrobo robot <command> [OPTIONS]
| Feature | Description | Example |
|---|---|---|
| Command group | robot (registered via entry point) | cloudrobo robot |
| Subcommand | kebab-case | create, export-certificate, show-sdk |
| Workspace | --workspace-id <id> (create/list/update) | --workspace-id abc-123 |
| Output format | JSON to stdout | out(result) |
| JSON parameter | Passed as individual flags (e.g. --name, --type, --manufacturer, --robot-model) | create --name r1 --type HUMANOID --manufacturer M --robot-model X |
| Dry-run | --dry-run (on create/update/delete/export-certificate) | Preview without executing |
| Binary output | --output <directory> (export-certificate) | auto-generates cert_config_{name}_{timestamp}.zip in directory |
Full coverage: The SDK exposes 7 methods, CLI exposes 7 commands (0 gaps). See
references/robot-config-catalog.mdfor the full coverage matrix.
SDK Direct Calls: When CLI is inconvenient (dynamic JSON, cross-package queries), use the Python SDK directly.
RobotClientexposes the 7 methods below.
cloudrobo robot create --name <robot-name> --type HUMANOID --manufacturer "Manufacturer A" --robot-model "Model X" --workspace-id <workspace-id> [--description "inspection robot"] [--dry-run]
# SDK
from cloudrobo_core.sdk import Config, HttpClient
from cloudrobo_robot import RobotClient
config = Config()
http_client = HttpClient(config)
client = RobotClient(http_client)
robot = client.create_robot({
"name": "inspection-robot-001",
"type": "HUMANOID",
"manufacturer": "Manufacturer A",
"robot_model": "Model X",
"workspace_id": config.workspace_id,
"description": "inspection robot for factory floor"
})
print(robot) # includes robot_id
cloudrobo robot list [--limit 10] [--offset 0] [--status <status>] [--type <TYPE>] [--workspace-id <ws>]
robots = client.list_robots(name="inspection-robot-001")
for r in robots.get("items", []):
print(r["name"], r["type"], r["status"])
cloudrobo robot show --robot-id <robot-id>
robot = client.show_robot("<robot-id>")
print(robot["name"], robot["type"], robot["manufacturer"], robot["status"])
cloudrobo robot update --robot-id <robot-id> --description "new description" [--dry-run]
client.update_robot("<robot-id>", {"description": "new description"})
cloudrobo robot delete --robot-id <robot-id> [--dry-run]
client.delete_robot("<robot-id>")
cloudrobo robot export-certificate --robot-id <robot-id> [--password <password>] --output <directory> [--dry-run]
# Output: <directory>/cert_config_{robot_name}_{timestamp}.zip
# Returns the access-config zip binary content
cert = client.export_robot_certificate("<robot-id>", {"password": "<password>"})
# CLI auto-generates filename and writes binary to --output directory in wb mode
This command exports the robot's 接入配置 (access config / certificate) — the credential bundle a robot uses to connect to the platform. It is a zip package: the CLI auto-generates the filename as
cert_config_{robot_name}_{timestamp}.zipand writes it to the--outputdirectory. Store the zip securely.--password(encrypts the bundle) is optional;--output(export directory, must exist) is required; see the Certificate / Access-Config Export Workflow.
cloudrobo robot show-sdk
sdk = client.show_sdk()
print(sdk["file_name"], sdk["version"], sdk["signed_url"])
| Parameter | Source | Required | Confirmation Needed |
|---|---|---|---|
--name | User | Yes (create) | Verify uniqueness/descriptiveness before create |
--type | User | Yes (create) | Uppercase enum: HUMANOID/QUADRUPED/ARM/OPERATION/WHEELED/OTHER |
--manufacturer / --robot-model | User | Yes (create) | Uniquely identify the robot model |
--workspace-id | User or default workspace | Yes (create/list/update) | — |
--robot-id | User or prior command output | Yes (show/update/delete/export) | Verify before update/delete |
--password | User | No (export-certificate, default None) | Optional; encrypts the access-config zip; masked, not echoed |
--output | User | Yes (export-certificate) | Required; directory to write the auto-generated cert_config_{name}_{timestamp}.zip |
--status/--type filters | User | No (list) | — |
--dry-run | — | No | Preview without submitting |
Mutating operations (create/update/delete/export-certificate) must prompt the user for confirmation before execution.
| Scenario | Handling |
|---|---|
Missing workspace_id | create/list/update may fall back to default workspace; if none, error with suggestion |
Invalid robot_type | create rejects values outside HUMANOID/QUADRUPED/ARM/OPERATION/WHEELED/OTHER |
| Robot not found | show/update/delete return ResourceNotFoundError; verify robot_id |
| Path traversal | validate_safe_id(robot_id) blocks ../ input |
| Certificate export failure | Check password correctness and robot has a valid certificate; if CloudRobo.04010007 "The robot can only have one running job" (backend-verified, pending live confirmation), the robot has a running job — retry on an INACTIVE/idle robot with no running job, or wait for the current job to finish |
| Certificate output corruption | CLI writes binary with wb mode; never write text-encoded |
| Access-config (zip) storage | The exported access config is a zip credential bundle; store it securely and never commit/shared publicly |
| SDK retrieval failure | Check backend SDK package published; retry show-sdk |
| Workspace cross-tenant | API carries workspace_id; backend validates ownership |
| Deleting a running robot | Backend validates status and business dependencies; may reject |
| Deletion irreversible | Always confirm robot_id before delete |
| AK/SK not set | Operations fail at HTTP signing step; set HUAWEI_CLOUD_AK/HUAWEI_CLOUD_SK |
| robot_id / model values | Never hardcoded; obtained from user or list/show results |
| API paths | Sourced from OpenAPI YAML (robo-operations.yaml) and feature design, not inferred |
| Cross-skill invocation | This skill does not call other skills by name; it only produces a robot_id that dispatch/infer may consume |
| Mutating operations | create/update/delete/export-certificate should be confirmed by the user |
bash scripts/test-cli-commands.sh
bash scripts/test-cli-commands.sh
See templates/test-vars.json for the full test case list covering registration, lookup,
update, delete, certificate export, SDK query, and safety scenarios.
create, verify via list --name / show --robot-id that the robot appears with correct type/statusupdate, show reflects the changed name/descriptiondelete, show returns not-foundexport-certificate, the output directory contains the auto-generated cert_config_{name}_{timestamp}.zip with the access-config binaryshow-sdk returns file_name/version/signed_url../) is blocked by validate_safe_idrobot_id and the full config before create/update/delete/export-certificate--dry-run to validate create/update/export params before actual submissionvalidate_safe_id-backed CLI to prevent path traversal; never embed raw user input into pathspassword and sensitive values in all runbooks and logs--output <directory> (must exist); the CLI auto-generates the filename cert_config_{robot_name}_{timestamp}.zip and writes the zip in binary (wb) mode — store the zip securelyexport-certificate —
the body config is built into r2c_sdk / distributed with adapters and is not exported hererobot_id after registration for later dispatch/infer referencecloudrobo robot list for a workspace-wide overview; paginate with --limit/--offsetcloudrobo workspace current) and asset skills to resolve workspace/model context before creating robots or wiring them into dispatch