siluzan-tso-cli 1.1.13 → 1.1.14-beta.10

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 (114) hide show
  1. package/README.md +2 -3
  2. package/assets/siluzan-ads/references/hosted-automation-user-catalog.md +40 -0
  3. package/dist/index.js +371 -55
  4. package/dist/skill/SKILL.md +78 -37
  5. package/dist/skill/_meta.json +2 -2
  6. package/dist/skill/references/account-analytics.md +69 -2
  7. package/dist/skill/references/accounts.md +8 -5
  8. package/dist/skill/references/clue.md +5 -0
  9. package/dist/skill/references/finance.md +9 -5
  10. package/dist/skill/references/forewarning.md +7 -0
  11. package/dist/skill/references/google-ads-rules/google-ads-campaign-optimization.md +3 -2
  12. package/dist/skill/references/google-ads.md +123 -101
  13. package/dist/skill/references/hosted-automation-monitoring-json.md +94 -0
  14. package/dist/skill/references/hosted-automation-optimize-ab-winner.md +69 -0
  15. package/dist/skill/references/hosted-automation-optimize-index.md +32 -0
  16. package/dist/skill/references/hosted-automation-optimize-scale.md +99 -0
  17. package/dist/skill/references/hosted-automation-optimize-weak-downbid.md +94 -0
  18. package/dist/skill/references/hosted-automation-scenarios.md +23 -0
  19. package/dist/skill/references/hosted-automation-self-control.md +216 -0
  20. package/dist/skill/references/hosted-automation-user-catalog.md +40 -0
  21. package/dist/skill/references/open-account-google-ui.md +0 -6
  22. package/dist/skill/references/reporting.md +4 -2
  23. package/dist/skill/references/setup.md +5 -5
  24. package/dist/skill/references/tips.md +6 -0
  25. package/dist/skill/references/tso-home.md +1 -1
  26. package/dist/skill/references/workflows.md +14 -1
  27. package/dist/skill/report-templates/google-account-diagnosis-report.md +1 -1
  28. package/dist/skill/report-templates/google-period-report.md +1 -0
  29. package/dist/skill/scripts/install.ps1 +2 -2
  30. package/dist/skill/scripts/install.sh +2 -2
  31. package/eval/cases/accounts-entityid-vs-mediaccustomerid.scenario.json +23 -0
  32. package/eval/cases/accounts-mcc-bind-inquiry.scenario.json +12 -0
  33. package/eval/cases/accounts-single-balance-not-bulk.scenario.json +23 -0
  34. package/eval/cases/budget-display-not-raw-micros.scenario.json +17 -0
  35. package/eval/cases/clue-meta-leads-json.scenario.json +23 -0
  36. package/eval/cases/clue-tiktok-leads-json.scenario.json +20 -0
  37. package/eval/cases/destructive-account-delink-needs-confirm.scenario.json +15 -0
  38. package/eval/cases/destructive-forewarning-delete-needs-confirm.scenario.json +15 -0
  39. package/eval/cases/destructive-invoice-apply-needs-confirm.scenario.json +15 -0
  40. package/eval/cases/destructive-unshare-needs-confirm.scenario.json +9 -0
  41. package/eval/cases/finance-invoice-info-list.scenario.json +17 -0
  42. package/eval/cases/forewarning-list-google.scenario.json +20 -0
  43. package/eval/cases/google-ads-no-structural-without-confirm.scenario.json +12 -0
  44. package/eval/cases/google-analysis-keywords-route.scenario.json +23 -0
  45. package/eval/cases/hosted-sop-cpa-spike-downbid.scenario.json +14 -0
  46. package/eval/cases/hosted-sop-daily-budget-circuit-breaker.scenario.json +13 -0
  47. package/eval/cases/hosted-sop-empty-spend-pause-p1.scenario.json +14 -0
  48. package/eval/cases/human-p1-multiturn.scenario.json +17 -0
  49. package/eval/cases/meta-single-balance-not-bulk.scenario.json +26 -0
  50. package/eval/cases/open-account-bing-noninteractive.scenario.json +13 -0
  51. package/eval/cases/open-account-google-noninteractive.scenario.json +12 -0
  52. package/eval/cases/open-account-tiktok-license-file.scenario.json +12 -0
  53. package/eval/cases/optimize-list-by-account.scenario.json +17 -0
  54. package/eval/cases/p1-single-account-profile.scenario.json +20 -0
  55. package/eval/cases/p2-balance-scan-bulk.scenario.json +18 -0
  56. package/eval/cases/p3-accounts-digest.scenario.json +20 -0
  57. package/eval/cases/p4-period-report-window.scenario.json +17 -0
  58. package/eval/cases/report-list-google.scenario.json +20 -0
  59. package/eval/cases/report-push-list-google.scenario.json +20 -0
  60. package/eval/cases/reporting-vs-account-analytics-routing.scenario.json +13 -0
  61. package/eval/cases/setup-login-or-env.scenario.json +12 -0
  62. package/eval/cases/setup-siluzan-data-permission-env.scenario.json +19 -0
  63. package/eval/cases/skill-async-poll-guidance.scenario.json +9 -0
  64. package/eval/cases/skill-optimize-vs-google-ads-distinction.scenario.json +13 -0
  65. package/eval/cases/tiktok-bc-bind-inquiry.scenario.json +12 -0
  66. package/eval/cases/time-range-must-ask.scenario.json +16 -0
  67. package/eval/cases/time-range-user-delegates-default.scenario.json +17 -0
  68. package/eval/cases/tips-json-filtering.scenario.json +12 -0
  69. package/eval/cases/tips-large-json-pagination.scenario.json +19 -0
  70. package/eval/cases/uj-ad-bluetooth-keywords-exclude-cheap-free.scenario.json +9 -0
  71. package/eval/cases/uj-ad-keywords-camping-tent-outdoor-plan.scenario.json +9 -0
  72. package/eval/cases/uj-ad-outdoor-campgear-search-plan.scenario.json +12 -0
  73. package/eval/cases/uj-analytics-30d-pdf-campaign-device-geo.scenario.json +29 -0
  74. package/eval/cases/uj-analytics-compare-google-tiktok-last-month-roi.scenario.json +17 -0
  75. package/eval/cases/uj-analytics-google-weekly-trends-campaigns-keywords.scenario.json +20 -0
  76. package/eval/cases/uj-analytics-report-push-weekly-email.scenario.json +12 -0
  77. package/eval/cases/uj-finance-invoice-records-this-month.scenario.json +20 -0
  78. package/eval/cases/uj-life-newbie-siluzan-google-end-to-end.scenario.json +13 -0
  79. package/eval/cases/uj-ops-google-accounts-list-normal.scenario.json +23 -0
  80. package/eval/cases/uj-ops-google-yesterday-spend-conversions.scenario.json +23 -0
  81. package/eval/cases/uj-ops-open-google-b2c-usd-shenzhen.scenario.json +13 -0
  82. package/eval/cases/uj-ops-pause-worst-adgroup-confirm.scenario.json +12 -0
  83. package/eval/cases/uj-ops-tiktok-leads-last-week.scenario.json +23 -0
  84. package/eval/cases/uj-patrol-all-media-balance-stats-forewarning.scenario.json +9 -0
  85. package/eval/cases/uj-patrol-cpc-spike-adgroups-over-15.scenario.json +18 -0
  86. package/eval/cases/uj-patrol-forewarning-create-daily-cap-3000.scenario.json +12 -0
  87. package/eval/cases/uj-patrol-forewarning-trigger-records.scenario.json +23 -0
  88. package/eval/cases/uj-patrol-google-balances-low.scenario.json +20 -0
  89. package/eval/cases/uj-roi-full-google-account-diagnosis.scenario.json +9 -0
  90. package/eval/cases/uj-roi-keywords-high-cpa-low-cvr-triage.scenario.json +9 -0
  91. package/eval/cases/uj-roi-optimize-records-then-execute-cautiously.scenario.json +20 -0
  92. package/eval/cases/uj-roi-search-terms-add-negative-keywords.scenario.json +23 -0
  93. package/eval/stub-fixtures/accounts-digest.json +33 -0
  94. package/eval/stub-fixtures/ad-campaigns.json +14 -0
  95. package/eval/stub-fixtures/balance-meta.json +6 -0
  96. package/eval/stub-fixtures/balance-scan.json +21 -0
  97. package/eval/stub-fixtures/balance.json +6 -0
  98. package/eval/stub-fixtures/clue-meta.json +7 -0
  99. package/eval/stub-fixtures/clue-tiktok.json +7 -0
  100. package/eval/stub-fixtures/forewarning-create-ok.json +1 -0
  101. package/eval/stub-fixtures/forewarning-records.json +7 -0
  102. package/eval/stub-fixtures/generic-ok.json +1 -0
  103. package/eval/stub-fixtures/google-analysis-search-terms.json +10 -0
  104. package/eval/stub-fixtures/google-analysis.json +7 -0
  105. package/eval/stub-fixtures/invoice-billable.json +7 -0
  106. package/eval/stub-fixtures/invoice-info-list.json +13 -0
  107. package/eval/stub-fixtures/invoice-list.json +10 -0
  108. package/eval/stub-fixtures/list-accounts.json +13 -0
  109. package/eval/stub-fixtures/optimize-list.json +7 -0
  110. package/eval/stub-fixtures/report-push-list.json +7 -0
  111. package/eval/stub-fixtures/stats.json +9 -0
  112. package/package.json +7 -2
  113. package/scripts/postinstall.mjs +27 -2
  114. package/dist/skill/references/open-account-by-media.md +0 -61
