siluzan-tso-cli 1.1.29-beta.2 → 1.1.29-beta.21

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 (169) hide show
  1. package/README.md +1 -1
  2. package/dist/index.js +3174 -867
  3. package/dist/skill/AGENTS.md +30 -31
  4. package/dist/skill/SKILL.md +16 -33
  5. package/dist/skill/_meta.json +2 -2
  6. package/dist/skill/assets/campaign-create-keyword-test.fixed.json +10 -33
  7. package/dist/skill/assets/campaign-create-template.json +2 -0
  8. package/dist/skill/assets/campaign-create-template.md +114 -99
  9. package/dist/skill/assets/market-analysis-rules.md +55 -55
  10. package/dist/skill/assets/meta-period-report-rules.md +61 -60
  11. package/dist/skill/assets/pmax-asset-group-template.json +12 -4
  12. package/dist/skill/assets/pmax-asset-group-template.md +25 -0
  13. package/dist/skill/assets/pmax-brand-assets-template.json +25 -0
  14. package/dist/skill/assets/pmax-brand-assets-template.md +22 -0
  15. package/dist/skill/assets/pmax-brand-guidelines-enable-template.json +24 -0
  16. package/dist/skill/assets/pmax-brand-guidelines-enable-template.md +22 -0
  17. package/dist/skill/assets/pmax-create-template.json +41 -2
  18. package/dist/skill/assets/pmax-create-template.md +84 -51
  19. package/dist/skill/assets/pmax-lead-form-template.json +36 -0
  20. package/dist/skill/assets/pmax-lead-form-template.md +70 -0
  21. package/dist/skill/assets/pmax-signals-template.json +2 -6
  22. package/dist/skill/assets/pmax-whatsapp-template.json +26 -0
  23. package/dist/skill/assets/pmax-whatsapp-template.md +45 -0
  24. package/dist/skill/assets/website-diagnosis-rules.md +67 -67
  25. package/dist/skill/references/README.md +78 -65
  26. package/dist/skill/references/accounts/accounts.md +99 -105
  27. package/dist/skill/references/accounts/finance.md +23 -79
  28. package/dist/skill/references/accounts/open-account-by-media.md +84 -81
  29. package/dist/skill/references/accounts/open-account-google-ui.md +24 -24
  30. package/dist/skill/references/analytics/account-analytics.md +94 -103
  31. package/dist/skill/references/analytics/facebook-analysis-guide.md +61 -61
  32. package/dist/skill/references/analytics/google-analysis-batch.md +2 -2
  33. package/dist/skill/references/analytics/keyword-planner-workflows.md +22 -23
  34. package/dist/skill/references/analytics/market-analysis-guide.md +31 -25
  35. package/dist/skill/references/analytics/rag.md +20 -20
  36. package/dist/skill/references/analytics/reporting.md +4 -4
  37. package/dist/skill/references/analytics/website-diagnosis-guide.md +24 -24
  38. package/dist/skill/references/core/agent-conventions.md +136 -106
  39. package/dist/skill/references/core/cli-enums.md +47 -53
  40. package/dist/skill/references/core/playbooks.md +42 -41
  41. package/dist/skill/references/core/subagent-orchestration.md +40 -40
  42. package/dist/skill/references/core/tips.md +18 -61
  43. package/dist/skill/references/core/workflows.md +36 -29
  44. package/dist/skill/references/google-ads/google-ads-campaign-plan.md +25 -24
  45. package/dist/skill/references/google-ads/google-ads.md +81 -57
  46. package/dist/skill/references/google-ads/pmax-api.md +138 -34
  47. package/dist/skill/references/google-ads/rules/README.md +15 -15
  48. package/dist/skill/references/google-ads/rules/google-ads-account-audit.md +22 -22
  49. package/dist/skill/references/google-ads/rules/google-ads-compliance.md +27 -27
  50. package/dist/skill/references/google-ads/rules/google-ads-keyword-strategy.md +15 -15
  51. package/dist/skill/references/google-ads/rules/google-ads-keyword-taxonomy.md +32 -22
  52. package/dist/skill/references/google-ads/rules/google-ads-launch-plan-template.md +32 -30
  53. package/dist/skill/references/google-ads/rules/google-ads-pmax-guide.md +3 -1
  54. package/dist/skill/references/misc/tso-home.md +8 -8
  55. package/dist/skill/references/operations/clue.md +1 -1
  56. package/dist/skill/references/operations/forewarning.md +1 -1
  57. package/dist/skill/references/operations/hosted-automation-optimize-index.md +2 -2
  58. package/dist/skill/references/operations/hosted-automation-scenarios.md +5 -5
  59. package/dist/skill/references/operations/hosted-automation-self-control.md +15 -15
  60. package/dist/skill/references/operations/hosted-automation-user-catalog.md +13 -13
  61. package/dist/skill/references/operations/optimize.md +8 -8
  62. package/dist/skill/references/report-templates/README.md +45 -0
  63. package/dist/skill/references/report-templates/REPORT-WORKFLOW.md +114 -0
  64. package/dist/skill/references/report-templates/bing-period-report.md +65 -0
  65. package/dist/skill/references/report-templates/google-account-diagnosis-report.md +83 -0
  66. package/dist/skill/references/report-templates/google-ads-diagnosis.md +378 -0
  67. package/dist/skill/references/report-templates/google-inquiry-analysis.md +543 -0
  68. package/dist/skill/references/report-templates/google-period-report-excel.md +126 -0
  69. package/dist/skill/references/report-templates/google-period-report.md +60 -0
  70. package/dist/skill/references/report-templates/market-analysis-report.md +40 -0
  71. package/dist/skill/references/report-templates/meta-account-diagnosis-report.md +74 -0
  72. package/dist/skill/references/report-templates/meta-period-report-excel.md +230 -0
  73. package/dist/skill/references/report-templates/meta-period-report.md +219 -0
  74. package/dist/skill/references/report-templates/okki-weekly-google-client.md +217 -0
  75. package/dist/skill/references/report-templates/tiktok-period-report.md +56 -0
  76. package/dist/skill/references/report-templates/website-diagnosis-report.md +79 -0
  77. package/dist/skill/report-templates/README.md +16 -14
  78. package/dist/skill/report-templates/REPORT-WORKFLOW.md +13 -13
  79. package/dist/skill/report-templates/google-account-diagnosis-report.md +1 -1
  80. package/dist/skill/report-templates/google-ads-diagnosis.md +21 -21
  81. package/dist/skill/report-templates/google-inquiry-analysis.md +44 -44
  82. package/dist/skill/report-templates/google-period-report-excel.md +24 -24
  83. package/dist/skill/report-templates/google-period-report.md +23 -23
  84. package/dist/skill/report-templates/market-analysis-report.md +1 -1
  85. package/dist/skill/report-templates/meta-period-report-excel.md +72 -64
  86. package/dist/skill/report-templates/meta-period-report.html +706 -428
  87. package/dist/skill/report-templates/meta-period-report.md +61 -60
  88. package/dist/skill/report-templates/okki-weekly-google-client.md +26 -26
  89. package/dist/skill/report-templates/report-template-academic.html +1 -1
  90. package/dist/skill/report-templates/report-template-dark.html +1 -1
  91. package/dist/skill/report-templates/report-template-formal.html +1 -1
  92. package/dist/skill/report-templates/report-template-mobile.html +1 -1
  93. package/dist/skill/report-templates/report-template-onepager.html +1 -1
  94. package/dist/skill/report-templates/report-template-print.html +1 -1
  95. package/dist/skill/report-templates/report-template.html +1 -1
  96. package/dist/skill/report-templates/website-diagnosis-report.html +1731 -1653
  97. package/dist/skill/report-templates/website-diagnosis-report.md +21 -23
  98. package/dist/skill/scripts/install.ps1 +1 -1
  99. package/dist/skill/scripts/install.sh +1 -1
  100. package/dist/skill/snippets/handoff-p7-inquiry.md +5 -5
  101. package/eval/cases/accounts-entityid-vs-mediaccustomerid.scenario.json +2 -14
  102. package/eval/cases/accounts-mcc-bind-inquiry.scenario.json +1 -3
  103. package/eval/cases/accounts-single-balance-not-bulk.scenario.json +3 -14
  104. package/eval/cases/budget-display-not-raw-micros.scenario.json +1 -8
  105. package/eval/cases/clue-meta-leads-json.scenario.json +2 -14
  106. package/eval/cases/clue-tiktok-leads-json.scenario.json +2 -11
  107. package/eval/cases/destructive-account-delink-needs-confirm.scenario.json +3 -9
  108. package/eval/cases/destructive-forewarning-delete-needs-confirm.scenario.json +3 -9
  109. package/eval/cases/destructive-invoice-apply-needs-confirm.scenario.json +3 -9
  110. package/eval/cases/facebook-analysis-google-section-aliases.scenario.json +2 -11
  111. package/eval/cases/facebook-analysis-not-google-keywords.scenario.json +3 -10
  112. package/eval/cases/facebook-analysis-period-default.scenario.json +2 -14
  113. package/eval/cases/finance-invoice-info-list.scenario.json +3 -11
  114. package/eval/cases/forewarning-list-google.scenario.json +3 -14
  115. package/eval/cases/google-ads-no-structural-without-confirm.scenario.json +2 -6
  116. package/eval/cases/google-analysis-keywords-route.scenario.json +2 -14
  117. package/eval/cases/human-p1-multiturn.scenario.json +1 -5
  118. package/eval/cases/meta-single-balance-not-bulk.scenario.json +3 -17
  119. package/eval/cases/no-legacy-json-flag.scenario.json +2 -6
  120. package/eval/cases/open-account-google-noninteractive.scenario.json +1 -3
  121. package/eval/cases/open-account-tiktok-license-file.scenario.json +1 -3
  122. package/eval/cases/optimize-list-by-account.scenario.json +3 -11
  123. package/eval/cases/p1-single-account-profile.scenario.json +1 -11
  124. package/eval/cases/p2-balance-scan-bulk.scenario.json +2 -9
  125. package/eval/cases/p3-accounts-digest.scenario.json +1 -5
  126. package/eval/cases/p4-fb-meta-period-report.scenario.json +2 -12
  127. package/eval/cases/p4-period-report-window.scenario.json +1 -8
  128. package/eval/cases/pmax-asset-group-create-with-bg.scenario.json +15 -0
  129. package/eval/cases/pmax-brand-edit-routing.scenario.json +12 -0
  130. package/eval/cases/pmax-edit-not-campaign-edit.scenario.json +15 -0
  131. package/eval/cases/pmax-enable-brand-guidelines.scenario.json +15 -0
  132. package/eval/cases/pmax-no-assets-update-brand-fields.scenario.json +12 -0
  133. package/eval/cases/rag-before-keyword-expand.scenario.json +1 -11
  134. package/eval/cases/rag-list-then-query.scenario.json +2 -14
  135. package/eval/cases/report-list-google.scenario.json +2 -11
  136. package/eval/cases/report-push-list-google.scenario.json +2 -11
  137. package/eval/cases/setup-login-or-env.scenario.json +1 -3
  138. package/eval/cases/setup-siluzan-data-permission-env.scenario.json +1 -3
  139. package/eval/cases/tiktok-bc-bind-inquiry.scenario.json +2 -6
  140. package/eval/cases/time-range-user-delegates-default.scenario.json +1 -8
  141. package/eval/cases/tips-json-out-filtering.scenario.json +1 -3
  142. package/eval/cases/tips-large-json-pagination.scenario.json +1 -3
  143. package/eval/cases/uj-ad-campaign-validate-before-create-stub.scenario.json +2 -11
  144. package/eval/cases/uj-ad-outdoor-campgear-search-plan.scenario.json +1 -3
  145. package/eval/cases/uj-analytics-30d-pdf-campaign-device-geo.scenario.json +6 -18
  146. package/eval/cases/uj-analytics-compare-google-tiktok-last-month-roi.scenario.json +1 -8
  147. package/eval/cases/uj-analytics-google-weekly-trends-campaigns-keywords.scenario.json +2 -11
  148. package/eval/cases/uj-analytics-report-push-weekly-email.scenario.json +1 -3
  149. package/eval/cases/uj-finance-invoice-records-this-month.scenario.json +2 -11
  150. package/eval/cases/uj-life-newbie-siluzan-google-end-to-end.scenario.json +1 -4
  151. package/eval/cases/uj-ops-google-accounts-list-normal.scenario.json +2 -17
  152. package/eval/cases/uj-ops-google-yesterday-spend-conversions.scenario.json +2 -14
  153. package/eval/cases/uj-ops-pause-worst-adgroup-confirm.scenario.json +2 -6
  154. package/eval/cases/uj-ops-tiktok-leads-last-week.scenario.json +3 -17
  155. package/eval/cases/uj-patrol-cpc-spike-adgroups-over-15.scenario.json +1 -5
  156. package/eval/cases/uj-patrol-forewarning-create-daily-cap-3000.scenario.json +1 -3
  157. package/eval/cases/uj-patrol-forewarning-trigger-records.scenario.json +3 -17
  158. package/eval/cases/uj-patrol-google-balances-low.scenario.json +2 -11
  159. package/eval/cases/uj-roi-optimize-records-then-execute-cautiously.scenario.json +3 -14
  160. package/eval/cases/uj-roi-search-terms-add-negative-keywords.scenario.json +2 -14
  161. package/eval/stub-fixtures/facebook-analysis.json +24 -4
  162. package/eval/stub-fixtures/meta-overview.json +4 -1
  163. package/eval/stub-fixtures/pmax-asset-group-create-ok.json +12 -0
  164. package/eval/stub-fixtures/pmax-brand-assets-edit-ok.json +11 -0
  165. package/eval/stub-fixtures/pmax-brand-guidelines-enable-ok.json +11 -0
  166. package/eval/stub-fixtures/pmax-edit-ok.json +11 -0
  167. package/eval/stub-fixtures/pmax-get-bg-on.json +20 -0
  168. package/package.json +1 -1
  169. package/dist/skill/references/core/deliverable-preflight.md +0 -109
