Use this skill when the user asks to view or operate Volcano Cloud Phone resources under a configured test business.
Runtime Constraints
- Do not statically configure a DC. The DC should be selected based on the user's request or current resource availability.
- First use
list-productsto look up the business ID, then explicitly pass it in each command asproduct_id。 - When creating and ordering resources, you must explicitly select the business resource type: for cloud disk storage use
100, for local storage use200。 - When updating instance images or specifications, prefer to power off first; when a forced update is involved, remind the user to confirm the possible impact.
- Post-paid instance resource groups only support repurchase. Before ordering a post-paid resource, first confirm that the business has already placed an order in the Volcano Cloud Phone console and that it can be found
OrderId。 - For screenshots, prefer the direct connection method
get-presigned-edge-url --api-type TakeScreenshot。 batch-screen-shotas a fallback; use it only when the business has configured screenshot storage and the user explicitly needs that path.- Unless the user explicitly requests it, do not output signed URLs.
- When querying installed applications, prefer
get-pod-app-list; fall back to Android only when truly necessarypm list packages。 - Unless the user explicitly requests it, do not output access keys, secret keys, Authorization headers, or full signed URLs.
- Creating, deleting, powering on/off, restarting, resetting, installing/uninstalling, file transfer, starting/stopping applications, and Android command execution are all stateful change operations. Unless the user explicitly requests the operation, confirm first.
Command Entry Point
The following examples are executed by default in the current skill package directory:
python3 scripts/vephone_cli.py <command> [args]
This skill already includes built-in scripts/vephone_cli.py and scripts/core/, and can be run directly without depending on the implementation in the repository root directory.
Commands expose common parameters in the form of explicit flags. Except for list-products and a few other query commands, most business commands take product_id as the first positional parameter; to see which filter conditions a command supports, directly use python3 scripts/vephone_cli.py <command> -h. If the authentication configuration is not in the default location, you can use --config /path/to/config.json to specify the configuration file path; this global parameter can be placed before or after the subcommand.
If the existing commands do not yet cover the target OpenAPI Action, you can use the generic command:
python3 scripts/vephone_cli.py action-call ListOperableProduct --json-body --param Count=10 --param CloudphoneProductType=5
python3 scripts/vephone_cli.py action-call GetProductResource --product-id <product_id>
python3 scripts/vephone_cli.py action-call SetProxy --json-body --params-json '{"ProductId":"<product_id>","PodIdList":["pod-1"],"ProxyStatus":1,"ProxyConfig":{"version":"v2","type":"socks5","address":"203.0.113.52","port":"12345"}}'
action-call 's --param uses the Key=Value form,Value will first parse as JSON, and handle it as a string on failure, so you can directly pass true、123、[1,2]、{"k":"v"}. Note that in common shells, if Key=Value is not quoted/escaped, double quotes of the form --param Foo={"k":"v"} may be swallowed by the shell, causing the program to actually receive Foo={k:v} and trigger a JSON parsing failure; when Value contains double quotes, spaces, or complex JSON, please wrap the entire Key=Valuein single quotes (such as --param 'Foo={"k":"v"}' / --param 'PodIdList=["pod-1"]'), or prefer to use --params-json(such as --params-json '{"Foo":{"k":"v"}}'). If you want to force passing true/123 as a string, please use the JSON string form:--param Name='"123"'. To pass parameters in batches, use --params-json; if keys with the same name are passed at the same time,--param will override --params-json. By default it is called via query string, with --json-body it switches to a JSON body.
Instance Management
Read-only operations:
python3 scripts/vephone_cli.py list-products --count 10
python3 scripts/vephone_cli.py list-pods <product_id> --max-results 10
python3 scripts/vephone_cli.py list-pods <product_id> --configuration-code-list <code1,code2> --dc-list <dc1,dc2> --online-list 1,2 --next-token <token>
python3 scripts/vephone_cli.py detail-pod <product_id> <pod_id>
python3 scripts/vephone_cli.py get-pod-metric <product_id> <pod_id>
python3 scripts/vephone_cli.py get-pod-property <product_id> <pod_id>
State-changing operations:
python3 scripts/vephone_cli.py create-pod <product_id> --name <name> --template-id <template_id> --configuration-code <code> --dc-id <dc> --resource-type 200 --image-id <image_id> --display-layout-id <layout_id> --phone-template-id <template_id>
python3 scripts/vephone_cli.py update-pod <product_id> <pod_id> --image-id <image_id> --display-layout-id <layout_id> --configuration-code <code>
python3 scripts/vephone_cli.py update-pod <product_id> <pod_id> --image-id <image_id> --force
python3 scripts/vephone_cli.py delete-pod <product_id> <pod_id>
python3 scripts/vephone_cli.py power-on-pod <product_id> <pod_id>
python3 scripts/vephone_cli.py power-off-pod <product_id> <pod_id>
python3 scripts/vephone_cli.py reboot-pod <product_id> <pod_id>
python3 scripts/vephone_cli.py reset-pod <product_id> <pod_id>
python3 scripts/vephone_cli.py create-pod-one-step <product_id> --configuration-code <code> --dc <dc> --app-list <app_id:version_id,...>
python3 scripts/vephone_cli.py update-pod-property <product_id> --pod-id <pod_id> --pod-settings '[{"SettingsName":"locale_language","SettingsType":"global","SettingsValue":"zh-CN","SettingsValueType":"string"}]'
python3 scripts/vephone_cli.py update-pod-resource-apply-num <product_id> --resource-set-id <resource_set_id> --apply-num <num>
python3 scripts/vephone_cli.py backup-pod <product_id> --pod-id-list <pod_id1,pod_id2>
python3 scripts/vephone_cli.py restore-pod <product_id> --pod-id-list <pod_id1,pod_id2>
python3 scripts/vephone_cli.py pod-mute <product_id> --pod-id <pod_id> --mute true --display-list <display1,display2>
python3 scripts/vephone_cli.py pod-adb <product_id> --pod-id <pod_id> --enable true
python3 scripts/vephone_cli.py pod-stop <product_id> --pod-id <pod_id>
python3 scripts/vephone_cli.py pod-data-delete <product_id> --pod-id <pod_id> --file-path-list </sdcard,/data/data> --package-list <pkg1,pkg2>
python3 scripts/vephone_cli.py set-proxy <product_id> --pod-id-list <pod_id1,pod_id2> --proxy-status 1 --proxy-config '{"version":"v2","type":"socks5","address":"203.0.113.52","port":"12345"}'
python3 scripts/vephone_cli.py get-proxy <product_id> --pod-id-list <pod_id1,pod_id2>
python3 scripts/vephone_cli.py backup-data <product_id> --pod-id-list <pod_id1,pod_id2> --backup-all false --include-path-list </data/app,/data/data> --exclude-path-list </data/anr>
python3 scripts/vephone_cli.py restore-data <product_id> --backup-data-id <backup_data_id> --pod-id-list <pod_id1,pod_id2>
python3 scripts/vephone_cli.py list-backup-data <product_id> --status completed --max-results 20
python3 scripts/vephone_cli.py delete-backup-data <product_id> --backup-data-id-list <backup_data_id1,backup_data_id2>
list-pods Supports pagination via --max-results and --next-token .create-pod You can use --image-id to specify the initial image.delete-pod、reset-pod、update-pod --force Operations like this have a significant impact; confirm before executing. For structured parameters like --app-list、--pod-settings、--specify-host-list、--proxy-config , directly check the corresponding command's -h for format instructions.
Resource, DC, Host and Image Queries
python3 scripts/vephone_cli.py list-dcs <product_id>
python3 scripts/vephone_cli.py get-dc-bandwidth-daily-peak <product_id> <dc_id_list>
python3 scripts/vephone_cli.py list-pod-resources <product_id>
python3 scripts/vephone_cli.py get-product-resource <product_id>
python3 scripts/vephone_cli.py list-products --count 10
python3 scripts/vephone_cli.py list-configurations <product_id>
python3 scripts/vephone_cli.py list-instance-configuration-specs <product_id>
python3 scripts/vephone_cli.py list-phone-templates <product_id>
python3 scripts/vephone_cli.py get-phone-template <product_id> <phone_template_id>
python3 scripts/vephone_cli.py list-hosts <product_id>
python3 scripts/vephone_cli.py detail-host <product_id> <host_id>
python3 scripts/vephone_cli.py update-host <product_id> <host_id1,host_id2> --configuration-code <pod_config_code>
python3 scripts/vephone_cli.py reboot-host <product_id> <host_id1,host_id2> --force
python3 scripts/vephone_cli.py reset-host <product_id> <host_id1,host_id2> --force
python3 scripts/vephone_cli.py list-image-resources <product_id>
python3 scripts/vephone_cli.py list-aosp-images <product_id> --is-public --max-results 20
python3 scripts/vephone_cli.py list-aosp-images <product_id> --max-results 20
python3 scripts/vephone_cli.py get-image-preheating <product_id> <image_id>
list-image-resources is used to view the image resources currently in use by the business.list-aosp-images --is-public queries public images; omitting --is-public queries custom images.
Before creating an instance, first look at list-pod-resources, choose a (ConfigurationCode, Dc) combination with available capacity, and include the matching --resource-type。
Resource ordering operations are state-changing and may incur costs. Postpaid instance resource groups only apply to businesses with an existing order history; confirm before executing.
When ordering local storage hosts, explicitly pass the target pod specification, host type, data center, quantity and resource type:
python3 scripts/vephone_cli.py subscribe-resource-auto \
<product_id> \
--configuration-code <pod_config_code> \
--server-type-code <host_server_type_code> \
--dc <dc> \
--apply-num <num> \
--resource-type 200 \
--charge-type host_post_daily \
--region <region> \
--volc-region inner
Example of the Wenzhou 03-ppe dual-open specification:
python3 scripts/vephone_cli.py subscribe-resource-auto \
<product_id> \
--configuration-code g3.pod8c24g.type2 \
--server-type-code g3.host8c24g256g \
--dc zjwz-ctcucm-03-47frx0k0 \
--apply-num 3 \
--resource-type 200 \
--charge-type host_post_daily \
--region cn-east \
--volc-region inner
Before repurchasing, first confirm via existing orders or resource records that the postpaid resource group has an order history. After ordering or unsubscribing, use list-pod-resources and list-hosts to verify the result.
Renewal and Unsubscription:
python3 scripts/vephone_cli.py renew-resource-auto <product_id> --resource-set-id <resource_set_id> --term <n> --period <period> --round-id <round_id>
python3 scripts/vephone_cli.py unsubscribe-host-resource <product_id> <host_id1,host_id2> --force
After executing unsubscription, continue using the resource list and host list to confirm changes in the host/resource count.
Cloud disk storage businesses use ResourceType=100, local storage businesses use ResourceType=200。
Application Management
Read-only operations:
python3 scripts/vephone_cli.py get-pod-app-list <product_id> <pod_id>
python3 scripts/vephone_cli.py list-apps <product_id>
python3 scripts/vephone_cli.py detail-app <product_id> <app_id>
python3 scripts/vephone_cli.py list-app-version-deploys <product_id> <app_id>
python3 scripts/vephone_cli.py get-app-crash-log <product_id> <pod_id1,pod_id2> --start-time <unix_seconds> --end-time <unix_seconds>
State-changing operations:
python3 scripts/vephone_cli.py install-app <product_id> <pod_id> <app_id> <version_id>
python3 scripts/vephone_cli.py launch-app <product_id> <pod_id> <package_name>
python3 scripts/vephone_cli.py close-app <product_id> <pod_id> <package_name>
python3 scripts/vephone_cli.py uninstall-app <product_id> <pod_id> <app_id>
python3 scripts/vephone_cli.py auto-install-app <product_id> --pod-id-list <pod_id1,pod_id2> --download-url <url>
auto-install-app can be installed either via a download URL or combined with an image path for batch installation. For specific parameter combinations, directly check python3 scripts/vephone_cli.py auto-install-app -h。
Screenshots, Files and Command Operations
Screenshots:
python3 scripts/vephone_cli.py get-presigned-edge-url <product_id> <pod_id> \
--api-type TakeScreenshot \
--payload RoundId=<unique_round_id> \
--payload MimeType=png \
--timeout 5 \
--ttl 60
python3 scripts/vephone_cli.py batch-screen-shot <product_id> <pod_id>
For regular screenshots, prefer using get-presigned-edge-url --api-type TakeScreenshot。product_id and pod_id are both positional parameters; if the user just wants to see the screenshot result, prefer the direct screenshot path.batch-screen-shot is retained as a fallback, suitable for scenarios where the business has already configured screenshot storage and explicitly wants to use that capability.
Direct edge URL:
python3 scripts/vephone_cli.py get-presigned-edge-url <product_id> <pod_id> \
--api-type TakeScreenshot \
--payload RoundId=<unique_round_id> \
--payload MimeType=png \
--timeout 5 \
--ttl 60
get-presigned-edge-url is the preferred path for screenshots and direct access, where regular screenshots prefer using --api-type TakeScreenshot. Signed URLs are sensitive information; do not output them directly unless the user explicitly requests it. There are many combinations of --api-type、--api-path and --payload across different scenarios; directly check python3 scripts/vephone_cli.py get-presigned-edge-url -h。
If the user explicitly requests to access the sandbox, you can use the following command:
python3 scripts/vephone_cli.py get-presigned-edge-url <product_id> <pod_id> --api-type Sandbox --api-path /sandbox/ws
python3 scripts/vephone_cli.py get-presigned-edge-url <product_id> <pod_id> --api-type Sandbox --api-path /sandbox/exec
python3 scripts/vephone_cli.py get-presigned-edge-url <product_id> <pod_id> --api-type Sandbox --api-path /sandbox/healthz
Unless the user explicitly requests it, do not execute the sandbox direct access test.
Screen recording:
python3 scripts/vephone_cli.py start-recording <product_id> <pod_id> --duration-limit 60 --round-id <unique_round_id>
python3 scripts/vephone_cli.py stop-recording <product_id> <pod_id>
Files:
python3 scripts/vephone_cli.py push-file <product_id> <pod_id> ./app.apk /sdcard/Download/app.apk --overwrite
python3 scripts/vephone_cli.py pull-file <product_id> <pod_id> /sdcard/Download/file.txt --output ./file.txt
push-file is used to upload local files,pull-file is used to download files inside the instance to a local path.
Command execution:
python3 scripts/vephone_cli.py run-command <product_id> <pod_id> "cmd"
python3 scripts/vephone_cli.py run-sync-command <product_id> <pod_id> "cmd" --permission-type root --timeout-second 10 --result-length 10240
Use harmless commands during diagnostics (ls、echo、pm list packages). Commands that modify files, install packages, change settings, or start/stop applications are all state-changing operations.
For a focused Android input box, you can input Chinese and English via IME commands:
python3 scripts/vephone_cli.py run-sync-command <product_id> <pod_id> 'ime inject_text "你好"'
python3 scripts/vephone_cli.py run-sync-command <product_id> <pod_id> 'ime inject_text "hello world"'
python3 scripts/vephone_cli.py run-sync-command <product_id> <pod_id> 'ime clear_input_text'
If replacing existing content, first use ime clear_input_text, then use ime inject_text. These commands require the target input box to already be focused, which usually requires first clicking via input tap x y .
pull-logcat Used to pull instance logs. Supports output path, resumable download, and sharding-related parameters; for specific parameters, see directly python3 scripts/vephone_cli.py pull-logcat -h。
python3 scripts/vephone_cli.py pull-logcat <product_id> <pod_id> --output ~/Downloads/logcat_<pod_id>
python3 scripts/vephone_cli.py pull-logcat <product_id> <pod_id> --chunk-size 800 --concurrency 5 --retries 3
python3 scripts/vephone_cli.py pull-logcat <product_id> <pod_id> --resume
If you only need regular log export, just use the simplest pull-logcat command.
Task, layout, label, and network queries
Task:
python3 scripts/vephone_cli.py list-tasks <product_id>
python3 scripts/vephone_cli.py get-task-info <product_id> <task_id>
Screen layout:
python3 scripts/vephone_cli.py list-display-layouts <product_id>
python3 scripts/vephone_cli.py detail-display-layout <product_id> <display_layout_id>
Label:
python3 scripts/vephone_cli.py list-tags <product_id>
python3 scripts/vephone_cli.py create-tag <product_id> --tag-name <tag_name> --tag-desc <tag_desc>
python3 scripts/vephone_cli.py update-tag <product_id> --tag-id <tag_id> --tag-name <tag_name> --tag-desc <tag_desc>
python3 scripts/vephone_cli.py delete-tag <product_id> --tag-id-list <tag_id1,tag_id2>
python3 scripts/vephone_cli.py attach-tag <product_id> --tag-id <tag_id> --pod-id-list <pod_id1,pod_id2>
Network configuration:
python3 scripts/vephone_cli.py list-port-mapping-rules <product_id>
python3 scripts/vephone_cli.py detail-port-mapping-rule <product_id> <port_mapping_rule_id>
python3 scripts/vephone_cli.py list-dns-rules <product_id>
python3 scripts/vephone_cli.py detail-dns-rule <product_id> <dns_id>
python3 scripts/vephone_cli.py list-custom-routes <product_id>