@@ -32,6 +32,7 @@
32
32
  > - 若当前会话中尚未阅读上述任一文件,AI 必须先主动阅读,再继续下一步流程,而不是直接生成广告计划或文案。
33
33
  > - 在首次阅读后,AI 需用自己的话向用户**简要复述**上述文档中与本次任务强相关的 3~5 条关键合规/策略要点,并询问用户是否有本地特殊限制需要补充。
34
34
  > - 后续生成的关键词、文案、出价与结构,必须**显式遵守这些规则**;一旦与规则冲突,应以规则优先,并向用户说明原因(例如:某些词因合规或商标问题被自动剔除)。
35
+ > - **方案阶段措辞**:输出结构/投放方案时,用「方案草案 / 结构蓝图 / 待你确认后再执行」等表述;**避免**「可立即执行 / 拿到参数就立刻跑命令」等暗示可跳过用户确认的说法。回复开头宜有一行**已读规则文档清单**(本 `google-ads.md` + 上表 `references/google-ads-rules/` 中实际打开的文件名)。
35
36
 
36
37
  ### 第二步:向用户补齐关键信息
37
38
 
@@ -124,7 +125,7 @@ siluzan-tso ad campaigns -a 6326027735 --start 2026-03-01 --end 2026-03-31
124
125
  siluzan-tso ad campaigns -a 6326027735 --json
125
126
  ```
126
127
 
127
- 输出字段:名称、状态(`statusV2`)、类型(`channelTypeV2`)、预算、点击数、展示数。
128
+ 输出字段:名称、状态、类型、预算、点击数、展示数(具体字段名以 `--json` 为准;另有 CLI 派生的 `statusDisplay`、`budgetDisplay` 等便于阅读)。
128
129
 
129
130
  ---
130
131
 
@@ -199,36 +200,38 @@ siluzan-tso ad adgroup-create \
199
200
  --campaign-id <campaignId> \
200
201
  --campaign-name <campaignName> \
201
202
  --name <adGroupName> \
202
- --max-cpc <金额(微单位)>
203
+ --max-cpc <主币种金额>
203
204
  ```
204
205
 