@@ -10,15 +10,31 @@
10
10
 
11
11
  ## Agent 常见坑
12
12
 
13
- | 场景 | 正确做法 |
14
- |------|----------|
15
- | 创建 PMax | `pmax-validate` → 用户确认 → `pmax-create` |
16
- | 文案超长 | `pmax-validate --json-out` 读 `lengthViolations`(含完整 `text`);**勿自动截断**,列改写方案给用户确认后再改 JSON 并重跑 validate(同 Search `campaign-validate`) |
17
- | 金额 | JSON 填**主币种「元」**;CLI 提交前 `budget`、`targetCpa_BidingAmount` ×100 |
18
- | 图片 | **只填 `imagePaths`** 指向本地 PNG/JPEG;`pmax-create` 会自动 multipart 上传并用 assetId 创建(勿把 Base64 提交进 Git) |
19
- | 视频 | JSON 填 **`videoPath`**(别名 `video` 亦可);`pmax-create` 成功后 **必定**经 PyAPI 上传并链接(含 `--json-out`)。已有 YouTube 用 `youtubeUrlOrId` |
20
- | 改已上线 PMax | `ad pmax-get` / `pmax-edit` / `pmax-assets-update` 等(见 `references/google-ads/pmax-api.md`) |
21
- | 列表复核 | `ad campaigns -a <id> --json-out ./snap`,`channelTypeV2` 应为 `PERFORMANCE_MAX` |
13
+ | 场景 | 正确做法 |
14
+ | ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
15
+ | 创建 PMax | `pmax-validate` → 用户确认 → `pmax-create` |
16
+ | 文案超长 | `pmax-validate --json-out` 读 `lengthViolations`(含完整 `text`);**勿自动截断**,列改写方案给用户确认后再改 JSON 并重跑 validate(同 Search `campaign-validate`) |
17
+ | 金额 | JSON 填**主币种「元」**;CLI 提交前 `budget`、`targetCpa_BidingAmount` ×100 |
18
+ | 图片 | **只填 `imagePaths`** 指向本地 PNG/JPEG;`pmax-create` 会自动 multipart 上传并用 assetId 创建(勿把 Base64 提交进 Git) |
19
+ | 视频 | JSON 填 **`videoPath`**(别名 `video` 亦可);`pmax-create` 成功后 **必定**经 PyAPI 上传并链接(含 `--json-out`)。已有 YouTube 用 `youtubeUrlOrId` |
20
+ | 附加资产 | **必填** `campaignExtensions`:宣传信息 ≥20、结构化摘要 ≥20、站内链接 ≥6、leadForm、WhatsApp |
21
+ | 文案数量 | 短标题 15、长 nga 5(Google API 上限,须填满)、描述 5 |
22
+ | Lead Gen 方案 | **默认**在 `campaignExtensions` 含 **`leadForm`**(B2B/询盘/留资);仅 callouts/snippets 不算完整方案;用户明确不要才省略 |
23
+ | 存量补表单 | 活动已创建时用 `ad extension lead-form`(见 `pmax-lead-form-template.md` 方式 B) |
24
+ | 改已上线 PMax | 先 `ad pmax-get` 看 `_brandGuidelinesActive`;改品牌见 `pmax-api.md` § Brand Guidelines |
25
+ | 列表复核 | `ad campaigns -a <id> --json-out ./snap`,`channelTypeV2` 应为 `PERFORMANCE_MAX` |
26
+
27
+ ---
28
+
29
+ ## 方案生成(Agent 出投放方案时)
30
+
31
+ 出 PMax **投放方案**(Markdown + JSON)时,除标题/描述/图片外,**Lead Gen / B2B 场景默认包含潜在客户表单**:
32
+
33
+ 1. JSON:`campaignExtensions.leadForm` 字段结构与 `pmax-lead-form-template.json` 的 `leadForm` 相同(`businessName`、`headline`、`description`、`privacyPolicyUrl`、`finalUrl`、`fields`)。
34
+ 2. Markdown:单独一节 **「潜在客户表单」**,列出表单标题、描述、收集字段、隐私政策 URL;**不得**只在 JSON 里写而方案正文遗漏。
35
+ 3. `privacyPolicyUrl`:从落地页站点找 `/privacy`、`/terms` 等;找不到时向用户确认,**禁止**编造 URL。
36
+ 4. 用户说「不要表单 / 仅品牌曝光 / 纯电商 Shopping」→ 可省略 `leadForm` 并在方案中说明原因。
37
+ 5. `pmax-validate` 会校验 `leadForm`;创建后 `--json-out` 的 `campaignExtensions.leadForm` 段含 `ok` / `error`。
22
38
 
