@vocmarket/voc-skill 0.3.15 → 0.3.16

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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "voc-intelligence",
3
- "description": "VOC intelligence skills for Claude Code: end-to-end VOC business workflows, Xiaohongshu and Douyin trend reports, live social VOC collection, token/recharge checks, evidence-card outputs, prioritized issue pools, single-problem deep dives, competitor maps, 7-day content plans, VOC-backed speaking script co-creation, boss/operator action plans, and multi-turn memory.",
4
- "version": "0.3.15",
3
+ "description": "VOC intelligence skills for Claude Code: end-to-end VOC business workflows, Xiaohongshu and Douyin trend reports, live social VOC collection, Fmode Doubao image analysis, token/recharge checks, evidence-card outputs, prioritized issue pools, single-problem deep dives, competitor maps, 7-day content plans, VOC-backed speaking script co-creation, boss/operator action plans, and multi-turn memory.",
4
+ "version": "0.3.16",
5
5
  "author": {
6
6
  "name": "nkkj-BrainHack"
7
7
  }
package/.mcp.json CHANGED
@@ -3,9 +3,9 @@
3
3
  "voc": {
4
4
  "command": "node",
5
5
  "args": [
6
- "E:\\workspace\\openclaw-voc-skill\\claude-code-voc-intelligence\\mcp\\src\\server.js"
6
+ "E:\\workspace\\openclaw-voc-skill\\claude-code\\claude-code-voc-intelligence\\mcp\\src\\server.js"
7
7
  ],
8
- "cwd": "E:\\workspace\\openclaw-voc-skill\\claude-code-voc-intelligence"
8
+ "cwd": "E:\\workspace\\openclaw-voc-skill\\claude-code\\claude-code-voc-intelligence"
9
9
  }
10
10
  }
11
11
  }
package/README.md CHANGED
@@ -110,6 +110,7 @@ npx --yes @vocmarket/voc-skill@latest workspace --smoke
110
110
  .claude/skills/voc-speaking-script/SKILL.md
111
111
  .claude/skills/voc-competitor-map/SKILL.md
112
112
  .claude/skills/voc-business-workflow/SKILL.md
113
+ .claude/skills/fmode-image-analysis/SKILL.md
113
114
  .claude/plugins/voc-intelligence
114
115
  ```
115
116
 
@@ -186,9 +187,11 @@ npx --yes @vocmarket/voc-skill@latest install --smoke
186
187
  - `voc-speaking-script`
187
188
  - `voc-competitor-map`
188
189
  - `voc-business-workflow`
190
+ - `fmode-image-analysis`
189
191
 
190
192
  MCP 工具:
191
193
 
194
+ - `fmode_image_analysis`
192
195
  - `voc_business_workflow_run`
193
196
  - `voc_xiaohongshu_trend_run`
194
197
  - `voc_xiaohongshu_preference_update`
@@ -207,6 +210,8 @@ MCP 工具:
207
210
  ```powershell
208
211
  npm --prefix claude-code-voc-intelligence run xhs:sample
209
212
  npm --prefix claude-code-voc-intelligence run dy:sample
213
+ npm --prefix claude-code-voc-intelligence run fmode:image:smoke
214
+ claude-voc image --image-path E:\workspace\example\screenshot.png --prompt "识别截图里的文字、主体和风险点"
210
215
  npm --prefix claude-code-voc-intelligence run voc:issue-pool
211
216
  npm --prefix claude-code-voc-intelligence run voc:deep-dive
212
217
  npm --prefix claude-code-voc-intelligence run voc:business-workflow