205
- | 选项 | 说明 | 必填 |
206
- | ------------------------ | -------------------------------------------------- | ---- |
207
- | `-a, --account <id>` | Google mediaCustomerId | ✅ |
208
- | `--campaign-id <id>` | 所属广告系列 ID(来自 `campaigns --json`) | ✅ |
209
- | `--campaign-name <name>` | 所属广告系列名称 | ✅ |
210
- | `--name <name>` | 广告组名称 | ✅ |
211
- | `--max-cpc <amount>` | 最高 CPC 出价(最小货币单位,如 `100000` = 1 USD) | ✅ |
212
- | `--status <status>` | `ENABLED \| PAUSED`(默认 `ENABLED`) | |
206
+ > **金额单位**:`--max-cpc` **主币种金额**(如 `1.5` 表示 ¥1.50),CLI 内部 `Math.round(value × 100)` 写入「分」字段,与前端表单 `arithmetic.times(maxCPCAmount, 100)`、`ad adgroup-edit` 完全一致。**禁止** 按 Google micros(×1,000,000)填写。
207
+
208
+ | 选项 | 说明 | 必填 |
209
+ | ------------------------ | ---------------------------------------------------------- | ---- |
210
+ | `-a, --account <id>` | Google mediaCustomerId | ✅ |
211
+ | `--campaign-id <id>` | 所属广告系列 ID(来自 `campaigns --json`) | ✅ |
212
+ | `--campaign-name <name>` | 所属广告系列名称 | ✅ |
213
+ | `--name <name>` | 广告组名称 | |
214
+ | `--max-cpc <amount>` | 最高 CPC 出价,主币种金额(如 `1.5` = ¥1.50;CLI 内部 ×100)| ✅ |
215
+ | `--status <status>` | `ENABLED \| PAUSED`(默认 `ENABLED`) | |
213
216
 
214
217
  **示例:**
215
218
 
216
219
  ```bash
217
- # 在广告系列下创建广告组,最高 CPC 1 USD
220
+ # 在广告系列下创建广告组,最高 CPC ¥1
218
221
  siluzan-tso ad adgroup-create \
219
222
  -a 6326027735 \
220
223
  --campaign-id campaign_001 \
221
224
  --campaign-name "品牌推广_春季" \
222
225
  --name "核心词_跑步鞋" \
223
- --max-cpc 100000
226
+ --max-cpc 1
224
227
 
225
- # 创建时设为暂停状态
228
+ # 创建时设为暂停状态,最高 CPC ¥1.5
226
229
  siluzan-tso ad adgroup-create \
227
230
  -a 6326027735 \
228
231
  --campaign-id campaign_001 \
229
232
  --campaign-name "品牌推广_春季" \
230
233
  --name "竞品词" \
231
- --max-cpc 150000 \
234
+ --max-cpc 1.5 \
232
235
  --status PAUSED
233
236
  ```
234
237
 
@@ -255,6 +258,43 @@ siluzan-tso ad adgroup-status -a 6326027735 --id adgroup_001 --status Enabled
255
258
 
256
259
  ---
257
260
 
261
+ ### 广告组编辑(名称 / 最高 CPC / 组级目标 CPA)
262
+
263
+ 先用 **`ad groups … --json`** 查看当前的 **`maxCPCAmountDisplay`**、**`targetCpaAmountDisplay`**(主币种金额)等,再用本命令只改传入的字段。
264
+
265
+ ```bash
266
+ siluzan-tso ad adgroup-edit \
267
+ -a <accountId> \
268
+ --id <adGroupId> \
269
+ [--name <新名称>] \
270
+ [--max-cpc <主币种金额>] \
271
+ [--target-cpa <主币种金额>] \
272
+ [--start <YYYY-MM-DD>] [--end <YYYY-MM-DD>]
273
+ ```
274
+
275
+ > **金额单位(必读)**:所有金额参数均按 **主币种金额** 传入(如 `1.5` 表示 ¥1.50);CLI 内部 `Math.round(value × 100)` 写入后端「分」字段,与 `ad campaign-edit`、前端表单完全一致。**禁止** 按 Google micros(×1,000,000)填写。
276
+
277
+ | 选项 | 说明 |
278
+ |------|------|
279
+ | `--max-cpc` | 最高 CPC,主币种金额(与 `ad groups --json` 中 **`maxCPCAmountDisplay`** 对齐)。 |
280
+ | `--target-cpa` | 组级目标 CPA,主币种金额(与 `ad groups --json` 中 **`targetCpaAmountDisplay`** 对齐)。写入 **> 0** 才会更新。 |
281
+ | `--name` | 新名称(可选)。 |
282
+
283
+ **示例:**
284
+
285
+ ```bash
286
+ # 先取 JSON,读取 maxCPCAmountDisplay / targetCpaAmountDisplay(主币种金额)算新值后再写回
287
+ siluzan-tso ad groups -a 6326027735 --json
288
+
289
+ # 把最高 CPC 调整到 ¥2
290
+ siluzan-tso ad adgroup-edit -a 6326027735 --id 195548094874 --max-cpc 2
291
+
292
+ # 设置目标 CPA = ¥50,并改名
293
+ siluzan-tso ad adgroup-edit -a 6326027735 --id 195548094874 --target-cpa 50 --name "核心词_降价后"
294
+ ```
295
+
296
+ ---
297
+
258
298
  ### 广告组删除
259
299
 
260
300
  ```bash
@@ -277,11 +317,12 @@ siluzan-tso ad adgroup-delete -a 6326027735 --id adgroup_001
277
317
  siluzan-tso ad list -a <accountId> [选项]
278
318
  ```
279
319
 
280
- | 选项 | 说明 |
281
- | ------------------------ | ------------------------------ |
282
- | `-a, --account <id>` | Google mediaCustomerId(必填) |
283
- | `--start / --end <date>` | 统计日期范围 |
284
- | `--json` | 输出原始 JSON |
320
+ | 选项 | 说明 |
321
+ | ------------------------ | -------------------------------------------------------------------- |
322
+ | `-a, --account <id>` | Google mediaCustomerId(必填) |
323
+ | `--start / --end <date>` | 统计日期范围 |
324
+ | `--include-deleted` | 包含已删除的广告(默认不传;传则网关加 `readDeleted=true`,审计/排障用) |
325
+ | `--json` | 输出原始 JSON |
285
326
 
286
327
  **示例:**
287
328
 
@@ -293,6 +334,28 @@ siluzan-tso ad list -a 6326027735
293
334
  siluzan-tso ad list -a 6326027735 --json
