Huawei Cloud MaaS Tokens Usage Monitoring Skill
Overview
Query Huawei Cloud MaaS (Model as a Service) usage statistics via the ShowStatistics API, including total tokens, prompt tokens, completion tokens, total requests, and total errors. Supports querying last 7 days, 14 days, 30 days, or custom time ranges. Default query type is MaaS preset service. AK/SK never leaves Python process memory.
Tool separation principle:
- Python SDK signing — AK/SK signing via
huaweicloudsdkcore.signer.Signer (credentials never leave Python process memory, never appear in ps -ef)
- Python requests — HTTP POST to MaaS ShowStatistics endpoint (signed request sent from Python process only)
- No hcloud CLI — MaaS ShowStatistics is not covered by KooCLI; pure Python REST + SDK signing
Security architecture:
- AK/SK is read from environment variables (
HW_ACCESS_KEY / HW_SECRET_KEY) or a credentials file by the Python script (never typed by user in conversation, never passed via CLI args, never exported to shell)
- Temporary credentials add
HW_SECURITY_TOKEN (passed as X-Security-Token header by the SDK signer)
- Signing is performed by
huaweicloudsdkcore.Signer inside the Python process; the signed Authorization header is sent to the MaaS endpoint only
- AK/SK is never printed, never logged, never appears in
ps -ef, never appears in conversation
- No KMS dependency, no hcloud CLI dependency, no third-party skill dependency
⛔ Prohibited Operations (Security Constraints)
This skill strictly forbids the following operations, regardless of user requests:
| Prohibited Operation |
Reason |
| ❌ Ask the user to provide AK/SK directly in the conversation |
Credentials must never appear in conversation |
| ❌ Accept AK/SK directly provided by the user in the conversation |
Credentials must never appear in conversation |
| ❌ Hardcode AK/SK in scripts or command-line arguments |
Credential exposure risk |
❌ Use hcloud configure set to pass plaintext AK/SK values |
Credentials recorded in command history |
| ❌ Print or log the AK/SK values in any output |
Credentials must only exist in Python process memory |
| ❌ Export AK/SK to shell variables or stdout via the script |
Credentials must stay in Python process; only statistics result is printed |
| ❌ Implement SDK-HMAC-SHA256 signing manually |
Error-prone; must use huaweicloudsdkcore.Signer |
❌ Use service_type=3 for Custom Endpoint |
API only supports [1, 2, 4]; returns 400 error |
❌ Hardcode timezone as CST or Asia/Shanghai |
Must auto-detect OS local timezone |
| ❌ Query a time range exceeding 30 days without segmentation |
API retains only 30 days; script must auto-segment |
❌ Use a region other than cn-southwest-2 |
MaaS ShowStatistics only supports Southwest-Guiyang-1 |
❌ Write a new query script instead of using maas_rest_usage_stats.py |
Must use the script in scripts/ directory |
If a user requests a prohibited operation, you must refuse and explain the security constraint.
Architecture
Huawei Cloud MaaS Tokens Usage Monitoring
├── Task 1: Query MaaS Tokens Usage Statistics (via MaaS ShowStatistics API)
│ ├── 1a. Load credentials (env vars or --credentials-file, in Python memory only)
│ ├── 1b. Resolve time range (last 7/14/30 days, this month, or custom YYYY-MM-DD)
│ ├── 1c. Auto-segment (split ranges > 30 days, aggregate results)
│ ├── 1d. SDK sign request (huaweicloudsdkcore.Signer, AK/SK in process memory)
│ ├── 1e. POST ShowStatistics (modelarts.{region}.myhuaweicloud.com)
│ ├── 1f. Aggregate & convert (token unit: thousand → M tokens)
│ └── 1g. Print table (Total/Prompt/Completion Tokens, Requests, Errors, Error Rate)
└── Task 2: Verify & Report (compare with console, check error rate)
Prerequisites
Prerequisite check 1/3: Python 3.8+ and huaweicloudsdkcore required
The MaaS ShowStatistics query script uses Python to keep AK/SK in process memory only.
Install the required packages:
# Auto-use China mirror when system timezone is UTC+8 (faster in CN region; auto-detected via Python)
PIP_INDEX=$(python3 -c "import time;print('-i https://mirrors.huaweicloud.com/repository/pypi/simple' if -(time.timezone)//3600==8 else '')")
pip install $PIP_INDEX huaweicloudsdkcore requests
Verify SDK installation:
python3 --version # Expected: >= 3.8
python3 -c "import huaweicloudsdkcore; print('SDK OK')"
python3 -c "import requests; print('requests OK')"
Prerequisite check 2/3: Environment variables for Python SDK credentials (highest priority)
The query script (maas_rest_usage_stats.py) reads credentials from environment variables or a credentials file. The following environment variables MUST be set before running the script (unless --credentials-file is used):
| Variable |
Required |
Description |
HW_ACCESS_KEY |
Yes |
Huawei Cloud Access Key ID (AK) |
HW_SECRET_KEY |
Yes |
Huawei Cloud Secret Access Key (SK) |
HW_SECURITY_TOKEN |
No |
Temporary security token (only for temporary AK/SK) |
# Linux — verify HW_ACCESS_KEY / HW_SECRET_KEY are set (values never printed)
python3 -c 'import os,sys;ak=os.environ.get("HW_ACCESS_KEY","");sk=os.environ.get("HW_SECRET_KEY","");ok=bool(ak) and bool(sk);print("AK/SK configured OK" if ok else "ERROR: HW_ACCESS_KEY/HW_SECRET_KEY not set");sys.exit(0 if ok else 1)'
# Windows (cmd / PowerShell)
python -c "import os,sys;ak=os.environ.get('HW_ACCESS_KEY','');sk=os.environ.get('HW_SECRET_KEY','');ok=bool(ak) and bool(sk);print('AK/SK configured OK' if ok else 'ERROR: HW_ACCESS_KEY/HW_SECRET_KEY not set');sys.exit(0 if ok else 1)"
If verification reports ERROR (variables not set), configure them:
- Linux: add
export HW_ACCESS_KEY=... / export HW_SECRET_KEY=... to your shell profile (~/.bashrc, ~/.zshrc) or a secrets manager, then source the profile.
- Windows: set system environment variables via the GUI (System Properties → Advanced → Environment Variables → System variables → New). See references/cli-installation-guide.md "Windows GUI Setup" for step-by-step instructions. Avoid
setx (it records credentials in command history).
⚠️ Never set these variables in conversation or hardcode them in scripts. After setting, restart the terminal/Python process and re-run the verification above.
Prerequisite check 3/3: MaaS service region limitation
- Region: cn-southwest-2 (Southwest-Guiyang-1) — the only region supported by MaaS ShowStatistics API
- API retention: 30 days of statistics data
- Rate limit: total requests ≤ 1000/min, per-user ≤ 200/min
Authentication
Security rules (must be followed):
- Prohibited from reading, echoing, or printing AK/SK values
- Prohibited from asking the user to input AK/SK directly in the conversation
- Prohibited from using
hcloud configure set to pass plaintext credential values
- Prohibited from accepting AK/SK directly provided by the user in the conversation
- Only allowed to read credentials from environment variables or a credentials file
⚠️ Important: Handling user-provided credentials
If a user attempts to provide AK/SK directly (e.g., "my AK is xxx, SK is yyy"):
- Stop immediately — Do not execute any commands
- Politely refuse and return the following message:
For account security, please do not provide Huawei Cloud Access Key ID and Access Key Secret directly in the conversation.
Please use one of the following secure methods to configure credentials:
Method 1: Environment variables (permanent AK/SK)
export HW_ACCESS_KEY=<your-access-key-id>
export HW_SECRET_KEY=<your-access-key-secret>
Method 2: Environment variables (temporary AK/SK + Security Token)
export HW_ACCESS_KEY=<your-temp-access-key-id>
export HW_SECRET_KEY=<your-temp-access-key-secret>
export HW_SECURITY_TOKEN=<your-security-token>
Method 3: Credentials file
Create a file (e.g., ~/aksk.txt) with AK on line 1, SK on line 2, Security Token on line 3 (if using temporary credentials).
Then use: --credentials-file ~/aksk.txt
After configuration is complete, please retry your request.
- Do not continue executing any Huawei Cloud operations until credentials are configured
IAM Permission Policies
Ensure the IAM user has the required permissions (ModelArts monitoring + IAM read, scoped to the MaaS query workflow only). See references/iam-policies.md for the full permission table and recommended IAM policy JSON.
Permission boundaries:
- Scope constraint: Only query MaaS statistics data (read-only). Never modify or delete any MaaS service, endpoint, or configuration.
- Must stop if: credentials missing or invalid, user declines any confirmation, API returns 403/401, or time range exceeds 30 days and segmentation fails.
- Prohibited actions: modifying MaaS services, deleting API keys, changing IAM policies, accessing resources outside the MaaS query workflow, running commands not documented in this skill.
Core Workflows
Task 1: Query MaaS Tokens Usage Statistics
Query MaaS usage statistics via the ShowStatistics API. Data is consistent with the Huawei Cloud console.
⚠️ Tool separation: Python SDK signing + Python requests
- Python SDK (
huaweicloudsdkcore.Signer): Signs the request with AK/SK. Credentials never leave Python process memory.
- Python requests: Sends the signed HTTP POST to the MaaS endpoint. No CLI, no shell variable, no
ps -ef leakage.
📄 Detailed steps → references/task-query-tokens-usage.md
Sub-tasks:
- 1a. Load credentials — Read
HW_ACCESS_KEY / HW_SECRET_KEY / HW_SECURITY_TOKEN from env vars, or read from --credentials-file (supports one-per-line, comma-separated, KEY=VALUE formats)
- 1b. Resolve time range — Parse
--from / --to (YYYY-MM-DD), or map user expression ("last 7 days" / "last 14 days" / "last 30 days" / "this month") to a rolling/calendar window
- 1c. Auto-segment — If time range exceeds 30 days, split into multiple ≤ 30-day segments and aggregate results
- 1d. SDK sign request —
Signer(_Creds(ak, sk)).sign(sdk_request) — AK/SK in Python process memory only
- 1e. POST ShowStatistics —
requests.post("https://modelarts.{region}.myhuaweicloud.com/v1/{project_id}/maas/monitoring/show-statistics", headers=signed_headers, data=body_bytes)
- 1f. Aggregate & convert — Sum segment results; convert token unit (thousand → M tokens, actual = value × 1000)
- 1g. Print table — Output Total Tokens / Prompt Tokens / Completion Tokens / Total Requests / Total Errors / Error Rate + Period
Task 2: Verify & Report
Compare the API result with the Huawei Cloud console and report the error rate.
📄 Acceptance criteria → references/acceptance-criteria.md
⚠️ Small discrepancy is normal. API vs. console may differ by < 0.1% due to minor time boundary differences. Data is reliable.
Core Commands
Python Script (SDK signing + requests — AK/SK never in ps -ef)
| Command |
Description |
pip install huaweicloudsdkcore requests |
Install Python SDK signing library + HTTP client (for UTC+8, add -i https://mirrors.huaweicloud.com/repository/pypi/simple) |
python3 scripts/maas_rest_usage_stats.py --from 2026-05-08 --to 2026-05-21 |
Query preset service usage (default --service-type 2) for the given date range |
python3 scripts/maas_rest_usage_stats.py --from 2026-05-08 --to 2026-05-21 --service-type 1 |
Query My Service usage |
python3 scripts/maas_rest_usage_stats.py --from 2026-05-08 --to 2026-05-21 --service-type 4 |
Query Custom Endpoint usage |
python3 scripts/maas_rest_usage_stats.py --from 2026-05-08 --to 2026-05-21 --infer-type batch |
Query batch inference usage (default real_time) |
python3 scripts/maas_rest_usage_stats.py --from 2026-05-08 --to 2026-05-21 --api-keys key1 key2 |
Filter by API Key list |
python3 scripts/maas_rest_usage_stats.py --from 2026-05-08 --to 2026-05-21 --credentials-file /path/to/aksk.txt |
Use credentials file instead of env vars |
python3 scripts/maas_rest_usage_stats.py --from 2026-05-08 --to 2026-05-21 --raw |
Show raw API response (for debugging) |
⚠️ Key constraints on Core Commands:
- MaaS query: MUST use
scripts/maas_rest_usage_stats.py — AK/SK never in ps -ef
- Credentials: MUST use env vars or
--credentials-file — never hardcode, never pass via CLI args
--service-type: MUST be 1, 2, or 4 — never 3 (API returns 400)
--region: MUST be cn-southwest-2 (default) — the only supported region
- Time range: MUST match user expression exactly — "last 7 days" ≠ "this month"
Parameter Confirmation
Before executing any task, the following parameters must be confirmed with the user. Guessing is prohibited.
| Parameter |
Required/Optional |
Description |
Default |
| Time range |
Required |
--from / --to (YYYY-MM-DD), or user expression ("last 7 days", "last 14 days", "last 30 days", "this month") |
Last 7 days |
| Service type |
Optional |
--service-type: 1=My Service, 2=Preset Service, 4=Custom Endpoint |
2 (Preset Service) |
| Inference type |
Optional |
--infer-type: real_time (online) or batch |
real_time |
| Region |
Optional |
Huawei Cloud region (only cn-southwest-2 is supported) |
cn-southwest-2 |
| API Keys filter |
Optional |
--api-keys list to filter specific keys |
All keys |
| Credentials file |
Optional |
--credentials-file path (alternative to env vars) |
- |
| Raw response |
Optional |
--raw flag to show raw API response |
off |
Note: No AK/SK parameter is required. Credentials are read from environment variables or a credentials file by the Python script. AK/SK is never exported from the Python process.
Script Tools
| Script |
Description |
| maas_rest_usage_stats.py |
MaaS ShowStatistics API query script (SDK signing + requests, AK/SK never in ps -ef). Auto-segments ranges > 30 days, auto-detects OS local timezone, supports permanent/temporary AK/SK + credentials file. See Core Commands above for usage. |
⚠️ Script usage rules:
- Must use the existing script; do not write a new query script as a replacement
- Do not split the script internal logic into individual curl/HTTP commands
- Do not implement SDK-HMAC-SHA256 signing manually — must use
huaweicloudsdkcore.Signer
Verification Method
See references/verification-method.md for details. For common issues and solutions, see references/troubleshooting.md.
Quick validation (permanent AK/SK):
python3 -c 'import os,sys;ak=os.environ.get("HW_ACCESS_KEY","");sk=os.environ.get("HW_SECRET_KEY","");ok=bool(ak) and bool(sk);print("AK/SK configured OK" if ok else "ERROR: HW_ACCESS_KEY/HW_SECRET_KEY not set");sys.exit(0 if ok else 1)'
python3 scripts/maas_rest_usage_stats.py --from 2026-05-08 --to 2026-05-21
Quick validation (temporary AK/SK + Security Token):
python3 -c 'import os,sys;ak=os.environ.get("HW_ACCESS_KEY","");sk=os.environ.get("HW_SECRET_KEY","");st=os.environ.get("HW_SECURITY_TOKEN","");ok=bool(ak) and bool(sk) and bool(st);print("Temp AK/SK + Token configured OK" if ok else "ERROR: HW_ACCESS_KEY/HW_SECRET_KEY/HW_SECURITY_TOKEN not set");sys.exit(0 if ok else 1)'
python3 scripts/maas_rest_usage_stats.py --from 2026-05-08 --to 2026-05-21
⚠️ Credential reminder: AK/SK is read from environment variables or a credentials file by the Python script. If you need to configure credentials, see references/cli-installation-guide.md.
Security Design
The security architecture keeps AK/SK exclusively in Python process memory — never in ps -ef, shell variables, environment variables (read-only access), or conversation. Tool separation: Python SDK signing for AK/SK authentication, Python requests for HTTP POST to the MaaS endpoint. Credentials are never printed, never logged, never exported. Temporary credentials add HW_SECURITY_TOKEN as the X-Security-Token header via the SDK signer.
📄 Full details (tool separation table, credential leakage risk elimination, credential lifecycle) → references/security-design.md
References
| Document |
Description |
| cli-installation-guide.md |
Prerequisites + Python SDK + credentials configuration + Windows GUI env var setup |
| task-query-tokens-usage.md |
Task 1: Query tokens usage statistics detailed steps |
| related-apis.md |
MaaS ShowStatistics API and parameter details |
| maas-metrics.md |
MaaS monitoring metrics reference |
| iam-policies.md |
Required IAM permissions |
| verification-method.md |
Query result verification method |
| acceptance-criteria.md |
Correct/error pattern comparison |
| troubleshooting.md |
Common query issues and solutions |
| security-design.md |
Security design: tool separation, credential lifecycle |
| maas_rest_usage_stats.py |
ShowStatistics API usage statistics script (AK/SK never in ps -ef) |
1---
2name: huawei-cloud-maas-tokens-usage
3description: |
4 Query Huawei Cloud MaaS (Model as a Service) tokens usage statistics, including total tokens, prompt tokens, completion tokens, total requests, and total errors. Supports preset service, my service, and custom endpoint with time range queries (last 7/14/30 days or custom). Data source is MaaS ShowStatistics API, consistent with console.
5 Use this skill when the user wants to: (1) query MaaS token consumption statistics, (2) check MaaS service request counts and error rates, (3) analyze token usage for preset service or my service, (4) monitor MaaS usage over a specific time period.
6 Trigger: user mentions "MaaS", "Model as a Service", "tokens usage", "token consumption", "request count", "error count", "MaaS usage", "preset service usage", "completion tokens", "prompt tokens", "MaaS statistics", "模型服务", "令牌用量", "token统计", "token用量", "词元用量", "请求次数", "MaaS监控", "华为云MaaS"
7tags: ["maas", "tokens usage", "model as a service"]
8---
9
10# Huawei Cloud MaaS Tokens Usage Monitoring Skill
11
12## Overview
13
14Query Huawei Cloud MaaS (Model as a Service) usage statistics via the ShowStatistics API, including total tokens, prompt tokens, completion tokens, total requests, and total errors. Supports querying last 7 days, 14 days, 30 days, or custom time ranges. Default query type is MaaS preset service. **AK/SK never leaves Python process memory.**
15
16**Tool separation principle:**
17- **Python SDK signing** — AK/SK signing via `huaweicloudsdkcore.signer.Signer` (**credentials never leave Python process memory, never appear in `ps -ef`**)
18- **Python requests** — HTTP POST to MaaS ShowStatistics endpoint (**signed request sent from Python process only**)
19- **No hcloud CLI** — MaaS ShowStatistics is not covered by KooCLI; pure Python REST + SDK signing
20
21**Security architecture:**
22- AK/SK is read from environment variables (`HW_ACCESS_KEY` / `HW_SECRET_KEY`) or a credentials file by the Python script (never typed by user in conversation, never passed via CLI args, never exported to shell)
23- Temporary credentials add `HW_SECURITY_TOKEN` (passed as `X-Security-Token` header by the SDK signer)
24- Signing is performed by `huaweicloudsdkcore.Signer` inside the Python process; the signed Authorization header is sent to the MaaS endpoint only
25- AK/SK is never printed, never logged, never appears in `ps -ef`, never appears in conversation
26- No KMS dependency, no hcloud CLI dependency, no third-party skill dependency
27
28## ⛔ Prohibited Operations (Security Constraints)
29
30> **This skill strictly forbids the following operations, regardless of user requests:**
31
32| Prohibited Operation | Reason |
33|---------------------|--------|
34| ❌ Ask the user to provide AK/SK directly in the conversation | Credentials must never appear in conversation |
35| ❌ Accept AK/SK directly provided by the user in the conversation | Credentials must never appear in conversation |
36| ❌ Hardcode AK/SK in scripts or command-line arguments | Credential exposure risk |
37| ❌ Use `hcloud configure set` to pass plaintext AK/SK values | Credentials recorded in command history |
38| ❌ Print or log the AK/SK values in any output | Credentials must only exist in Python process memory |
39| ❌ Export AK/SK to shell variables or stdout via the script | Credentials must stay in Python process; only statistics result is printed |
40| ❌ Implement SDK-HMAC-SHA256 signing manually | Error-prone; must use `huaweicloudsdkcore.Signer` |
41| ❌ Use `service_type=3` for Custom Endpoint | API only supports `[1, 2, 4]`; returns 400 error |
42| ❌ Hardcode timezone as `CST` or `Asia/Shanghai` | Must auto-detect OS local timezone |
43| ❌ Query a time range exceeding 30 days without segmentation | API retains only 30 days; script must auto-segment |
44| ❌ Use a region other than `cn-southwest-2` | MaaS ShowStatistics only supports Southwest-Guiyang-1 |
45| ❌ Write a new query script instead of using `maas_rest_usage_stats.py` | Must use the script in `scripts/` directory |
46
47> **If a user requests a prohibited operation, you must refuse and explain the security constraint.**
48
49## Architecture
50
51```
52Huawei Cloud MaaS Tokens Usage Monitoring
53├── Task 1: Query MaaS Tokens Usage Statistics (via MaaS ShowStatistics API)
54│ ├── 1a. Load credentials (env vars or --credentials-file, in Python memory only)
55│ ├── 1b. Resolve time range (last 7/14/30 days, this month, or custom YYYY-MM-DD)
56│ ├── 1c. Auto-segment (split ranges > 30 days, aggregate results)
57│ ├── 1d. SDK sign request (huaweicloudsdkcore.Signer, AK/SK in process memory)
58│ ├── 1e. POST ShowStatistics (modelarts.{region}.myhuaweicloud.com)
59│ ├── 1f. Aggregate & convert (token unit: thousand → M tokens)
60│ └── 1g. Print table (Total/Prompt/Completion Tokens, Requests, Errors, Error Rate)
61└── Task 2: Verify & Report (compare with console, check error rate)
62```
63
64## Prerequisites
65
66> **Prerequisite check 1/3: Python 3.8+ and huaweicloudsdkcore required**
67>
68> The MaaS ShowStatistics query script uses Python to keep AK/SK in process memory only.
69> Install the required packages:
70> ```bash
71> # Auto-use China mirror when system timezone is UTC+8 (faster in CN region; auto-detected via Python)
72> PIP_INDEX=$(python3 -c "import time;print('-i https://mirrors.huaweicloud.com/repository/pypi/simple' if -(time.timezone)//3600==8 else '')")
73> pip install $PIP_INDEX huaweicloudsdkcore requests
74> ```
75>
76> Verify SDK installation:
77> ```bash
78> python3 --version # Expected: >= 3.8
79> python3 -c "import huaweicloudsdkcore; print('SDK OK')"
80> python3 -c "import requests; print('requests OK')"
81> ```
82
83> **Prerequisite check 2/3: Environment variables for Python SDK credentials (highest priority)**
84>
85> The query script (`maas_rest_usage_stats.py`) reads credentials from environment variables or a credentials file. The following environment variables **MUST** be set before running the script (unless `--credentials-file` is used):
86>
87> | Variable | Required | Description |
88> |----------|----------|-------------|
89> | `HW_ACCESS_KEY` | Yes | Huawei Cloud Access Key ID (AK) |
90> | `HW_SECRET_KEY` | Yes | Huawei Cloud Secret Access Key (SK) |
91> | `HW_SECURITY_TOKEN` | No | Temporary security token (only for temporary AK/SK) |
92>
93> ```bash
94> # Linux — verify HW_ACCESS_KEY / HW_SECRET_KEY are set (values never printed)
95> python3 -c 'import os,sys;ak=os.environ.get("HW_ACCESS_KEY","");sk=os.environ.get("HW_SECRET_KEY","");ok=bool(ak) and bool(sk);print("AK/SK configured OK" if ok else "ERROR: HW_ACCESS_KEY/HW_SECRET_KEY not set");sys.exit(0 if ok else 1)'
96> # Windows (cmd / PowerShell)
97> python -c "import os,sys;ak=os.environ.get('HW_ACCESS_KEY','');sk=os.environ.get('HW_SECRET_KEY','');ok=bool(ak) and bool(sk);print('AK/SK configured OK' if ok else 'ERROR: HW_ACCESS_KEY/HW_SECRET_KEY not set');sys.exit(0 if ok else 1)"
98> ```
99>
100> **If verification reports ERROR (variables not set), configure them:**
101> - **Linux**: add `export HW_ACCESS_KEY=...` / `export HW_SECRET_KEY=...` to your shell profile (`~/.bashrc`, `~/.zshrc`) or a secrets manager, then `source` the profile.
102> - **Windows**: set **system environment variables** via the GUI (System Properties → Advanced → Environment Variables → System variables → New). See [references/cli-installation-guide.md](references/cli-installation-guide.md) "Windows GUI Setup" for step-by-step instructions. Avoid `setx` (it records credentials in command history).
103>
104> ⚠️ **Never set these variables in conversation or hardcode them in scripts.** After setting, restart the terminal/Python process and re-run the verification above.
105
106> **Prerequisite check 3/3: MaaS service region limitation**
107>
108> - **Region**: **cn-southwest-2** (Southwest-Guiyang-1) — the only region supported by MaaS ShowStatistics API
109> - **API retention**: 30 days of statistics data
110> - **Rate limit**: total requests ≤ 1000/min, per-user ≤ 200/min
111
112---
113
114## Authentication
115
116> **Security rules (must be followed):**
117> - **Prohibited** from reading, echoing, or printing AK/SK values
118> - **Prohibited** from asking the user to input AK/SK directly in the conversation
119> - **Prohibited** from using `hcloud configure set` to pass plaintext credential values
120> - **Prohibited** from accepting AK/SK directly provided by the user in the conversation
121> - **Only allowed** to read credentials from environment variables or a credentials file
122>
123> **⚠️ Important: Handling user-provided credentials**
124>
125> If a user attempts to provide AK/SK directly (e.g., "my AK is xxx, SK is yyy"):
126> 1. **Stop immediately** — Do not execute any commands
127> 2. **Politely refuse** and return the following message:
128> ```
129> For account security, please do not provide Huawei Cloud Access Key ID and Access Key Secret directly in the conversation.
130>
131> Please use one of the following secure methods to configure credentials:
132>
133> Method 1: Environment variables (permanent AK/SK)
134> export HW_ACCESS_KEY=<your-access-key-id>
135> export HW_SECRET_KEY=<your-access-key-secret>
136>
137> Method 2: Environment variables (temporary AK/SK + Security Token)
138> export HW_ACCESS_KEY=<your-temp-access-key-id>
139> export HW_SECRET_KEY=<your-temp-access-key-secret>
140> export HW_SECURITY_TOKEN=<your-security-token>
141>
142> Method 3: Credentials file
143> Create a file (e.g., ~/aksk.txt) with AK on line 1, SK on line 2, Security Token on line 3 (if using temporary credentials).
144> Then use: --credentials-file ~/aksk.txt
145>
146> After configuration is complete, please retry your request.
147> ```
148> 3. **Do not continue** executing any Huawei Cloud operations until credentials are configured
149
150---
151
152## IAM Permission Policies
153
154Ensure the IAM user has the required permissions (ModelArts monitoring + IAM read, scoped to the MaaS query workflow only). See [references/iam-policies.md](references/iam-policies.md) for the full permission table and recommended IAM policy JSON.
155
156**Permission boundaries:**
157
158- **Scope constraint**: Only query MaaS statistics data (read-only). Never modify or delete any MaaS service, endpoint, or configuration.
159- **Must stop if**: credentials missing or invalid, user declines any confirmation, API returns 403/401, or time range exceeds 30 days and segmentation fails.
160- **Prohibited actions**: modifying MaaS services, deleting API keys, changing IAM policies, accessing resources outside the MaaS query workflow, running commands not documented in this skill.
161
162---
163
164## Core Workflows
165
166### Task 1: Query MaaS Tokens Usage Statistics
167
168Query MaaS usage statistics via the ShowStatistics API. Data is consistent with the Huawei Cloud console.
169
170> **⚠️ Tool separation: Python SDK signing + Python requests**
171>
172> - **Python SDK** (`huaweicloudsdkcore.Signer`): Signs the request with AK/SK. **Credentials never leave Python process memory.**
173> - **Python requests**: Sends the signed HTTP POST to the MaaS endpoint. No CLI, no shell variable, no `ps -ef` leakage.
174
175📄 Detailed steps → [references/task-query-tokens-usage.md](references/task-query-tokens-usage.md)
176
177**Sub-tasks:**
178
1791. **1a. Load credentials** — Read `HW_ACCESS_KEY` / `HW_SECRET_KEY` / `HW_SECURITY_TOKEN` from env vars, or read from `--credentials-file` (supports one-per-line, comma-separated, KEY=VALUE formats)
1802. **1b. Resolve time range** — Parse `--from` / `--to` (YYYY-MM-DD), or map user expression ("last 7 days" / "last 14 days" / "last 30 days" / "this month") to a rolling/calendar window
1813. **1c. Auto-segment** — If time range exceeds 30 days, split into multiple ≤ 30-day segments and aggregate results
1824. **1d. SDK sign request** — `Signer(_Creds(ak, sk)).sign(sdk_request)` — AK/SK in Python process memory only
1835. **1e. POST ShowStatistics** — `requests.post("https://modelarts.{region}.myhuaweicloud.com/v1/{project_id}/maas/monitoring/show-statistics", headers=signed_headers, data=body_bytes)`
1846. **1f. Aggregate & convert** — Sum segment results; convert token unit (thousand → M tokens, actual = value × 1000)
1857. **1g. Print table** — Output Total Tokens / Prompt Tokens / Completion Tokens / Total Requests / Total Errors / Error Rate + Period
186
187### Task 2: Verify & Report
188
189Compare the API result with the Huawei Cloud console and report the error rate.
190
191📄 Acceptance criteria → [references/acceptance-criteria.md](references/acceptance-criteria.md)
192
193> **⚠️ Small discrepancy is normal.** API vs. console may differ by < 0.1% due to minor time boundary differences. Data is reliable.
194
195---
196
197## Core Commands
198
199### Python Script (SDK signing + requests — AK/SK never in ps -ef)
200
201| Command | Description |
202|---------|-------------|
203| `pip install huaweicloudsdkcore requests` | Install Python SDK signing library + HTTP client (for UTC+8, add `-i https://mirrors.huaweicloud.com/repository/pypi/simple`) |
204| `python3 scripts/maas_rest_usage_stats.py --from 2026-05-08 --to 2026-05-21` | Query preset service usage (default `--service-type 2`) for the given date range |
205| `python3 scripts/maas_rest_usage_stats.py --from 2026-05-08 --to 2026-05-21 --service-type 1` | Query My Service usage |
206| `python3 scripts/maas_rest_usage_stats.py --from 2026-05-08 --to 2026-05-21 --service-type 4` | Query Custom Endpoint usage |
207| `python3 scripts/maas_rest_usage_stats.py --from 2026-05-08 --to 2026-05-21 --infer-type batch` | Query batch inference usage (default `real_time`) |
208| `python3 scripts/maas_rest_usage_stats.py --from 2026-05-08 --to 2026-05-21 --api-keys key1 key2` | Filter by API Key list |
209| `python3 scripts/maas_rest_usage_stats.py --from 2026-05-08 --to 2026-05-21 --credentials-file /path/to/aksk.txt` | Use credentials file instead of env vars |
210| `python3 scripts/maas_rest_usage_stats.py --from 2026-05-08 --to 2026-05-21 --raw` | Show raw API response (for debugging) |
211
212> **⚠️ Key constraints on Core Commands:**
213>
214> - MaaS query: **MUST use `scripts/maas_rest_usage_stats.py`** — AK/SK never in `ps -ef`
215> - Credentials: **MUST use env vars or `--credentials-file`** — never hardcode, never pass via CLI args
216> - `--service-type`: **MUST be 1, 2, or 4** — never 3 (API returns 400)
217> - `--region`: **MUST be `cn-southwest-2`** (default) — the only supported region
218> - Time range: **MUST match user expression exactly** — "last 7 days" ≠ "this month"
219
220---
221
222## Parameter Confirmation
223
224> **Before executing any task, the following parameters must be confirmed with the user. Guessing is prohibited.**
225
226| Parameter | Required/Optional | Description | Default |
227|-----------|-------------------|-------------|---------|
228| Time range | Required | `--from` / `--to` (YYYY-MM-DD), or user expression ("last 7 days", "last 14 days", "last 30 days", "this month") | Last 7 days |
229| Service type | Optional | `--service-type`: 1=My Service, 2=Preset Service, 4=Custom Endpoint | 2 (Preset Service) |
230| Inference type | Optional | `--infer-type`: `real_time` (online) or `batch` | `real_time` |
231| Region | Optional | Huawei Cloud region (only `cn-southwest-2` is supported) | `cn-southwest-2` |
232| API Keys filter | Optional | `--api-keys` list to filter specific keys | All keys |
233| Credentials file | Optional | `--credentials-file` path (alternative to env vars) | - |
234| Raw response | Optional | `--raw` flag to show raw API response | off |
235
236> **Note**: No AK/SK parameter is required. Credentials are read from environment variables or a credentials file by the Python script. AK/SK is never exported from the Python process.
237
238---
239
240## Script Tools
241
242| Script | Description |
243|--------|-------------|
244| [maas_rest_usage_stats.py](scripts/maas_rest_usage_stats.py) | MaaS ShowStatistics API query script (SDK signing + requests, AK/SK never in `ps -ef`). Auto-segments ranges > 30 days, auto-detects OS local timezone, supports permanent/temporary AK/SK + credentials file. See Core Commands above for usage. |
245
246> **⚠️ Script usage rules:**
247> - Must use the existing script; do not write a new query script as a replacement
248> - Do not split the script internal logic into individual curl/HTTP commands
249> - Do not implement SDK-HMAC-SHA256 signing manually — must use `huaweicloudsdkcore.Signer`
250
251---
252
253## Verification Method
254
255See [references/verification-method.md](references/verification-method.md) for details. For common issues and solutions, see [references/troubleshooting.md](references/troubleshooting.md).
256
257**Quick validation (permanent AK/SK):**
258```bash
259python3 -c 'import os,sys;ak=os.environ.get("HW_ACCESS_KEY","");sk=os.environ.get("HW_SECRET_KEY","");ok=bool(ak) and bool(sk);print("AK/SK configured OK" if ok else "ERROR: HW_ACCESS_KEY/HW_SECRET_KEY not set");sys.exit(0 if ok else 1)'
260python3 scripts/maas_rest_usage_stats.py --from 2026-05-08 --to 2026-05-21
261```
262
263**Quick validation (temporary AK/SK + Security Token):**
264```bash
265python3 -c 'import os,sys;ak=os.environ.get("HW_ACCESS_KEY","");sk=os.environ.get("HW_SECRET_KEY","");st=os.environ.get("HW_SECURITY_TOKEN","");ok=bool(ak) and bool(sk) and bool(st);print("Temp AK/SK + Token configured OK" if ok else "ERROR: HW_ACCESS_KEY/HW_SECRET_KEY/HW_SECURITY_TOKEN not set");sys.exit(0 if ok else 1)'
266python3 scripts/maas_rest_usage_stats.py --from 2026-05-08 --to 2026-05-21
267```
268
269> **⚠️ Credential reminder:** AK/SK is read from environment variables or a credentials file by the Python script. If you need to configure credentials, see [references/cli-installation-guide.md](references/cli-installation-guide.md).
270
271---
272
273## Security Design
274
275The security architecture keeps AK/SK exclusively in Python process memory — never in `ps -ef`, shell variables, environment variables (read-only access), or conversation. Tool separation: **Python SDK signing** for AK/SK authentication, **Python requests** for HTTP POST to the MaaS endpoint. Credentials are never printed, never logged, never exported. Temporary credentials add `HW_SECURITY_TOKEN` as the `X-Security-Token` header via the SDK signer.
276
277📄 Full details (tool separation table, credential leakage risk elimination, credential lifecycle) → [references/security-design.md](references/security-design.md)
278
279---
280
281## References
282
283| Document | Description |
284|----------|-------------|
285| [cli-installation-guide.md](references/cli-installation-guide.md) | Prerequisites + Python SDK + credentials configuration + Windows GUI env var setup |
286| [task-query-tokens-usage.md](references/task-query-tokens-usage.md) | Task 1: Query tokens usage statistics detailed steps |
287| [related-apis.md](references/related-apis.md) | MaaS ShowStatistics API and parameter details |
288| [maas-metrics.md](references/maas-metrics.md) | MaaS monitoring metrics reference |
289| [iam-policies.md](references/iam-policies.md) | Required IAM permissions |
290| [verification-method.md](references/verification-method.md) | Query result verification method |
291| [acceptance-criteria.md](references/acceptance-criteria.md) | Correct/error pattern comparison |
292| [troubleshooting.md](references/troubleshooting.md) | Common query issues and solutions |
293| [security-design.md](references/security-design.md) | Security design: tool separation, credential lifecycle |
294| [maas_rest_usage_stats.py](scripts/maas_rest_usage_stats.py) | ShowStatistics API usage statistics script (AK/SK never in ps -ef) |