siluzan-tso-cli 1.1.20-beta.2 → 1.1.20-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.
- package/README.md +1 -1
- package/dist/index.js +3777 -1190
- package/dist/skill/SKILL.md +144 -125
- package/dist/skill/_meta.json +2 -2
- package/dist/skill/assets/campaign-create-template.json +146 -93
- package/dist/skill/assets/campaign-create-template.md +238 -0
- package/dist/skill/references/account-analytics.md +39 -32
- package/dist/skill/references/accounts.md +13 -11
- package/dist/skill/references/currency.md +72 -0
- package/dist/skill/references/geo-continents.json +1 -9
- package/dist/skill/references/google-ads-campaign-plan.md +89 -0
- package/dist/skill/references/google-ads-rules/google-ads-campaign-optimization.md +1 -15
- package/dist/skill/references/google-ads-rules/google-ads-compliance.md +7 -8
- package/dist/skill/references/google-ads-rules/google-ads-keyword-strategy.md +2 -3
- package/dist/skill/references/google-ads-rules/google-ads-keyword-taxonomy.md +86 -0
- package/dist/skill/references/google-ads-rules/google-ads-launch-plan-template.md +59 -129
- package/dist/skill/references/google-ads.md +256 -144
- package/dist/skill/references/google-analysis-batch.md +18 -18
- package/dist/skill/references/hosted-automation-optimize-weak-downbid.md +1 -1
- package/dist/skill/references/hosted-automation-self-control.md +2 -2
- package/dist/skill/references/keyword-planner-workflows.md +132 -28
- package/dist/skill/references/rag.md +104 -0
- package/dist/skill/references/reporting.md +1 -1
- package/dist/skill/references/tips.md +12 -6
- package/dist/skill/references/workflows.md +24 -172
- package/dist/skill/report-templates/README.md +8 -8
- package/dist/skill/report-templates/REPORT-WORKFLOW.md +12 -12
- package/dist/skill/report-templates/google-inquiry-analysis.md +185 -127
- package/dist/skill/report-templates/okki-weekly-google-client.md +66 -66
- package/dist/skill/scripts/install.ps1 +8 -6
- package/dist/skill/scripts/install.sh +7 -3
- package/eval/cases/accounts-entityid-vs-mediaccustomerid.scenario.json +14 -2
- package/eval/cases/accounts-mcc-bind-inquiry.scenario.json +3 -1
- package/eval/cases/accounts-single-balance-not-bulk.scenario.json +14 -3
- package/eval/cases/budget-display-not-raw-micros.scenario.json +10 -3
- package/eval/cases/clue-meta-leads-json.scenario.json +14 -2
- package/eval/cases/clue-tiktok-leads-json.scenario.json +11 -2
- package/eval/cases/destructive-account-delink-needs-confirm.scenario.json +9 -3
- package/eval/cases/destructive-forewarning-delete-needs-confirm.scenario.json +9 -3
- package/eval/cases/destructive-invoice-apply-needs-confirm.scenario.json +9 -3
- package/eval/cases/finance-invoice-info-list.scenario.json +11 -3
- package/eval/cases/forewarning-list-google.scenario.json +14 -3
- package/eval/cases/google-ads-no-structural-without-confirm.scenario.json +6 -2
- package/eval/cases/google-analysis-keywords-route.scenario.json +14 -2
- package/eval/cases/human-p1-multiturn.scenario.json +5 -1
- package/eval/cases/meta-single-balance-not-bulk.scenario.json +17 -3
- package/eval/cases/open-account-bing-noninteractive.scenario.json +4 -1
- package/eval/cases/open-account-google-noninteractive.scenario.json +3 -1
- package/eval/cases/open-account-tiktok-license-file.scenario.json +3 -1
- package/eval/cases/optimize-list-by-account.scenario.json +11 -3
- package/eval/cases/p1-single-account-profile.scenario.json +11 -1
- package/eval/cases/p2-balance-scan-bulk.scenario.json +9 -2
- package/eval/cases/p3-accounts-digest.scenario.json +5 -1
- package/eval/cases/p4-period-report-window.scenario.json +8 -1
- package/eval/cases/rag-before-keyword-expand.scenario.json +24 -0
- package/eval/cases/rag-list-then-query.scenario.json +23 -0
- package/eval/cases/report-list-google.scenario.json +11 -2
- package/eval/cases/report-push-list-google.scenario.json +11 -2
- package/eval/cases/reporting-vs-account-analytics-routing.scenario.json +4 -1
- package/eval/cases/setup-login-or-env.scenario.json +3 -1
- package/eval/cases/setup-siluzan-data-permission-env.scenario.json +3 -1
- package/eval/cases/skill-optimize-vs-google-ads-distinction.scenario.json +4 -1
- package/eval/cases/tiktok-bc-bind-inquiry.scenario.json +6 -2
- package/eval/cases/time-range-user-delegates-default.scenario.json +8 -1
- package/eval/cases/tips-json-filtering.scenario.json +3 -1
- package/eval/cases/tips-large-json-pagination.scenario.json +3 -1
- package/eval/cases/uj-ad-campaign-validate-before-create-stub.scenario.json +20 -0
- package/eval/cases/uj-ad-keywords-camping-tent-outdoor-plan.scenario.json +1 -1
- package/eval/cases/uj-ad-outdoor-campgear-search-plan.scenario.json +5 -3
- package/eval/cases/uj-analytics-30d-pdf-campaign-device-geo.scenario.json +18 -6
- package/eval/cases/uj-analytics-compare-google-tiktok-last-month-roi.scenario.json +8 -1
- package/eval/cases/uj-analytics-google-weekly-trends-campaigns-keywords.scenario.json +11 -2
- package/eval/cases/uj-analytics-report-push-weekly-email.scenario.json +3 -1
- package/eval/cases/uj-finance-invoice-records-this-month.scenario.json +11 -2
- package/eval/cases/uj-life-newbie-siluzan-google-end-to-end.scenario.json +4 -1
- package/eval/cases/uj-ops-google-accounts-list-normal.scenario.json +14 -2
- package/eval/cases/uj-ops-google-yesterday-spend-conversions.scenario.json +14 -2
- package/eval/cases/uj-ops-open-google-b2c-usd-shenzhen.scenario.json +4 -1
- package/eval/cases/uj-ops-pause-worst-adgroup-confirm.scenario.json +6 -2
- package/eval/cases/uj-ops-tiktok-leads-last-week.scenario.json +17 -3
- package/eval/cases/uj-patrol-cpc-spike-adgroups-over-15.scenario.json +9 -2
- package/eval/cases/uj-patrol-forewarning-create-daily-cap-3000.scenario.json +3 -1
- package/eval/cases/uj-patrol-forewarning-trigger-records.scenario.json +17 -3
- package/eval/cases/uj-patrol-google-balances-low.scenario.json +11 -2
- package/eval/cases/uj-roi-optimize-records-then-execute-cautiously.scenario.json +14 -3
- package/eval/cases/uj-roi-search-terms-add-negative-keywords.scenario.json +14 -2
- package/eval/stub-fixtures/rag-list.json +19 -0
- package/eval/stub-fixtures/rag-query.json +20 -0
- package/package.json +1 -1
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
## 金额单位(全局重要)
|
|
8
8
|
|
|
9
|
-
> **所有 CLI 金额参数均按「主币种金额」传入**(如 `1.5` = ¥1.50 / $1.50
|
|
9
|
+
> **所有 CLI 金额参数均按「主币种金额」传入**(如 `1.5` = ¥1.50 / $1.50)
|
|
10
10
|
> **唯一例外**:`ad keyword-edit --max-cpc` 单位为「主币种元」(直接透传,不做 ×100 转换)。
|
|
11
11
|
> **禁止** 按 Google micros(×1,000,000)填写任何金额参数。
|
|
12
12
|
|
|
@@ -24,76 +24,22 @@
|
|
|
24
24
|
|
|
25
25
|
---
|
|
26
26
|
|
|
27
|
-
##
|
|
27
|
+
## 新建广告系列(方案 + 创建)
|
|
28
28
|
|
|
29
|
-
>
|
|
30
|
-
> 1)完整阅读所有规则文档 → 2)向用户补齐关键信息 → 3)在规则约束下设计广告计划 → 4)按模板输出方案并获得用户「明确确认」 → 5)**仅在已确认的前提下**执行任何结构性改动。
|
|
31
|
-
|
|
32
|
-
### 第一步:规则文档阅读(不得跳过)
|
|
33
|
-
|
|
34
|
-
操作开始前,**AI 必须先阅读完下面所有文档**,严禁只读 `google-ads-launch-plan-template.md` 就直接出方案。
|
|
35
|
-
|
|
36
|
-
| 文档地址 | 文档内容 |
|
|
37
|
-
| ------------------------------------------------------------ | ----------------------------------------------------------------------------- |
|
|
38
|
-
| `references/google-ads-rules/google-ads-compliance.md` | 关键词 & 文案审核规则、编辑规范、禁止内容、商标规则 |
|
|
39
|
-
| `references/google-ads-rules/sensitive-industries.md` | 酒精/赌博/金融/加密/医疗等 15 个敏感行业规则 |
|
|
40
|
-
| `references/google-ads-rules/google-ads-keyword-strategy.md` | 匹配类型策略、分组结构、否定词技巧、出价意图分层 |
|
|
41
|
-
| `references/google-ads-rules/google-ads-keyword-optimization.md` | 基于数据的迭代优化闭环 |
|
|
42
|
-
| `references/google-ads-rules/google-ads-creative-optimization.md` | RSA 主题法、Ad Strength、A/B 测试、附加信息优化 |
|
|
43
|
-
| `references/google-ads-rules/google-ads-campaign-optimization.md` | 系列类型选择、出价策略、转化追踪、预算优化 |
|
|
44
|
-
| `references/google-ads-rules/google-ads-launch-plan-template.md` | **投放计划确认模板**(用户确认后再执行) |
|
|
45
|
-
| `references/google-ads-rules/google-ads-account-audit.md` | 账户诊断三层审计框架 |
|
|
46
|
-
| `references/google-ads-rules/google-ads-conversion-architecture.md` | 转化信号架构(L1-L5)、Enhanced Conversions、Consent Mode |
|
|
47
|
-
| `references/google-ads-rules/google-ads-audience-strategy.md` | 受众类型、再营销分层、Customer Match |
|
|
48
|
-
| `references/google-ads-rules/google-ads-pmax-guide.md` | PMax 与 Demand Gen 深度运营 |
|
|
49
|
-
|
|
50
|
-
**搜索广告方案 — 落地页 URL 推断**:用户只提供官网首页时,参阅 `references/google-ads-rules/google-ads-landing-page-discovery-via-webfetch.md`(**不向用户复述工具名**)。
|
|
51
|
-
|
|
52
|
-
> **AI Agent 要求:**
|
|
53
|
-
> - 未读完全部文档前,不得生成广告计划或文案。
|
|
54
|
-
> - 首次阅读后,向用户简要复述 3~5 条与本次任务强相关的合规/策略要点。
|
|
55
|
-
> - 生成的关键词、文案、出价与结构必须显式遵守规则;与规则冲突时以规则优先。
|
|
56
|
-
> - **方案阶段措辞**:用「方案草案 / 待你确认后再执行」等表述,避免暗示可跳过用户确认。回复开头列出已读规则文档清单。
|
|
57
|
-
|
|
58
|
-
### 第二步:向用户补齐关键信息
|
|
59
|
-
|
|
60
|
-
AI 应最少确认以下信息:
|
|
61
|
-
- **业务与转化目标**:行业、主营产品/服务、转化动作(表单/电话/下单等)。
|
|
62
|
-
- **目标地区与语言**:投放国家/地区、语言组合。
|
|
63
|
-
- **预算与节奏**:日预算区间、活动档期、试错周期。
|
|
64
|
-
- **历史投放情况**:是否有历史数据、必须保留/禁止的词或文案。
|
|
65
|
-
- **合规与品牌限制**:敏感行业、品牌词/法律风控要求等。
|
|
66
|
-
|
|
67
|
-
### 第三步:根据规则与信息生成计划并确认
|
|
68
|
-
|
|
69
|
-
按 `references/google-ads-rules/google-ads-launch-plan-template.md` 生成计划,与用户沟通确认。方案中必须:
|
|
70
|
-
- 引用并遵守规则文档关键条款,标注来源。
|
|
71
|
-
- 解释核心决定依据(匹配结构、排除词、出价策略)。
|
|
72
|
-
- 列出风险点与替代方案。
|
|
73
|
-
|
|
74
|
-
**只有用户明确表示「同意/确认按此方案执行」后**,才能执行操作。
|
|
75
|
-
|
|
76
|
-
> 即使用户要求跳过方案直接创建,也必须先输出完整 Markdown 投放方案并列出已参考的规则文档。
|
|
77
|
-
|
|
78
|
-
- 创建失败处理:
|
|
79
|
-
- 部分失败:获取失败子项,用对应命令重新创建
|
|
80
|
-
- 完全失败:直接重新创建
|
|
29
|
+
> **流程与校验**:`references/google-ads-campaign-plan.md`。本文件只写 **命令参数**(`campaign-validate` / `campaign-create` / `batch` 见下文各节)。
|
|
81
30
|
|
|
82
31
|
---
|
|
83
32
|
|
|
84
33
|
## 广告的编辑
|
|
85
34
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
### 广告修改
|
|
89
|
-
- 基于 `references/google-ads-rules/*.md` 评估修改内容
|
|
90
|
-
- 读取 launch-plan-template 对应章节,按格式输出给用户确认
|
|
91
|
-
- 使用 `ad -h` 查询可用命令,执行后用获取命令校验
|
|
35
|
+
已上线系列勿用 `campaign-create` 覆盖;改方案/重建见 **`google-ads-campaign-plan.md`** § 已上线后的修改;分步 CRUD 用下文 `ad *-edit` 等,写后读命令复核。
|
|
92
36
|
|
|
93
37
|
### 广告新增
|
|
38
|
+
|
|
94
39
|
参考修改流程,将修改命令替换为新增命令。
|
|
95
40
|
|
|
96
41
|
### 广告优化
|
|
42
|
+
|
|
97
43
|
参考修改流程,增加新旧对照表格。
|
|
98
44
|
|
|
99
45
|
---
|
|
@@ -101,65 +47,121 @@ AI 应最少确认以下信息:
|
|
|
101
47
|
## ad campaigns — 广告系列管理
|
|
102
48
|
|
|
103
49
|
### 查询列表
|
|
50
|
+
|
|
104
51
|
```bash
|
|
105
52
|
siluzan-tso ad campaigns -a <accountId> [--start <YYYY-MM-DD>] [--end <YYYY-MM-DD>] [--json]
|
|
106
53
|
```
|
|
54
|
+
|
|
107
55
|
`--json` 下 `budget` 为日预算(主币种「元」,CLI 已 ÷100),另有 `statusDisplay`(状态文案)。
|
|
108
56
|
|
|
109
57
|
### 启停
|
|
58
|
+
|
|
110
59
|
```bash
|
|
111
60
|
siluzan-tso ad campaign-status -a <accountId> --id <campaignId> --status <Enabled|Paused>
|
|
112
61
|
```
|
|
113
62
|
|
|
114
63
|
### 删除
|
|
64
|
+
|
|
115
65
|
```bash
|
|
116
66
|
siluzan-tso ad campaign-delete -a <accountId> --id <campaignId>
|
|
117
67
|
```
|
|
68
|
+
|
|
118
69
|
> 删除不可逆,建议先 `campaigns` 确认名称。
|
|
119
70
|
|
|
120
71
|
---
|
|
121
72
|
|
|
73
|
+
## 批量创建工作流(adgroup + keyword + ad + extension)
|
|
74
|
+
|
|
75
|
+
适用:从 Excel/JSON 任务清单一次性创建多个广告组及其内容。`adgroup-create` / `keyword-create` / `ad-create` / `extension <type>` 均已支持 **`--json`**,网关响应里直接含 `id`,**无需**再 `ad groups --json` 反查。
|
|
76
|
+
|
|
77
|
+
**推荐节奏**(每广告组):
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
# 1. 创建广告组 → 拿 adgroupId
|
|
81
|
+
out=$(siluzan-tso ad adgroup-create -a <accountId> \
|
|
82
|
+
--campaign-id <campaignId> --campaign-name <campaignName> \
|
|
83
|
+
--name "<adgroupName>" --max-cpc 2.0 --status ENABLED --json)
|
|
84
|
+
adgroupId=$(echo "$out" | jq -r '.id')
|
|
85
|
+
|
|
86
|
+
# 2. 添加关键词(已是单组批量,传逗号分隔关键词)
|
|
87
|
+
siluzan-tso ad keyword-create -a <accountId> \
|
|
88
|
+
--adgroup-id "$adgroupId" --adgroup-name "<adgroupName>" \
|
|
89
|
+
--campaign-id <campaignId> --campaign-name <campaignName> \
|
|
90
|
+
--keywords "kw1,\"kw2\",[kw3]" --final-url "https://..." --json
|
|
91
|
+
|
|
92
|
+
# 3. 添加 RSA 广告
|
|
93
|
+
siluzan-tso ad ad-create -a <accountId> \
|
|
94
|
+
--adgroup-id "$adgroupId" --adgroup-name "<adgroupName>" \
|
|
95
|
+
--final-url "https://..." \
|
|
96
|
+
--headlines "标题1,标题2,标题3,..." \
|
|
97
|
+
--descriptions "描述1,描述2,..." \
|
|
98
|
+
[--path1 <path1>] [--path2 <path2>] --json
|
|
99
|
+
|
|
100
|
+
# 4. 系列层 Sitelinks(每条 1 次调用,逐条循环)
|
|
101
|
+
for sitelink in "${SITELINKS[@]}"; do
|
|
102
|
+
siluzan-tso ad extension sitelink -a <accountId> \
|
|
103
|
+
--level Campaign --campaign-id <campaignId> \
|
|
104
|
+
--text "..." --url "..." [--line2/--line3 ...] --json
|
|
105
|
+
done
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
**幂等性(Agent 侧)**:CLI 当前无 `--idempotent` 参数,请脚本侧先用 `ad groups --json` / `ad keywords --json` / `ad list --json` / `ad extension list --json` 取已有实体清单,按 `name + adgroupId` 等键过滤待创建项;HTTP 400 多半是重复创建,建议捕获并跳过。
|
|
109
|
+
|
|
110
|
+
**字符上限**(Agent 侧校验):标题 ≤30、描述 ≤90、CALLOUT ≤25、Sitelink Text ≤25。CJK 字符按 2 计(Google 规范),`google-ads-rules/google-ads-compliance.md` 有详细规则。
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
122
114
|
## ad groups — 广告组管理
|
|
123
115
|
|
|
124
116
|
### 查询列表
|
|
117
|
+
|
|
125
118
|
```bash
|
|
126
119
|
siluzan-tso ad groups -a <accountId> [--start/--end <date>] [--json]
|
|
127
120
|
```
|
|
128
121
|
|
|
129
122
|
### 创建
|
|
123
|
+
|
|
130
124
|
```bash
|
|
131
125
|
siluzan-tso ad adgroup-create \
|
|
132
126
|
-a <accountId> \
|
|
133
127
|
--campaign-id <campaignId> --campaign-name <campaignName> \
|
|
134
128
|
--name <adGroupName> --max-cpc <主币种金额> \
|
|
135
|
-
[--status ENABLED|PAUSED]
|
|
129
|
+
[--status ENABLED|PAUSED] [--json | --json-out <path>]
|
|
136
130
|
```
|
|
137
131
|
|
|
138
|
-
| 选项
|
|
139
|
-
|
|
|
140
|
-
| `-a, --account <id>`
|
|
141
|
-
| `--campaign-id <id>`
|
|
142
|
-
| `--campaign-name <name>` | 所属广告系列名称
|
|
143
|
-
| `--name <name>`
|
|
144
|
-
| `--max-cpc <amount>`
|
|
145
|
-
| `--status`
|
|
132
|
+
| 选项 | 说明 | 必填 |
|
|
133
|
+
| ------------------------ | ------------------------------------------------------------------ | ---- |
|
|
134
|
+
| `-a, --account <id>` | Google mediaCustomerId | ✅ |
|
|
135
|
+
| `--campaign-id <id>` | 所属广告系列 ID | ✅ |
|
|
136
|
+
| `--campaign-name <name>` | 所属广告系列名称 | ✅ |
|
|
137
|
+
| `--name <name>` | 广告组名称 | ✅ |
|
|
138
|
+
| `--max-cpc <amount>` | 最高 CPC(主币种金额) | ✅ |
|
|
139
|
+
| `--status` | `ENABLED`(默认)/ `PAUSED` | |
|
|
140
|
+
| `--json` / `--json-out` | 输出网关返回的完整 adgroup 对象(含 `id` / `maxCPCAmountYuan` 等) | |
|
|
141
|
+
|
|
142
|
+
**返回字段(--json)**:网关同步返回完整 adgroup,含 **`id`**(adgroupId)、`name`、`campaignId`、`statusV2`、`maxCPCAmountYuan`(元,CLI 已 ÷100)、`typeV2: "SEARCH_STANDARD"` 等 75+ 字段。批量创建脚本应直接读 `id`,**不需要**再次 `ad groups --json` 反查。
|
|
146
143
|
|
|
147
144
|
### 启停
|
|
145
|
+
|
|
148
146
|
```bash
|
|
149
147
|
siluzan-tso ad adgroup-status -a <accountId> --id <adGroupId> --status <Enabled|Paused>
|
|
150
148
|
```
|
|
151
149
|
|
|
152
150
|
### 编辑
|
|
151
|
+
|
|
153
152
|
先用 `ad groups --json` 查看当前值,再只改传入字段。
|
|
153
|
+
|
|
154
154
|
```bash
|
|
155
155
|
siluzan-tso ad adgroup-edit \
|
|
156
156
|
-a <accountId> --id <adGroupId> \
|
|
157
157
|
[--name <新名称>] [--max-cpc <主币种金额>] [--target-cpa <主币种金额>] \
|
|
158
158
|
[--start/--end <YYYY-MM-DD>]
|
|
159
159
|
```
|
|
160
|
-
|
|
160
|
+
|
|
161
|
+
`--max-cpc` / `--target-cpa` 与 `ad groups --json` 中 `maxCPCAmountYuan` / `targetCpaAmountYuan` 对齐(**元**,CLI 出口已统一)。
|
|
161
162
|
|
|
162
163
|
### 删除
|
|
164
|
+
|
|
163
165
|
```bash
|
|
164
166
|
siluzan-tso ad adgroup-delete -a <accountId> --id <adGroupId>
|
|
165
167
|
```
|
|
@@ -169,15 +171,19 @@ siluzan-tso ad adgroup-delete -a <accountId> --id <adGroupId>
|
|
|
169
171
|
## ad list — 广告创意管理
|
|
170
172
|
|
|
171
173
|
### 查询列表
|
|
174
|
+
|
|
172
175
|
```bash
|
|
173
176
|
siluzan-tso ad list -a <accountId> [--start/--end <date>] [--include-deleted] [--json]
|
|
174
177
|
```
|
|
178
|
+
|
|
175
179
|
`--include-deleted` 用于审计/排障,会多传 `readDeleted=true`。
|
|
176
180
|
|
|
177
181
|
### 拒审巡检(`--json`)
|
|
182
|
+
|
|
178
183
|
关注 `policyApprovalStatusV2`(`2`=不通过、`3`=受限)、`approvalStatusDetails`(`;` 分隔摘要)、`statusV2`(过滤 `Removed`)。同源也可用 `google-analysis --sections ads --json-out <dir>`。
|
|
179
184
|
|
|
180
185
|
### 创建(RSA)
|
|
186
|
+
|
|
181
187
|
```bash
|
|
182
188
|
siluzan-tso ad ad-create \
|
|
183
189
|
-a <accountId> \
|
|
@@ -185,11 +191,14 @@ siluzan-tso ad ad-create \
|
|
|
185
191
|
--final-url <url> \
|
|
186
192
|
--headlines "标题1,标题2,标题3" \
|
|
187
193
|
--descriptions "描述1,描述2" \
|
|
188
|
-
[--path1 <≤15字符>] [--path2 <≤15字符>]
|
|
194
|
+
[--path1 <≤15字符>] [--path2 <≤15字符>] \
|
|
195
|
+
[--json | --json-out <path>]
|
|
189
196
|
```
|
|
190
|
-
|
|
197
|
+
|
|
198
|
+
`--headlines` 至少 3 条(≤30字符),`--descriptions` 至少 2 条(≤90字符)。**`--json`** 返回网关响应(含 `id` 等字段),便于批量脚本拿到 adId 后续编辑/启停。
|
|
191
199
|
|
|
192
200
|
### 启停 / 删除
|
|
201
|
+
|
|
193
202
|
```bash
|
|
194
203
|
siluzan-tso ad ad-status -a <accountId> --id <adId> --status <Enabled|Paused>
|
|
195
204
|
siluzan-tso ad ad-delete -a <accountId> --id <adId>
|
|
@@ -200,20 +209,26 @@ siluzan-tso ad ad-delete -a <accountId> --id <adId>
|
|
|
200
209
|
## ad keywords — 关键词管理
|
|
201
210
|
|
|
202
211
|
### 查询
|
|
212
|
+
|
|
203
213
|
```bash
|
|
204
214
|
siluzan-tso ad keywords -a <accountId> [--negative] [--start/--end <date>] [--json]
|
|
205
215
|
```
|
|
206
216
|
|
|
207
217
|
### 添加关键词
|
|
218
|
+
|
|
208
219
|
```bash
|
|
209
220
|
siluzan-tso ad keyword-create \
|
|
210
221
|
-a <accountId> \
|
|
211
222
|
--adgroup-id <adGroupId> --adgroup-name <adGroupName> \
|
|
212
223
|
--campaign-id <campaignId> --campaign-name <campaignName> \
|
|
213
|
-
--keywords "词1,词2,词3" [--final-url <url>]
|
|
224
|
+
--keywords "词1,词2,词3" [--final-url <url>] \
|
|
225
|
+
[--json | --json-out <path>]
|
|
214
226
|
```
|
|
215
227
|
|
|
228
|
+
`--json` 输出 `{ request: { adgroupId, count }, response: ... }`,批量脚本可直接据此核对成功量。
|
|
229
|
+
|
|
216
230
|
### 否定关键词
|
|
231
|
+
|
|
217
232
|
```bash
|
|
218
233
|
# 添加(默认系列层级;传 --adgroup-id 则为组层级)
|
|
219
234
|
siluzan-tso ad keyword-negative-create \
|
|
@@ -238,6 +253,7 @@ siluzan-tso ad batch get --id <recordId>
|
|
|
238
253
|
siluzan-tso ad batch update --id <recordId> [--budget <主币种>] [--url <url>] [--campaign-name <name>]
|
|
239
254
|
siluzan-tso ad batch publish --id <recordId>
|
|
240
255
|
```
|
|
256
|
+
|
|
241
257
|
`update` / `publish` 仅 `draftStatus === "Draft"` 可操作。
|
|
242
258
|
|
|
243
259
|
---
|
|
@@ -247,88 +263,129 @@ siluzan-tso ad batch publish --id <recordId>
|
|
|
247
263
|
多场景编排(竞品 URL + 种子、账户词叠市场指标、否词与建户表等)见 **`references/keyword-planner-workflows.md`**。
|
|
248
264
|
|
|
249
265
|
```bash
|
|
250
|
-
siluzan-tso keyword -k <搜索词> [--url <url>] [--include <words>] [--exclude <words>] [--json] [--json-out <dir>]
|
|
266
|
+
siluzan-tso keyword -k <搜索词> [--geo <geoTargetConstantIds>] [--url <url>] [--google-only] [--include <words>] [--exclude <words>] [--json] [--json-out <dir>]
|
|
267
|
+
siluzan-tso keyword geo-list [--country-code <US,CN,...>] [--name-contains <text>] [--json]
|
|
251
268
|
```
|
|
252
|
-
|
|
269
|
+
|
|
270
|
+
`--geo` 传多个 ID(如 `2840,2826`)时,返回的搜索量/CPC/竞争度为**跨所传地区的汇总数据**,响应中**无**按地区拆分的字段。若要分别查看各市场指标,须**多次调用**且每次 `--geo` **只传一个** ID(详见 **`references/keyword-planner-workflows.md`**「多地区 `--geo`」)。
|
|
271
|
+
|
|
272
|
+
`--url` 触发网址拓词(`websitereco`)并合并进结果;与 `--google-only` 互斥(仅 Google Keyword Planner 时用后者)。`--include`/`--exclude` 为本地过滤。仅 Google、不联网搜索的 Agent 编排见 **`references/keyword-planner-workflows.md`**「分支 B」。
|
|
273
|
+
|
|
274
|
+
---
|
|
275
|
+
|
|
276
|
+
## ad campaign-validate — 投放 JSON 校验
|
|
277
|
+
|
|
278
|
+
不提交 API;创建系列前**建议**跑。命令、选项、与 create 共用校验逻辑见 **`references/google-ads-campaign-plan.md`** § 校验与创建(后端/Google 硬约束,不含关键词分层占比)。
|
|
253
279
|
|
|
254
280
|
---
|
|
255
281
|
|
|
256
|
-
## ad campaign-create —
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
**步骤:** 1) Write 工具写 JSON → 2) `siluzan-tso ad campaign-create --config-file /path/to/config.json` → 3) `ad batch get --id <taskId>` 查进度
|
|
269
|
-
|
|
270
|
-
完整 Schema 见 `assets/campaign-create-template.json`。
|
|
271
|
-
|
|
272
|
-
**核心字段:**
|
|
273
|
-
|
|
274
|
-
| 字段 | 必填 | 类型 | 说明 |
|
|
275
|
-
| --- | --- | --- | --- |
|
|
276
|
-
| `account` | ✅ | string | Google mediaCustomerId |
|
|
277
|
-
| `customerName` | ✅ | string | 账户名称 |
|
|
278
|
-
| `name` | ✅ | string | 广告系列名称 |
|
|
279
|
-
| `budget` | ✅ | number | 日预算,主币种金额 |
|
|
280
|
-
| `bidding` | ✅ | string | `TARGET_SPEND` / `MANUAL_CPC` / `TARGET_CPA` / `TARGET_ROAS` |
|
|
281
|
-
| `locationIds` | ✅ | string[] | 地理位置 ID(`ad geo search` 获取) |
|
|
282
|
-
| `adgroupName` | ✅ | string | 第一个广告组名称 |
|
|
283
|
-
| `maxCpc` | ✅ | number | 最高 CPC,主币种金额 |
|
|
284
|
-
| `bidCeiling` | ✅ | number | TARGET_SPEND 出价上限 |
|
|
285
|
-
| `targetCpa` | ✅ | number | TARGET_CPA 目标 CPA |
|
|
286
|
-
| `targetRoas` | ✅ | number | TARGET_ROAS(如 2.5) |
|
|
287
|
-
| `languageIds` | ✅ | string[] | 默认 `["1000"]`=英语,中文=`"1017"` |
|
|
288
|
-
| `startDate`/`endDate` | ✅ | string | YYYY-MM-DD |
|
|
289
|
-
| `url` | ✅ | string | 落地页 |
|
|
290
|
-
| `status` | ✅ | string | `Enabled` / `Paused` |
|
|
291
|
-
| `matchType` | ✅ | string | `BROAD` / `PHRASE` / `EXACT` |
|
|
292
|
-
| `keywords` | ✅ | string[] | 第一个广告组关键词 |
|
|
293
|
-
| `headlines` | ✅ | string[] | ≥3 条,≤30 字符,元素内允许逗号 |
|
|
294
|
-
| `descriptions` | ✅ | string[] | ≥2 条,≤90 字符 |
|
|
295
|
-
| `finalUrl` | ✅ | string | 广告落地页 |
|
|
296
|
-
| `path1`/`path2` | ✅ | string | ≤15 字符 |
|
|
297
|
-
| `productWords` | ✅ | string[] | 推广产品词 |
|
|
298
|
-
| `negativeKeywords` | ✅ | string[] | 否定关键词 |
|
|
299
|
-
| `extensions` | | array | 附加功能(CALL/SITELINK/STRUCTURED_SNIPPET) |
|
|
300
|
-
| `extraAdGroups` | | array | 额外广告组 |
|
|
301
|
-
| `draft` | | boolean | `true`=仅保存草稿 |
|
|
302
|
-
|
|
303
|
-
### 命令行传参(简单场景)
|
|
282
|
+
## ad campaign-create — 广告系列创建
|
|
283
|
+
|
|
284
|
+
**仅支持 JSON 配置文件**(`--config-file`)。JSON 字段名 **直接对齐后端契约**(外层 `CampaignCreationRecord`、内层 `campaign` 对应 `Samm.Domain.AdsAcctMgmt.Campaign`,**全部 PascalCase**)。CLI 不做字段重命名、camelCase 转换或结构展开。
|
|
285
|
+
|
|
286
|
+
- 默认:`draft: false` → 立即发布(`DraftStatus: Published`)
|
|
287
|
+
- `draft: true` → 仅保存草稿,需 `ad batch publish`
|
|
288
|
+
|
|
289
|
+
**步骤:**
|
|
290
|
+
|
|
291
|
+
- 模板:`assets/siluzan-ads/assets/campaign-create-template.json`(PascalCase 直通)
|
|
292
|
+
- 说明:`assets/siluzan-ads/assets/campaign-create-template.md`(逐字段含必填条件)
|
|
304
293
|
|
|
305
294
|
```bash
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
295
|
+
# 1. 复制模板并填写
|
|
296
|
+
# - 外层:account / customerName / name / url / draft
|
|
297
|
+
# - 内层 campaign:Name / Budget / BiddingStrategyTypeV2 / targetedLocations 等(PascalCase)
|
|
298
|
+
# - 广告组在 campaign.AdGroupsForBatchJob 数组中
|
|
299
|
+
siluzan-tso ad campaign-create --config-file ./campaign.json
|
|
300
|
+
|
|
301
|
+
# 2. 查异步任务(Creating 时每 5–10s 轮询,直至非 Creating)
|
|
302
|
+
siluzan-tso ad batch get --id <taskId> --config-file ./campaign.json
|
|
303
|
+
|
|
304
|
+
# 3. 成功或部分成功后必做比对
|
|
305
|
+
siluzan-tso ad batch diff --batch-id <taskId> --config-file ./campaign.json
|
|
306
|
+
# 可选:--campaign-id <id>(ad campaigns -a <accountId> --json;省略时按系列名自动匹配)
|
|
307
|
+
|
|
308
|
+
# Failed:系列未创建,无需 diff;根据 get 的 reason/errors 改 JSON 后重提
|
|
309
|
+
# siluzan-tso ad campaign-create --config-file ./campaign.json
|
|
317
310
|
```
|
|
318
|
-
|
|
311
|
+
|
|
312
|
+
### 失败处理(Agent 必遵)
|
|
313
|
+
|
|
314
|
+
| `status` | 含义 | 做法 |
|
|
315
|
+
| -------- | ---- | ---- |
|
|
316
|
+
| `Creating` | 仍在执行 | 继续 `ad batch get`,勿重复 `campaign-create` |
|
|
317
|
+
| `Successfully` | 全部成功 | **须** `ad batch diff` 核对计划与账户一致(无缺失应 ✅) |
|
|
318
|
+
| `Failed` | 全部失败 | `ad batch get` 读 `reason`/`errors` → **只改 JSON** → 再 `ad campaign-create`(**不要** `batch diff`) |
|
|
319
|
+
| `HasFailed` | 部分成功 | **须** `ad batch diff` 列出缺失 → 分步补建或删系列重提 |
|
|
320
|
+
|
|
321
|
+
**`HasFailed` 分支:**
|
|
322
|
+
|
|
323
|
+
1. **多数广告组未建成**(`AdGroupsForBatchJob` 中多数项无 `Id`,默认 ≥50%):
|
|
324
|
+
`ad campaign-delete -a <accountId> --id <campaignId>` → 按 `reason`/`errors` 修正 **campaign.json** → 重新 `ad campaign-create`。**不要**在脏系列上反复补建。
|
|
325
|
+
|
|
326
|
+
2. **仅少数组/资产失败**(系列与大部分组已有 `Id`):
|
|
327
|
+
- 缺组:`ad adgroup-create`(`--json` 取 `id`)
|
|
328
|
+
- 缺词:`ad keyword-create`(词面格式同 JSON `KeywordsForBatchJob`)
|
|
329
|
+
- 缺 RSA:`ad ad-create`(`--headlines` / `--descriptions` 从 JSON `AdsForBatchJob` 抄)
|
|
330
|
+
补建前可用 `ad groups` / `ad keywords` 核对账户现状。
|
|
331
|
+
|
|
332
|
+
**`ad batch diff` 比对维度:**系列是否存在 → 各 `AdGroupsForBatchJob[].Name` → 组内关键词(匹配类型+词面)→ RSA 首条标题 → 系列否定词 → 附加信息条数。默认按层级树状输出每条缺失的 **JSON 路径 + 计划内容 + 账户实况**;`--json` 可落盘完整结构。
|
|
333
|
+
|
|
334
|
+
**`ad batch get` 输出:**摘要表 + 后端原始 `reason` + 完整 `errors`(或 `--json` 整条记录)。
|
|
335
|
+
|
|
336
|
+
**CLI 在提交前只做三件事:**
|
|
337
|
+
|
|
338
|
+
1. 剥除 `_` 前缀注解键(如 `_meta`、`_comment_xxx`);
|
|
339
|
+
2. 缺失 `googleDataRecordId` 时生成 UUID;
|
|
340
|
+
3. 把 `campaign` 子树内金额字段(`Budget`、`MaxCPCAmount`、`TargetSpend_BidCeilingAmount`、`TargetCpa_BidingAmount`、`MaxCpmAmount`、`MaxCPVAmount`、`TargetCpaAmount`、`MaxCPC`)从「元」深遍历 ×100 转为「分」。
|
|
341
|
+
|
|
342
|
+
**字段校验:**提交前自动执行 `runCampaignCreateValidation`(与 `ad campaign-validate` 相同):后端镜像硬约束 + 词面/RSA/搜索网络等;关键词分层与匹配占比见 `google-ads-keyword-taxonomy.md`(仅 Agent 参考,CLI 不校验)。
|
|
343
|
+
|
|
344
|
+
**广告组:** 写在 `campaign.AdGroupsForBatchJob` 数组中(至少 1 项),字段名严格 PascalCase(`Name` / `MaxCPCAmount` / `KeywordsForBatchJob` / `AdsForBatchJob`)。详见 `campaign-create-template.md`。
|
|
345
|
+
|
|
346
|
+
**关键词匹配:** 写在 `KeywordsForBatchJob` 块内;同一块同匹配类型,`MatchTypeV2` 与 `KeywordText` 词面格式必须对齐(`PHRASE` 用 `"词"`、`EXACT` 用 `[词]`、`BROAD` 直写)。
|
|
347
|
+
|
|
348
|
+
广告组/关键词/创意的分步创建仍用 `adgroup-create`、`keyword-create`、`ad-create`。
|
|
319
349
|
|
|
320
350
|
---
|
|
321
351
|
|
|
322
352
|
## ad campaign-edit — 广告系列编辑
|
|
323
353
|
|
|
324
354
|
```bash
|
|
355
|
+
# 支持的策略枚举
|
|
356
|
+
siluzan-tso ad campaign-bidding-strategies [--json]
|
|
357
|
+
|
|
325
358
|
siluzan-tso ad campaign-edit \
|
|
326
359
|
-a <accountId> --id <campaignId> \
|
|
327
360
|
[--name <新名称>] [--budget <主币种>] [--bidding <策略>] \
|
|
328
|
-
[--bid-ceiling <主币种>] [--target-cpa <主币种>] \
|
|
361
|
+
[--bid-ceiling <主币种>] [--target-cpa <主币种>] [--target-roas <倍数>] \
|
|
362
|
+
[--manual-ecpc true|false] \
|
|
329
363
|
[--search-network true|false] [--content-network true|false]
|
|
330
364
|
```
|
|
331
|
-
|
|
365
|
+
|
|
366
|
+
| `--bidding` | 须配合 |
|
|
367
|
+
|-------------|--------|
|
|
368
|
+
| `TARGET_SPEND` | 可选 `--bid-ceiling`(0=不限) |
|
|
369
|
+
| `MANUAL_CPC` | 可选 `--manual-ecpc` |
|
|
370
|
+
| `TARGET_CPA` | **必填** `--target-cpa` |
|
|
371
|
+
| `TARGET_ROAS` | **必填** `--target-roas`(2.5 = 250%) |
|
|
372
|
+
| `MAXIMIZE_CONVERSIONS` | 可选 `--target-cpa`(目标 CPA,元) |
|
|
373
|
+
|
|
374
|
+
示例:
|
|
375
|
+
|
|
376
|
+
```bash
|
|
377
|
+
# 改为「尽可能争取更多点击次数」并设 CPC 上限 ¥3.5
|
|
378
|
+
siluzan-tso ad campaign-edit -a <accountId> --id <campaignId> \
|
|
379
|
+
--bidding TARGET_SPEND --bid-ceiling 3.5
|
|
380
|
+
|
|
381
|
+
# 改为 tCPA = ¥80
|
|
382
|
+
siluzan-tso ad campaign-edit -a <accountId> --id <campaignId> \
|
|
383
|
+
--bidding TARGET_CPA --target-cpa 80
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
相对运算:先 `ad campaigns --json` 读 `budget`(已为主币种元)、`biddingStrategyTypeV2`,再传入。
|
|
387
|
+
|
|
388
|
+
> PMax / 部分智能系列类型 Google 可能拒绝切换出价策略;以 API 返回错误为准。
|
|
332
389
|
|
|
333
390
|
---
|
|
334
391
|
|
|
@@ -345,6 +402,7 @@ siluzan-tso ad adgroup-rename -a <accountId> --id <adGroupId> --name <新名称>
|
|
|
345
402
|
先用 `ad list --json` 取得完整 JSON,再只修改传入字段,未改字段从列表原值带回。
|
|
346
403
|
|
|
347
404
|
`ad list --json` 关键字段映射:
|
|
405
|
+
|
|
348
406
|
- `headlinePart1~3` + `AddtionalHeadlines` → `--headlines`(≥3条)
|
|
349
407
|
- `adDescription`/`adDescription2` + `AddtionalAdDescriptions` → `--descriptions`(≥2条)
|
|
350
408
|
- `finalUrl` → `--final-url`;`path1`/`path2` → `--path1`/`--path2`
|
|
@@ -357,6 +415,7 @@ siluzan-tso ad ad-edit \
|
|
|
357
415
|
[--final-url <url>] [--path1 <p1>] [--path2 <p2>] \
|
|
358
416
|
[--status Enabled|Paused]
|
|
359
417
|
```
|
|
418
|
+
|
|
360
419
|
至少指定一项。
|
|
361
420
|
|
|
362
421
|
---
|
|
@@ -380,9 +439,20 @@ siluzan-tso ad keyword-delete -a <accountId> --id <keywordId> --adgroup-id <adGr
|
|
|
380
439
|
siluzan-tso ad keyword-edit \
|
|
381
440
|
-a <accountId> --id <keywordId> \
|
|
382
441
|
[--text <新关键词>] [--match-type Broad|Phrase|Exact] \
|
|
383
|
-
[--max-cpc <n>] [--final-url <url>]
|
|
442
|
+
[--max-cpc <n>] [--final-url <url>] [--status Enabled|Paused]
|
|
443
|
+
```
|
|
444
|
+
|
|
445
|
+
传 `--match-type` 时 CLI 自动规范 `keywordText` 括号/引号格式。至少传一项。`--max-cpc` 为「主币种元」(见文首金额单位说明)。`--status` 写入 `userStatusV2`(与 Web 关键词开关一致,非系列的 `statusV2`)。
|
|
446
|
+
|
|
447
|
+
---
|
|
448
|
+
|
|
449
|
+
## ad keyword-status — 搜索关键词状态切换
|
|
450
|
+
|
|
451
|
+
仅改 `userStatusV2`,走与 `keyword-edit` 相同的批量 PUT。与 `ad adgroup-status` 用法对称。
|
|
452
|
+
|
|
453
|
+
```bash
|
|
454
|
+
siluzan-tso ad keyword-status -a <accountId> --id <keywordId> --status <Enabled|Paused>
|
|
384
455
|
```
|
|
385
|
-
传 `--match-type` 时 CLI 自动规范 `keywordText` 括号/引号格式。至少传一项。`--max-cpc` 为「主币种元」(见文首金额单位说明)。
|
|
386
456
|
|
|
387
457
|
---
|
|
388
458
|
|
|
@@ -393,13 +463,14 @@ siluzan-tso ad keyword-negative-edit \
|
|
|
393
463
|
-a <accountId> --id <negativeKeywordId> \
|
|
394
464
|
[--text <新文本>] [--match-type Broad|Phrase|Exact]
|
|
395
465
|
```
|
|
466
|
+
|
|
396
467
|
传 `--match-type` 时 CLI 自动同步改写外层括号/引号。
|
|
397
468
|
|
|
398
469
|
---
|
|
399
470
|
|
|
400
471
|
## ad extension — 附加信息管理
|
|
401
472
|
|
|
402
|
-
修改方式为**先删后建**(无 PUT
|
|
473
|
+
修改方式为**先删后建**(无 PUT 接口)。所有 `extension <type>` 子命令均支持 `--json` / `--json-out`,输出网关返回的扩展对象(含 `id`),批量脚本可据此回填。
|
|
403
474
|
|
|
404
475
|
```bash
|
|
405
476
|
# 查询
|
|
@@ -407,21 +478,22 @@ siluzan-tso ad extension list -a <accountId> [--type SITELINK|CALL|CALLOUT|STRUC
|
|
|
407
478
|
|
|
408
479
|
# 附加链接
|
|
409
480
|
siluzan-tso ad extension sitelink -a <accountId> --text "文字" --url "https://..." \
|
|
410
|
-
[--line2/--line3 <text>] [--level Account|Campaign|AdGroup] [--campaign-id <id>]
|
|
481
|
+
[--line2/--line3 <text>] [--level Account|Campaign|AdGroup] [--campaign-id <id>] [--json]
|
|
411
482
|
|
|
412
483
|
# 附加电话
|
|
413
484
|
siluzan-tso ad extension call -a <accountId> --country-code "+86" --phone "4008001234" \
|
|
414
|
-
[--level Account|Campaign|AdGroup]
|
|
485
|
+
[--level Account|Campaign|AdGroup] [--json]
|
|
415
486
|
|
|
416
487
|
# 附加宣传信息(≤25字符)
|
|
417
|
-
siluzan-tso ad extension callout -a <accountId> --text "免费送货上门" [--level Account]
|
|
488
|
+
siluzan-tso ad extension callout -a <accountId> --text "免费送货上门" [--level Account] [--json]
|
|
418
489
|
|
|
419
490
|
# 附加结构化摘要
|
|
420
|
-
siluzan-tso ad extension snippet -a <accountId> --header "Brands" --values "A,B,C" [--level Account]
|
|
491
|
+
siluzan-tso ad extension snippet -a <accountId> --header "Brands" --values "A,B,C" [--level Account] [--json]
|
|
421
492
|
|
|
422
493
|
# 删除
|
|
423
494
|
siluzan-tso ad extension delete -a <accountId> --id <extensionId>
|
|
424
495
|
```
|
|
496
|
+
|
|
425
497
|
`--header` 常用值:`Brands`/`Services`/`Amenities`/`Types`/`Styles`/`Courses`/`Models` 等。
|
|
426
498
|
|
|
427
499
|
---
|
|
@@ -451,3 +523,43 @@ siluzan-tso ad geo add -a <accountId> --campaign-id <id> --location-id <id> [--b
|
|
|
451
523
|
# 删除
|
|
452
524
|
siluzan-tso ad geo remove -a <accountId> --campaign-id <id> --location-id <id>
|
|
453
525
|
```
|
|
526
|
+
|
|
527
|
+
---
|
|
528
|
+
|
|
529
|
+
## ad device-bid — 设备出价调整
|
|
530
|
+
|
|
531
|
+
与前端 `updateDeviceAndAddress`(`intelligent-optimization-v2.ts`)及 AI 优化「修改设备出价」同源。
|
|
532
|
+
|
|
533
|
+
| 级别 | 列表 | 修改 |
|
|
534
|
+
|------|------|------|
|
|
535
|
+
| **系列**(默认) | `GET …/campaignmanagement/{id}/BidModifiers/Devices` | `PUT …/campaigns/{campaignId}/Criteria/{criterionId}/BidModifier/{bidModifier}` |
|
|
536
|
+
| **广告组** | `GET …/adgroupnmanagement/bidmodifiers/{id}?campaignId&adgroupId&criteriaType=PLATFORM` | `PUT …/adgroupnmanagement/bidmodifiers/{id}?campaignId&adGroupId` + Body `Criterion[]` |
|
|
537
|
+
|
|
538
|
+
**`--bid-modifier` 口径(系列级直接透传 Google 倍率)**
|
|
539
|
+
|
|
540
|
+
| 倍率 | 含义 |
|
|
541
|
+
|------|------|
|
|
542
|
+
| `1.0` | 不调整 |
|
|
543
|
+
| `0.8` | 降低 20% |
|
|
544
|
+
| `1.2` | 提高 20% |
|
|
545
|
+
| `0` | 排除该设备(-100%) |
|
|
546
|
+
|
|
547
|
+
广告组级会在 CLI 内将倍率转为后端百分比:`(倍率 - 1) × 100`(与 `GoogleAdsAcctMgmtServiceProviderV2.MutateAdGroupBidModifier` 一致)。
|
|
548
|
+
|
|
549
|
+
**Sammamish 落点**:`CampaignManagementController.GetDeviceBidModifier` / `ModifyCampaignCriteriaBidModifier`;`AdGroupManagementController.SetAdGroupCriterionBidModifier` → `GoogleAdsAcctMgmtServiceProviderV2`。
|
|
550
|
+
|
|
551
|
+
```bash
|
|
552
|
+
# 系列级:账户下全部设备出价(可按系列过滤)
|
|
553
|
+
siluzan-tso ad device-bid list -a <accountId> [--campaign-id <id>] [--json]
|
|
554
|
+
|
|
555
|
+
# 广告组级
|
|
556
|
+
siluzan-tso ad device-bid list -a <accountId> --level adgroup --campaign-id <id> --ad-group-id <id> [--json]
|
|
557
|
+
|
|
558
|
+
# 修改系列设备出价(id 来自 list --json,或用 --device-type 自动匹配)
|
|
559
|
+
siluzan-tso ad device-bid set -a <accountId> --campaign-id <id> --device-type Mobile --bid-modifier 0.8
|
|
560
|
+
|
|
561
|
+
# 修改广告组设备出价
|
|
562
|
+
siluzan-tso ad device-bid set -a <accountId> --level adgroup --campaign-id <id> --ad-group-id <id> --device-type Desktop --bid-modifier 1.1
|
|
563
|
+
```
|
|
564
|
+
|
|
565
|
+
> 智能出价(tCPA/tROAS)可能覆盖设备出价调整;排除极差设备仍可用 `0`。
|