294
335
  ```
295
336
 
337
+ ### 拒审与政策(`ad list --json`)
338
+
339
+ 使用 **`siluzan-tso ad list -a <accountId> [--start/--end] --json`**(或 **`siluzan-tso google-analysis ads … --json`**,与 `references/account-analytics.md` 中 `ads` 子命令一致)巡检素材审核状态。
340
+
341
+ **在 JSON 中可重点查看的键名(以当次 stdout 为准,多为 camelCase):**
342
+
343
+ - **`policyApprovalStatusV2`**(及可能出现的 **`policyApprovalStatus`**):审核总状态。常见数值含义(若为数字):**`2`** 表示不通过(拒审)、**`3`** 表示受限通过;若为字符串则按字面量解析。
344
+ - **`approvalStatusDetails`**:政策相关说明的**摘要串**,多条证据之间常用 **`;`** 分隔。**不提供**与控制台一一对应的「政策主题」结构化数组;需要更细粒度编码时须另辟数据源或与维护方确认。
345
+ - **`statusV2`**:广告启用状态;排除已移除条目时用 **`Removed`** 等值过滤(以实际枚举为准)。
346
+
347
+ **同源拉数**:`ad list` 与 **`google-analysis ads`** 在默认参数下列表数据一致;任选其一做拒审巡检即可,仍以 **当次 `--json`** 为准。若使用 **`ad list --include-deleted`**,会多传 `readDeleted=true`,与未带该参数的 **`google-analysis ads`** 口径可能不一致。
348
+
349
+ ### 转化与价值(`ad list --json`,需网关已返回对应字段)
350
+
351
+ 在已部署的 Google 网关上,创意列表 JSON 中除 **`spend`**、**`conversions`**、**`impressions`**、**`ctr`** 等外,还可关注(键名以当次输出为准):
352
+
353
+ - **`allConversions`**
354
+ - **`conversionsValue`**
355
+ - **`conversionsValuePerImpression`**(可能由后端计算属性序列化;若无则用 **`conversionsValue / impressions`** 在聚合后自行计算)
356
+
357
+ 带 **`--start` / `--end`** 时,底层按日分段,**同一创意 `id` 可能多行**;做窗口汇总或 A/B 比较前须在宿主 **按 `id` 聚合** 后再算比率。宿主编排下的 **自动优化 SOP** 见 **`references/hosted-automation-optimize-index.md`**。
358
+
296
359
  ---
297
360
 
298
361
  ### 创建广告(自适应搜索广告 RSA)
@@ -562,11 +625,11 @@ siluzan-tso ad batch get --id <recordId>
562
625
  siluzan-tso ad batch update --id <recordId> [选项]
563
626
  ```
564
627
 
565
- | 选项 | 说明 |
566
- | ------------------------ | --------------------------------------------- |
567
- | `--budget <amount>` | 新预算(最小货币单位,如 `8500` = 85 CNY) |
568
- | `--url <url>` | 新推广链接 |
569
- | `--campaign-name <name>` | 新广告系列名称 |
628
+ | 选项 | 说明 |
629
+ | ------------------------ | ------------------------------------------------------------------- |
630
+ | `--budget <amount>` | 新日预算,主币种金额(如 `85` 表示 ¥85;CLI 内部自动 ×100 写入「分」) |
631
+ | `--url <url>` | 新推广链接 |
632
+ | `--campaign-name <name>` | 新广告系列名称 |
570
633
 
571
634
  ### publish — 发布草稿
572
635
 
@@ -621,7 +684,7 @@ siluzan-tso keyword -k "running shoes" --json
621
684
 
622
685
  > - 默认行为:不加 `--draft` 时,CLI 直接走「立即发布」路径(`DraftStatus: Published`)。
623
686
  > - 草稿行为:加上 `--draft` 时,仅创建草稿记录(`DraftStatus: Draft`),需后续用 `ad batch publish` 才真正提交给 Google。
624
- > 广告组、关键词、广告创意的直接创建走另一套 Google 网关 API,均有对应的 `adgroup-create`、`keyword-create`、`ad-create` 等命令。
687
+ > 广告组、关键词、广告创意的分步创建请使用 `adgroup-create`、`keyword-create`、`ad-create` 等命令。
625
688
  > 任务异步处理,任务 ID 可通过 `ad batch get --id <id>` 跟进进度。
626
689
 
627
690
  ---
@@ -758,33 +821,42 @@ siluzan-tso ad campaign-edit \
758
821
  -a <accountId> \
759
822
  --id <campaignId> \
760
823
  [--name <新名称>] \
761
- [--budget <预算(最小货币单位)>] \
824
+ [--budget <主币种金额>] \
762
825
  [--bidding <出价策略>] \
763
- [--bid-ceiling <出价上限>] \
826
+ [--bid-ceiling <主币种金额>] \
827
+ [--target-cpa <主币种金额>] \
764
828
  [--search-network true|false] \
765
829
  [--content-network true|false]
766
830
  ```
767
831
 
832
+ > **金额单位(必读)**:所有金额参数均按 **主币种金额**(如 `100` 表示 ¥100,支持小数 `10.5`)传入;CLI 内部 `Math.round(value × 100)` 写入后端「分」字段,与前端表单、`ad campaign-create`、`ad batch update` 完全一致。**禁止** 按 Google micros(×1,000,000)口径填写,会被后端按「分」解读,导致金额放大 10000 倍。
833
+
768
834
  | 选项 | 说明 |
769
835
  | ------------------- | ------------------------------------------------------------------------- |
770
836
  | `--name` | 新广告系列名称 |
771
- | `--budget` | 新预算,最小货币单位(如 100000 = 1 USD |
837
+ | `--budget` | 新日预算,主币种金额(如 `100` = ¥100;`10.5` = ¥10.50 |
772
838
  | `--bidding` | 出价策略:`TARGET_SPEND` \| `TARGET_CPA` \| `TARGET_ROAS` \| `MANUAL_CPC` |
773
- | `--bid-ceiling` | `TARGET_SPEND` 出价上限(最小货币单位,0 = 不限) |
774
- | `--target-cpa` | `TARGET_CPA` 目标 CPA |
839
+ | `--bid-ceiling` | `TARGET_SPEND` 出价上限,主币种金额(`0` = 不限) |
840
+ | `--target-cpa` | `TARGET_CPA` 目标 CPA,主币种金额 |
775
841
  | `--search-network` | 投放 Google 搜索:`true` \| `false` |
776
842
  | `--content-network` | 投放展示网络:`true` \| `false` |
777
843
 
778
844
  **示例:**
779
845
 
780
846
  ```bash
781
- # 修改名称和预算
847
+ # 修改名称和预算(日预算 ¥5000)
782
848
  siluzan-tso ad campaign-edit -a 6326027735 --id 23509626948 \