23
39
  ---
24
40
 
@@ -36,48 +52,65 @@ siluzan-tso ad campaigns -a <accountId> --json-out ./snap
36
52
 
37
53
  ## 字段说明(camelCase)
38
54
 
39
- | 字段 | 类型 | 必填 | 说明 |
40
- |------|------|:----:|------|
41
- | `account` | string | | Google 媒体客户 ID(`list-accounts` → `mediaCustomerId`) |
42
- | `name` | string | | 广告系列名称 |
43
- | `budget` | number | | 日预算(**元**),如 `50` = 主币种 50.00/天 |
44
- | `budgetName` | string | | 预算资源名称 |
45
- | `assetGroupName` | string | | 首个资产组名称;缺省由服务端生成 |
46
- | `finalUrls` | string[] | | 至少 1 个 `https://` 落地页 |
47
- | `businessName` | string | | BUSINESS_NAME:1 条,≤25 字符 |
48
- | `headlines` | string[] | | HEADLINE:3–15 条,每条 ≤30 字符(CJK×2) |
49
- | `longHeadlines` | string[] | | LONG_HEADLINE:1–5 条,每条 ≤90 字符 |
50
- | `descriptions` | string[] | | DESCRIPTION:2–5 条,每条 ≤90 字符 |
51
- | `imagePaths.marketing` | string | ✅* | MARKETING_IMAGE 横图 1.91:1,≤5MB(创建 JSON 1 张;资产组 API 最多 20) |
52
- | `imagePaths.square` | string | ✅* | SQUARE_MARKETING_IMAGE 方图 1:1,≤5MB(创建 1 张;最多 20) |
53
- | `imagePaths.logo` | string | ✅* | LOGO 方图 1:1,≤5MB(创建 1 张;最多 5) |
54
- | `marketingImageAssetId` | string | ✅* | 已上传横图 asset.id(与 path/base64 三选一) |
55
- | `squareMarketingImageAssetId` | string | ✅* | 已上传方图 asset.id |
56
- | `logoImageAssetId` | string | ✅* | 已上传 Logo asset.id |
57
- | `marketingImageBase64` | string | ✅* | 内联 Base64(不推荐;无 path 时用) |
58
- | `squareMarketingImageBase64` | string | ✅* | 内联方图 Base64 |
59
- | `logoImageBase64` | string | ✅* | 内联 Logo Base64 |
60
- | `targetedLocations` | `{ id }[]` | | 地理 criterion ID,如 `{ "id": "2840" }`(美国) |
61
- | `targetedLanguages` | `{ id }[]` | | 语言 ID,如 `{ "id": 1000 }`(英语) |
62
- | `biddingStrategyTypeV2` | string | | 默认 `MAXIMIZE_CONVERSIONS` |
63
- | `targetCpa_BidingAmount` | number | | `TARGET_CPA` 或带目标 CPA 的 `MAXIMIZE_CONVERSIONS` 时必填(**元**) |
64
- | `targetRoas` | number | | `TARGET_ROAS` 时必填(如 `2.5` = 250%) |
65
- | `videoPath` | string | | YOUTUBE_VIDEO(可选):本地视频 ≥10s;与 `youtubeUrlOrId` 二选一,创建时最多 1 条;更多视频创建后用 `pmax-youtube-link` / `pmax-assets-update` 追加 |
66
- | `videoTitle` | string | | PyAPI 上传标题(默认文件名) |
67
- | `videoDescription` | string | | PyAPI 上传描述(可选) |
68
- | `youtubeUrlOrId` | string | | 已有 YouTube URL 或 11 位 ID;`pmax-create` 后自动链接 |
69
- | `youtubeAssetName` | string | | 链接 YouTube 时的资产显示名 |
55
+ | 字段 | 类型 | 必填 | 说明 |
56
+ | ----------------------------- | ---------- | :--: | --------------------------------------------------------------------------------------------------------------------------------------------------- |
57
+ | `account` | string | | Google 媒体客户 ID(`list-accounts` → `mediaCustomerId`) |
58
+ | `name` | string | | 广告系列名称 |
59
+ | `budget` | number | | 日预算(**元**),如 `50` = 主币种 50.00/天 |
60
+ | `budgetName` | string | | 预算资源名称 |
61
+ | `assetGroupName` | string | | 首个资产组名称;缺省由服务端生成 |
62
+ | `finalUrls` | string[] | | 至少 1 个 `https://` 落地页 |
63
+ | `businessName` | string | | BUSINESS_NAME:1 条,≤25 字符 |
64
+ | `headlines` | string[] | | HEADLINE:3–15 条,每条 ≤30 字符(CJK×2) |
65
+ | `longHeadlines` | string[] | | LONG_HEADLINE:1–5 条,每条 ≤90 字符 |
66
+ | `descriptions` | string[] | | DESCRIPTION:2–5 条,每条 ≤90 字符 |
67
+ | `imagePaths.marketing` | string | ✅\* | MARKETING_IMAGE 横图 1.91:1,≤5MB(创建 JSON 1 张;资产组 API 最多 20) |
68
+ | `imagePaths.square` | string | ✅\* | SQUARE_MARKETING_IMAGE 方图 1:1,≤5MB(创建 1 张;最多 20) |
69
+ | `imagePaths.logo` | string | ✅\* | LOGO 方图 1:1,≤5MB(创建 1 张;最多 5) |
70
+ | `marketingImageAssetId` | string | ✅\* | 已上传横图 asset.id(与 path/base64 三选一) |
71
+ | `squareMarketingImageAssetId` | string | ✅\* | 已上传方图 asset.id |
72
+ | `logoImageAssetId` | string | ✅\* | 已上传 Logo asset.id |
73
+ | `marketingImageBase64` | string | ✅\* | 内联 Base64(不推荐;无 path 时用) |
74
+ | `squareMarketingImageBase64` | string | ✅\* | 内联方图 Base64 |
75
+ | `logoImageBase64` | string | ✅\* | 内联 Logo Base64 |
76
+ | `targetedLocations` | `{ id }[]` | | 地理 criterion ID,如 `{ "id": "2840" }`(美国) |
77
+ | `targetedLanguages` | `{ id }[]` | | 语言 ID,如 `{ "id": 1000 }`(英语) |
78
+ | `biddingStrategyTypeV2` | string | | 默认 `MAXIMIZE_CONVERSIONS` |
79
+ | `targetCpa_BidingAmount` | number | | `TARGET_CPA` 或带目标 CPA 的 `MAXIMIZE_CONVERSIONS` 时必填(**元**) |
80
+ | `targetRoas` | number | | `TARGET_ROAS` 时必填(如 `2.5` = 250%) |
81
+ | `brandGuidelinesEnabled` | boolean | | 省略 = 网关默认 `true`(Campaign BG);`false` = 品牌在 AssetGroup(旧路径) |
82
+ | `videoPath` | string | | YOUTUBE_VIDEO(可选):本地视频 ≥10s;与 `youtubeUrlOrId` 二选一,创建时最多 1 条;更多视频创建后用 `pmax-youtube-link` / `pmax-assets-update` 追加 |
83
+ | `videoTitle` | string | | PyAPI 上传标题(默认文件名) |
84
+ | `videoDescription` | string | | PyAPI 上传描述(可选) |
85
+ | `youtubeUrlOrId` | string | | 已有 YouTube URL 或 11 位 ID;`pmax-create` 后自动链接 |
86
+ | `youtubeAssetName` | string | | 链接 YouTube 时的资产显示名 |
87
+ | `campaignExtensions` | object | | 创建成功后自动挂载的 Campaign 级扩展(见下表) |
70
88
 
