@volcengine/ark-cli-darwin-x64 0.0.0-stage → 1.0.46-prerelease.2e2d76ea86c4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (171) hide show
  1. package/LICENSE +201 -0
  2. package/bin/arkcli-darwin-amd64 +4 -0
  3. package/manifest.json +37 -0
  4. package/package.json +20 -4
  5. package/skills/arkcli-agent/SKILL.md +197 -0
  6. package/skills/arkcli-agent/references/activation.md +23 -0
  7. package/skills/arkcli-agent/references/agent.md +442 -0
  8. package/skills/arkcli-agent/references/byok.md +74 -0
  9. package/skills/arkcli-agent/references/context-management.md +61 -0
  10. package/skills/arkcli-agent/references/debug-export.md +27 -0
  11. package/skills/arkcli-agent/references/dream.md +91 -0
  12. package/skills/arkcli-agent/references/evals.md +215 -0
  13. package/skills/arkcli-agent/references/events-chat.md +192 -0
  14. package/skills/arkcli-agent/references/interfaces-gaps.md +55 -0
  15. package/skills/arkcli-agent/references/mcp-vault.md +111 -0
  16. package/skills/arkcli-agent/references/model-config.md +46 -0
  17. package/skills/arkcli-agent/references/self-hosted.md +47 -0
  18. package/skills/arkcli-agent/references/session-files.md +157 -0
  19. package/skills/arkcli-agent/references/session-upgrade.md +64 -0
  20. package/skills/arkcli-agent/references/skills.md +94 -0
  21. package/skills/arkcli-agent/references/todo-write.md +37 -0
  22. package/skills/arkcli-agent/references/vision-agent.md +92 -0
  23. package/skills/arkcli-api-explorer/SKILL.md +114 -0
  24. package/skills/arkcli-api-explorer/references/arkcli-api.md +185 -0
  25. package/skills/arkcli-api-explorer/references/evals.md +92 -0
  26. package/skills/arkcli-auth/SKILL.md +127 -0
  27. package/skills/arkcli-auth/references/api-key-query.md +74 -0
  28. package/skills/arkcli-auth/references/arkcli-auth-init-volc.md +58 -0
  29. package/skills/arkcli-auth/references/arkcli-auth-login.md +125 -0
  30. package/skills/arkcli-auth/references/arkcli-auth-status.md +41 -0
  31. package/skills/arkcli-auth/references/arkcli-auth-whoami.md +128 -0
  32. package/skills/arkcli-auth/references/auth-modes.md +101 -0
  33. package/skills/arkcli-auth/references/identity-resolution.md +74 -0
  34. package/skills/arkcli-auth/references/realname-gate.md +23 -0
  35. package/skills/arkcli-auth/scripts/key-metadata.jq +34 -0
  36. package/skills/arkcli-billing/SKILL.md +105 -0
  37. package/skills/arkcli-billing/references/arkcli-billing-list.md +247 -0
  38. package/skills/arkcli-billing/references/evals.md +50 -0
  39. package/skills/arkcli-chat/SKILL.md +229 -0
  40. package/skills/arkcli-chat/references/arkcli-chat.md +300 -0
  41. package/skills/arkcli-chat/references/caching-thinking.md +138 -0
  42. package/skills/arkcli-chat/references/chat-meta.md +77 -0
  43. package/skills/arkcli-chat/references/evals.md +60 -0
  44. package/skills/arkcli-chat/references/stream-events.md +163 -0
  45. package/skills/arkcli-chat/references/text-format.md +160 -0
  46. package/skills/arkcli-chat/references/tools.md +130 -0
  47. package/skills/arkcli-code-example/SKILL.md +73 -0
  48. package/skills/arkcli-code-example/assets/demo-code/examples.json +14 -0
  49. package/skills/arkcli-code-example/assets/demo-code/go/main.go +53 -0
  50. package/skills/arkcli-code-example/assets/demo-code/python.py +26 -0
  51. package/skills/arkcli-code-example/references/arkcli-code-example.md +146 -0
  52. package/skills/arkcli-code-example/references/evals.md +12 -0
  53. package/skills/arkcli-config/SKILL.md +129 -0
  54. package/skills/arkcli-config/references/arkcli-config-init.md +49 -0
  55. package/skills/arkcli-config/references/arkcli-config-profile.md +54 -0
  56. package/skills/arkcli-config/references/evals.md +87 -0
  57. package/skills/arkcli-connect/SKILL.md +62 -0
  58. package/skills/arkcli-connect/references/arkcli-connect.md +129 -0
  59. package/skills/arkcli-connect/references/evals.md +117 -0
  60. package/skills/arkcli-custommodel/SKILL.md +177 -0
  61. package/skills/arkcli-custommodel/references/arkcli-custommodel-available-quantizations.md +28 -0
  62. package/skills/arkcli-custommodel/references/arkcli-custommodel-delete.md +36 -0
  63. package/skills/arkcli-custommodel/references/arkcli-custommodel-get.md +45 -0
  64. package/skills/arkcli-custommodel/references/arkcli-custommodel-list.md +72 -0
  65. package/skills/arkcli-custommodel/references/arkcli-custommodel-quantize.md +58 -0
  66. package/skills/arkcli-custommodel/references/arkcli-custommodel-update.md +47 -0
  67. package/skills/arkcli-custommodel/references/arkcli-custommodel-upload.md +60 -0
  68. package/skills/arkcli-custommodel/references/evals.md +58 -0
  69. package/skills/arkcli-datasets/SKILL.md +41 -0
  70. package/skills/arkcli-datasets/references/commands.md +91 -0
  71. package/skills/arkcli-datasets/references/evals.md +30 -0
  72. package/skills/arkcli-deploy/SKILL.md +128 -0
  73. package/skills/arkcli-deploy/references/arkcli-deploy.md +138 -0
  74. package/skills/arkcli-deploy/references/evals.md +117 -0
  75. package/skills/arkcli-docs/SKILL.md +232 -0
  76. package/skills/arkcli-docs/references/commands.md +225 -0
  77. package/skills/arkcli-docs/references/evals.md +200 -0
  78. package/skills/arkcli-docs/references/failure-modes.md +77 -0
  79. package/skills/arkcli-doctor/CONTRIBUTING.md +202 -0
  80. package/skills/arkcli-doctor/SKILL.md +302 -0
  81. package/skills/arkcli-doctor/references/error-codes.md +504 -0
  82. package/skills/arkcli-doctor/references/evals.md +70 -0
  83. package/skills/arkcli-doctor/references/scope-account.md +205 -0
  84. package/skills/arkcli-doctor/references/scope-cli.md +217 -0
  85. package/skills/arkcli-doctor/references/scope-infer-endpoint.md +214 -0
  86. package/skills/arkcli-doctor/references/scope-metrics.md +197 -0
  87. package/skills/arkcli-doctor/references/scope-model.md +241 -0
  88. package/skills/arkcli-doctor/references/scope-report.md +242 -0
  89. package/skills/arkcli-doctor/references/verify-origin.md +142 -0
  90. package/skills/arkcli-gen/SKILL.md +348 -0
  91. package/skills/arkcli-gen/references/arkcli-gen-audio.md +125 -0
  92. package/skills/arkcli-gen/references/arkcli-gen.md +297 -0
  93. package/skills/arkcli-gen/references/evals.md +93 -0
  94. package/skills/arkcli-gen/references/gen-meta.md +182 -0
  95. package/skills/arkcli-gen/references/image-stream.md +105 -0
  96. package/skills/arkcli-gen/references/intent-and-validation.md +177 -0
  97. package/skills/arkcli-helper/SKILL.md +233 -0
  98. package/skills/arkcli-helper/references/arkcli-helper.md +372 -0
  99. package/skills/arkcli-helper/references/evals.md +110 -0
  100. package/skills/arkcli-infer-endpoint/SKILL.md +141 -0
  101. package/skills/arkcli-infer-endpoint/references/arkcli-infer-endpoint-create.md +142 -0
  102. package/skills/arkcli-infer-endpoint/references/arkcli-infer-endpoint-delete.md +68 -0
  103. package/skills/arkcli-infer-endpoint/references/arkcli-infer-endpoint-get.md +60 -0
  104. package/skills/arkcli-infer-endpoint/references/arkcli-infer-endpoint-list.md +142 -0
  105. package/skills/arkcli-infer-endpoint/references/arkcli-infer-endpoint-start.md +34 -0
  106. package/skills/arkcli-infer-endpoint/references/arkcli-infer-endpoint-stop.md +34 -0
  107. package/skills/arkcli-infer-endpoint/references/arkcli-infer-endpoint-update.md +76 -0
  108. package/skills/arkcli-infer-endpoint/references/evals.md +24 -0
  109. package/skills/arkcli-models/SKILL.md +314 -0
  110. package/skills/arkcli-models/references/arkcli-models-activate.md +110 -0
  111. package/skills/arkcli-models/references/arkcli-models-get.md +100 -0
  112. package/skills/arkcli-models/references/arkcli-models-list.md +73 -0
  113. package/skills/arkcli-models/references/arkcli-models-performance.md +32 -0
  114. package/skills/arkcli-models/references/arkcli-models-scenario-table.md +83 -0
  115. package/skills/arkcli-models/references/arkcli-models-search.md +208 -0
  116. package/skills/arkcli-models/references/evals.md +88 -0
  117. package/skills/arkcli-onboard/SKILL.md +81 -0
  118. package/skills/arkcli-onboard/references/evals.md +107 -0
  119. package/skills/arkcli-plans/SKILL.md +208 -0
  120. package/skills/arkcli-plans/references/arkcli-plans-agreement-signing.md +74 -0
  121. package/skills/arkcli-plans/references/arkcli-plans-buy.md +209 -0
  122. package/skills/arkcli-plans/references/arkcli-plans-get.md +96 -0
  123. package/skills/arkcli-plans/references/arkcli-plans-harness-status.md +149 -0
  124. package/skills/arkcli-plans/references/arkcli-plans-model-apply.md +56 -0
  125. package/skills/arkcli-plans/references/arkcli-plans-model-list.md +119 -0
  126. package/skills/arkcli-plans/references/arkcli-plans-personal-rotate-apikey.md +83 -0
  127. package/skills/arkcli-plans/references/arkcli-plans-renew.md +134 -0
  128. package/skills/arkcli-plans/references/arkcli-plans-team-rotate-apikey.md +108 -0
  129. package/skills/arkcli-plans/references/arkcli-plans-team-seat-assign.md +142 -0
  130. package/skills/arkcli-plans/references/arkcli-plans-team-seat-list.md +115 -0
  131. package/skills/arkcli-plans/references/evals.md +224 -0
  132. package/skills/arkcli-pricing/SKILL.md +125 -0
  133. package/skills/arkcli-pricing/references/arkcli-pricing-models.md +260 -0
  134. package/skills/arkcli-pricing/references/arkcli-pricing-plans.md +147 -0
  135. package/skills/arkcli-profile/SKILL.md +188 -0
  136. package/skills/arkcli-profile/references/arkcli-profile-create.md +101 -0
  137. package/skills/arkcli-profile/references/arkcli-profile-keys.md +100 -0
  138. package/skills/arkcli-profile/references/arkcli-profile-set-default.md +81 -0
  139. package/skills/arkcli-profile/references/evals.md +5 -0
  140. package/skills/arkcli-resources/SKILL.md +122 -0
  141. package/skills/arkcli-resources/references/arkcli-resources-list.md +140 -0
  142. package/skills/arkcli-shared/SKILL.md +236 -0
  143. package/skills/arkcli-shared/references/execution-context.md +108 -0
  144. package/skills/arkcli-shared/references/global-flags.md +45 -0
  145. package/skills/arkcli-shared/references/profile-defaults.md +57 -0
  146. package/skills/arkcli-shared/references/troubleshooting.md +36 -0
  147. package/skills/arkcli-shared/references/update.md +72 -0
  148. package/skills/arkcli-train-finetune/SKILL.md +123 -0
  149. package/skills/arkcli-train-finetune/references/ark-finetune-sdk.md +133 -0
  150. package/skills/arkcli-train-finetune/references/create.md +262 -0
  151. package/skills/arkcli-train-finetune/references/download.md +44 -0
  152. package/skills/arkcli-train-finetune/references/evals.md +14 -0
  153. package/skills/arkcli-train-finetune/references/export-deploy.md +177 -0
  154. package/skills/arkcli-train-finetune/references/job-configuration.md +122 -0
  155. package/skills/arkcli-train-finetune/references/list.md +78 -0
  156. package/skills/arkcli-train-finetune/references/manage.md +128 -0
  157. package/skills/arkcli-train-finetune/references/rl-plugins.md +77 -0
  158. package/skills/arkcli-train-finetune/references/testing-debug-monitoring.md +137 -0
  159. package/skills/arkcli-understand/SKILL.md +131 -0
  160. package/skills/arkcli-understand/references/arkcli-understand-asr.md +53 -0
  161. package/skills/arkcli-understand/references/arkcli-understand.md +268 -0
  162. package/skills/arkcli-understand/references/evals.md +119 -0
  163. package/skills/arkcli-understand/references/sub-skills.md +141 -0
  164. package/skills/arkcli-usage/SKILL.md +166 -0
  165. package/skills/arkcli-usage/references/arkcli-usage-balance.md +217 -0
  166. package/skills/arkcli-usage/references/arkcli-usage-plan-details.md +136 -0
  167. package/skills/arkcli-usage/references/arkcli-usage-plan.md +166 -0
  168. package/skills/arkcli-usage/references/arkcli-usage-seats.md +194 -0
  169. package/skills/arkcli-usage/references/arkcli-usage-stats.md +195 -0
  170. package/skills/arkcli-usage/references/evals.md +30 -0
  171. package/README.md +0 -3