783
- --name "搜索-春季促销-2026" --budget 500000
849
+ --name "搜索-春季促销-2026" --budget 5000
850
+
851
+ # 在原预算基础上 +10 元(典型相对运算流程):
852
+ # 1) 先 GET 系列详情,读出 budgetDisplay(主币种)
853
+ # 2) 计算新值(主币种)= budgetDisplay + 10
854
+ # 3) 把新值(主币种)作为 --budget 传入;CLI 内部自动 ×100
855
+ siluzan-tso ad campaign-edit -a 6326027735 --id 23509626948 --budget 10.01
784
856
 
785
857
  # 切换出价策略为 TARGET_CPA,目标 CPA 2 USD
786
858
  siluzan-tso ad campaign-edit -a 6326027735 --id 23509626948 \
787
- --bidding TARGET_CPA --target-cpa 200000
859
+ --bidding TARGET_CPA --target-cpa 2
788
860
  ```
789
861
 
790
862
  ---
@@ -808,18 +880,18 @@ siluzan-tso ad adgroup-rename -a 6326027735 --id 195548094874 --name "核心词_
808
880
 
809
881
  ## ad ad-edit — 广告创意编辑(自适应搜索广告 RSA)
810
882
 
811
- 与网页端一致:先按日期范围从 **`GET {googleApi}/admanagement/v2/list/{account}`** 拉取该广告完整对象,再 **`PUT {googleApi}/admanagement/campaign/{account}/{adId}`** 提交合并后的 JSON。成功时响应体与请求体字段结构一致(含 `id`、`activeuseridg`、`typeV2`、`statusV2` 等)。
883
+ 与网页端一致:先用 **`siluzan-tso ad list -a <accountId> [--start/--end] --json`** 取得该广告的完整 JSON,再用本命令只修改传入的选项;未改动的字段由 **`siluzan-tso`** 按列表原值带回。
812
884
 
813
- CLI 会在请求前自动设置 **Datapermission**(与浏览器 `datapermission` 头同源逻辑),避免网关侧权限相关错误。
885
+ CLI 会自动附带数据权限相关请求头,减少权限类错误。
814
886
 
815
- ### 网关 JSON CLI 参数对应(常用字段)
887
+ ### `ad list --json` 常见键名与 CLI 选项(常用)
816
888
 
817
- | 网关字段 | 说明 | CLI |
889
+ | 列表 JSON 键名 | 说明 | CLI |
818
890
  | --------------------------------------------------- | --------------------------------------- | ------------------------------------------- |
819
891
  | `id` | 广告 ID | `--id` |
820
892
  | `activeuseridg` | 账户 mediaCustomerId | `-a` / `--account` |
821
893
  | `headlinePart1` / `headlinePart2` / `headlinePart3` | 前 3 条标题 | `--headlines` 前 3 项 |
822
- | `AddtionalHeadlines` | 第 4~15 条标题(网关拼写为 Addtional) | `--headlines` 第 4 项起 |
894
+ | `AddtionalHeadlines` | 第 4~15 条标题(历史拼写 Addtional) | `--headlines` 第 4 项起 |
823
895
  | `adDescription` / `adDescription2` | 前 2 条描述 | `--descriptions` 前 2 项 |
824
896
  | `AddtionalAdDescriptions` | 第 3~4 条描述 | `--descriptions` 第 3 项起 |
825
897
  | `finalUrl` | 落地页 | `--final-url` |
@@ -842,30 +914,6 @@ siluzan-tso ad ad-edit \
842
914
  [--status Enabled|Paused]
843
915
  ```
844
916
 
845
- **与 curl 等价的网页请求形态(示意,勿把真实 Token 写入文档或仓库):**
846
-
847
- ```http
848
- PUT {googleApi}/admanagement/campaign/{activeuseridg}/{id}
849
- Content-Type: application/json
850
-
851
- {
852
- "id": "<adId>",
853
- "activeuseridg": "<account>",
854
- "headlinePart1": "...",
855
- "headlinePart2": "...",
856
- "headlinePart3": "...",
857
- "adDescription": "...",
858
- "adDescription2": "...",
859
- "adGroupId": "...",
860
- "adGroup": "...",
861
- "finalUrl": "https://...",
862
- "path1": "...",
863
- "path2": "...",
864
- "typeV2": "RESPONSIVE_SEARCH_AD",
865
- "statusV2": "Paused"
866
- }
867
- ```
868
-
869
917
  **示例:**
870
918
 
871
919
  ```bash
@@ -885,7 +933,7 @@ siluzan-tso ad ad-edit -a 6326027735 --id 802428202775 --status Paused
885
933
 
886
934
  ## ad keyword-delete — 搜索关键词删除
887
935
 
888
- 与网页一致:**`DELETE {googleApi}/keywordmanagement/Keyword/{account}/batch`**,请求体为 **JSON 数组**,每项至少包含 **`adGroupId`**、**`id`**(关键词资源 id)。成功时 HTTP 2xx **响应体常为空**,属正常现象;CLI 只要未报错即表示删除请求已送达网关。请求前会自动设置 **Datapermission**;DELETE 使用带 **Content-Length** 的原始请求,避免部分网关对带 body DELETE 解析异常。
936
+ 先用 **`siluzan-tso ad keywords -a <accountId> --json`** 取得关键词 **`id`** **`adGroupId`**,再执行删除。成功时 CLI 正常结束;可用 **`ad keywords --json`** 再次核对列表。
889
937
 
890
938
  ```bash
891
939
  siluzan-tso ad keyword-delete \
@@ -894,16 +942,7 @@ siluzan-tso ad keyword-delete \
894
942
  --adgroup-id <adGroupId>