71
89
  \* 三张图各须有一种来源(路径或 Base64)。
72
90
 
91
+ ### `campaignExtensions`(可选,CLI 编排)
92
+
93
+ **不**随 `POST .../campaign/pmax` 提交;活动创建成功后 CLI 自动调用 `extensionmanagement`。
94
+
95
+ | 子字段 | 类型 | 说明 |
96
+ | -------------------- | -------- | ------------------------------------------------------------------------ |
97
+ | `callouts` | string[] | 宣传信息(CALLOUT),每条 ≤25 字符,各创建 1 个扩展 |
98
+ | `structuredSnippets` | object[] | `{ header, values }`;`values` 至少 3 项 |
99
+ | `leadForm` | object | 潜在客户表单;字段同 `pmax-lead-form-template.json` 的 `leadForm` |
100
+ | `businessMessage` | object | WhatsApp 私信;字段同 `pmax-whatsapp-template.json` 的 `businessMessage` |
101
+
102
+ 标头可选值:`ad extension snippet-headers`。WhatsApp 需 Google API 白名单(见 `pmax-whatsapp-template.md`)。
103
+
104
+ 若挂载失败,活动仍已创建;`--json-out` 的 `campaignExtensions` 段含各条 `ok` / `error`,可手动 `ad extension *` 补挂。
105
+
73
106
  ### 出价策略(PMax 支持子集)