@@ -0,0 +1,166 @@
1
+ # usage plan
2
+
3
+ > **前置条件:** 先阅读 [`../arkcli-shared/SKILL.md`](../../arkcli-shared/SKILL.md) 了解认证、全局参数和安全规则。
4
+
5
+ > **跟 `stats` / `billing` 的区别(务必先看):**
6
+ > - `usage stats` — 按 token 计费的 **inference 用量**(按时间序列,有 5–30 分钟延迟)
7
+ > - `billing list` — 按月**结算金额**(火山计费中心拆账,T+1 出账)
8
+ > - `usage plan` — **订阅类套餐(AgentPlan / CodingPlan)的 quota 快照**(后端"我的套餐"实时数据,跟火山方舟控制台 1:1)
9
+ >
10
+ > 用户问「我用了多少 token / 多少次请求」走 stats;问「花了多少钱」走 billing;问「我的套餐还剩多少额度 / 用了百分之几 / 几号刷新」走 **plan**。
11
+
12
+ 查询订阅套餐的额度用量快照。Plan 不是按时间序列查,而是**按时间窗口(5h / weekly / monthly / session)给当前生效订阅的"已用 / 总额 / 重置时间"**。
13
+
14
+ 当前 `periods[].total` 与历史档位 AFP 表不同,只能报告当前快照的产品、档位、时间窗口、数值及查询时间;它不证明按剩余天数折算、权益缩水、赠送或升降档。没有当前订单周期或官方权益规则证据时,差异原因明确标为未知。`reset_at` 是额度窗口刷新时间,不是订阅到期时间;到期查询转 Plans。
15
+
16
+ ## 命令
17
+
18
+ ```bash
19
+ # 默认:并发 ListSubscribeTrade × 4 探所有 SKU (personal × 2 + team × 2),
20
+ # 探到的桶才下发 usage 请求 — 一次拉全你账号下所有生效订阅的余额
21
+ arkcli usage plan
22
+
23
+ # 纯人读额度卡片 (不输出 JSON;管道下也去 ANSI)
24
+ arkcli usage plan --render
25
+
26
+ # 显式指定 product (跳过订阅探测,直接单桶查)
27
+ arkcli usage plan --product agent-plan
28
+ arkcli usage plan --product coding-plan
29
+ arkcli usage plan --product agent-plan-team
30
+ arkcli usage plan --product coding-plan-team
31
+
32
+ # 强制查所有 4 个桶 (personal + team), 不管订阅与否 (诊断 / Excel 视角)
33
+ arkcli usage plan --all
34
+
35
+ # Team 版查指定席位 (绕过 GetSeatInfo 的自动 caller seat 解析)
36
+ arkcli usage plan --product agent-plan-team --seat seat-001
37
+ ```
38
+
39
+ ## 参数
40
+
41
+ | 参数 | 必填 | 类型 | 说明 |
42
+ |------|------|------|------|
43
+ | `--product` | 否 | string | 显式 product id: `agent-plan` / `coding-plan` / `agent-plan-team` / `coding-plan-team`。不传则默认走自动探订阅 |
44
+ | `--all` | 否 | bool | 强制查所有 4 个 product,没订阅的桶 endpoint 自己返 subscribed=false 行。**跟 `--product` 互斥** |
45
+ | `--seat` | 否 | string | 仅 team product 有意义。不传时 service 层自动调 `GetSeatInfo` 找 caller 绑定的 seat;传了则跳过该 RPC,直接用提供的 SeatID(管理员视角查别人的 seat) |
46
+ | `--render` | 否 | bool | 只输出人读额度卡片,不输出 JSON。TTY 下彩色,管道/重定向下保留 Unicode 进度条但去 ANSI;不能与显式 `--format` / `--transform` 混用 |
47
+
48
+ ## 默认行为(无 `--product` / `--all`)
49
+
50
+ 不传任何 product 时,**默认行为统一**(profile.Type 不再参与派生 — 历史版本曾按 profile 单桶查,V2 起改为统一探所有订阅,因为同一身份常常同时订了多个 product):
51
+
52
+ 1. 4 桶并发探订阅状态:
53
+ - **Personal × 2** 走 `ListSubscribeTrade`(`ResourceNames=[RealAgentPlanPersonal]` / `[""]`)
54
+ - **Team × 2** 走 `GetSeatInfo(Scene="agent_plan_enterprise" / "")`(企业版不在 ListSubscribeTrade 暴露,实测返 null;改通过 caller seat 绑定状态探)
55
+ 2. 探到的桶下发对应 usage RPC:
56
+ - `agent-plan` (personal) → `GetAFPUsage`
57
+ - `coding-plan` (personal) → `GetCodingPlanUsage`
58
+ - `agent-plan-team` → 已经拿到 SeatID → `GetSeatAFPUsage(SeatIDs=[id])`
59
+ - `coding-plan-team` → 已经拿到 SeatID → `GetSeatInfoUsage(SeatID=id, Scene="")`
60
+ 3. 一桶失败不挡其它桶 (per-bucket error isolation)
61
+
62
+ > **多 1 次 RPC 换零 flag 体验**:`ListSubscribeTrade × 2 + GetSeatInfo × 2` 并发约 ~50ms,远低于循环逐 product 查的成本。要跳过这个探测就传具体 `--product`。
63
+ >
64
+ > **Team 桶静默规则**:caller 没绑 seat 时,team 桶在默认探测里**不出现**(避免 admin 没买企业版还看到 "no seat bound" 误导)。要看完整 4 桶(包括 "no seat bound" error 行)用 `--all` 强制。
65
+
66
+ ## 返回值
67
+
68
+ JSON 形态(顶层 `viewer` + `items` 数组):
69
+
70
+ ```json
71
+ {
72
+ "viewer": {
73
+ "auth_method": "sso",
74
+ "is_root": false,
75
+ "user_id": "12345",
76
+ "user_name": "alice",
77
+ "account_id": "210000",
78
+ "profile": "my-profile",
79
+ "tenant": "volc",
80
+ "region": "cn-beijing",
81
+ "project_name": "default"
82
+ },
83
+ "items": [
84
+ {
85
+ "product": "agent-plan",
86
+ "edition": "personal",
87
+ "tier": "medium",
88
+ "subscribed": true,
89
+ "periods": [
90
+ { "label": "5h", "used": 250, "total": 1000, "percent": 25, "reset_at": "2024-05-30T05:26:40+08:00" },
91
+ { "label": "weekly", "used": 12500, "total": 50000, "percent": 25, "reset_at": "2024-06-06T00:26:40+08:00" },
92
+ { "label": "monthly", "used": 50000, "total": 200000, "percent": 25, "reset_at": "2024-06-29T05:06:40+08:00" }
93
+ ]
94
+ },
95
+ {
96
+ "product": "agent-plan-team",
97
+ "edition": "team",
98
+ "tier": "large",
99
+ "seat_id": "seat-001",
100
+ "subscribed": true,
101
+ "periods": [...]
102
+ }
103
+ ]
104
+ }
105
+ ```
106
+
107
+ ### `viewer` 字段(身份摘要)
108
+
109
+ ```
110
+ viewer.auth_method = sso | aksk | apikey | none
111
+ viewer.is_root = SSO 主账号(JWT trn 带 :root)
112
+ viewer.user_id = SSO 子用户 ID(AK/SK / APIKey 通常空)
113
+ viewer.user_name = SSO 子用户名
114
+ viewer.account_id = JWT sub claim
115
+ viewer.profile = 当前激活 profile 名
116
+ viewer.tenant = volc
117
+ viewer.region = active region
118
+ viewer.project_name = active project
119
+ ```
120
+
121
+ **用途**:子用户跟主账号视图易混淆 — `viewer` 字段告诉用户/agent"这条数据是给谁看的"。具体匹配规则:
122
+ - 子用户 SSO 登录 → `is_root=false`,`user_id` / `user_name` 是子用户身份,看到的是这个子用户绑定的 seat
123
+ - 主账号 SSO 登录 → `is_root=true`,看到的是主账号视图(整个 account 下的订阅)
124
+ - AK/SK 登录 → `auth_method=aksk`,`user_id` 通常空,后端按 AK/SK 解析的 IAM 身份找数据
125
+ - APIKey 登录 → `auth_method=apikey`,数据范围跟 API Key 绑定的身份对齐
126
+
127
+ ### 字段说明
128
+
129
+ | 字段 | 说明 |
130
+ |---|---|
131
+ | `product` | `agent-plan` / `coding-plan` / `agent-plan-team` / `coding-plan-team`(跟 `profile.Type` 一致) |
132
+ | `edition` | `personal` / `team` |
133
+ | `tier` | 实际订阅档位(`small/medium/large/max` 或 `lite/pro`),由后端返;AgentPlan 才有,CodingPlan 通常缺 |
134
+ | `subscribed` | 当前身份是否有有效订阅。AgentPlan: `Result != nil`; CodingPlan: `QuotaUsage` 数组非空 |
135
+ | `periods[].label` | AgentPlan: `5h` / `weekly` / `monthly`(后端返的 `daily` 不展示)。CodingPlan: `session` / `weekly` / `monthly`,按 canonical order 稳定排序 |
136
+ | `periods[].used` / `total` | AgentPlan 给的是绝对值,CodingPlan 后端只返 `Percent`,`used`/`total` 字段缺(JSON 通过 `omitempty` 不出现) |
137
+ | `periods[].percent` | 已用百分比(0-100). AgentPlan 由 `used/total*100` 算; CodingPlan 直接透传后端 `Percent` |
138
+ | `periods[].reset_at` | 下次刷新时间,**RFC3339 北京时间(UTC+08:00)**。service 内部仍把 AgentPlan 后端 ms / CodingPlan 后端秒统一成 epoch ms,输出层再格式化;周期内无数据的 sentinel 不输出该字段 |
139
+ | `updated_at` | 仅 CodingPlan,后端 `UpdateTimestamp` 透传(epoch ms) |
140
+ | `error` | 该桶失败原因(per-bucket error isolation,一桶失败不挡其它桶)。team product NotImpl 也走这个字段 |
141
+
142
+ ## 错误处理
143
+
144
+ - **AccessDenied / 网络错误**: 写到对应 `items[].error`,其它桶不受影响,整体不阻塞
145
+ - **未订阅**: AgentPlan `Result=nil` → `subscribed: false, periods: []`; CodingPlan `QuotaUsage` 空 → 同样 `subscribed: false`
146
+ - **Team 订了但 caller 没绑 seat**: `subscribed: true` + `error: "no seat bound to caller for ..."`(区分于"未订阅"),传 `--seat <id>` 显式指定可绕过
147
+ - **typo product**: 不在 `agent-plan` / `coding-plan` / `*-team` 集合内 → ErrValidation 立即返,不发请求
148
+ - **`--all` + `--product` 同传**: ErrValidation 互斥
149
+ - **自动探全失败**: 上抛 `auto-discover subscriptions: <err>`(如 `MissingParameter.ResourceNames` 之类的后端拒绝),提示用户改用显式 `--product`
150
+
151
+ ## AI Agent 决策路径
152
+
153
+ - 用户问「我的套餐用了多少 / 还剩多少」→ `arkcli usage plan`(默认探所有订阅,一把拉全)
154
+ - 用户问「我有几个套餐」→ `arkcli usage plan --all`(展开所有 4 个桶,subscribed=true 的就是有的)
155
+ - 用户问「team 套餐 admin 视角看其他 seat 用量」→ `arkcli usage plan --product agent-plan-team --seat <id>`
156
+ - 用户问「为啥 plan 出了空 items」→ 大概率当前身份名下所有 product 都没订阅,转 [arkcli-pricing](../../arkcli-pricing/SKILL.md) 查 catalog 价格
157
+ - 用户问「按模型看我哪个模型用得多」→ 这条命令只给 quota 快照,**没有按模型的拆分**,转 [`usage plan-details`](arkcli-usage-plan-details.md)(仅 AgentPlan)
158
+
159
+ ## 调用面对齐
160
+
161
+ - AgentPlan personal: `/open/GetAFPUsage`(OpenAPI,AK/SK + SSO 都支持)。arkcli 用公网 OpenTOP 入口,不带 AgentPlan 前缀
162
+ - CodingPlan personal: `/open/GetCodingPlanUsage`(OpenAPI)
163
+ - AgentPlan team: `/open/GetSeatAFPUsage`(**公网 OpenAPI**,AK/SK + SSO 都可调)。arkcli 用公网 OpenTOP 不带 AgentPlan 前缀的入口
164
+ - CodingPlan team: `/open/GetSeatInfoUsage`(OpenAPI)
165
+ - 自动探的 `ListSubscribeTrade` payload(personal × 2);**企业版**不在 `ListSubscribeTrade` 暴露,改通过 `GetSeatInfo(Scene)` 探 caller seat 绑定状态
166
+ - Team SeatID 解析: `/open/GetSeatInfo` 不传 SeatID,后端按 caller 身份 + Scene 返绑定的 seat。**Scene 必须用 `agent_plan_enterprise`**(AgentPlan 企业版)或**空字符串**(CodingPlan 企业版,后端默认即 enterprise)— 早期错用 `agent_plan` / `coding_plan` 会返空 SeatID 不报错
@@ -0,0 +1,194 @@
1
+ # usage seats
2
+
3
+ > **前置条件:** 先阅读 [`../arkcli-shared/SKILL.md`](../../arkcli-shared/SKILL.md) 了解认证、全局参数和安全规则。
4
+
5
+ > **跟其它命令的区别:**
6
+ > - `usage plan` / `balance --type plan` — **caller 自己**的订阅余额(子用户视角看自己的 seat)
7
+ > - `usage seats` — **admin 视角** 列举团队下**所有 seat**(管理员看团队席位)
8
+ >
9
+ > 子用户调 `usage seats` 通常 `AccessDenied`(后端权限校验)。需要 admin / root SSO 身份。
10
+
11
+ ## 命令
12
+
13
+ ```bash
14
+ # 列出 AgentPlan 团队版下所有 seat (默认自动翻页直到末页)
15
+ arkcli usage seats --product agent-plan-team
16
+
17
+ # 列出 CodingPlan 团队版的所有 seat
18
+ arkcli usage seats --product coding-plan-team
19
+
20
+ # 按 BizInfo 档位过滤
21
+ arkcli usage seats --product agent-plan-team --biz-info large
22
+
23
+ # 按 BillingStatus 过滤(回收态准备清理)
24
+ arkcli usage seats --product agent-plan-team --billing-status Reclaimed
25
+
26
+ # 查特定子用户绑定的 seat
27
+ arkcli usage seats --product agent-plan-team --user-id 12345
28
+ arkcli usage seats --product agent-plan-team --user-name alice
29
+
30
+ # 多个用户(client-side fan-out 并行查 N 次再合并)
31
+ arkcli usage seats --product agent-plan-team --user-name alice --user-name bob --user-name charlie
32
+
33
+ # 跨字段组合 = AND (alice 名下的 + 状态是 Running 的)
34
+ arkcli usage seats --product agent-plan-team --user-name alice --billing-status Running
35
+
36
+ # 单页查询(关闭 auto-paginate)
37
+ arkcli usage seats --product agent-plan-team --page-number 1 --page-size 50
38
+
39
+ # === --with-usage:同时拉每个 seat 的用量 ===
40
+ arkcli usage seats --product agent-plan-team --with-usage # AFP 用量(used/total/percent)
41
+ arkcli usage seats --product coding-plan-team --with-usage # 仅 percent(CodingPlan 后端只暴露百分比)
42
+ ```
43
+
44
+ ## 参数
45
+
46
+ | 参数 | 必填 | 类型 | 说明 |
47
+ |---|---|---|---|
48
+ | `--product` | 是 | string | 团队版 plan id:`agent-plan-team` / `coding-plan-team`。**personal 不支持**(没 seat 概念) |
49
+ | `--biz-info` | 否 | string | 档位过滤:`small/medium/large/max`(AgentPlan)\|`lite/pro`(CodingPlan) |
50
+ | `--billing-status` | 否 | string slice | 计费状态(可重复):`Pending` / `Running` / `Expired` / `Reclaimed` |
51
+ | `--seat-status` | 否 | string | 席位状态:`Idle` / `Active`;`Idle` 表示未绑定,`Active` 表示已绑定 |
52
+ | `--user-id` | 否 | string slice | 按子用户 ID 过滤(可重复;>1 触发 client-side fan-out 并行查) |
53
+ | `--user-name` | 否 | string slice | 按子用户名字过滤(可重复;>1 触发 client-side fan-out 并行查) |
54
+ | `--seat-id` | 否 | string slice | 指定具体 SeatID(可重复;wire 原生 array,单次调用) |
55
+ | `--project` | 否 | string | 项目过滤;不传走 active profile project |
56
+ | `--page-size` | 否 | int | 单页大小,默认 100 |
57
+ | `--page-number` | 否 | int | 1-based 页码;**显式传则关闭 auto-paginate**,只拉单页 |
58
+ | `--sort-by` / `--sort-order` | 否 | string | 排序字段 / 升降序 |
59
+ | `--with-usage` | 否 | bool | **Team product only**:join 每个 seat 的用量。AgentPlan team 走 `ListSeatAFPUsage` 出 `afp_usage{plan_type, periods[5h/weekly/monthly with used/total/percent/reset_at]}`;CodingPlan team 走 `ListSeatInfoUsages` 出 `coding_usage{periods[session/weekly/monthly with percent/reset_at]}`。`reset_at` 输出 RFC3339 北京时间(UTC+08:00) |
60
+
61
+ ## 默认行为:auto-paginate
62
+
63
+ 不传 `--page-number` 时 service 层自动用 `NextToken` 翻页直到末页(最多 30 页 × 100 = 3000 seat 上限,触发上限会报错引导手动分页)。
64
+
65
+ ## 多值过滤语义(必读)
66
+
67
+ flag 之间是 **AND** 关系(每个 flag 是 narrowing filter,跟 SQL `WHERE` / kubectl `-l` 同),**同一个 flag 多值是 OR** 关系。
68
+
69
+ | 例子 | 语义 | wire 调用 |
70
+ |---|---|---|
71
+ | `--seat-id sa --seat-id sb` | seat ∈ {sa, sb} | 1 次,wire `Filter.SeatIDs:["sa","sb"]` 原生 array |
72
+ | `--user-name a --user-name b` | user = a OR user = b | **2 次并行**(client-side fan-out;wire `Filter.UserName` 单值不接 array) |
73
+ | `--seat-id sa --user-name a` | seat ∈ {sa} **AND** user = a | 1 次 |
74
+ | `--seat-id sa --user-name a --user-name b` | seat ∈ {sa} **AND** (user ∈ {a,b}) | 2 次并行,每次都带同一个 SeatIDs filter |
75
+ | `--user-name alice --billing-status Reclaimed` | user = alice **AND** billing = Reclaimed | 1 次 |
76
+
77
+ **等价 SQL**:`WHERE seat_id IN (...) AND user_name IN (...) AND billing_status IN (...)`。
78
+
79
+ ### 不会拿到的"并集" — 是刻意的
80
+
81
+ ```bash
82
+ # 不会返回 "seat sa 加上 alice 的所有 seat 的并集"
83
+ arkcli usage seats --seat-id sa --user-name alice
84
+ # 实际:只返回 sa(且必须属于 alice;不属于则 0 行)
85
+ ```
86
+
87
+ 如果真的想要"seat sa **或** alice 的 seat" 这种并集语义,跑两条命令客户端合并:
88
+
89
+ ```bash
90
+ { arkcli usage seats --product ... --seat-id sa
91
+ arkcli usage seats --product ... --user-name alice; } | jq -s '...'
92
+ ```
93
+
94
+ 故意不在 CLI 里隐式 OR — filter 的安全契约是"只能缩小结果",意外扩大容易导致误统计 / 误清理。
95
+
96
+ ### Fan-out 是什么
97
+
98
+ 只跟 wire 打交道时才需要懂这个细节:wire 上 `Filter.UserID / UserName` 是单值字段(传 array 会被 InvalidParameter 拒)。多用户场景 service 层起 N 个 goroutine 并行各发一次单值 RPC,客户端按 `SeatID` 去重合并。后果:
99
+
100
+ - **延迟** = `max(N 个并发的最慢一个)`,不是 sum(并行)
101
+ - **后端负担** = N 倍(用户传越多名字,RPC 越多)— 几十个用户没问题,几百个建议改 `--all` + 客户端再筛
102
+ - **一致性** = 多次调用之间有秒级时间窗,理论上有 race(seat 此刻被解绑),admin 盘点场景可忽略
103
+ - 任一 user 查询失败整体报错(标明哪个 user 失败),不返回部分结果
104
+
105
+ ## 返回值
106
+
107
+ ```json
108
+ {
109
+ "items": [
110
+ {
111
+ "seat_id": "seat-001",
112
+ "account_id": "210000",
113
+ "project_name": "default",
114
+ "biz_info": "large",
115
+ "billing_status": "Running",
116
+ "seat_status": "Active",
117
+ "identity_type": "IAMUser",
118
+ "user_id": "12345",
119
+ "user_name": "alice",
120
+ "instance_id": "inst-xxx",
121
+ "order_time": 1700000000000,
122
+ "expired_time": 1717000000000,
123
+ "bind_count": 1,
124
+ "create_time": 1700000000000,
125
+ "update_time": 1716000000000
126
+ }
127
+ ],
128
+ "total": 30,
129
+ "biz_summaries": [
130
+ { "biz_info": "large", "total_count": 30, "active_count": 25 }
131
+ ]
132
+ }
133
+ ```
134
+
135
+ ### 字段说明
136
+
137
+ | 字段 | 含义 |
138
+ |---|---|
139
+ | `seat_id` | 唯一 seat 标识 |
140
+ | `biz_info` | 档位 |
141
+ | `billing_status` | 计费状态(`Running` 才计费;`Reclaimed` 已回收) |
142
+ | `seat_status` | 席位本身状态(跟 billing 解耦,例如 admin 主动停用) |
143
+ | `user_id` / `user_name` | **绑定的子用户**(后端原 schema 是 `IdentityId` / `IdentityDetail`,arkcli 改名) |
144
+ | `bind_count` | 本月绑定换绑次数 |
145
+ | `order_time` / `expired_time` | 订单 / 过期 epoch ms |
146
+ | `total` | 后端口径下满足 filter 的总数 |
147
+ | `biz_summaries[]` | 按档位的 summary(`large` 档买了 30 个,激活 25 个) |
148
+
149
+ ## Admin 工作流场景
150
+
151
+ **场景 1**:看团队整体订阅情况
152
+ ```bash
153
+ arkcli usage seats --product agent-plan-team
154
+ # 看 biz_summaries 知道每档买了几个、激活了几个
155
+ ```
156
+
157
+ **场景 2**:找到回收态(过期)的 seat 准备处理
158
+ ```bash
159
+ arkcli usage seats --product agent-plan-team --billing-status Reclaimed
160
+ ```
161
+
162
+ **场景 3**:查特定子用户绑了什么
163
+ ```bash
164
+ arkcli usage seats --product agent-plan-team --user-name alice
165
+ ```
166
+
167
+ **场景 4**:查特定 SeatID 的当前状态
168
+ ```bash
169
+ arkcli usage seats --product agent-plan-team --seat-id seat-001 --seat-id seat-002
170
+ ```
171
+
172
+ ## 常见错误
173
+
174
+ | 错误 | 原因 | 处理 |
175
+ |---|---|---|
176
+ | `--product is required and must be a team plan` | 没传 / 传了 personal | 传 `agent-plan-team` 或 `coding-plan-team` |
177
+ | `invalid --seat-status` / `invalid --billing-status` | 状态值不在上述枚举中 | 改用 help 列出的合法值;非法值不会退化成全量查询 |
178
+ | `AccessDenied` | 调用者不是 admin | 让 admin 跑;或子用户改用 `usage plan` 看自己的那个 seat |
179
+ | `exceeded auto-paginate limit (30 pages)` | 团队规模 > 3000 seat | 用 `--page-number` 手动分页 |
180
+
181
+ ## 跟其它命令的关系
182
+
183
+ - 子用户视角看**自己**绑的 seat → [`usage plan`](arkcli-usage-plan.md) / [`usage balance --type plan`](arkcli-usage-balance.md)
184
+ - Admin 想看团队**用量明细**(不只 seat 列表) → [`usage plan-details --product agent-plan-team`](arkcli-usage-plan-details.md)
185
+ - 查模型免费额度(账户级) → [`usage balance --type free-quota`](arkcli-usage-balance.md)
186
+
187
+ ## 调用面对齐
188
+
189
+ - wire path:`/open/ListSeatInfos`(OpenAPI)。`--with-usage` 增量调:
190
+ - AgentPlan team → `/open/ListSeatAFPUsage`(admin 列全 + 翻页)
191
+ - CodingPlan team → `/open/ListSeatInfoUsages`(SeatIDs 必传,从 ListSeatInfos 收齐后批量喂,单次 ≤ 1000)
192
+ - 翻页用 `NextToken`(cursor)而不是 PageNum
193
+ - `IdentityId` / `IdentityDetail` 字段在控制台前端也叫 `user_id` / `user_name`,arkcli 跟前端列名对齐而非 wire 字段名
194
+ - `ListSeatAFPUsage` 用的是 page-based 分页(`PageNumber/PageSize`,后端约束 PageSize 10-100),跟 `ListSeatInfos` 的 cursor 翻页不同;service 层独立翻页拉全后再 join
@@ -0,0 +1,195 @@
1
+ # usage stats
2
+
3
+ > **前置条件:** 先阅读 [`../arkcli-shared/SKILL.md`](../../arkcli-shared/SKILL.md) 了解认证、全局参数和安全规则。
4
+
5
+ > **⚠️ 数据时效:** `usage stats` 数据来自上游 BFF 聚合管道,**有 5–30 分钟延迟**,定位为「日级 / 聚合分析」。**不适合**实时预算监控、限流、实时告警。这类实时控制场景请直接读推理命令返回的 per-request `.usage` 字段([arkcli-chat](../../arkcli-chat/SKILL.md) / [arkcli-gen](../../arkcli-gen/SKILL.md)),零延迟、按调用计量。
6
+
7
+ 查询指定时间范围内的 ARK 推理用量,支持按接入点、模型、API Key 等多维度过滤与分组。
8
+
9
+ **先核对交付单位:** 用户问已发生调用的实际花费、人民币或用量折算费用时,先转 [Billing](../../arkcli-billing/SKILL.md) 查实际应付;本页只提供数量统计。目录报价转 [Pricing](../../arkcli-pricing/SKILL.md);只有用户明确要按单价估算/预测时,才组合数量与价格并标为估算。个人数量查询失败不允许换成账号全量后乘单价来补一个“我的费用”。
10
+
11
+ **语音模型不支持**:TTS / ASR / 配音 / 播客 / 音色 / 实时语音交互,或模型名命中 `doubao-seed-tts-*`、`doubao-seed-asr-*`、`seedasr-*` 时,不要用 `usage stats --model` 查询。广场可搜不代表 usage 管道有可查用量;应回到 `arkcli models search <keyword>` 的可发现说明。
12
+
13
+ ## 命令
14
+
15
+ ```bash
16
+ # 查询当日用量(--start 必填,缺失会报 required flag(s) "start" not set;查今天就把 start 填成今天)
17
+ arkcli usage stats --start <YYYY-MM-DD>
18
+
19
+ # 查询本月按天用量
20
+ arkcli usage stats --start 2025-09-01 --end 2025-09-30
21
+
22
+ # 按小时粒度查询
23
+ arkcli usage stats --start 2025-09-17 --end 2025-09-19 --interval Hour --endpoint ep-20xxxx-xxx
24
+
25
+ # 查询指定模型的用量
26
+ arkcli usage stats --start 2025-09-01 --end 2025-09-30 --model doubao-pro-4k
27
+
28
+ # 按模型分组查看所有模型用量
29
+ arkcli usage stats --start 2025-09-01 --end 2025-09-30 --by model
30
+
31
+ # 按接入点分组
32
+ arkcli usage stats --start 2025-09-01 --end 2025-09-30 --by endpoint
33
+
34
+ # 同时按模型和接入点分组
35
+ arkcli usage stats --start 2025-09-01 --end 2025-09-30 --by model,endpoint
36
+
37
+ # 按 API Key 过滤
38
+ arkcli usage stats --start 2025-09-01 --end 2025-09-30 --apikey ak-xxxxxxxx
39
+
40
+ # 使用绑定目标 Project 的 profile 查询
41
+ arkcli --profile my-project-profile usage stats --start 2025-09-01 --end 2025-09-30
42
+
43
+ # 显示按计费窗口拆分的明细(每条记录附带所属计费窗口)
44
+ arkcli usage stats --start 2025-09-01 --end 2025-09-30 --show-window-detail
45
+
46
+ # ─── “我的用量” 入口(AI Agent 高频调用) ───
47
+ # 默认走 endpoint 维度:列出我创建的全部 Endpoint,合并查它们的用量
48
+ arkcli usage stats --start <YYYY-MM-DD> --mine
49
+
50
+ # 显式 endpoint 维度(语义同 --mine)
51
+ arkcli usage stats --start <YYYY-MM-DD> --mine --mine-by=endpoint
52
+
53
+ # apikey 维度:筛选本人 active APIKey 的非空掩码后缀,分别查后合并
54
+ arkcli usage stats --start 2026-05-01 --end 2026-05-08 --mine --mine-by=apikey
55
+
56
+ # 按 APIKey 后缀模糊匹配(与 console "AuthToken ValueLike" 对齐)
57
+ arkcli usage stats --start <YYYY-MM-DD> --apikey-suffix d9bcce38dab0
58
+ ```
59
+
60
+ ## 参数
61
+
62
+ | 参数 | 必填 | 类型 | 说明 |
63
+ |------|------|------|------|
64
+ | `--start` | **是** | string | 开始日期,YYYY-MM-DD 格式 |
65
+ | `--end` | 否 | string | 结束日期,YYYY-MM-DD 格式(与开始日期间隔不超过 31 天),默认当日 |
66
+ | `--interval` | 否 | string | 查询粒度:`Day`(默认)或 `Hour` |
67
+ | `--endpoint` | 否 | string | 按接入点 ID 过滤 |
68
+ | `--model` | 否 | string | 按模型名称过滤,输出中附加 `ModelName`、`ModelUnitID` 列 |
69
+ | `--apikey` | 否 | string | 按 API Key 完整值过滤(Values 精确匹配,兼容旧用法) |
70
+ | `--apikey-suffix` | 否 | string | 按 API Key 后缀过滤(ValueLike 模糊匹配,与 console 行为一致;推荐传末 12 位) |
71
+ | `--mine` | 否 | bool | 限定为当前登录身份名下的资源;与 `--mine-by` 配合使用。 |
72
+ | `--mine-by` | 否 | string | `--mine` 的维度:`endpoint`(默认)= 我创建的所有 Endpoint;`apikey` = 本人 active APIKey 中带可用掩码后缀的项。 |
73
+ | `--by` | 否 | string | 追加分组维度,逗号分隔。可选值:`model`、`endpoint`、`apikey` |
74
+ | `--show-window-detail` | 否 | bool | 输出按计费窗口拆分的明细。**与 `SplitByWindows` 互斥**(后者目前仅通过 `arkcli api GetInferenceUsage` raw 调用使用) |
75
+
76
+ ### --mine 行为细节
77
+
78
+ **火山:**
79
+ - **要求 SSO 子用户登录**:root 账号或 AK/SK 登录会拒绝执行(会引导你重新 `arkcli auth login volc-sso`)
80
+ - **互斥规则**:`--mine --mine-by=endpoint` 与 `--endpoint` 互斥;`--mine --mine-by=apikey` 与 `--apikey` / `--apikey-suffix` 互斥
81
+ - **`--mine-by=endpoint`**:通过 `sys:ark:createdBy` Tag 拉出我创建的全部 Endpoint,单次请求合并查(强制 `--page-all`)
82
+ - 成功返回空 `records` 且 `data_count=0`,或明确没有本人 Endpoint 时,保留其他条件改查 `arkcli usage stats <日期参数> --mine --mine-by=apikey` 一次;这不证明本人没有其他调用。
83
+ - 保留 `--mine`;范围处理按下表执行,错误提示不能代替用户确认。
84
+ - **`--mine-by=apikey`**:列出本人 APIKey,再筛出 Active 且掩码后缀非空的项,**为每个 key 串行发一次请求**(ValueLike 是单值),客户端合并 records;`totals` 字段是合并后的合计
85
+
86
+ ### 空结果与资源筛选失败的处理
87
+
88
+ 先保留原命令的 exit code、stderr 和完整 JSON,按下表判断;不要把解析失败或资源筛选失败写成“用量为 0”。
89
+
90
+ | 实际结果 | 能说明什么 | 下一步 |
91
+ | --- | --- | --- |
92
+ | 命令成功,`records` 为空且 `data_count=0` | 该次范围内未返回明细 | 本人 endpoint 维度可按相同日期、模型、分组、粒度及 Profile/Project 改查本人 apikey 维度一次 |
93
+ | `no endpoints found ... try --mine-by=apikey or omit --mine` | 当前本人 Endpoint 筛选集合为空,尚未取得该范围的用量明细 | 只可尝试 `--mine --mine-by=apikey`;错误里的 `omit --mine` 是另一个命令范围,不代表用户同意扩大查询 |
94
+ | `no active API keys found under your account` | 本次 `ListPersonalKeys` 结果经 Active 和非空 Key 后缀筛选后集合为空 | 报告“未取得本人范围用量”,保留未知项;不能据此说整个账号无 Key、没有调用或费用为零 |
95
+ | `records` 有行但 `totals` 为 0 | 返回了记录;指标可能为真实零或解析有误 | 对照记录、字段及数值类型,不按空结果切换范围 |
96
+ | 鉴权、权限、网络、解析等其他错误 | 查询失败,未得到可信结果 | 按实际错误处理;不删除本人或资源过滤来绕过失败 |
97
+
98
+ 第二层成功为空或筛选失败时,分别说明已查范围与缺口。只有用户另行明确要求查询整个账号,才移除 `--mine` / `--mine-by`,保持其余条件并标“账号全量(可能包含其他用户)”。用户拒绝、未回复或当前任务无法交互时,停在原范围;不能把“我会查询全量”这样的单方面告知当成确认。
99
+
100
+ Usage 的本人 Key 过滤读取 Active 项的 `Key` 掩码后缀;Billing 的同名维度读取 Active 项的非空 `SID`,两者的筛选依据不同,集合可能不同。Usage 筛选失败不能代替 Billing 的实际结果。用户确实问费用时,按 Billing 契约直接查询该金额范围;不要为了拿后缀去获取明文 Key、创建/轮换 Key 或修改 Profile。
101
+
102
+ 近期空结果可核对真实调用日/时区、聚合延迟、平台或套餐口径、身份、Project 和 Key 掩码归属。移除分组可用于检查 totals,但不顺便删身份或资源过滤;归属核对见 [Key 查询](../../arkcli-auth/references/api-key-query.md)。展示已核对项与未知项,不因空结果自动切账号、登录、换 Key 或查另一个计费桶。
103
+
104
+ ### --by 说明
105
+
106
+ `--by` 用于在不过滤的情况下,将指定维度作为输出列返回并按维度分组:
107
+
108
+ | 值 | 追加的输出列 |
109
+ |----|------------|
110
+ | `model` | `ModelName`、`ModelUnitID` |
111
+ | `endpoint` | `ModelEndpoint` |
112
+ | `apikey` | `AuthToken` |
113
+
114
+ > `--model` 与 `--by model` 的区别:前者过滤出指定模型的数据,后者返回所有模型并按模型分组。两者都会在输出中附加 `ModelName` 和 `ModelUnitID` 列。
115
+
116
+ ## 返回值
117
+
118
+ JSON 格式:
119
+
120
+ ```json
121
+ {
122
+ "fields": [
123
+ { "name": "AccountID", "type": "BIGINT" },
124
+ { "name": "Day", "type": "DATE" },
125
+ { "name": "InputTokens", "type": "BIGINT" },
126
+ { "name": "CacheTokensHit", "type": "BIGINT" },
127
+ { "name": "OutputTokens", "type": "BIGINT" },
128
+ { "name": "TotalTokens", "type": "BIGINT" },
129
+ { "name": "ReqCnt", "type": "BIGINT" },
130
+ { "name": "ImageCount", "type": "BIGINT" }
131
+ ],
132
+ "records": [{
133
+ "Day": "2025-09-01",
134
+ "ModelName": "<实际模型名>",
135
+ "ModelEndpoint": "<实际 Endpoint ID>",
136
+ "AuthToken": "****example",
137
+ "ProjectName": "<实际 Project>",
138
+ "BillingStatus": "<实际结算状态>",
139
+ "InputTokens": "382",
140
+ "OutputTokens": "5317",
141
+ "TotalTokens": "5699",
142
+ "ReqCnt": "11",
143
+ "CacheTokensHit": "0",
144
+ "ImageCount": "4"
145
+ }],
146
+ "totals": {
147
+ "InputTokens": "382",
148
+ "OutputTokens": "5317",
149
+ "TotalTokens": "5699",
150
+ "ReqCnt": "11",
151
+ "CacheTokensHit": "0",
152
+ "ImageCount": "4"
153
+ },
154
+ "data_count": 1
155
+ }
156
+ ```
157
+
158
+ > `totals` 是把 records 中所有 metric 列(`InputTokens` / `OutputTokens` / `TotalTokens` / `ReqCnt` / `CacheTokensHit` / `ImageCount`)跨行加和的结果。维度列(`AccountID` / `Day` / `ModelEndpoint` / `AuthToken` / `ProjectName` / `BillingStatus`)**不会**被加和。AI Agent 答"我今天用了多少 token"直接读 `totals.TotalTokens`;要按维度拆走 `records`。
159
+
160
+ 维度列出现条件:
161
+
162
+ | 列名 | 出现条件 |
163
+ |------|---------|
164
+ | `Day` / `Hour` | 对应查询粒度;以本次 `fields` 和 `records` 为准 |
165
+ | `ModelEndpoint` | 使用了 `--endpoint`、`--by endpoint` 或 endpoint 维度的 `--mine` |
166
+ | `ModelName` | 使用了 `--model` 或 `--by model` |
167
+ | `ModelUnitID` | 使用了 `--model` 或 `--by model` |
168
+ | `AuthToken` | Key 过滤/分组或 apikey 维度的 `--mine`;掩码不是完整凭证 |
169
+
170
+ 上面是带维度的结构示例,不保证每次返回所有列;以 `fields` 声明及实际键为准。指标可能是数字字符串,聚合前验证数值类型,不做字符串拼接;缺失字段不是数值 0。不要把 `AuthToken` 写成旧文案的 `ApiKey`,也不要把 PascalCase 改成 snake_case。动态 JSON 参数使用 [Raw API 的安全拼装方式](../../arkcli-api-explorer/references/arkcli-api.md),不手写转义拼用户输入。
171
+
172
+ ## 常见错误
173
+
174
+ | 错误 | 原因 | 处理方式 |
175
+ |------|------|---------|
176
+ | `not logged in` | 未认证 | 运行 `arkcli auth login volc-sso` 重新建立 Volc 身份 |
177
+ | `AuthFailure` / 401 | AK/SK 或 SSO token 无效 | 重新登录 |
178
+ | 时间范围超过 31 天 | API 限制 | 拆分为多次查询 |
179
+ | 返回空 records | 当前范围未返回匹配数据;不等于权限正常或用量必为零 | 核对时间、身份和过滤条件;保留用户指定范围,扩大范围前先确认,不自动去掉过滤 |
180
+
181
+ ## 注意事项
182
+
183
+ - **`--start` 必填**:缺失直接报 `required flag(s) "start" not set`,CLI **不会**默认今天;用户未给任何日期时,默认 `--start`=今天、`--end` 缺省同今天再跑,不要裸跑省略 `--start`
184
+ - **数据有 5–30 分钟延迟**:上游聚合管道行为,arkcli 仅透传,不可缩短;做实时预算 / 限流 / 告警请改走 per-request `.usage`,不要轮询本接口
185
+ - **语音模型不在本命令支持范围**:不要为 TTS / ASR / 语音交互构造 `--model`、`--by model` 或 API Key fallback;当前只说明 arkcli 不支持语音模型用量查询
186
+ - arkcli 自动过滤掉 `free_for_coding_plan` 的用量行,始终保留有 `ModelUnitID` 的行
187
+ - `--interval Hour` 时返回的 `Hour` 字段为 STRING 类型
188
+ - `stats` 的开始/结束跨度须严格小于 31 天;更长请求按原时间范围分片并核对边界,不能默默只查最近 30 天
189
+
190
+ ## 参考
191
+
192
+ - [arkcli-usage](../SKILL.md) -- usage skill 概览
193
+ - [arkcli-chat](../../arkcli-chat/SKILL.md) -- 实时 / per-request 用量:`+chat` 返回里的 `.usage` 字段
194
+ - [arkcli-gen](../../arkcli-gen/SKILL.md) -- 实时 / per-request 用量:`+gen` 图片/视频任务返回里的 `.usage` 字段
195
+ - [arkcli-shared](../../arkcli-shared/SKILL.md) -- 认证和全局参数
@@ -0,0 +1,30 @@
1
+ # 用量与额度输出回归
2
+
3
+ 以真实 CLI JSON 与最终正文/卡片对账;先核验非空样例,再检查缺字段与失败,不能仅按关键词判通过。
4
+
5
+ | 场景 | 证据 | 验收 |
6
+ | --- | --- | --- |
7
+ | 按品牌请求次数(163601) | totals=34;豆包各记录合计 31;另一个品牌 3 | 目标品牌为 31;查询主语“我想查询”不等于本人创建资源限定;不从混合 totals 取品牌总数 |
8
+ | 团队/个人同档位(163583) | Agent Plan personal Medium 5h total=10000;team Medium 5h total=20000,monthly=200000 | 每个 product/edition/seat 与周期分别展示;团队卡片 5h=20000;正文/卡片的 used/total/percent/reset_at 一致 |
9
+ | Coding personal/team | 对应条目仅含 percent 与 reset_at,无绝对 used/total | 仅报告已有百分比与重置;不借 Agent 档位推算绝对 Token、次数或额度 |
10
+ | 缺字段/失败/零消费 | SKU 失败项、缺 total、另一个 SKU used=0 各一项 | 分别呈现未知/失败/真实零消耗,不相互填充;不把当前快照反推成历史限额不可能发生 |
11
+
12
+ 覆盖 Agent/Coding × personal/team 四种桶;其字段契约来自 `internal/service/usage/types.go` 与 `plan.go`。线上保持原题、实际当前值及冻结 CLI,不将本页固定数值注入用户请求。
13
+
14
+ ## 实际费用入口与本人范围
15
+
16
+ 以下是独立回归的验收契约,不把基线历史金额或固定日期注入原题。原题按原实验集 query 原样提交;日期、资源与费用从该次真实工具证据核对。静态文字检查和命令成功不能代替 Agent 实际执行路径。
17
+
18
+ | 场景 | 输入 / 证据 | 验收 |
19
+ | --- | --- | --- |
20
+ | 本人已发生用量折算费用(163678) | 使用原题;冻结 4363 的失败证据:先 usage/pricing、两种本人筛选失败后去掉 mine、最终给单价估算 | 金额意图先读取 Billing 并查询实际应付;按本轮当前自然周及 T+1 说明范围;不以账号混合 Token 乘目录价冒充个人实际花费。费用/范围无法查询时明确未知,不编造历史 GT 数值 |
21
+ | 目录询价控制 | “某模型每百万 Token 多少钱”且未问已发生消费 | 走 Pricing 的真实目录价及计量单位;不误进个人账单,不发推理请求 |
22
+ | 用户明确要求估算 | 用户指定模型、输入/输出数量与范围,要求按单价预测成本 | 可组合 Usage/Pricing 或使用用户给出的数量;读取实际字段并数值计算,标估算,披露免费额度、缓存、折扣与结算差异;不把估算称为实际应付 |
23
+ | 纯数量控制 | “本周我用了多少 Token/请求” | 使用正确的 Usage 数量入口;金额路由不抢占数量查询,不为统计生成新调用 |
24
+ | 无本人 Endpoint | CLI 非零退出且明确 `no endpoints found ... omit --mine` | 只可尝试本人 apikey 维度一次,其余条件保持;不把 CLI 提示当扩大范围的确认 |
25
+ | Key selector 为空但 SID 存在 | 已知非空 fixture:本人 Active 项有 SID,但 Key 掩码后缀为空;另一个 Active 项后缀非空作为对照 | 区分 Usage 后缀筛选与 Billing SID 筛选;不能从 Usage 错误推出账号无 Key、无调用或费用为零,不导出明文/新建 Key 来修统计 |
26
+ | 无交互回复的本人范围 | endpoint 与 apikey 均未取到结果;用户没有明确批准账号范围 | 交付已查范围、实际错误及未知项;不会自行删除 mine,不以“我会查全量”的通知代替用户确认 |
27
+ | 用户另行指定账号全量 | 先前个人查询缺口后,用户明确要求全账号 | 才扩大范围并标注可能包含其他用户;保留原日期、模型等条件,不再称个人用量 |
28
+ | 空、真实零与错误 | 成功空 records;非空记录且指标为0;非零退出/解析失败,各一项 | 三者分别呈现,不用同一个“无消费”结论;前两项对照验证读取器确实能区分非空和空 |
29
+
30
+ 源码依据:`shortcuts/usage/stats.go` 的 `applyMine` / `listMyAPIKeySuffixes`、`shortcuts/billing/list.go` 的 `resolveMyAPIKeySIDs`。新候选须在真实挂载后验证路由及范围;本页的固定 fixture 仅用于解释和校准,不能充当云端查询结果。
package/README.md DELETED
@@ -1,3 +0,0 @@
1
- # Temporary Holding Version
2
-
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.