895
943
  ```
896
944
 
897
- > `--id` 与 `--adgroup-id` 来自 `ad keywords --json` `id`、`adGroupId`(与网关字段名一致)。
898
-
899
- **与 curl 等价的请求形态(示意):**
900
-
901
- ```http
902
- DELETE {googleApi}/keywordmanagement/Keyword/{account}/batch
903
- Content-Type: application/json
904
-
905
- [{"adGroupId":"193360670606","id":"2474194779750"}]
906
- ```
945
+ > `--id` 与 `--adgroup-id` 来自 **`ad keywords --json`** 中的 **`id`**、**`adGroupId`**。
907
946
 
908
947
  **示例:**
909
948
 
@@ -919,21 +958,25 @@ siluzan-tso ad keyword-delete -a 6326027735 --id 2464982882313 --adgroup-id 1955
919
958
 
920
959
  ## ad keyword-edit — 搜索关键词编辑
921
960
 
922
- 与网页一致:**先**按日期范围从 **`GET {googleApi}/keywordmanagement/v2/list/{account}`** 取该关键词完整对象,**再** **`PUT {googleApi}/keywordmanagement/Keyword/{account}/batch`**,请求体为 **JSON 数组**(通常一条),元素为合并后的关键词对象。CLI 会自动设置 **Datapermission**。
961
+ 与网页一致:**先** **`siluzan-tso ad keywords --json`** 取该关键词完整对象,**再**用本命令提交修改;未改字段随列表结果保留。
923
962
 
924
- ### 网关字段与 CLI 对应(常用)
963
+ > **⚠️ 金额单位(与系列 / 组的金额字段不同!)**:关键词的 `maxCPC` 字段单位是 **「主币种元」**(直接是元,不是「分」),CLI 直接透传 **不做 ×100 转换**。这与 `ad campaign-edit --budget` / `ad adgroup-edit --max-cpc` 等"用户传元、CLI 内部 ×100"的命令**口径相反**。
964
+ >
965
+ > 验证依据:前端 `KeywordList.vue:266` 用 `filterSpend(maxCPC)` 直接展示原值,对应 `useFormatter.js:86` 的 `filterSpend` 内部不 ÷100(对比 `filterBudget` 显式 ÷100)。
966
+
967
+ ### `ad keywords --json` 常见键名与 CLI 选项(常用)
925
968
 
926
- | 网关字段 | 说明 | CLI |
969
+ | 列表 JSON 键名 | 说明 | CLI |
927
970
  | ----------------------------- | ----------------------------------------- | ---------------------------- |
928
971
  | `id` | 关键词资源 id | `--id` |
929
972
  | `keywordText` | 关键词文案(数组,一般一项) | `--text` → `["..."]` |
930
973
  | `matchTypeV2` | 匹配类型(网页用 Broad / Phrase / Exact) | `--match-type` |
931
974
  | `matchType` | 另一套枚举(如 EXACT),列表里可能仍存在 | 一般随 list 结果保留,勿手改 |
932
- | `maxCPC` | 最高每次点击费用 | `--max-cpc` |
975
+ | `maxCPC` | 最高每次点击费用,**主币种金额**(直接是元,不要 ×100) | `--max-cpc` |
933
976
  | `finalURL` | 关键词级最终到达网址 | `--final-url` |
934
977
  | `adGroupId` / `campaignId` 等 | 层级与统计字段 | 从列表保留 |
935
978
 
936
- **注意:** 成功响应也是数组;**`id` 可能与请求不一致**(网关可能返回新资源 id)。CLI 若检测到变化会打印提示,后续请用 **返回体中的新 `id`** 再查列表或再编辑。
979
+ **注意:** 成功响应也可能是数组;**`id` 可能与请求不一致**。CLI 若检测到变化会打印提示,后续请用 **返回体中的新 `id`** 再查列表或再编辑。
937
980
 
938
981
  **约束:** `--text`、`--match-type`、`--max-cpc`、`--final-url` 至少传一项。
939
982
 
@@ -947,27 +990,6 @@ siluzan-tso ad keyword-edit \
947
990
  [--final-url <url>]
948
991
  ```
949
992
 
950
- **与 curl 等价的请求形态(示意,勿写入真实 Token):**
951
-
952
- ```http
953
- PUT {googleApi}/keywordmanagement/Keyword/{account}/batch
954
- Content-Type: application/json
955
-
956
- [
957
- {
958
- "id": "<keywordId>",
959
- "keywordText": ["广告工具1"],
960
- "matchType": "EXACT",
961
- "matchTypeV2": "Broad",
962
- "maxCPC": 0,
963
- "finalURL": "https://example.com",
964
- "adGroupId": "...",
965
- "campaignId": "...",
966
- "...": "其余字段来自 list 接口"
967
- }
968
- ]
969
- ```
970
-
971
993
  **示例:**
972
994
 