74
107
 
75
- | 值 | 说明 |
76
- |----|------|
77
- | `MAXIMIZE_CONVERSIONS` | 默认 |
78
- | `MAXIMIZE_CONVERSION_VALUE` | 最大化转化价值 |
79
- | `TARGET_CPA` | 目标 CPA(须 `targetCpa_BidingAmount`) |
80
- | `TARGET_ROAS` | 目标 ROAS(须 `targetRoas`) |
108
+ | 值 | 说明 |
109
+ | --------------------------- | --------------------------------------- |
110
+ | `MAXIMIZE_CONVERSIONS` | 默认 |
111
+ | `MAXIMIZE_CONVERSION_VALUE` | 最大化转化价值 |
112
+ | `TARGET_CPA` | 目标 CPA(须 `targetCpa_BidingAmount`) |
113
+ | `TARGET_ROAS` | 目标 ROAS(须 `targetRoas`) |
81
114
 
82
115
  ---
83
116
 
@@ -85,11 +118,11 @@ siluzan-tso ad campaigns -a <accountId> --json-out ./snap
85
118
 
86
119
  网关同步返回(camelCase):
87
120
 
88
- | 字段 | 说明 |
89
- |------|------|
90
- | `campaignId` | 活动 ID |
91
- | `assetGroupId` | 首个资产组 ID |
92
- | `budgetId` | 日预算 ID(后续 PATCH 改预算时需与 `budget` 成对) |
121
+ | 字段 | 说明 |
122
+ | -------------- | -------------------------------------------------- |
123
+ | `campaignId` | 活动 ID |
124
+ | `assetGroupId` | 首个资产组 ID |
125
+ | `budgetId` | 日预算 ID(后续 PATCH 改预算时需与 `budget` 成对) |
93
126
 
94
127
  ---
95
128
 