package/bin/claude-voc.js CHANGED
@@ -15,6 +15,7 @@ const EXCLUDED_DIRS = new Set([
15
15
  'node_modules',
16
16
  'memory',
17
17
  'outputs',
18
+ '.npm-cache-acceptance',
18
19
  '.tmp',
19
20
  '.git',
20
21
  '.claude'
@@ -36,6 +37,7 @@ function usage() {
36
37
  ' claude-voc install --workspace --smoke',
37
38
  ' claude-voc check',
38
39
  ' claude-voc smoke',
40
+ ' claude-voc image --image-path <file> --prompt <text>',
39
41
  ' claude-voc path',
40
42
  '',
41
43
  'npx:',
@@ -181,6 +183,8 @@ function assertInstalled(targetDir) {
181
183
  'skills/voc-speaking-script/SKILL.md',
182
184
  'skills/voc-competitor-map/SKILL.md',
183
185
  'skills/voc-business-workflow/SKILL.md',
186
+ 'skills/fmode-image-analysis/SKILL.md',
187
+ 'mcp/src/tools/fmode-image-analysis.js',
184
188
  'mcp/src/server.js'
185
189
  ];
186
190
  const missing = required.filter(rel => !fs.existsSync(path.join(targetDir, rel)));
@@ -641,6 +645,7 @@ function writeWorkspaceSkillEntries(targetDir) {
641
645
  const speakingScriptSkillDir = path.join(WORKSPACE_ROOT, '.claude', 'skills', 'voc-speaking-script');
642
646
  const competitorMapSkillDir = path.join(WORKSPACE_ROOT, '.claude', 'skills', 'voc-competitor-map');
643
647
  const businessWorkflowSkillDir = path.join(WORKSPACE_ROOT, '.claude', 'skills', 'voc-business-workflow');
648
+ const fmodeImageSkillDir = path.join(WORKSPACE_ROOT, '.claude', 'skills', 'fmode-image-analysis');
644
649
  ensureDir(xhsSkillDir);
645
650
  ensureDir(douyinSkillDir);
646
651
  ensureDir(issuePoolSkillDir);
@@ -649,6 +654,7 @@ function writeWorkspaceSkillEntries(targetDir) {
649
654
  ensureDir(speakingScriptSkillDir);
650
655
  ensureDir(competitorMapSkillDir);
651
656
  ensureDir(businessWorkflowSkillDir);
657
+ ensureDir(fmodeImageSkillDir);
652
658
  fs.writeFileSync(path.join(xhsSkillDir, 'SKILL.md'), workspaceSkillText(targetDir), 'utf8');
653
659
  fs.writeFileSync(path.join(douyinSkillDir, 'SKILL.md'), workspaceDouyinSkillText(targetDir), 'utf8');
654
660
  fs.writeFileSync(path.join(issuePoolSkillDir, 'SKILL.md'), workspaceIssuePoolSkillText(targetDir), 'utf8');
@@ -657,6 +663,7 @@ function writeWorkspaceSkillEntries(targetDir) {
657
663
  fs.writeFileSync(path.join(speakingScriptSkillDir, 'SKILL.md'), workspaceSpeakingScriptSkillText(targetDir), 'utf8');
658
664
  fs.writeFileSync(path.join(competitorMapSkillDir, 'SKILL.md'), workspaceCompetitorMapSkillText(targetDir), 'utf8');
659
665
  fs.writeFileSync(path.join(businessWorkflowSkillDir, 'SKILL.md'), workspaceBusinessWorkflowSkillText(targetDir), 'utf8');
666
+ fs.copyFileSync(path.join(targetDir, 'skills', 'fmode-image-analysis', 'SKILL.md'), path.join(fmodeImageSkillDir, 'SKILL.md'));
660
667
  }
661
668
 
662
669
  function writeWorkspaceActivation(targetDir) {
@@ -672,6 +679,7 @@ function writeWorkspaceActivation(targetDir) {
672
679
  console.log('Wrote workspace skill entry: .\\.claude\\skills\\voc-speaking-script\\SKILL.md');
673
680
  console.log('Wrote workspace skill entry: .\\.claude\\skills\\voc-competitor-map\\SKILL.md');
674
681
  console.log('Wrote workspace skill entry: .\\.claude\\skills\\voc-business-workflow\\SKILL.md');
682
+ console.log('Wrote workspace skill entry: .\\.claude\\skills\\fmode-image-analysis\\SKILL.md');
675
683
  }
676
684
 
677
685
  function printNextSteps(targetDir) {
@@ -692,6 +700,7 @@ function printNextSteps(targetDir) {
692
700
  console.log(' .\\.claude\\skills\\voc-speaking-script\\SKILL.md');
693
701
  console.log(' .\\.claude\\skills\\voc-competitor-map\\SKILL.md');
694
702
  console.log(' .\\.claude\\skills\\voc-business-workflow\\SKILL.md');
703
+ console.log(' .\\.claude\\skills\\fmode-image-analysis\\SKILL.md');
695
704
  console.log(' .\\.claude\\plugins\\voc-intelligence');
696
705
  console.log('');
697
706
  console.log('Restart the VSCode Claude Code session if it was already open.');
@@ -769,6 +778,12 @@ function printPath(opts) {
769
778
  }
770
779
 
771
780
  function main() {
781
+ const directCommand = process.argv[2];
782
+ if (directCommand === 'image' || directCommand === 'fmode-image') {
783
+ run(process.execPath, ['mcp/src/tools/fmode-image-analysis.js', ...process.argv.slice(3)], SOURCE_ROOT);
784
+ return;
785
+ }
786
+
772
787
  const opts = parseArgs(process.argv.slice(2));
773
788
  if (opts.help || opts.command === 'help') {
774
789
  console.log(usage());
@@ -22,6 +22,12 @@
22
22
  | 选中一条内容继续改口播 | `voc-speaking-script` | `voc_speaking_script_run` | 60 秒稿、30 秒稿、提词器版、改稿反馈、定稿记忆 |
23
23
  | 下轮继续优化 | 同一 skill | 带同一 `memory`,或带 project/industry/scenario/audience 让工具自动分桶 | 应用历史记忆,避免从零开始 |
24
24
 
25
+ ## Fmode Image Analysis Add-on
26
+
27
+ | 能力 | 推荐入口 | MCP 工具 | 输出重点 |
28
+ | --- | --- | --- | --- |
29
+ | 图片识别/截图分析 | `fmode-image-analysis` | `fmode_image_analysis` | 使用平台用户 token 调用 Fmode Doubao vision,默认模型 `doubao-seed-2-0-pro-260215` |
30
+
25
31
  ## 技能入口
26
32
 
27
33
  ### `voc-business-workflow`
@@ -1,93 +1,228 @@
1
- # Claude Code VOC 技能包 npm 打包经验
1
+ # Claude Code VOC 技能包 npm 打包与发布说明
2
2
 
3
- ## 目标
3
+ ## 当前包名
4
4
 
5
- 同一个技能包同时支持两种交付:
5
+ VOC 技能包当前对外 npm 包名:
6
6
 
7
- - 链接下载 zip:适合不会 npm 的客户,解压后执行 `node install.js`。
8
- - npm/npx 安装:适合教学、远程交付和批量升级。
7
+ ```bash
8
+ @vocmarket/voc-skill
9
+ ```
9
10
 
10
- 推荐命令:
11
+ CLI 命令保持不变:
11
12
 
12
13
  ```bash
13
- npm install -g @vocmarket/voc-skill
14
- claude-voc install
14
+ claude-voc
15
15
  ```
16
16
 
17
- 免全局安装:
17
+ 插件安装目录也保持不变:
18
18
 
19
- ```bash
20
- npx @vocmarket/voc-skill install
19
+ ```text
20
+ voc-intelligence
21
21
  ```
22
22
 
23
- ## 关键设计
23
+ 这样做的目的:对外包名更短、更适合课程和市场传播;同时不破坏已经沉淀好的 Claude Code 插件目录、MCP server 名称和 skill 入口。
24
24
 
25
- `npx` 下载的包可能在临时缓存里,不能直接让 Claude Code 长期加载这个临时目录。
25
+ ## 用户安装方式
26
26
 
27
- 所以 `claude-voc install` 会把包复制到固定目录:
27
+ 推荐给 VSCode Claude Code 使用工作区安装:
28
+
29
+ ```powershell
30
+ npx --yes @vocmarket/voc-skill@latest workspace --smoke
31
+ ```
32
+
33
+ 工作区安装会写入:
28
34
 
29
35
  ```text
30
- ~/.claude/plugins/voc-intelligence
36
+ .\.mcp.json
37
+ .\.claude\plugins\voc-intelligence
38
+ .\.claude\skills\xiaohongshu-trend-intelligence\SKILL.md
39
+ .\.claude\skills\douyin-trend-intelligence\SKILL.md
40
+ .\.claude\skills\voc-issue-pool\SKILL.md
41
+ .\.claude\skills\voc-problem-deep-dive\SKILL.md
42
+ .\.claude\skills\voc-content-plan\SKILL.md
43
+ .\.claude\skills\voc-speaking-script\SKILL.md
44
+ .\.claude\skills\voc-competitor-map\SKILL.md
45
+ .\.claude\skills\voc-business-workflow\SKILL.md
31
46
  ```
32
47
 
33
- 然后在该目录安装运行依赖,并输出:
48
+ 全局安装:
34
49
 
35
- ```bash
36
- claude --plugin-dir "<安装目录>"
50
+ ```powershell
51
+ npm install -g @vocmarket/voc-skill
52
+ claude-voc install
37
53
  ```
38
54
 
39
- 这样全局安装和 npx 安装的结果一致,后续也便于升级。
55
+ npx 免全局安装:
40
56
 
41
- ## package.json 要点
57
+ ```powershell
58
+ npx --yes @vocmarket/voc-skill@latest install
59
+ ```
42
60
 
43
- - npm 包名使用 scoped package:`@vocmarket/voc-skill`
44
- - CLI 入口:
61
+ ## package.json 要点
45
62
 
46
63
  ```json
47
64
  {
65
+ "name": "@vocmarket/voc-skill",
48
66
  "bin": {
49
67
  "claude-voc": "bin/claude-voc.js"
68
+ },
69
+ "publishConfig": {
70
+ "access": "public"
50
71
  }
51
72
  }
52
73
  ```
53
74
 
54
- - `files` 必须显式包含:
55
- - `.claude-plugin/`
56
- - `.mcp.json`
57
- - `bin/`
58
- - `skills/`
59
- - `mcp/`
60
- - `memory-templates/`
61
- - `docs/`
62
- - `install.js`
63
- - `skill-package-manifest.json`
75
+ `files` 必须显式包含:
76
+
77
+ - `.claude-plugin/`
78
+ - `.mcp.json`
79
+ - `bin/`
80
+ - `docs/`
81
+ - `install.js`
82
+ - `mcp/`
83
+ - `memory-templates/`
84
+ - `package.json`
85
+ - `scripts/`
86
+ - `skill-package-manifest.json`
87
+ - `skills/`
88
+
89
+ 不要发布:
90
+
91
+ - `.env`
92
+ - `.env.local`
93
+ - `.npmrc`
94
+ - `node_modules/`
95
+ - `memory/`
96
+ - `outputs/`
97
+ - 本地 smoke 临时目录
98
+
99
+ ## 发布前验证
100
+
101
+ 在仓库根目录执行:
102
+
103
+ ```powershell
104
+ npm --prefix claude-code/claude-code-voc-intelligence run mcp:smoke
105
+ npm --prefix claude-code/claude-code-voc-intelligence run smoke:package
106
+ npm run claude-voc:acceptance
107
+ npm run claude-voc:build
108
+ npm run claude-voc:npm-pack
109
+ ```
64
110
 
65
- ## 验证命令
111
+ `npm run claude-voc:npm-pack` 会做三类验证:
66
112
 
67
- 根目录执行:
113
+ 1. 校验 npm package metadata、CLI 入口和必要文件。
114
+ 2. 生成 `dist/npm/vocmarket-voc-skill-<version>.tgz`。
115
+ 3. 在临时目录模拟 npm install、npx install、workspace install,并执行 `--smoke`。
68
116
 
69
- ```bash
70
- npm run claude-voc:npm-pack
71
- ```
117
+ `npm run claude-voc:acceptance` 是更完整的发布前验收,会额外断言 workspace 安装后的:
72
118
 
73
- 这个命令会做三件事:
119
+ - `.mcp.json` 已生成
120
+ - 8 个 `.claude/skills/*/SKILL.md` 入口已生成
121
+ - MCP server 路径是安装后插件目录里的绝对路径
122
+ - `npm pack --dry-run` 能看到关键文件
74
123
 
75
- 1. 校验 npm package metadata 和 CLI 入口。
76
- 2. 生成 `dist/npm/*.tgz`。
77
- 3. 在临时目录里模拟 npm 安装,并执行 `claude-voc install --smoke`。
124
+ ## 正式发布
78
125
 
79
- 发布命令:
126
+ 推荐使用 release 脚本:
80
127
 
81
- ```bash
128
+ ```powershell
129
+ powershell -ExecutionPolicy Bypass -File release/npm/claude-code-voc-intelligence/publish.ps1
130
+ ```
131
+
132
+ 也可以直接执行:
133
+
134
+ ```powershell
82
135
  npm run claude-voc:npm-publish
83
136
  ```
84
137
 
85
- 发布前需要完成 `npm login`,或在 CI/部署环境配置 npm token。
138
+ 发布脚本会读取以下位置的 token:
139
+
140
+ ```text
141
+ release/npm/claude-code-voc-intelligence/.env.local
142
+ ```
143
+
144
+ 文件内容格式:
145
+
146
+ ```text
147
+ NPM_TOKEN=你的 npm automation token
148
+ ```
149
+
150
+ 也支持环境变量:
151
+
152
+ ```powershell
153
+ $env:NPM_TOKEN="你的 npm automation token"
154
+ ```
155
+
156
+ 不要提交 `.env.local`、npm token、VOC session token、模型 API key 或任何真实用户凭证。
157
+
158
+ ## 发布后验证
159
+
160
+ 确认 npm latest:
161
+
162
+ ```powershell
163
+ npm view @vocmarket/voc-skill name version dist-tags.latest --registry=https://registry.npmjs.org/
164
+ ```
165
+
166
+ 线上安装 smoke:
167
+
168
+ ```powershell
169
+ $test = Join-Path $env:TEMP ("vocmarket-online-smoke-" + [guid]::NewGuid())
170
+ New-Item -ItemType Directory -Path $test | Out-Null
171
+ Push-Location $test
172
+ npm exec --yes --package @vocmarket/voc-skill@latest -- claude-voc workspace --smoke
173
+ Pop-Location
174
+ ```
175
+
176
+ ## npm 发布假失败处理
177
+
178
+ 有时 `npm publish` 已经返回成功,例如:
179
+
180
+ ```text
181
+ + @vocmarket/voc-skill@0.3.15
182
+ ```
183
+
184
+ 但脚本紧接着执行 `npm view` 时,registry 还没同步完成,会短暂返回 404。
185
+
186
+ 处理方式:
187
+
188
+ 1. 等 20-60 秒后重新执行:
189
+
190
+ ```powershell
191
+ npm view @vocmarket/voc-skill@0.3.15 version --registry=https://registry.npmjs.org/
192
+ ```
193
+
194
+ 2. 如果返回版本号,说明发布已经成功,不要重复发布同一个版本。
195
+ 3. 如果持续 404,再检查 npm 组织权限、token 权限和包名 scope。
196
+
197
+ 当前发布脚本已经把后置校验等待次数从 6 次增加到 12 次,减少这种假失败。
198
+
199
+ ## 当前发布记录
200
+
201
+ - 2026-06-05:已发布 `@vocmarket/voc-skill@0.3.15`。
202
+ - `npm view @vocmarket/voc-skill name version dist-tags.latest` 返回 `0.3.15`。
203
+ - 线上 `npm exec --yes --package @vocmarket/voc-skill@latest -- claude-voc workspace --smoke` 已通过。
204
+ - 旧包 `@gangvy/claude-code-voc-intelligence@*` 已标记为 deprecated,安装旧包时会提示改用 `@vocmarket/voc-skill`。
205
+ - 已新增 `npm run claude-voc:acceptance` 一键发布前验收,覆盖包级 smoke、MCP smoke、npm pack dry-run 和 workspace 安装断言。
206
+ - 包内包含 8 个 skill、12 个 MCP tools。
207
+ - smoke 覆盖 sample report、证据卡、图片缓存、xsec URL 规范化、偏好记忆、no-token 充值提示、祖先 `.env.local` token 读取、抖音搜索入参错误保护、跨行业样例和 MCP tool discovery。
208
+
209
+ ## 后续版本同步
210
+
211
+ 升级版本时同步修改:
212
+
213
+ - `claude-code/claude-code-voc-intelligence/package.json`
214
+ - `claude-code/claude-code-voc-intelligence/package-lock.json`
215
+ - `claude-code/claude-code-voc-intelligence/skill-package-manifest.json`
216
+ - `claude-code/claude-code-voc-intelligence/.claude-plugin/plugin.json`
217
+ - 如涉及 MCP server 或记忆 schema,同步对应版本字段
218
+ - `dist/npm/claude-code-voc-npm-package-manifest.json`
219
+ - `dist/claude-code-voc-intelligence-suite-manifest.json`
220
+ - `release/npm/claude-code-voc-intelligence/README.md`
221
+ - `release/npm/claude-code-voc-intelligence/release-checklist.md`
86
222
 
87
- ## 注意点
223
+ ## 体验原则
88
224
 
89
- - zip 包和 npm 包共用同一套源码,但验证脚本分开。
90
- - npm 包不要发布 `node_modules/`、`memory/`、`outputs/`、`.env`。
91
- - `install.js` 不强依赖 `package-lock.json`,因为 npm publish 后 package-lock 不一定随包安装。
92
- - 用户侧不要暴露 profile、output、collectionMode 这类参数;安装完成后仍然用自然语言启动。
93
-
225
+ - 用户侧不要暴露 `profile`、`output`、`collectionMode` 等底层参数。
226
+ - 用户用自然语言触发 VOC 采集、问题池、单点深挖、内容计划和口播脚本。
227
+ - 第一轮真实采集只输出“初步判断 / 机会假设 / 待校准”,不要包装成最终结论。
228
+ - 无 token、余额不足、业务权限未开通时,返回开通/充值引导,不直接暴露底层 403、余额接口或 stack trace。
package/install.js CHANGED
@@ -111,6 +111,8 @@ function checkFiles() {
111
111
  'skills/voc-speaking-script/SKILL.md',
112
112
  'skills/voc-competitor-map/SKILL.md',
113
113
  'skills/voc-business-workflow/SKILL.md',
114
+ 'skills/fmode-image-analysis/SKILL.md',
115
+ 'mcp/src/tools/fmode-image-analysis.js',
114
116
  'mcp/src/server.js'
115
117
  ].forEach(assertFile);
116
118
 
@@ -87,7 +87,7 @@ function buildNoSampleFallbackMessage({ platformLabel, profile, examples = [] })
87
87
  return [
88
88
  `本次 live 模式没有采到可用于分析的${platformLabel}样本。`,
89
89
  '',
90
- '这不代表行业没有机会,更可能是关键词过窄、平台内容表达不一样,或本轮上游没有返回可用内容。',
90
+ '说明:这不是类目限制,也不是“系统只支持某些行业”——任何行业(含律师、法律、医美、教育、专业服务等)都能采集。更可能是关键词过窄、平台内容表达不一样,或本轮上游没有返回可用内容。',
91
91
  '',
92
92
  '建议按这三步继续:',
93
93
  `1. 先保留当前方向:${keywords}`,
@@ -105,6 +105,24 @@ function buildRechargeRequiredMessage(paymentUrl, recharge = {}, options = {}) {
105
105
  ].join('\n');
106
106
  }
107
107
 
108
+ function buildWrongTokenTypeMessage(paymentUrl, recharge = {}, options = {}) {
109
+ const platformLabel = options.platformLabel || '小红书';
110
+ const packageUrl = recharge.recommendedPackageUrl || recharge.workshopUrl || paymentUrl;
111
+ return [
112
+ `检测到配置的是 sk- 开头的 AIGate API Key,这不是 ${platformLabel} 数据采集所需的 token,暂时不能进行真实采集。`,
113
+ '',
114
+ '这不是关键词或类目问题:任何关键词(含律师、法律、专业服务等)都可以采集,只要 token 类型正确并已开通额度。',
115
+ '',
116
+ `${platformLabel} 采集需要从充值/开通页复制的、以 r: 开头的会话 token(session token),不是 sk- 开头的 AIGate Key。`,
117
+ '',
118
+ `请打开充值/开通链接:${paymentUrl}`,
119
+ '',
120
+ `课程或工作坊用户也可以打开套餐入口:${packageUrl}`,
121
+ '',
122
+ '把以 r: 开头的 session token 配置到当前工作区 `.env.local` 或 `~/.claude/voc-credentials.json`(键名 vocToken / VOC_TOKEN),再重新运行 live 采集。'
123
+ ].join('\n');
124
+ }
125
+
108
126
  module.exports = {
109
127
  VOC_SOCIAL_APIG_ID,
110
128
  VOC_RECHARGE_FUN_ID,
@@ -113,5 +131,6 @@ module.exports = {
113
131
  buildVocRechargeUrl,
114
132
  buildVocWorkshopUrl,
115
133
  buildMissingTokenMessage,
116
- buildRechargeRequiredMessage
134
+ buildRechargeRequiredMessage,
135
+ buildWrongTokenTypeMessage
117
136
  };
@@ -318,7 +318,7 @@ async function collectLiveDataset({ profile, token, options = {} }) {
318
318
  errors.push({
319
319
  stage: 'search_videos',
320
320
  kind: 'invalid_keyword',
321
- message: '请提供至少一个可用于抖音搜索的关键词,例如“茶饮 18元 22元”或“茶饮 性价比 新客”。',
321
+ message: '请提供至少一个可用于抖音搜索的关键词(任何行业都可以,例如“<品类/服务> <人群> <场景>”这种自然短语)。',
322
322
  httpStatus: 0
323
323
  });
324
324
  return { videos, comments, warnings, errors, keywords };