Install
openclaw skills install @huaweiclouddev/huawei-cloud-cloudrobo-inferManage CloudRobo inference services — deploy a model into a managed inference service, list/query deployed services and their logs, start/stop a running service, update or delete a service, and orchestrate the 'wait-deploy' convenience flow that polls a service until it finishes deploying. Inference services consume models produced by cloudrobo-train and are consumed by robo-dispatcher when dispatching embodied tasks. Triggers include: infer, inference, model deployment, deploy model, inference service, service deployment, start inference, stop inference, service logs, wait-deploy, model serving, 推理, 推理服务, 模型部署, 部署模型, 推理服务管理, 服务日志, 模型服务.
openclaw skills install @huaweiclouddev/huawei-cloud-cloudrobo-inferWindows / 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-infer skill manages the full lifecycle of CloudRobo inference services
(also called model-serving / inference-service). It lets the agent deploy a model (identified
by model_id + model_version_id passed as a --model-json JSON object) into a long-running
inference service, monitor and operate that service (start / stop / update / delete / logs),
and use wait-deploy to poll until the service status is no longer DEPLOYING
(status != "DEPLOYING"), at which point it returns any other state (e.g., RUNNING, FAILED, STOPPED).
Note:
wait-deployonly waits on theDEPLOYINGphase — it does NOT wait throughCREATING. Read the Wait-Deploy reference for exact semantics.
Applicable scenarios:
DEPLOYING (5s interval, 600s default)list-logs with millisecond time range and keyword filtercloudrobo-train; expose the
service to robo-dispatcher for embodied tasks (via infer_service_id).Architecture:
Agent / LLM
│
├── CLI → cloudrobo infer <command>
└── SDK → InferClient (Python)
│
▼
cloudrobo-service (REST API)
/v1/infer-services/*
All operations target the cloudrobo-service backend and require a valid workspace_id
(default workspace is used unless explicitly provided). Deploying a service consumes compute
(pool) resources — always confirm before starting a long-running service.
references/cli-installation-guide.md for CLI installation, AK/SK authentication, and
workspace configuration.workspace_id (resolve via cloudrobo workspace current or list + use).model_id (=asset_id) + model_version_id (=latest_version_id),
passed to create as a single --model-json argument:
--model-json '{"model_id": "<asset_id>", "model_version_id": "<latest_version_id>"}'.
The model must have ONLINE_DEPLOYMENT action with status: "ENABLE" in its show-asset
output. Models in DRAFT/CREATING status cannot be deployed (403 error).pool_id (prefix resource_id with pool-, i.e. pool-<resource_id>)
pool_type + flavor, resolved via cloudrobo resource list-pools --resource-type MODELARTS. Only pools with
status: "AVAILABLE" are usable.--stop-schedule-json is required in practice for create (though not CLI-required).
Format: {"duration": <N>, "time_unit": "MINUTES"}.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 (status changes, polling progress).
Scenario: "我想创建一个推理服务" / "Deploy model X as an inference service."
Core principle: query each required parameter → present options → let user choose → assemble full command → execute.
Resolve workspace — cloudrobo workspace current.
workspace_id and asset_catalog_id directly.cloudrobo workspace list → present workspace names + IDs to the user →
cloudrobo workspace use --workspace-id <id> → re-run current to confirm.Ask model source & type — ask the user two questions in this order:
ext_metadata.model_type, ask second): perception (感知), vln (导航),
vla (操作), planning (规划).search-assets for a global keyword search.create.Query models — search based on the user's choice:
cloudrobo asset list-publication-assets --type model --actions ONLINE_DEPLOYMENT --action-status ENABLE (returns RELEASE models with
online deployment enabled).cloudrobo asset list-assets --catalog-id <asset_catalog_id> --type model (note: use --catalog-id from workspace, NOT --repository-id).cloudrobo asset search-assets --keyword "<keyword>" --type model.Resolve model version — cloudrobo asset show-asset --asset-id <asset_id>.
latest_version_id to populate the model_version_id field in --model-json.version_count > 1 → cloudrobo asset list-versions --asset-id <id> → let user choose.actions array — ONLINE_DEPLOYMENT must have
status: "ENABLE". If DISABLE, the model cannot be deployed (403 error).status should be RELEASE (plaza) or published state.
DRAFT/CREATING models will be rejected with 403 "Model asset permission deny".Auto-discover deployment parameters — space asset / custom models ONLY.
Embodiment plaza models (具身广场): skip this entire step and DO NOT carry any of the
parameters below (nothing here, and nothing from --cmd/--image-swr-url/--envs-json/
--skill-config-json/--service-invoke-json/--readiness-health-json/--model-ext-metadata/
--model-json.mount_path). Plaza models are pre-configured on the platform — their
orchestration, image, envs, skills, health probes and r2c mapping are already bound to the
model. Passing these extra parameters for a plaza model risks invalid/config-mismatch
deployment and is exactly the "不该带的参数" this workflow forbids.
Space asset / custom models: after resolving the model version, check whether the model has an associated algorithm asset that provides deployment parameters. These are auto-discovered from the model's algorithm asset and config files:
a. Check ONLINE_DEPLOYMENT action — in the show-asset output from Step 4,
look at actions[] for type: "ONLINE_DEPLOYMENT". If present and
status: "ENABLE", it contains algorithm.asset_id + algorithm.version_id
pointing to the associated algorithm asset.
b. Query algorithm asset (if action found) —
cloudrobo asset show-asset --asset-id <algorithm.asset_id> then
cloudrobo asset show-version --asset-id <algorithm.asset_id> --version-id <algorithm.version_id> to get the algorithm's ext_metadata:
ext_metadata.command → --cmdext_metadata.engine.image_url → --image-swr-urlext_metadata.environment_variables (array of {"name":"K","default":"V"})
→ convert to map {"K":"V"} → --envs-jsonext_metadata.deployment_config.model_mount_path → --model-json.mount_pathext_metadata.deployment_config.service_invoke → --service-invoke-jsonext_metadata.deployment_config.readiness_health → --readiness-health-jsonc. Download skill_config.json — via the download-url API (CLI/SDK not
wrapped; use HttpClient directly):
from cloudrobo_core.sdk import Config, HttpClient
from cloudrobo_asset.client import AssetClient
import requests
config = Config()
http = HttpClient(config)
asset_client = AssetClient(http)
resp = http.get(
asset_client._url(f'/v1/assets/{asset_id}/versions/{version_id}/download-url'),
params={'file_name': 'skill_config.json'}
)
skill_config = requests.get(resp['file_url']).text
name + prompt fields (drop priority/
description extra fields) → --skill-config-jsonstrict field: controls whether the deployed service accepts only
predefined skill prompts or also allows user custom prompts:
strict: true — service only accepts the predefined skills (matched
by name); user cannot input custom prompts at runtimestrict: false or omitted — service allows users to input their own
custom prompts at runtime, in addition to the predefined skillsstrict is
false or not present in the skill_config.jsond. Download r2c config — same download-url API, fallback rule:
file_name=r2c_config.yaml firstfile_name=r2c.json--model-ext-metadata does not block
deployment, it will prevent subsequent robo-dispatcher operations
from working (see huawei-cloud-cloudrobo-dispatch skill for details
on robo-dispatcher workflows)--model-ext-metadata--model-ext-metadata (warn that
robo-dispatcher operations will not be available)--model-ext-metadataPriority: config files > ext_metadata fields > ask user. If a parameter cannot be discovered, skip it silently (do not block deployment). For "bare" models with no algorithm association, ask the user whether to manually provide optional parameters.
Resolve pool & flavor — cloudrobo resource list-pools --resource-type MODELARTS.
status: "AVAILABLE" are usable.resource_id → --pool-id (prefix with pool-, e.g.
pool-d1cc6d45-...), pool_type → --pool-type (Choice: DEDICATED / SHARED).config.flavor grouped by hardware type (CPU/GPU/ASCEND)."1 * SNT9B2 | 24 vCPUs | 192 GiB").Confirm parameters & deploy — present the create command to the user, choosing the
variant that matches the model source from Step 2 (see the
Model Source → Parameter Policy table). The two variants
must NOT be mixed.
Variant A — embodiment plaza model (具身广场, required core parameters ONLY):
cloudrobo infer create --name <service-name> --flavor "<flavor>" --model-json '{"model_id": "<asset_id>", "model_version_id": "<latest_version_id>"}' --workspace-id <workspace_id> --pool-id pool-<resource_id> --pool-type <pool_type> --stop-schedule-json '{"duration": 60, "time_unit": "MINUTES"}' [--dry-run]
--cmd/--image-swr-url/--envs-json/--skill-config-json/
--service-invoke-json/--readiness-health-json/--model-ext-metadata/--model-json.mount_path.
Plaza models are pre-configured on the platform; carrying these extra parameters is a
deployment risk and is explicitly forbidden by this workflow.Variant B — space asset / custom model (空间资产/自定义, with auto-discovered params):
cloudrobo infer create --name <service-name> --flavor "<flavor>" --model-json '{"model_id": "<asset_id>", "model_version_id": "<latest_version_id>", "mount_path": "<mount_path>"}' --workspace-id <workspace_id> --pool-id pool-<resource_id> --pool-type <pool_type> --stop-schedule-json '{"duration": 60, "time_unit": "MINUTES"}' [--cmd "<command>"] [--image-swr-url "<image_url>"] [--envs-json '{"KEY":"VALUE"}'] [--skill-config-json '{"skills":[{"name":"...","prompt":"..."}],"strict":true}'] [--service-invoke-json '{"auth_type":"...","port":8080,"protocol":"HTTP"}'] [--readiness-health-json '{"path":"/ready","port":8080}'] [--model-ext-metadata '<r2c_config_file_content>'] [--dry-run]
--model-json.mount_path only included when algorithm's deployment_config provides it.--envs-json must be converted from asset array format to map format.--skill-config-json skill items keep only name+prompt; drop priority/description.--model-ext-metadata takes the raw file content (string).--dry-run first to validate parameter assembly.--stop-schedule-json is required in practice (though not CLI-required); without it
the backend may reject the creation. Format: {"duration": <N>, "time_unit": "MINUTES"}.--dry-run.service_id.Wait for deployment — cloudrobo infer wait-deploy --service-id <sid> to poll every
5s until status is no longer DEPLOYING (status != "DEPLOYING"), returning whatever state
follows (e.g., RUNNING, FAILED).
create, the service auto-enters CREATING → DEPLOYING. Do NOT call start
immediately after create — it will return 400 "Status DEPLOYING does not support start".start is only for restarting a STOPPED service, not for initial deployment.wait-deploy returns the moment status != "DEPLOYING". It does NOT
wait through the CREATING phase — if you call it while the service is still CREATING, it
returns immediately with the CREATING status. In practice, call it after create and let
the backend transition CREATING → DEPLOYING → RUNNING; the helper blocks on DEPLOYING.Report — output service_id, model name, flavor, and final status.
FAILED → run cloudrobo infer list-logs for diagnosis.delete
command and ask the user for explicit confirmation before executing it.Asset note: model_id/version_id/flavor/pool_id must be resolved dynamically via the query commands above; never hardcode them. Always let the user choose from queried options.
This table is the single source of truth for which create parameters to carry, based on
the model source resolved in Step 2. It is referenced by cloudrobo-model-workflow Stage 3 to
keep both skills consistent. When creating any inference service, resolve the model source first
and then apply exactly the matching column — do not mix variants.
| Model source (from Step 2) | Search command (Step 3) | Auto-discovery (Step 5) | create parameters to carry |
|---|---|---|---|
| Embodiment plaza (具身广场) | asset list-publication-assets --type model --actions ONLINE_DEPLOYMENT --action-status ENABLE | SKIP entirely — model is pre-configured on platform | Required core only: --name, --flavor, --model-json (model_id+model_version_id), --workspace-id, --pool-id, --pool-type, --stop-schedule-json. Do NOT carry --cmd/--image-swr-url/--envs-json/--skill-config-json/--service-invoke-json/--readiness-health-json/--model-ext-metadata/--model-json.mount_path |
| Space asset / custom (空间资产/自定义) | asset list-assets --catalog-id <asset_catalog_id> --type model / search-assets --keyword ... | Run Step 5 fully — query algorithm asset (cmd/image/envs/mount_path/service-invoke/readiness-health) + download skill_config.json + r2c config | Required core plus every parameter actually discovered in Step 5; omit undiscovered ones silently |
| Unknown model id (user passed explicit id) | asset show-asset --asset-id <id> | Determine from show-asset: if the model carries an ONLINE_DEPLOYMENT action pointing to a platform algorithm → treat as space-asset path (run Step 5). If the model's deployment config is self-contained/pre-configured → carry required core only | As per the resolved path |
Rationale: Embodiment plaza models bundle their orchestration, image, envs, health probes, skills and r2c feature mapping on the platform. Re-supplying these in
createfor a plaza model is redundant and risks invalid/mismatched deployment (this is the "不该带的参数不要带" rule). Space asset / custom models have no such bundled config, so their parameters must be auto-discovered and passed explicitly.
Scenario: "Wait for this inference service to finish deploying."
cloudrobo infer wait-deploy --service-id <sid> [--timeout 600]
wait-deploy is a CLI client-side polling helper: it polls show every 5s until the
service status is no longer DEPLOYING (status != "DEPLOYING") and returns any other state
(e.g., RUNNING, FAILED, STOPPED).--timeout range 1–3600); if exceeded, the client raises
RuntimeError and the CLI reports a timeout error (JSON error + ClickException, non-zero exit).FAILED suggest list-logs for diagnosis.Note:
wait-deploydoes NOT create the service. Callcreatefirst, thenwait-deploy. Do NOT callstartaftercreate— the service auto-deploys (CREATING → DEPLOYING → RUNNING).startis only for restarting aSTOPPEDservice.
Scenario: "What inference services are running in my workspace?"
cloudrobo infer list --workspace-id <ws> [--status <status>] [--model-id <mid>] [--name <name>] [--model-name <mn>] [--model-version-id <mvid>] [--model-version-name <mvn>] [--user-name <un>] [--user-id <uid>] with pagination (--limit/--offset)
and sorting (--sort-key/--sort-dir).cloudrobo infer show --service-id <sid> for a full config snapshot.Scenario: "Stop the inference service behind this API." / "Bring it back up."
show --service-id <sid>.cloudrobo infer stop --service-id <sid> or cloudrobo infer start --service-id <sid>
(mutating; confirm before executing).show until the desired terminal state (STOPPED / RUNNING).Scenario: "Why is my deployed service failing? Show me its logs."
cloudrobo infer list-logs --service-id <sid> --start-time <ms> --end-time <ms> — both
timestamps are milliseconds (13-digit). Optionally filter --keywords, --limit,
--line-num, --is-count, --highlight, --is-desc.show status (e.g. CREATE_FAILED/START_FAILED).Scenario: "Reconfigure this service" / "Shut down and remove this service."
cloudrobo infer update --service-id <sid> [--description <desc>] [--model-ext-metadata <json>] [--dry-run] (mutating; confirm).cloudrobo infer delete --service-id <sid> [--dry-run] (mutating; irreversible; confirm).Scenario: "I trained a VLA model; deploy it as an inference service."
cloudrobo workspace current (or list + use).cloudrobo asset list-assets --catalog-id <asset_catalog_id> --type model (or use the train skill's output_models); obtain asset_id.cloudrobo asset show-asset --asset-id <asset_id> → use
latest_version_id in the model_version_id field of --model-json. Verify
ONLINE_DEPLOYMENT action status: "ENABLE".cloudrobo resource list-pools --resource-type MODELARTS → let user select resource_id
and flavor.
4a. A trained model is a space asset → follow Variant B / space-asset path of the
Model Deployment Workflow. (If the trained model has algorithm association) Auto-discover
deployment parameters per Step 5 — query algorithm asset for
cmd/image/envs/service-invoke/readiness-health, download skill_config.json and r2c config.
Carrying these is the correct behavior for a space asset; the "do not carry" rule only
applies to embodiment plaza models.cloudrobo infer create --name <name> --flavor "<flavor>" --model-json '{"model_id": "<asset_id>", "model_version_id": "<latest_version_id>"}' --workspace-id <ws> --pool-id pool-<resource_id> --pool-type <type> --stop-schedule-json '{"duration": 60, "time_unit": "MINUTES"}'
— add any parameters actually discovered in step 4a (per Step 7 Variant B).cloudrobo infer wait-deploy --service-id <sid> — polls every 5s until status is no longer
DEPLOYING (service auto-deploys after create; do NOT call start — it will fail with 400)service_id and status. The service is now consumable.Parameter auto-discovery: For space asset / custom models, deployment parameters (cmd, image, envs, skill-config, health-checks, model-ext-metadata, etc.) are auto-discovered from the model's associated algorithm asset and config files per Step 5 above. See
references/service-config-catalog.md→ "Parameter Auto-Discovery Sources" for the full discovery table, download-url API code, and key rules.
cloudrobo infer <command> [OPTIONS]
| Subcommand | Description | Key options |
|---|---|---|
create | Deploy a new inference service | --name, --flavor, --model-json, --workspace-id, --pool-id, --pool-type, --stop-schedule-json |
wait-deploy | Poll until deployment completes | --service-id, --timeout |
list | List inference services | --workspace-id, --status, --limit, --offset |
show | Show service detail | --service-id |
start / stop | Start or stop a service | --service-id |
update | Update service config | --service-id, --description, --model-ext-metadata |
delete | Delete a service | --service-id |
list-logs | Query service logs | --service-id, --start-time (ms), --end-time (ms), --keywords |
Full CLI/SDK examples, parameter resolution table, and edge cases: see
references/service-config-catalog.md→ "Command Examples", "Parameter Resolution & Confirmation", and "Edge Cases". SDK exposes 9 methods, CLI exposes 9 commands (0 gaps);wait-deployis a client-side polling helper available in both CLI and SDK. When CLI is inconvenient (dynamic JSON, cross-package queries), use the Python SDK directly —InferClientexposes the 9 methods.
See
references/service-config-catalog.md→ "Edge Cases" for the full scenario-handling table (missing model_id, invalid JSON, wrong timestamp unit, 403 permission deny, 500 internal error, missing stop-schedule, r2c config fallback, envs format mismatch, cross-skill invocation, etc.).
bash scripts/test-cli-commands.sh
bash scripts/test-cli-commands.sh
See templates/test-vars.json for the full test case list covering deployment, wait-deploy,
service lifecycle, logs, and safety scenarios.
create, service appears in list with correct statuswait-deploy, service status is no longer DEPLOYING (status != "DEPLOYING"; reports timeout/failure with log guidance)start/stop, show reflects the new statusdelete, show returns not-foundlist-logs with ms timestamps returns log lines; keyword filter works../ blocked by validate_safe_idcreate parameter via query commands, then let the user choose — never hardcode--cmd/--image-swr-url/--envs-json/
--skill-config-json/--service-invoke-json/--readiness-health-json/--model-ext-metadata/
--model-json.mount_path); space asset / custom models run Step 5 auto-discovery and carry
whatever is actually discoveredlist-publication-assets --actions ONLINE_DEPLOYMENT --action-status ENABLE
for deployable plaza models; use list-assets --catalog-id <id> for workspace models;
use search-assets --keyword "<kw>" for fuzzy/keyword search--model-json's model_version_id must be latest_version_id from show-asset, NOT actions[].algorithm.version_id--stop-schedule-json '{"duration": N, "time_unit": "MINUTES"}' in createwait-deploy after create to poll until deployment completes (5s interval, 600s default). Do NOT call start after create — the service auto-deployswait-deploy returns when status != "DEPLOYING"; it only blocks on the DEPLOYING phase (not CREATING), so call it after create and let the backend transition CREATING → DEPLOYING → RUNNING — if it returns while still CREATING, immediately re-invoke wait-deploy--dry-run on create to validate parameter assembly before actual submissionlist-logs with --keywords to rapidly isolate errors; remember ms timestampsinternet_access_enable OFF unless the user explicitly needs outbound accesscloudrobo workspace current) and asset skills to resolve workspace/model context; combine with dispatch to execute embodied tasks