@@ -0,0 +1,36 @@
1
+ {
2
+ "_meta": {
3
+ "schema": "pmax-lead-form/v1",
4
+ "doc": "pmax-lead-form-template.md",
5
+ "note": "以 _ 开头的键仅作说明,CLI 提交前会剥离",
6
+ "agentPitfalls": [
7
+ "新建 PMax(Lead Gen/B2B):优先 campaignExtensions.leadForm 随 pmax-create 一次挂载(见 pmax-create-template.json)",
8
+ "存量补挂:用本文件 + ad extension lead-form(须已有 campaignId)",
9
+ "LEAD_FORM 仅 Campaign 级;每活动通常 1 个;补挂前 ad extension list --type LEAD_FORM --campaign-id 检查",
10
+ "privacyPolicyUrl 须为 https 可访问页(可从官网 footer 找 privacy/terms)",
11
+ "账户须在 Google Ads UI 接受 Lead Form ToS",
12
+ "WhatsApp 见 pmax-whatsapp-template.json 或 campaignExtensions.businessMessage"
13
+ ]
14
+ },
15
+ "account": "REPLACE_mediaCustomerId",
16
+ "campaignId": "REPLACE_pmaxCampaignId",
17
+ "leadForm": {
18
+ "businessName": "Example Brand Co",
19
+ "headline": "Get a free quote",
20
+ "description": "Tell us about your project and we will contact you.",
21
+ "privacyPolicyUrl": "https://www.example.com/privacy",
22
+ "finalUrl": "https://www.example.com",
23
+ "callToActionType": "LEARN_MORE",
24
+ "callToActionDescription": "Contact us",
25
+ "fields": [
26
+ { "inputType": "FULL_NAME" },
27
+ { "inputType": "EMAIL" },
28
+ { "inputType": "PHONE_NUMBER" }
29
+ ],
30
+ "webhook": {
31
+ "advertiserWebhookUrl": "https://your-crm.example.com/webhook",
32
+ "googleSecret": "your-google-secret",
33
+ "payloadSchemaVersion": 3
34
+ }
35
+ }
36
+ }
@@ -0,0 +1,70 @@
1
+ # `ad extension lead-form` JSON 配置说明
2
+
3
+ PMax **潜在客户表单**(`LEAD_FORM`)有两种挂载方式:
4
+
5
+ | 方式 | 何时用 | 入口 |
6
+ | ---- | ------ | ---- |
7
+ | **A(推荐·新建活动)** | `pmax-create` 一次性创建系列 + 扩展 | `pmax-create` JSON 的 `campaignExtensions.leadForm`(见 `pmax-create-template.json`) |
8
+ | **B(存量补挂)** | 活动已存在、需单独加/改表单 | 本文件 + `ad extension lead-form` |
9
+
10
+ **Lead Gen / B2B 询盘类 PMax 方案**:默认在 `campaignExtensions` 中包含 `leadForm`;用户明确不要表单时才省略。
11
+
12
+ 模板 JSON:同目录 [`pmax-lead-form-template.json`](pmax-lead-form-template.json)(方式 B 用;方式 A 只取其中的 `leadForm` 对象嵌入 `pmax-create` JSON)。
13
+
14
+ ---
15
+
16
+ ## 推荐命令顺序
17
+
18
+ ```bash
19
+ # 1. 确认 PMax 活动 ID
20
+ siluzan-tso ad campaigns -a <accountId> --json-out ./snap
21
+
22
+ # 2. 查看 PMax 支持的扩展类型
23
+ siluzan-tso ad extension pmax-types --json-out ./snap
24
+
25
+ # 3. 检查活动上是否已有 Lead Form
26
+ siluzan-tso ad extension list -a <accountId> --type LEAD_FORM --campaign-id <campaignId> --json-out ./snap
27
+
28
+ # 4. 创建
29
+ siluzan-tso ad extension lead-form -a <accountId> --config-file ./lead-form.json --json-out ./snap
30
+
31
+ # 5. 更新(须带完整 leadForm 对象)
32
+ siluzan-tso ad extension update -a <accountId> --id <extensionId> --config-file ./lead-form.json
33
+ ```
34
+
35
+ ---
36
+
37
+ ## 字段说明
38
+
39
+ | 字段 | 类型 | 必填 | 说明 |
40
+ | ---------------------------------- | -------- | :--: | -------------------------------------------------------------- |
41
+ | `account` | string | ✅ | Google 媒体客户 ID |
42
+ | `campaignId` | string | ✅ | PMax 活动 ID(`channelTypeV2=PERFORMANCE_MAX`) |
43
+ | `leadForm.businessName` | string | ✅ | 商家名称 |
44
+ | `leadForm.headline` | string | ✅ | 表单标题 |
45
+ | `leadForm.description` | string | ✅ | 表单描述 |
46
+ | `leadForm.privacyPolicyUrl` | string | ✅ | 隐私政策 URL |
47
+ | `leadForm.finalUrl` | string | ✅ | 落地页 URL |
48
+ | `leadForm.callToActionType` | string | | 默认 `LEARN_MORE` |
49
+ | `leadForm.callToActionDescription` | string | | 默认 `Contact us` |
50
+ | `leadForm.fields` | object[] | ✅ | 至少 1 项;`inputType` 如 `FULL_NAME`、`EMAIL`、`PHONE_NUMBER` |
51
+ | `leadForm.webhook` | object | | 写入 Google 的 Webhook(非平台接收端) |
52
+
53
+ ---
54
+
55
+ ## PMax 附加资产对照
56
+
57
+ | 中文 | 类型 | CLI 命令 |
58
+ | ------------- | -------------------- | --------------------------------------------------------------- |
59
+ | 宣传信息 | `CALLOUT` | `ad extension callout` |
60
+ | 结构化摘要 | `STRUCTURED_SNIPPET` | `ad extension snippet` |
61
+ | 潜在客户表单 | `LEAD_FORM` | `ad extension lead-form` |
62
+ | 附加链接 | `SITELINK` | `ad extension sitelink` |
63
+ | 附加电话 | `CALL` | `ad extension call` |
64
+ | 私信 WhatsApp | `BUSINESS_MESSAGE` | `ad extension whatsapp` 或 `campaignExtensions.businessMessage` |
65
+
66
+ **层级**:PMax 仅 `Account` / `Campaign`;`Ad Group` 会 **400**。
67
+
68
+ **副作用**:创建 Lead Form 后,后端会自动尝试将 `SUBMIT_LEAD_FORM` + `GOOGLE_HOSTED` 转化目标设为 `biddable=true`。
69
+
70
+ 详见 `references/google-ads/pmax-api.md` § 附加资产。
@@ -2,10 +2,6 @@
2
2
  "_comment": "PUT signals 全量同步;空数组会清空对应类型",
3
3
  "account": "6326027735",
4
4
  "assetGroupId": "98765432101",
5
- "audienceResourceNames": [
6
- "customers/6326027735/audiences/348219404"
7
- ],
8
- "searchThemes": [
9
- "industrial equipment supplier"
10
- ]
5
+ "audienceResourceNames": ["customers/6326027735/audiences/348219404"],
6
+ "searchThemes": ["industrial equipment supplier"]
11
7
  }
