@bluevs/vhcli 0.5.8 → 0.5.9
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/package.json +9 -8
- package/skill/SKILL.md +383 -0
- package/skill/docs/agent.md +43 -0
- package/skill/docs/auth.md +47 -0
- package/skill/docs/company.md +47 -0
- package/skill/docs/google.md +34 -0
- package/skill/docs/material-report.md +191 -0
- package/skill/docs/project.md +435 -0
- package/skill/docs/tiktok.md +749 -0
- package/skill/scripts/install-skill.sh +126 -0
- package/skill/scripts/vh-auth-card.cjs +228 -0
package/package.json
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bluevs/vhcli",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.9",
|
|
4
4
|
"description": "Vision Hub CLI - query projects and resources, designed for AI Agent and developers",
|
|
5
5
|
"bin": {
|
|
6
6
|
"vhcli": "scripts/run.js"
|
|
7
7
|
},
|
|
8
8
|
"scripts": {},
|
|
9
9
|
"optionalDependencies": {
|
|
10
|
-
"@bluevs/vhcli-darwin-arm64": "0.5.
|
|
11
|
-
"@bluevs/vhcli-darwin-x64": "0.5.
|
|
12
|
-
"@bluevs/vhcli-linux-arm64": "0.5.
|
|
13
|
-
"@bluevs/vhcli-linux-x64": "0.5.
|
|
14
|
-
"@bluevs/vhcli-win32-arm64": "0.5.
|
|
15
|
-
"@bluevs/vhcli-win32-x64": "0.5.
|
|
10
|
+
"@bluevs/vhcli-darwin-arm64": "0.5.9",
|
|
11
|
+
"@bluevs/vhcli-darwin-x64": "0.5.9",
|
|
12
|
+
"@bluevs/vhcli-linux-arm64": "0.5.9",
|
|
13
|
+
"@bluevs/vhcli-linux-x64": "0.5.9",
|
|
14
|
+
"@bluevs/vhcli-win32-arm64": "0.5.9",
|
|
15
|
+
"@bluevs/vhcli-win32-x64": "0.5.9"
|
|
16
16
|
},
|
|
17
17
|
"engines": {
|
|
18
18
|
"node": ">=16"
|
|
@@ -23,6 +23,7 @@
|
|
|
23
23
|
},
|
|
24
24
|
"license": "MIT",
|
|
25
25
|
"files": [
|
|
26
|
-
"scripts/run.js"
|
|
26
|
+
"scripts/run.js",
|
|
27
|
+
"skill/"
|
|
27
28
|
]
|
|
28
29
|
}
|
package/skill/SKILL.md
ADDED
|
@@ -0,0 +1,383 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: vh-skill
|
|
3
|
+
description: VH AI营销平台 - 授权管理、项目操作、广告账户管理、素材报表、媒体平台操作。通过 vhcli CLI 与 VH 平台交互。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# VH SKILL - AI营销平台操作
|
|
7
|
+
|
|
8
|
+
> VH平台(又称「AI营销平台」)的 CLI 工具。覆盖授权、项目管理、广告账户、素材报表、媒体平台操作。
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## 安装
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
npm install -g @bluevs/vhcli
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
### 环境检测与自动安装
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
bash skills/vhcli/scripts/install-skill.sh
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
双向检测逻辑:
|
|
25
|
+
|
|
26
|
+
| 场景 | 检测 | 动作 |
|
|
27
|
+
|------|------|------|
|
|
28
|
+
| 先装了 skill,没有 vhcli CLI | `which vhcli` | 自动 `npm install -g @bluevs/vhcli` |
|
|
29
|
+
| 先装了 vhcli,没有 skill | 检测 npm 包内 `skill/` 目录 | 同步到 workspace |
|
|
30
|
+
| 两者都在 + 版本一致 | 比对版本号 | 跳过 |
|
|
31
|
+
| 两者都在 + 版本不同 | 比对版本号 | 同步新版(不覆盖本地 scripts/ 定制) |
|
|
32
|
+
|
|
33
|
+
首次使用或升级时运行一次即可,后续无需重复执行。
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## 架构概览
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
用户需求
|
|
41
|
+
│
|
|
42
|
+
▼
|
|
43
|
+
┌─────────────────────────────┐
|
|
44
|
+
│ 执行前必检流程(见下方) │
|
|
45
|
+
└──────────────┬──────────────┘
|
|
46
|
+
│
|
|
47
|
+
┌─────────┼─────────┐
|
|
48
|
+
▼ ▼ ▼
|
|
49
|
+
第一层 第二层 第三层
|
|
50
|
+
平台授权 账户Token 下游操作
|
|
51
|
+
auth project media/google/
|
|
52
|
+
login account- material-report
|
|
53
|
+
token
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## 🚨 执行前必检流程(每次操作必须走完)
|
|
59
|
+
|
|
60
|
+
### Step 1:确认平台用户授权
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
vhcli auth token
|
|
64
|
+
```
|
|
65
|
+
- 有 token → 继续
|
|
66
|
+
- 无 token → 发起授权(飞书场景用卡片脚本)
|
|
67
|
+
|
|
68
|
+
### Step 2:查项目列表,引导用户确认项目
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
vhcli project list
|
|
72
|
+
```
|
|
73
|
+
**⚠️ 即使只有一个项目,也必须让用户确认!**
|
|
74
|
+
|
|
75
|
+
### Step 3:查项目下广告账户,引导用户确认账户
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
vhcli project accounts --project-id <project_id>
|
|
79
|
+
```
|
|
80
|
+
**⚠️ 必须让用户确认要操作哪个广告账户!**
|
|
81
|
+
|
|
82
|
+
### Step 4:初始化该账户的 token 到本地
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
vhcli project account-token --customer-project-id <数字ID> --account-id <账户ID>
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### Step 5:使用 token 进行下游操作
|
|
89
|
+
|
|
90
|
+
从 `~/.vhcli/ad_tokens.json` 读取对应账户的 token。
|
|
91
|
+
|
|
92
|
+
### 切换账户
|
|
93
|
+
|
|
94
|
+
回到 Step 3 → 确认新账户 → 重新 account-token → 继续。
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## 🚨 铁律:禁止用记忆/缓存冒充实时数据
|
|
99
|
+
|
|
100
|
+
1. **任何平台数据必须实时查询**,不得用记忆中的旧数据当作查询结果
|
|
101
|
+
2. 授权过期时立刻发起授权流程
|
|
102
|
+
3. 记忆中的数据只能作为"提示/参考"
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## 模块文档索引
|
|
107
|
+
|
|
108
|
+
| 模块 | 文件 | 说明 |
|
|
109
|
+
|------|------|------|
|
|
110
|
+
| 认证 | [docs/auth.md](docs/auth.md) | 平台用户授权(Device Flow) |
|
|
111
|
+
| 项目 | [docs/project.md](docs/project.md) | 项目查询、账户管理、成员管理、配置、开关 |
|
|
112
|
+
| Google | [docs/google.md](docs/google.md) | Google Ads 直接操作 |
|
|
113
|
+
| 素材报表 | [docs/material-report.md](docs/material-report.md) | 素材报表、归因报表、广告预览 |
|
|
114
|
+
| Agent 日志 | [docs/agent.md](docs/agent.md) | 操作记录审计 |
|
|
115
|
+
| 公司/产品 | [docs/company.md](docs/company.md) | 客户公司和产品查询 |
|
|
116
|
+
| TikTok 广告创编 | [docs/tiktok.md](docs/tiktok.md) | 项目级创编任务、表单下拉选项、Spark Ads 授权 |
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
## Token 存储
|
|
121
|
+
|
|
122
|
+
| 文件 | 内容 |
|
|
123
|
+
|------|------|
|
|
124
|
+
| `~/.vhcli/config.yaml` | 平台 server URL、app_id、token |
|
|
125
|
+
| `~/.vhcli/ad_tokens.json` | 各广告账户的 access_token |
|
|
126
|
+
|
|
127
|
+
### ad_tokens.json 结构
|
|
128
|
+
|
|
129
|
+
```json
|
|
130
|
+
{
|
|
131
|
+
"<customer_project_id>": {
|
|
132
|
+
"<account_id>": {
|
|
133
|
+
"token": "***",
|
|
134
|
+
"updated_at": "2026-05-19T10:35:53+08:00"
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
## 飞书授权卡片
|
|
143
|
+
|
|
144
|
+
位置:`scripts/vh-auth-card.cjs`
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
# 显式传入 target(可选,支持任意格式)
|
|
148
|
+
node skills/vhcli/scripts/vh-auth-card.cjs <oc_xxx|ou_xxx|user:ou_xxx>
|
|
149
|
+
|
|
150
|
+
# 或通过环境变量传入
|
|
151
|
+
OPENCLAW_CHAT_ID=user:ou_xxx node skills/vhcli/scripts/vh-auth-card.cjs
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
**Target 解析优先级(脚本内置逻辑):**
|
|
155
|
+
1. `argv[2]` - 显式参数(最高优先)
|
|
156
|
+
2. `VH_AUTH_TARGET` 环境变量
|
|
157
|
+
3. `OPENCLAW_CHAT_ID` 环境变量(Agent spawn 时自动传入当前会话 chat_id)
|
|
158
|
+
|
|
159
|
+
**格式自动解析:**
|
|
160
|
+
- `oc_xxx` → 识别为群聊 chat_id
|
|
161
|
+
- `ou_xxx` → 识别为 open_id
|
|
162
|
+
- `user:ou_xxx` → 去掉前缀,取 open_id
|
|
163
|
+
|
|
164
|
+
自动完成:获取 device code → 发蓝色卡片 → 等待授权 → patch 卡片变色
|
|
165
|
+
|
|
166
|
+
### Agent 授权交互模式(必须遵守)
|
|
167
|
+
|
|
168
|
+
**核心原则:在哪个会话触发的授权,就把授权卡片发到哪个会话。**
|
|
169
|
+
|
|
170
|
+
#### Target 自动解析规则
|
|
171
|
+
|
|
172
|
+
从当前 inbound message 的 `chat_id` 字段提取 target:
|
|
173
|
+
- 群聊:`chat_id` 已是 `oc_xxx` → 直接用
|
|
174
|
+
- 私聊:`chat_id` 格式为 `user:ou_xxx` → 去掉 `user:` 前缀,取 `ou_xxx`
|
|
175
|
+
|
|
176
|
+
**Agent 禁止硬编码 target!必须从当前会话上下文动态提取。**
|
|
177
|
+
|
|
178
|
+
当需要发起授权时,使用 **subagent 方案**:
|
|
179
|
+
|
|
180
|
+
1. **主 agent 只发一句话**:"已发起授权,飞书会收到授权卡片,点击完成授权后我继续。"
|
|
181
|
+
2. **spawn subagent** 执行授权脚本:
|
|
182
|
+
```
|
|
183
|
+
sessions_spawn(mode="run", lightContext=true, task=执行授权脚本并只输出"授权成功"或"授权失败")
|
|
184
|
+
```
|
|
185
|
+
subagent 任务内容:
|
|
186
|
+
```bash
|
|
187
|
+
cd /root/.openclaw/workspace && node skills/vhcli/scripts/vh-auth-card.cjs <当前会话的原始chat_id,如 oc_xxx 或 user:ou_xxx,脚本自动解析>
|
|
188
|
+
```
|
|
189
|
+
3. **主 agent yield 等待** subagent announce
|
|
190
|
+
4. **subagent announce 回来后**,主 agent 继续执行用户原始需求
|
|
191
|
+
|
|
192
|
+
#### subagent 严格约束
|
|
193
|
+
|
|
194
|
+
- subagent **只做授权**,不执行任何业务操作
|
|
195
|
+
- subagent 的最终输出(announce 内容)**只允许两种**:
|
|
196
|
+
- `授权成功`
|
|
197
|
+
- `授权失败`
|
|
198
|
+
- 不发消息给用户,不解释过程,不输出其他任何内容
|
|
199
|
+
|
|
200
|
+
#### 主 agent 严格约束
|
|
201
|
+
|
|
202
|
+
- 检测到未授权时,**只发一句话**:"已发起授权,飞书会收到授权卡片,点击完成授权后我继续。"
|
|
203
|
+
- ❌ 禁止发多余的过程描述(如"先帮你查一下"、"正在发起授权"等)
|
|
204
|
+
- ❌ 禁止在授权前后发超过必要的消息
|
|
205
|
+
- 授权成功后直接执行业务,输出结果即可
|
|
206
|
+
|
|
207
|
+
用户体验顺序:
|
|
208
|
+
```
|
|
209
|
+
1 主agent: "已发起授权,飞书会收到授权卡片,点击完成授权后我继续。"
|
|
210
|
+
2 脚本自动发: 文字"请先完成AI营销平台授权" + 蓝色授权卡片
|
|
211
|
+
3 用户点击完成授权 → 卡片变绿 + "授权成功,可以开始使用了"
|
|
212
|
+
4 主agent: 直接输出业务结果
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
❗ 禁止:
|
|
216
|
+
- 清除 token(auth login 本身会覆盖)
|
|
217
|
+
- 暴露内部操作过程
|
|
218
|
+
- 在授权脚本内耦合业务逻辑
|
|
219
|
+
- 主 agent 发超过一句话的授权提示
|
|
220
|
+
|
|
221
|
+
---
|
|
222
|
+
|
|
223
|
+
## 清理授权
|
|
224
|
+
|
|
225
|
+
```bash
|
|
226
|
+
# 第一层:清除 vhcli 平台 token
|
|
227
|
+
sed -i '/^token:/d; /^token_type:/d' ~/.vhcli/config.yaml
|
|
228
|
+
|
|
229
|
+
# 第二层:清除账户 token
|
|
230
|
+
rm -f ~/.vhcli/ad_tokens.json
|
|
231
|
+
|
|
232
|
+
# 第三层:清除环境变量
|
|
233
|
+
unset ACCESS_TOKEN
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
---
|
|
237
|
+
|
|
238
|
+
## TikTok 广告创编
|
|
239
|
+
|
|
240
|
+
`vhcli tiktok ...` 驱动 TikTok 广告创编流水线,与 `vhcli media tiktok`(需 `--auth-id`)不同,这里以项目(`--project-id`)为入口,使用 api-key 鉴权。
|
|
241
|
+
|
|
242
|
+
> 完整数据模型、字段映射、错误目录:[docs/tiktok.md](docs/tiktok.md)
|
|
243
|
+
|
|
244
|
+
### 三层配置(`task submit --config-file`)
|
|
245
|
+
|
|
246
|
+
JSON 顶层包含 `campaign_config` / `adgroup_config` / `ad_config` 三个动态对象:
|
|
247
|
+
|
|
248
|
+
| 层 | 已知字段 |
|
|
249
|
+
|----|---------|
|
|
250
|
+
| `campaign_config` | `campaign_name`, `budget`, `objective_type`, `app_promotion_type` |
|
|
251
|
+
| `adgroup_config` | `adgroup_name`, `location_ids`, `languages`, `app_id`, `gender` |
|
|
252
|
+
| `ad_config` | `ad_name`, `tiktok_account`, `identity_type`, `user_material`, `copywriting`, `selling_points` |
|
|
253
|
+
|
|
254
|
+
其他 TikTok Marketing API 字段(如 `optimization_goal`、`interest_keyword_ids`、`landing_page_url`、`dark_post_status`)自动路由到对应层的 `extra_params`,无需 CLI 发版。
|
|
255
|
+
|
|
256
|
+
### 典型工作流
|
|
257
|
+
|
|
258
|
+
1. **并行**获取元数据:`options --type=identity|app|region|language|minis|audience`、`targeting-search`、`optimization-event`
|
|
259
|
+
2. 预校验:提交前调用 `dark-post-status`(若 advertiser 或 identity 有 `ads_only_mode=true`,只允许 `dark_post_status=ON`)
|
|
260
|
+
3. 组装三层 JSON;用唯一 UUID `--request-id` 提交(10 分钟幂等锁,重复 ID 被拒绝)
|
|
261
|
+
4. 加 `--follow` 轮询最新任务至非 `PENDING`(`submit` 本身不返回 `task_id`)
|
|
262
|
+
|
|
263
|
+
### 命令
|
|
264
|
+
|
|
265
|
+
```bash
|
|
266
|
+
# 1) 列出创编任务
|
|
267
|
+
vhcli tiktok task list --project-id po_xxxx [--page-size 10] [--page-number 1]
|
|
268
|
+
|
|
269
|
+
# 2) 提交创编任务(10 分钟幂等锁)
|
|
270
|
+
vhcli tiktok task submit \
|
|
271
|
+
--project-id po_xxxx \
|
|
272
|
+
--resource-id 7234567890123456789 \
|
|
273
|
+
--request-id req_20260521_001 \
|
|
274
|
+
[--creative-app-id app_demo_001] \
|
|
275
|
+
--config-file ./payload.json \
|
|
276
|
+
[--follow] # 每 5s 轮询最新任务至非 PENDING,超时 5 分钟
|
|
277
|
+
|
|
278
|
+
# payload.json 示例
|
|
279
|
+
# {
|
|
280
|
+
# "campaign_config": { "campaign_name": "Demo", "objective_type": "APP_PROMOTION" },
|
|
281
|
+
# "adgroup_config": { "adgroup_name": "Demo", "location_ids": "6252001" },
|
|
282
|
+
# "ad_config": { "ad_name": "Demo", "tiktok_account": "..." }
|
|
283
|
+
# }
|
|
284
|
+
|
|
285
|
+
# 3) 表单下拉(--type 决定返回元素结构)
|
|
286
|
+
vhcli tiktok options --project-id po_xxxx --resource-id <ID> --type language
|
|
287
|
+
vhcli tiktok options --project-id po_xxxx --resource-id <ID> --type region --objective-type APP_PROMOTION --language zh
|
|
288
|
+
vhcli tiktok options --project-id po_xxxx --resource-id <ID> --type identity
|
|
289
|
+
vhcli tiktok options --project-id po_xxxx --resource-id <ID> --type minis
|
|
290
|
+
vhcli tiktok options --project-id po_xxxx --resource-id <ID> --type app
|
|
291
|
+
vhcli tiktok options --project-id po_xxxx --resource-id <ID> --type audience
|
|
292
|
+
|
|
293
|
+
# 4) 校验 dark_post_status(设置 ad_config.dark_post_status 前必须调用)
|
|
294
|
+
vhcli tiktok dark-post-status \
|
|
295
|
+
--project-id po_xxxx \
|
|
296
|
+
--resource-id 7234567890123456789 \
|
|
297
|
+
--identity-id 7888888888888888888 \
|
|
298
|
+
--identity-type CUSTOMIZED_USER \
|
|
299
|
+
[--identity-authorized-bc-id BC_xxx] # identity_type=BC_AUTH_TT 时必填
|
|
300
|
+
|
|
301
|
+
# 5) 优化事件(仅返回 availability_status=READY;--placements 支持逗号分隔或重复传)
|
|
302
|
+
vhcli tiktok optimization-event \
|
|
303
|
+
--project-id po_xxxx \
|
|
304
|
+
--resource-id 7234567890123456789 \
|
|
305
|
+
--app-id 7234567890123456789 \
|
|
306
|
+
--objective APP_PROMOTION \
|
|
307
|
+
--optimization-goal CONVERT \
|
|
308
|
+
--placements PLACEMENT_TIKTOK,PLACEMENT_PANGLE
|
|
309
|
+
|
|
310
|
+
# 6) 兴趣定向树(INTEREST_AND_BEHAVIOR,按顶级分组:video_interaction / general_interest / ...)
|
|
311
|
+
vhcli tiktok targeting-search \
|
|
312
|
+
--project-id po_xxxx \
|
|
313
|
+
--resource-id 7234567890123456789
|
|
314
|
+
|
|
315
|
+
# 7) 批量授权 Spark Ads 帖子(服务端上限 50 并发;返回 identity_id 不匹配或失败的 auth_codes)
|
|
316
|
+
vhcli tiktok spark-ads authorize \
|
|
317
|
+
--project-id po_xxxx \
|
|
318
|
+
--resource-id 7234567890123456789 \
|
|
319
|
+
--tiktok-account 7234567890123456789 \
|
|
320
|
+
--auth-codes "AUTHCODE_AAAA,AUTHCODE_BBBB,AUTHCODE_CCCC"
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
---
|
|
324
|
+
|
|
325
|
+
## 命令速查
|
|
326
|
+
|
|
327
|
+
```bash
|
|
328
|
+
# 认证
|
|
329
|
+
vhcli auth login # 平台授权
|
|
330
|
+
vhcli auth token # 查看 token
|
|
331
|
+
vhcli config # 完整配置
|
|
332
|
+
|
|
333
|
+
# 项目
|
|
334
|
+
vhcli project list # 项目列表
|
|
335
|
+
vhcli project info --project-id <po_xxx>
|
|
336
|
+
vhcli project accounts --project-id <po_xxx> [--platform-list Meta]
|
|
337
|
+
vhcli project account-token --customer-project-id <N> --account-id <ID>
|
|
338
|
+
|
|
339
|
+
# 授权
|
|
340
|
+
vhcli authorization list [--platform Meta]
|
|
341
|
+
|
|
342
|
+
# 媒体操作
|
|
343
|
+
vhcli media campaign-list --auth-id <N>
|
|
344
|
+
vhcli media ad-list --auth-id <N>
|
|
345
|
+
vhcli media report-get --auth-id <N> --start-date X --end-date Y
|
|
346
|
+
|
|
347
|
+
# 报表
|
|
348
|
+
vhcli material-report get --customer-project-id <N> --platform Meta --start-time X --end-time Y
|
|
349
|
+
|
|
350
|
+
# Google
|
|
351
|
+
vhcli google update-campaign-budget --customer-project-id <N> --account-id <ID> --campaign-id <ID> --target-budget 100
|
|
352
|
+
|
|
353
|
+
# Agent 日志
|
|
354
|
+
vhcli agent operate-record --customer-project-id <N> --account-id <ID> --operator x@x.com --operation-type CREATE --status SUCCESS
|
|
355
|
+
|
|
356
|
+
# 公司/产品
|
|
357
|
+
vhcli company list
|
|
358
|
+
vhcli company product-list
|
|
359
|
+
|
|
360
|
+
# TikTok 广告创编
|
|
361
|
+
vhcli tiktok task list --project-id po_xxxx
|
|
362
|
+
vhcli tiktok task submit --project-id po_xxxx --resource-id <ID> --request-id <UUID> --config-file ./payload.json [--follow]
|
|
363
|
+
vhcli tiktok options --project-id po_xxxx --resource-id <ID> --type language|region|identity|minis|app|audience
|
|
364
|
+
vhcli tiktok dark-post-status --project-id po_xxxx --resource-id <ID> --identity-id <ID> --identity-type CUSTOMIZED_USER
|
|
365
|
+
vhcli tiktok optimization-event --project-id po_xxxx --resource-id <ID> --app-id <ID> --objective APP_PROMOTION --optimization-goal CONVERT --placements PLACEMENT_TIKTOK
|
|
366
|
+
vhcli tiktok targeting-search --project-id po_xxxx --resource-id <ID>
|
|
367
|
+
vhcli tiktok spark-ads authorize --project-id po_xxxx --resource-id <ID> --tiktok-account <ID> --auth-codes "CODE1,CODE2"
|
|
368
|
+
|
|
369
|
+
# API 自省
|
|
370
|
+
vhcli schema # 所有模块
|
|
371
|
+
vhcli schema <module> # 模块端点
|
|
372
|
+
vhcli schema <module.endpoint> # 端点参数
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
---
|
|
376
|
+
|
|
377
|
+
## 核心原则
|
|
378
|
+
|
|
379
|
+
> 在执行任何需求前,必须明确:
|
|
380
|
+
> 1. **谁**在操作(平台授权是否有效)
|
|
381
|
+
> 2. 操作**哪个项目**(必须用户确认)
|
|
382
|
+
> 3. 操作**哪个账户**(必须用户确认)
|
|
383
|
+
> 4. 该账户的 **token 是否已初始化到本地**
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Agent - 广告创编操作记录
|
|
2
|
+
|
|
3
|
+
> 记录 Agent 执行的广告创建/修改/删除操作日志,用于审计追踪。
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## operate_record
|
|
8
|
+
|
|
9
|
+
记录一次广告创编操作(campaigns/adsets/ads 创建日志)。
|
|
10
|
+
|
|
11
|
+
**CLI:**
|
|
12
|
+
```bash
|
|
13
|
+
vhcli agent operate-record \
|
|
14
|
+
--customer-project-id <int> \
|
|
15
|
+
--account-id <string> \
|
|
16
|
+
--operator <email> \
|
|
17
|
+
--operation-type <CREATE|UPDATE|DELETE> \
|
|
18
|
+
--status <SUCCESS|FAILED|PARTIAL> \
|
|
19
|
+
[--confirmer <email>] \
|
|
20
|
+
[--campaigns-count <int>] \
|
|
21
|
+
[--adsets-count <int>] \
|
|
22
|
+
[--ads-count <int>] \
|
|
23
|
+
[--detail-json '<json>']
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
**参数:**
|
|
27
|
+
|
|
28
|
+
| 参数 | 类型 | 必填 | 说明 |
|
|
29
|
+
|------|------|------|------|
|
|
30
|
+
| customer_project_id | int32 | ✅ | 客户项目 ID(数字) |
|
|
31
|
+
| account_id | string | ✅ | 广告账户 ID |
|
|
32
|
+
| operator | string | ✅ | 操作人邮箱 |
|
|
33
|
+
| confirmer | string | | 确认人邮箱 |
|
|
34
|
+
| operation_type | string | ✅ | 操作类型:CREATE / UPDATE / DELETE |
|
|
35
|
+
| status | string | ✅ | 状态:SUCCESS / FAILED / PARTIAL |
|
|
36
|
+
| campaigns_count | int32 | | 创建的 campaign 数量 |
|
|
37
|
+
| adsets_count | int32 | | 创建的 adset 数量 |
|
|
38
|
+
| ads_count | int32 | | 创建的 ad 数量 |
|
|
39
|
+
| detail_json | object | | 操作详情 JSON 对象 |
|
|
40
|
+
|
|
41
|
+
**响应:** CommonResponse
|
|
42
|
+
|
|
43
|
+
**备注:** 这是写入操作(write: true),需要认证。
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# Auth - 平台用户认证
|
|
2
|
+
|
|
3
|
+
> VH AI营销平台用户级认证(Device Flow),获取平台 token 用于后续所有 API 调用。
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## login
|
|
8
|
+
|
|
9
|
+
发起 Device Flow 授权登录。输出授权 URL 和验证码,用户在浏览器完成授权后自动获取 token。
|
|
10
|
+
|
|
11
|
+
**CLI:**
|
|
12
|
+
```bash
|
|
13
|
+
vhcli auth login
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
**流程:**
|
|
17
|
+
1. CLI 输出授权 URL + 验证码
|
|
18
|
+
2. 用户访问 URL 并输入验证码
|
|
19
|
+
3. 完成后 token 自动写入 `~/.vhcli/config.yaml`
|
|
20
|
+
|
|
21
|
+
**飞书场景:** 使用 `scripts/vh-auth-card.cjs` 发送交互卡片,无需用户手动复制 URL。
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## token
|
|
26
|
+
|
|
27
|
+
查看当前平台 token。
|
|
28
|
+
|
|
29
|
+
**CLI:**
|
|
30
|
+
```bash
|
|
31
|
+
vhcli auth token
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
**用途:** 检查是否已认证。有输出 = 已认证,无输出 = 需要 login。
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## config
|
|
39
|
+
|
|
40
|
+
查看完整配置信息(server URL、app_id、token 等)。
|
|
41
|
+
|
|
42
|
+
**CLI:**
|
|
43
|
+
```bash
|
|
44
|
+
vhcli config
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
**配置文件位置:** `~/.vhcli/config.yaml`
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# Company - 客户公司与产品查询
|
|
2
|
+
|
|
3
|
+
> 查询客户公司(品牌)和产品信息。
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## list
|
|
8
|
+
|
|
9
|
+
列出公司列表,支持分页和搜索。
|
|
10
|
+
|
|
11
|
+
**CLI:**
|
|
12
|
+
```bash
|
|
13
|
+
vhcli company list [--page-size 20] [--page-num 1] [--company-name <name>]
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
**参数:**
|
|
17
|
+
|
|
18
|
+
| 参数 | 类型 | 必填 | 默认 | 说明 |
|
|
19
|
+
|------|------|------|------|------|
|
|
20
|
+
| page_size | int32 | | 20 | 每页条数 |
|
|
21
|
+
| page_num | int32 | | 1 | 页码 |
|
|
22
|
+
| company_name | string | | | 按公司名搜索 |
|
|
23
|
+
|
|
24
|
+
**响应:** CompanyListData(含 pagination + list)
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## product_list
|
|
29
|
+
|
|
30
|
+
列出产品列表,支持按公司过滤和搜索。
|
|
31
|
+
|
|
32
|
+
**CLI:**
|
|
33
|
+
```bash
|
|
34
|
+
vhcli company product-list [--page-size 20] [--page-num 1] [--company-id <int>] [--product-name <name>] [--category <cat1,cat2>]
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
**参数:**
|
|
38
|
+
|
|
39
|
+
| 参数 | 类型 | 必填 | 默认 | 说明 |
|
|
40
|
+
|------|------|------|------|------|
|
|
41
|
+
| page_size | int32 | | 20 | 每页条数 |
|
|
42
|
+
| page_num | int32 | | 1 | 页码 |
|
|
43
|
+
| company_id | int32 | | | 按公司 ID 过滤 |
|
|
44
|
+
| product_name | string | | | 按产品名搜索 |
|
|
45
|
+
| category | []string | | | 按类别过滤 |
|
|
46
|
+
|
|
47
|
+
**响应:** ProductListData(含 pagination + list)
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# Google - Google Ads 直接操作
|
|
2
|
+
|
|
3
|
+
> Google Ads 广告系列预算等直接操作。
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## update_campaign_budget
|
|
8
|
+
|
|
9
|
+
更新 Google 广告系列预算。
|
|
10
|
+
|
|
11
|
+
**CLI:**
|
|
12
|
+
```bash
|
|
13
|
+
vhcli google update-campaign-budget \
|
|
14
|
+
--customer-project-id <int> \
|
|
15
|
+
--account-id <string> \
|
|
16
|
+
--campaign-id <string> \
|
|
17
|
+
--target-budget <float>
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
**参数:**
|
|
21
|
+
|
|
22
|
+
| 参数 | 类型 | 必填 | 说明 |
|
|
23
|
+
|------|------|------|------|
|
|
24
|
+
| customer_project_id | int32 | ✅ | 客户项目 ID(数字) |
|
|
25
|
+
| account_id | string | ✅ | 广告账户 ID |
|
|
26
|
+
| campaign_id | string | ✅ | 广告系列 ID |
|
|
27
|
+
| target_budget | float64 | ✅ | 目标预算(USD) |
|
|
28
|
+
|
|
29
|
+
**响应:** CampaignBudgetData
|
|
30
|
+
- campaign_name: 广告系列名称
|
|
31
|
+
- before_budget: 修改前预算
|
|
32
|
+
- after_budget: 修改后预算
|
|
33
|
+
|
|
34
|
+
**备注:** 写入操作,需要认证。
|