973
995
  ```bash
@@ -1179,13 +1201,13 @@ siluzan-tso list-accounts -m Google --json -k [mediaCustomerId]
1179
1201
  siluzan-tso ad campaigns -a 6326027735 --json
1180
1202
  # 假设 campaignId = campaign_001,campaignName = "品牌推广_春季"
1181
1203
 
1182
- # 第四步:创建广告组(最高 CPC 1 USD = 100000 微单位)
1204
+ # 第四步:创建广告组(最高 CPC ¥1,主币种金额;CLI 内部 ×100 写入「分」)
1183
1205
  siluzan-tso ad adgroup-create \
1184
1206
  -a 6326027735 \
1185
1207
  --campaign-id campaign_001 \
1186
1208
  --campaign-name "品牌推广_春季" \
1187
1209
  --name "核心词_跑步鞋" \
1188
- --max-cpc 100000
1210
+ --max-cpc 1
1189
1211
 
1190
1212
  # 第五步:查询新建广告组 id
1191
1213
  siluzan-tso ad groups -a 6326027735 --json
@@ -0,0 +1,94 @@
1
+ # 异常监控巡检:`siluzan-tso` CLI `--json` 键名与命令
2
+
3
+ > **主题索引**:[`hosted-automation-scenarios.md`](hosted-automation-scenarios.md)
4
+ > **编排责任**:定时、HTTP 探活、通知等在宿主。本页只列 **读数命令与常见 JSON 键名**。
5
+ > **统计日 / 时区**:与自控场景相同,见 [`hosted-automation-self-control.md`](hosted-automation-self-control.md)「统计日与今日」。
6
+
7
+ 宿主做定时巡检时,**只以 `siluzan-tso … --json` 当次 stdout 的键名为准**。Google Ads API 文档里的资源名(如 `billing_setup`、`account_budget`、`amount_served_micros`)**与本 CLI 输出不是同一套命名**,不要当作本仓库 JSON 的键去解析。若某键缺失,**禁止猜测**:以实际输出为准,或换用 `references/account-analytics.md` 中的其它子命令。
8
+
9
+ ---
10
+
11
+ ## 1. 余额枯竭 / 续航不足(多账户批扫)
12
+
13
+ **批扫(推荐)** — 命令:
14
+
15
+ ```bash
16
+ siluzan-tso balance-scan -m Google [--threshold-days <n>] [--min-balance <n>] [--json]
17
+ ```
18
+
19
+ `--json` 时根结构为 **`{ ok, data: { items }, meta }`**(以实际输出为准)。宿主常用字段:
20
+
21
+ | 用途 | JSON 路径 / 字段名 |
22
+ |------|---------------------|
23
+ | 账户 | `data.items[].mediaCustomerId`、`data.items[].name`、`data.items[].advertiserName` |
24
+ | 余额(主币种金额,与平台余额接口一致) | **`data.items[].balance`**(由 `remainingAccountBudget` 计算而来) |
25
+ | 近 7 日估算日均消耗 | **`data.items[].dailySpend`** = 近 7 日总消耗 / 7(窗口为 **[T-7, T-1]**,即截至昨天的 7 个自然日,**不含当天**,避免拉到当天未结算数据) |
26
+ | 按余额÷日均估算的续航天数 | **`data.items[].remainingDays`** = `balance / dailySpend`(消耗过低 < `minDailySpend` 时为 `null`) |
27
+ | 建议充值额(按 `meta.thresholds.targetDaysForTopup` 目标) | **`data.items[].recommendedTopup`** |
28
+ | 命中原因(阈值逻辑) | **`data.items[].hitReason`**:`low-days` \| `low-balance` \| `both` |
29
+ | 币种 / 状态 / OAuth | `data.items[].currencyCode`、`data.items[].status`、`data.items[].invalidOAuthToken` |
30
+ | 本轮扫描元数据 | **`meta`**:`scannedAccounts`、`validAccounts`、`hitCount`、`thresholds`(含 `days`、`minBalance`、`minDailySpend`、`targetDaysForTopup`)、`generatedAt` 等 |
31
+
32
+ **单账户** — 命令:
33
+
34
+ ```bash
35
+ siluzan-tso balance -m Google --accounts <mediaCustomerId> --json
36
+ ```
37
+
38
+ `items[]` 每行:**`mediaCustomerId`**、**`remainingAccountBudget`**、**`status`**、**`currencyCode`**、**`name`**(与 `references/accounts.md` 中 `balance` 说明一致)。
39
+
40
+ **账户总览(区间内的费用与日均,可与续航逻辑组合)** — 命令:
41
+
42
+ ```bash
43
+ siluzan-tso google-analysis overview -a <mediaCustomerId> --start <YYYY-MM-DD> --end <YYYY-MM-DD> --json
44
+ ```
45
+
46
+ 根对象常见字段:**`remainingAccountBudget`**、**`averageDailyCost`**、**`totalCost`**、**`activeDays`**、**`currencyCode`**、**`accountId`**;**`currentPeriod`** / **`previousPeriod`** 为对象块,内含 **`spend`**、`impressions`、`clicks`、`conversions` 等与 `references/account-analytics.md` 总览口径一致的指标(块内还可能出现 **`currencyCode`**)。
47
+
48
+ ---
49
+
50
+ ## 2. 花费异动(按系列 × 日历小时)
51
+
52
+ 命令:
53
+
54
+ ```bash
55
+ siluzan-tso google-analysis campaign-hour -a <mediaCustomerId> --start <YYYY-MM-DD> --end <YYYY-MM-DD> --json
56
+ ```
57
+
58
+ **根 JSON 为数组**(不是 `items` 包装)。每元素常见字段:
59
+
60
+ **`campaignId`**、**`campaignName`**、**`date`**、**`hour`**、**`spend`**、`impressions`、`clicks`、`conversions`。
61
+
62
+ 宿主侧可做:同一 `campaignId` 在相邻小时或相邻日的 **`spend`** 对比、滑动均值、超阈值告警等(阈值与统计时区由宿主配置,见 [`hosted-automation-self-control.md`](hosted-automation-self-control.md)「统计日与今日」)。
63
+
64
+ ---
65
+
66
+ ## 3. 落地页 URL 收集(HTTP 探活由宿主完成)
67
+
68
+ **仅拉 URL 列表(无日期参数)**:
69
+
70
+ ```bash
71
+ siluzan-tso google-analysis final-urls -a <mediaCustomerId> --json
72
+ ```
73
+
74
+ 根为 **对象**:**键名**为网关返回的资源标识(以当次 JSON 为准),**值为字符串数组**(每个元素是一条最终到达网址)。CLI **不**代发 HTTP 请求判断 4xx/5xx;死链判定须在宿主对 URL 执行 HEAD/GET(注意频率与 robots/合规)。
75
+
76
+ **按创意行拉数**(可与拒审、启停共用一轮数据):
77
+
78
+ ```bash
79
+ siluzan-tso ad list -a <mediaCustomerId> --start <YYYY-MM-DD> --end <YYYY-MM-DD> --json
80
+ ```
81
+
82
+ `items[]` 为网关原样字段集合;落地页相关键名以当次输出为准(类型说明里常见 **`finalurl`**;亦可用 **`google-analysis ads`** 列表,结构见 `references/google-ads.md` / `account-analytics.md`)。命中后暂停创意用 **`ad ad-status`**(见 `references/google-ads.md`),写后复核再次 `ad list --json` 看 **`statusV2`**。
83
+
84
+ ---
85
+
86
+ ## 4. 广告素材拒审
87
+
88
+ 不依赖 `PolicyTopic` 等 API 资源名;直接读 CLI 拒审字段:**`policyApprovalStatusV2`**、**`approvalStatusDetails`**、**`statusV2`** 等。逐步说明见 **`references/google-ads.md`**「拒审与政策」;**`ad list`** 与 **`google-analysis ads`** 列表同源,任选其一做巡检。
89
+
90
+ ---
91
+
92
+ ## 5. 账户「封禁」与 Google 客户状态(暂不展开)
93
+
94
+ Google 客户级 **`SUSPENDED` / `CANCELED`** 与 **`list-accounts --json`** 中 **`status`** 的逐项对应关系**不在本页维护**;宿主若需该判定,请以内部运维约定或后续专门文档为准。
@@ -0,0 +1,69 @@
1
+ # SOP:同组多创意 A/B — 停输家、保赢家(Ad)
2
+
3
+ > **索引**:[`hosted-automation-optimize-index.md`](hosted-automation-optimize-index.md)
4
+
5
+ ---
6
+
7
+ ## 业务目标(宿主配置化)
8
+
9
+ 在同一 **广告组** 内存在多条可比较的创意时,根据约定窗口内的 **转化价值效率**、**全部转化** 或宿主侧统计检验,将**明显劣势**的创意 **Paused**,保留优势创意继续投放。显著性水平、最小样本、冷却期由宿主配置。
10
+
11
+ ---
12
+
13
+ ## 检查项(宿主每轮)
14
+
15
+ ### 1. 拉创意列表
16
+
17
+ ```bash
18
+ siluzan-tso ad list -a <mediaCustomerId> --start <YYYY-MM-DD> --end <YYYY-MM-DD> --json
19
+ ```
20
+
21
+ (等价:`siluzan-tso google-analysis ads …`。)
22
+
23
+ ### 2. 按组筛选、按创意聚合
24
+
25
+ - 对同一 **`adGroupId`** 下的行,先按创意 **`id`** 聚合(见索引「按日多行」):对 **`impressions`**、**`clicks`**、**`spend`**、**`conversions`**、**`allConversions`**、**`conversionsValue`** **求和**。
26
+ - **每次展现价值(聚合后)**:宿主计算
27
+
28
+ `cvpi = (Σ conversionsValue) / (Σ impressions)`,当分母为 0 时跳过该创意判定。
29
+
30
+ 若单行上已有后端提供的 **`conversionsValuePerImpression`**,在未聚合前**勿直接跨日相加**;应在聚合后用上式或按业务约定只对单日行比较。
31
+
32
+ ### 3. 参与判定的最小样本(示例)
33
+
34
+ - 聚合后 **`impressions`**(或 **`clicks`**)低于配置下限的创意**不参与**胜负判定。
35
+ - 同组内「活跃且达样本」的创意 **≥ 2** 条时才进入 A/B 决策。
36
+
37
+ ### 4. 统计显著性
38
+
39
+ **p 值、贝叶斯后验、序贯检验等**须由宿主实现;CLI **不提供**检验函数。可用聚合后的 **`conversions`/`clicks`** 或 **`conversionsValue`/`impressions`** 等输入自定义检验。
40
+
41
+ ---
42
+
43
+ ## 最终操作
44
+
45
+ 对判定为 **Loser** 的创意:
46
+
47
+ ```bash
48
+ siluzan-tso ad ad-status -a <mediaCustomerId> --id <adId> --status Paused
49
+ ```
50
+
51
+ (若需 `--start`/`--end` 见 `google-ads.md`。)
52
+
53
+ **不在此 SOP 内**:Google Ads 界面「将流量倾斜给赢家」的算法开关;宿主仅能 **停输家** 或结合人工/网页调整轮换策略。
54
+
55
+ ---
56
+
57
+ ## 写后复核
58
+
59
+ ```bash
60
+ siluzan-tso ad list -a <mediaCustomerId> --start <当日或下一窗> --end <…> --json
61
+ ```
62
+
63
+ 确认 Loser 的 **`statusV2`** 为 **`Paused`**;Winner 仍为 **`ENABLED`**(或宿主期望状态)。
64
+
65
+ ---
66
+
67
+ ## 通知(宿主)
68
+
69
+ 建议 **P2**:含 `mediaCustomerId`、**`adGroupId`**、输/赢 **`id`**、聚合指标摘要与判定规则版本号,便于审计。
@@ -0,0 +1,32 @@
1
+ # 宿主编排:自动优化(Google)— 文档索引
2
+
3
+ > **编排责任**:定时、阈值、多轮状态(如「连续 3 日未改善」)、统计检验、通知(P1/P2)由 **宿主** 实现。
4
+ > **本组文档**:说明如何用 `siluzan-tso` **拉检查项**、**执行写操作**、**写后复核**;每条 SOP 独立成文,避免单文件过长。
5
+
6
+ | 文档 | 场景 |
7
+ |------|------|
8
+ | [`hosted-automation-optimize-weak-downbid.md`](hosted-automation-optimize-weak-downbid.md) | 表现差:组/创意 **降价或暂停** |
9
+ | [`hosted-automation-optimize-scale.md`](hosted-automation-optimize-scale.md) | 高转化:**提预算 / 上调目标 CPA** 扩量 |
10
+ | [`hosted-automation-optimize-ab-winner.md`](hosted-automation-optimize-ab-winner.md) | 同组多创意:**A/B 决胜负、停输家** |
11
+
12
+ **必读交叉引用**:`SKILL.md`(金额与 `*Display` 硬规范)、`references/google-ads.md`(`ad campaign-edit` / `ad adgroup-edit` / `ad-status`)、`references/account-analytics.md`(日期与 `google-analysis`)、`references/tips.md`(`--json`)、[`hosted-automation-self-control.md`](hosted-automation-self-control.md)(统计日与时区约定)。
13
+
14
+ ---
15
+
16
+ ## 通用约定(三条 SOP 共用)
17
+
18
+ ### 1. 统计区间
19
+
20
+ `--start` / `--end` 为 **`YYYY-MM-DD`**,与宿主业务日一致;约定见 **`hosted-automation-self-control.md`**「统计日与今日」。
21
+
22
+ ### 2. `ad list` / `ad groups` 与「按日多行」
23
+
24
+ `admanagement/v2/list`(`ad list`、`google-analysis ads`)在带日期区间时,底层 GAQL 含 **`segments.date`**,**同一创意 `id` 可出现多行(一日一行)**。做「过去 7 天总展现 / 总花费 / 总转化」时,宿主须对 **`items[]` 按广告 `id`(及需要时 `adGroupId`)聚合** 后再算比率或阈值,**禁止**把未聚合的多行直接当作多条独立创意误判。
25
+
26
+ ### 3. JSON 键名以当次 `--json` 为准
27
+
28
+ 下列键名为当前网关常见命名;若某键缺失,以实际 stdout 为准,勿猜测。
29
+
30
+ ### 4. 写操作与复核
31
+
32
+ 所有写入须遵守 **`references/google-ads.md`** 的确认与安全约定;写后**同区间或下一统计日**再拉一次读命令核对 `statusV2`、预算、`targetCpaAmount` 等。