@@ -0,0 +1,26 @@
1
+ {
2
+ "_meta": {
3
+ "schema": "pmax-whatsapp/v1",
4
+ "doc": "pmax-whatsapp-template.md",
5
+ "note": "以 _ 开头的键仅作说明,CLI 提交前会剥离",
6
+ "agentPitfalls": [
7
+ "BUSINESS_MESSAGE 仅支持 Campaign / Account 级;PMax 用 Campaign + campaignId",
8
+ "每 Campaign 仅 1 个 ENABLED WhatsApp;重复 POST 会 400,须 DELETE 或 PUT 更新",
9
+ "PUT 成功后 asset id 会变化,后续删除/更新须用响应中的新 id",
10
+ "账户须已开通 Google Business Message API 白名单,否则 CUSTOMER_NOT_ON_ALLOWLIST_FOR_MESSAGE_ASSETS",
11
+ "勿与 pmax-create 同时挂 businessMessage 若活动上已有 WhatsApp"
12
+ ]
13
+ },
14
+ "account": "REPLACE_mediaCustomerId",
15
+ "campaignId": "REPLACE_pmaxCampaignId",
16
+ "businessMessage": {
17
+ "messageProvider": "WHATSAPP",
18
+ "starterMessage": "Hi! How can we help you today?",
19
+ "callToActionSelection": "CONTACT_US",
20
+ "callToActionDescription": "Message us on WhatsApp",
21
+ "whatsapp": {
22
+ "countryCode": "US",
23
+ "phoneNumber": "2125550100"
24
+ }
25
+ }
26
+ }
@@ -0,0 +1,45 @@
1
+ # `ad extension whatsapp` JSON 配置说明
2
+
3
+ 为**已创建的 PMax 活动**挂载 WhatsApp 私信(`BUSINESS_MESSAGE`)。也可写入 `pmax-create` JSON 的 `campaignExtensions.businessMessage` 由 CLI 自动编排。
4
+
5
+ 模板:`pmax-whatsapp-template.json`。
6
+
7
+ ---
8
+
9
+ ## 命令
10
+
11
+ ```bash
12
+ # 单独挂载
13
+ siluzan-tso ad extension whatsapp -a <accountId> --config-file ./whatsapp.json --json-out ./snap
14
+
15
+ # 更新(PUT 后 id 会变,用响应新 id)
16
+ siluzan-tso ad extension update -a <accountId> --id <extensionId> --config-file ./whatsapp.json
17
+
18
+ # 或在 pmax-create 一并挂载
19
+ # campaignExtensions.businessMessage 见 pmax-create-template.md
20
+ ```
21
+
22
+ ---
23
+
24
+ ## 字段
25
+
26
+ | 字段 | 必填 | 说明 |
27
+ | ----------------------------------------- | :--: | ---------------------------------------------------- |
28
+ | `account` | ✅ | Google 媒体客户 ID |
29
+ | `campaignId` | ✅ | PMax 活动 ID |
30
+ | `businessMessage.starterMessage` | ✅ | 欢迎语 |
31
+ | `businessMessage.callToActionDescription` | | 默认 `Message us on WhatsApp` |
32
+ | `businessMessage.callToActionSelection` | | 默认 `CONTACT_US`;可选 `LEARN_MORE`、`GET_QUOTE` 等 |
33
+ | `businessMessage.messageProvider` | | 默认 `WHATSAPP` |
34
+ | `businessMessage.whatsapp.countryCode` | ✅ | 两位国家码(如 `US`) |
35
+ | `businessMessage.whatsapp.phoneNumber` | ✅ | WhatsApp Business 注册号码 |
36
+
37
+ ---
38
+
39
+ ## 前置条件
40
+
41
+ 1. **Google API 白名单**(阻塞项):未开通返回 `CUSTOMER_NOT_ON_ALLOWLIST_FOR_MESSAGE_ASSETS`;须 MCC 运营联系 Google AM 申请。
42
+ 2. 号码已在 **WhatsApp Business** 注册。
43
+ 3. 同 Campaign **仅 1 个** ENABLED WhatsApp;已有则 POST 400,须 DELETE 或 PUT。
44
+
45
+ 详见 Sammamish `pmax-frontend-api.md` §3.2.4。
@@ -4,96 +4,96 @@
4
4
 
5
5
  ## JSON Schema(摘要)
6
6
 
7
- - `url`:被诊断 URL
8
- - `ratingId`:`s1`–`s5`
9
- - `coreIssuesIds`:`ci1`–`ci10` 子集
10
- - `modules[]`:`{ id, score, items[] }`
11
- - `items[]`:`{ id, score, status, issue, suggestion }`
12
- - `status` 枚举:`Excellent` | `Good` | `Normal` | `Poor` | `Full` | `NeedImprove` | `Absent`
13
- - 满分项 `suggestion` 可为空字符串
7
+ - `url`:被诊断 URL
8
+ - `ratingId`:`s1`–`s5`
9
+ - `coreIssuesIds`:`ci1`–`ci10` 子集
10
+ - `modules[]`:`{ id, score, items[] }`
11
+ - `items[]`:`{ id, score, status, issue, suggestion }`
12
+ - `status` 枚举:`Excellent` | `Good` | `Normal` | `Poor` | `Full` | `NeedImprove` | `Absent`
13
+ - 满分项 `suggestion` 可为空字符串
14
14
 
15
15
  ## 评分等级(ratingId)
16
16
 
17
- | ID | 等级 | 分数区间 | 说明 |
18
- | -- | ---- | -------- | ---- |
19
- | s1 | 优秀 | ≥90 | 可直接投放广告 |
20
- | s2 | 良好 | 80–89.99 | 小幅优化后可投放 |
21
- | s3 | 一般 | 70–79.99 | 需要重点优化 |
22
- | s4 | 较差 | 60–69.99 | 需要大幅改进 |
23
- | s5 | 不建议投放 | ≤59.99 | 需全面整改 |
17
+ | ID | 等级 | 分数区间 | 说明 |
18
+ | --- | ---------- | -------- | ---------------- |
19
+ | s1 | 优秀 | ≥90 | 可直接投放广告 |
20
+ | s2 | 良好 | 80–89.99 | 小幅优化后可投放 |
21
+ | s3 | 一般 | 70–79.99 | 需要重点优化 |
22
+ | s4 | 较差 | 60–69.99 | 需要大幅改进 |
23
+ | s5 | 不建议投放 | ≤59.99 | 需全面整改 |
24
24
 
25
25
  ## 核心问题(coreIssuesIds)
26
26
 
