Install
$ agentstack add skill-aliyun-alibabacloud-agent-toolkit-alibabacloud-cli-cost-estimation ✓ scanned · ✓ verified — works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
About
Alibaba Cloud CLI Cost Estimation
Get an exact price quote for a CLI operation without executing it. The quote comes from the same pricing source as the trade system: for operations that produce an immediate order, the quoted amount equals the order amount you would actually pay (verified across new purchases, spec upgrades, and bandwidth changes — quote and bill match to the cent).
This is the pre-execution half of cost management. The post-hoc half (bills already incurred) is aliyun bssopenapi QueryAccountBill — see the reconciliation section below.
Requirements
- Alibaba Cloud CLI ≥ 3.4.2 (
aliyun version) - Product plugins up to date (
aliyun plugin update)
The Agent Rule: Quote Before Chargeable Execution
When you are about to execute an operation that creates, resizes, renews, or otherwise changes billable resources:
- Check whether the API supports quoting (see Discovery below).
- Quote it by appending
--estimate-costto the exact command you intend
to run.
- Present the amount to the user as part of the confirmation, e.g.
"This will execute ModifyPrepayInstanceSpec — estimated charge ¥28.89 (prorated upgrade delta). Proceed?"
- Execute only after confirmation, by removing
--estimate-costfrom the
same command.
Never silently execute a chargeable operation when a quote was obtainable. --estimate-cost is always safe to add: it only quotes, never executes, and changes nothing in the account.
Multi-step plans: quote everything first, confirm once. When the user's request decomposes into multiple API calls (a workflow), do NOT interleave execute-and-ask step by step. Instead:
- Quote all chargeable steps up front, before executing step 1 — use
--estimate-cost-context state overrides for steps that depend on the state an earlier step will produce.
- Present one consolidated cost plan: each step's amount labelled by its
nature (immediate order / usage-based estimate with its assumption / refund / free), plus the total of immediate charges.
- Ask for a single confirmation of the whole sequence, then execute the
steps in order.
- If a step fails or the account state changes mid-sequence, stop and
re-quote the remaining steps before continuing.
The Cost Plan Format
Present the consolidated plan in this fixed shape:
Cost plan: ( steps)
. — ()
...
Totals: pay now ¥ · refund ¥ · future ¥/ (assumes )
Execute all steps in order? [y/N]
Use exactly four labels, one per step:
| Label | Meaning | Amount shown | | --- | --- | --- | | PAY NOW | Immediate order on execution | Quoted order amount | | FUTURE | Usage-based, billed as consumed | Estimate × unit price, with the assumption | | REFUND | Money returned on execution | Negative amount, or "not quotable" if the API can't quote it | | FREE | No money involved | — |
Rules:
- Never sum different natures together. The totals line keeps pay-now,
refund, and future amounts as separate figures — a single "grand total" mixing an immediate ¥130 with a ¥80/month estimate is misleading.
- Every
FUTUREamount must carry its assumption inline; if the user never
confirmed the assumption, ask before presenting the plan.
- A step whose quote is unavailable shows the reason in place of a number
(e.g. "refund occurs, amount not quotable yet") — never silently drop it.
Filled example (the 5-step public-IP replacement):
Cost plan: replace public IP (5 steps)
1. Switch bandwidth billing to pay-by-traffic — FUTURE ¥0.8/GB (assumes 100 GB/month → ¥80/month)
2. Convert fixed public IP to EIP — FREE (EIP then billed by usage)
3. Unassociate EIP — FREE
4. Set 5 Mbps bandwidth, new public IP — PAY NOW ¥130.40 (prorated to term end)
5. Release old EIP — FREE (stops the old IP's billing)
Totals: pay now ¥130.40 · refund: step 1 returns unused bandwidth fee (not quotable yet) · future ¥80/month (assumes 100 GB)
Execute all 5 steps in order? [y/N]
Discovery: Which APIs Support Quoting
aliyun list-supported-pricing-apis
# Does a specific API support it? (any output = yes)
aliyun list-supported-pricing-apis \
--cli-query "supportedApis[?apiName=='ModifyInstanceNetworkSpec']"
The list is served live and keeps expanding — query it rather than relying on a cached copy. Each entry is a popCode / popVersion / apiName triple.
Basic Usage
Append --estimate-cost to any supported command (works on both PascalCase built-in and kebab-case plugin command forms):
# What would a 1-month subscription instance cost?
aliyun ecs run-instances --biz-region-id cn-hangzhou \
--image-family acs:ubuntu_22_04_x64 \
--instance-type ecs.e-c1m1.large \
--instance-charge-type PrePaid --period 1 --period-unit Month \
--system-disk-category cloud_essd --system-disk-size 20 \
--vswitch-id vsw-xxx --security-group-id sg-xxx \
--estimate-cost
# What is the prorated delta for upgrading an instance type?
aliyun ecs modify-prepay-instance-spec --region cn-hangzhou \
--instance-id i-xxx --instance-type ecs.e-c1m2.large --estimate-cost
Reading the Quote JSON
Top level is price + requestId. Decide how to read the amount in this order:
pricingMode: "delta"(spec changes) → readcalculatedAmount. That is
the net amount to pay after the old configuration's remaining value is refunded. components.baseline / components.target are the gross sides — do not present them as the price.
pricingMode: "single"→ readpriceSummary.effectiveModuleSum
(post-discount total), then check pricingUnit:
- Present (e.g.
"1 Month","Once") → the amount is per that unit. - Missing → this is a usage-based quote: amount = the estimated usage
you supplied × unit price. Its dimension is the usage you passed in (e.g. ¥80 for the 100 GB you estimated). Do not present it as a monthly or one-time charge.
priceSummary.modules[]gives the per-billing-item breakdown
(originalCost / invoiceDiscount / costAfterDiscount) — useful when the user asks where the money goes.
success: false→ readerrorCode/errorMessage; do not infer from the
exit code.
PricingContext: --estimate-cost-context
Some quotes need input that is not an API parameter. Pass it as repeatable Key=Value pairs (must be combined with --estimate-cost):
--estimate-cost --estimate-cost-context K1=V1 K2=V2
It carries two kinds of information:
| Kind | Example | When needed | | --- | --- | --- | | Usage assumption | EstimatedInternetTrafficOutGB=100 | Usage-based billing: cost = usage × unit price, and only the user knows the expected usage | | State override | InternetChargeType=PayByTraffic | Multi-step workflows: a later step must be quoted against the state produced by an earlier step, not the current state |
Ask the user for usage assumptions when a quote requires them (e.g. "How much monthly outbound traffic do you expect?") instead of inventing a number; state the assumption alongside the quoted amount.
Multi-Step Workflow Quoting
Example: replacing a fixed-bandwidth instance's public IP (5 steps). All chargeable steps can be quoted before executing step 1:
# Step 1 — switch bandwidth billing to pay-by-traffic.
# Usage-based: supply the traffic estimate.
aliyun ecs modify-instance-network-spec --region cn-hangzhou \
--instance-id $INS --network-charge-type PayByTraffic \
--estimate-cost --estimate-cost-context EstimatedInternetTrafficOutGB=100
# Step 2 — convert the fixed public IP to an EIP. No context needed.
aliyun ecs convert-nat-public-ip-to-eip \
--instance-id $INS --biz-region-id cn-hangzhou --estimate-cost
# Step 3 — unassociate EIP: free operation (see "Free APIs" below).
# Step 4 — set new bandwidth. At quoting time the instance is still
# fixed-bandwidth, but by execution time step 1 will have completed —
# override the state so the quote is based on the future state:
aliyun ecs modify-instance-network-spec --region cn-hangzhou \
--instance-id $INS --network-charge-type PayByBandwidth \
--internet-max-bandwidth-out 5 \
--estimate-cost --estimate-cost-context InternetChargeType=PayByTraffic
# Step 5 — release old EIP: free; its effect is stopping the old IP's billing.
Sum the per-step quotes client-side and present one pre-execution bill preview, labelling each amount by its nature: immediate order vs future usage-based cost vs refund vs free step.
Free / Unsupported APIs
Quoting an API with no pricing information returns an explicit message:
Error: no pricing information for vpc/2016-04-28/UnassociateEipAddress:
this OpenAPI either incurs no cost or has no pricing mapping registered yet
This is an answer, not a failure — treat it as "this step is not chargeable (or not yet quotable)" and say so, rather than reporting an error to the user.
For APIs that are not yet quotable, never present a number from your own knowledge as if it were a quote. If you cite public list prices, label them explicitly as unverified estimates with their assumptions, and point the user to the official pricing page (or to bssopenapi QueryAccountBill after a trial run) for authoritative figures.
Troubleshooting
| Symptom | Meaning / action | | --- | --- | | no pricing information for ... | API is free or not yet quotable — informational | | No pricingTarget matched the input request | The parameter combination hit no pricing rule. The error lists each rule's when condition — usually a required PricingContext key is missing (e.g. traffic estimate for pay-by-traffic) | | --estimate-cost-context requires --estimate-cost | Add --estimate-cost | | invalid --estimate-cost-context 'xxx' | Use Key=Value form; key must be non-empty | | Quote succeeds but no pricingUnit | Usage-based quote: amount = your estimate × unit price |
Reconciliation (Post-Execution)
Chargeable executions return an OrderId. To verify the quote against the actual bill:
aliyun bssopenapi GetOrderDetail --OrderId
For upgrade orders the bill has two lines (new config + refund of the old); their net equals the quoted calculatedAmount.
Command Cheat Sheet
| Goal | Command | | --- | --- | | List quotable APIs | aliyun list-supported-pricing-apis | | Quote (no execution) | aliyun ... --estimate-cost | | Quote with assumptions / state override | ... --estimate-cost --estimate-cost-context K1=V1 K2=V2 | | Verify against actual order | aliyun bssopenapi GetOrderDetail --OrderId | | Post-hoc bills (complementary) | aliyun bssopenapi QueryAccountBill --BillingCycle YYYY-MM |
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: aliyun
- Source: aliyun/alibabacloud-agent-toolkit
- License: Apache-2.0
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet — be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.