27
- | ID | 问题 |
28
- | -- | ---- |
29
- | ci1 | 首屏缺乏清晰 CTA |
30
- | ci2 | 转化跟踪未部署 |
31
- | ci3 | 移动端显示异常 |
32
- | ci4 | 页面加载缓慢 |
33
- | ci5 | 导航栏与清晰度 |
34
- | ci6 | 表单复杂或缺乏清晰 |
35
- | ci7 | 类目页与详情页内容不匹配 |
36
- | ci8 | 网站语言与广告不一致 |
37
- | ci9 | 缺少社媒分享入口 |
38
- | ci10 | 品牌风格不统一 |
27
+ | ID | 问题 |
28
+ | ---- | ------------------------ |
29
+ | ci1 | 首屏缺乏清晰 CTA |
30
+ | ci2 | 转化跟踪未部署 |
31
+ | ci3 | 移动端显示异常 |
32
+ | ci4 | 页面加载缓慢 |
33
+ | ci5 | 导航栏与清晰度 |
34
+ | ci6 | 表单复杂或缺乏清晰 |
35
+ | ci7 | 类目页与详情页内容不匹配 |
36
+ | ci8 | 网站语言与广告不一致 |
37
+ | ci9 | 缺少社媒分享入口 |
38
+ | ci10 | 品牌风格不统一 |
39
39
 
40
40
  ## m1 · 网站内容及结构(9 项)
41
41
 
42
- | ID | 诊断项 | 满分 |
43
- | -- | ------ | ---- |
44
- | m1i1 | Banner 轮播图 | 5 |
45
- | m1i2 | 导航栏 | 2 |
46
- | m1i3 | 首页信息布局 | 4 |
47
- | m1i4 | 产品类目页 | 2 |
48
- | m1i5 | 产品详情页 | 4 |
49
- | m1i6 | 公司介绍页 | 3 |
50
- | m1i7 | 联系我们页 | 4 |
51
- | m1i8 | 表单提交流程 | 4 |
52
- | m1i9 | 社交媒体链接 | 2 |
42
+ | ID | 诊断项 | 满分 |
43
+ | ---- | ------------- | ---- |
44
+ | m1i1 | Banner 轮播图 | 5 |
45
+ | m1i2 | 导航栏 | 2 |
46
+ | m1i3 | 首页信息布局 | 4 |
47
+ | m1i4 | 产品类目页 | 2 |
48
+ | m1i5 | 产品详情页 | 4 |
49
+ | m1i6 | 公司介绍页 | 3 |
50
+ | m1i7 | 联系我们页 | 4 |
51
+ | m1i8 | 表单提交流程 | 4 |
52
+ | m1i9 | 社交媒体链接 | 2 |
53
53
 
54
54
  ## m2 · 网站性能(5 项)
55
55
 
56
- | ID | 诊断项 | 满分 |
57
- | -- | ------ | ---- |
58
- | m2i1 | 加载速度(Lighthouse PC/移动) | 8 |
59
- | m2i2 | HTTPS 安全 | 5 |
60
- | m2i3 | 404 页面 | 4 |
61
- | m2i4 | 图片清晰度 | 4 |
62
- | m2i5 | 移动端适配 | 4 |
56
+ | ID | 诊断项 | 满分 |
57
+ | ---- | ------------------------------ | ---- |
58
+ | m2i1 | 加载速度(Lighthouse PC/移动) | 8 |
59
+ | m2i2 | HTTPS 安全 | 5 |
60
+ | m2i3 | 404 页面 | 4 |
61
+ | m2i4 | 图片清晰度 | 4 |
62
+ | m2i5 | 移动端适配 | 4 |
63
63
 
64
64
  ## m3 · 营销基础与广告落地页(4 项)
65
65
 
66
- | ID | 诊断项 | 满分 |
67
- | -- | ------ | ---- |
68
- | m3i1 | 企业邮箱 | 6 |
69
- | m3i2 | 联系电话 | 3 |
70
- | m3i4 | 语言一致性 | 3 |
71
- | m3i5 | 地址地图 | 3 |
66
+ | ID | 诊断项 | 满分 |
67
+ | ---- | ---------- | ---- |
68
+ | m3i1 | 企业邮箱 | 6 |
69
+ | m3i2 | 联系电话 | 3 |
70
+ | m3i4 | 语言一致性 | 3 |
71
+ | m3i5 | 地址地图 | 3 |
72
72
 
73
73
  ## m4 · 用户体验与转化(5 项)
74
74
 
75
- | ID | 诊断项 | 满分 |
76
- | -- | ------ | ---- |
77
- | m4i1 | 页面布局 | 3 |
78
- | m4i2 | CTA 按钮 | 5 |
79
- | m4i3 | 表单体验 | 3 |
80
- | m4i4 | 内容可读性 | 3 |
81
- | m4i5 | 社媒分享可扩展性 | 1 |
75
+ | ID | 诊断项 | 满分 |
76
+ | ---- | ---------------- | ---- |
77
+ | m4i1 | 页面布局 | 3 |
78
+ | m4i2 | CTA 按钮 | 5 |
79
+ | m4i3 | 表单体验 | 3 |
80
+ | m4i4 | 内容可读性 | 3 |
81
+ | m4i5 | 社媒分享可扩展性 | 1 |
82
82
 
83
83
  ## m5 · 媒体广告投放辅助(3 项)
84
84
 
85
- | ID | 诊断项 | 满分 |
86
- | -- | ------ | ---- |
87
- | m5i1 | 落地页速度 | 3 |
88
- | m5i2 | 询盘转化路径 | 4 |
89
- | m5i4 | 跟踪与分析 | 3 |
85
+ | ID | 诊断项 | 满分 |
86
+ | ---- | ------------ | ---- |
87
+ | m5i1 | 落地页速度 | 3 |
88
+ | m5i2 | 询盘转化路径 | 4 |
89
+ | m5i4 | 跟踪与分析 | 3 |
90
90
 
91
91
  ## m6 · 社交媒体辅助(3 项)
92
92
 
93
- | ID | 诊断项 | 满分 |
94
- | -- | ------ | ---- |
95
- | m6i1 | 内容可引用性 | 2 |
96
- | m6i2 | 内容可分享性 | 2 |
97
- | m6i3 | 视觉风格统一 | 1 |
93
+ | ID | 诊断项 | 满分 |
94
+ | ---- | ------------ | ---- |
95
+ | m6i1 | 内容可引用性 | 2 |
96
+ | m6i2 | 内容可分享性 | 2 |
97
+ | m6i3 | 视觉风格统一 | 1 |
98
98
 
99
99
  > 各子项**判断规则**与**评分规则**全文见后端 `website_guide.py`;Agent 须按 HTML/Lighthouse 证据打分,不得照抄示例分。