@scorehub/creator-outreach 1.2.0 → 1.3.0
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/.codebuddy-plugin/plugin.json +1 -1
- package/README.en.md +4 -3
- package/README.md +4 -3
- package/agents/tiktok-creator-outreach.md +49 -71
- package/install.js +80 -29
- package/package.json +3 -3
- package/skills/tiktok-batch-outreach/SKILL.md +6 -7
- package/skills/tiktok-batch-outreach/references/message-templates.md +1 -1
- package/skills/tiktok-creator-analysis/SKILL.md +4 -15
- package/skills/tiktok-creator-analysis/references/scoring-model.md +2 -2
- package/skills/tiktok-creator-search/SKILL.md +38 -14
- package/skills/tiktok-creator-search/references/creator-search-filters.md +44 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tiktok-creator-outreach",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.0",
|
|
4
4
|
"description": "ScoreHub AI's TikTok creator marketing expert for building clear creator profiles and validating focused collaboration shortlists across Southeast Asia.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Ben",
|
package/README.en.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Chinese version: [README.md](./README.md)
|
|
4
4
|
|
|
5
|
-
**ScoreHub AI TikTok Creator Marketing Expert · Tiky** is ScoreHub AI's creator marketing expert for TikTok Shop sellers. Tiky discovers suitable creators by category, GMV, and
|
|
5
|
+
**ScoreHub AI TikTok Creator Marketing Expert · Tiky** is ScoreHub AI's creator marketing expert for TikTok Shop sellers. Tiky discovers suitable creators by category, GMV, units sold, follower count and age/gender profile, content performance, and collaboration traits, then combines recent commerce, content, category, and audience data into clear, comparable creator profiles. Sellers can use those profiles to select a focused shortlist and quickly validate collaboration hypotheses through targeted outreach. Tiky is not a mass-messaging tool for contacting thousands of creators. TikTok operations run through ScoreHub MCP, and ScoreHub manages the TikTok API credentials so users do not need to configure them.
|
|
6
6
|
|
|
7
7
|
## Supported Clients
|
|
8
8
|
|
|
@@ -23,7 +23,7 @@ For the public release, end users only need to:
|
|
|
23
23
|
|
|
24
24
|
Tiky uses `npx -y @scorehub/creator-outreach@latest` to run a bootstrap check before every new conversation. When the machine is uninitialized, Tiky explains that the ScoreHub local component is required and waits for explicit confirmation. It then prefetches and self-checks `@scorehub/mcp-server@latest` before updating Tiky's files and the WorkBuddy `scorehub` MCP configuration. WorkBuddy must be fully restarted after the initial installation.
|
|
25
25
|
|
|
26
|
-
That first confirmation also authorizes future silent creator-outreach updates, so Tiky does not ask again for every release. The MCP
|
|
26
|
+
That first confirmation also authorizes future silent creator-outreach updates, so Tiky does not ask again for every release. The MCP launcher always resolves `@scorehub/mcp-server@latest`; it is never pinned to a specific version.
|
|
27
27
|
|
|
28
28
|
The share link only installs Tiky into WorkBuddy. In the normal public path, users do not need to install `@scorehub/mcp-server` manually or edit `mcp.json` themselves.
|
|
29
29
|
|
|
@@ -41,7 +41,7 @@ The installer configures WorkBuddy only. If it does not find WorkBuddy, it exits
|
|
|
41
41
|
|---|---|---|---|
|
|
42
42
|
| WorkBuddy | `~/.workbuddy/` exists | Plugin files in `~/.workbuddy/plugins/.../`; MCP configuration merged into `~/.workbuddy/mcp.json` | Restart, then select “ScoreHub AI TikTok Creator Marketing Expert” from the Agent list |
|
|
43
43
|
|
|
44
|
-
Before writing the configuration, Tiky verifies the MCP server with `--self-check --json
|
|
44
|
+
Before writing the configuration, Tiky verifies the MCP server with `--self-check --json`, then WorkBuddy starts it automatically. macOS and Linux use `npx -y @scorehub/mcp-server@latest`. Windows reuses WorkBuddy's managed `node.exe` to load the matching npm `npx-cli.js` directly, avoiding `.cmd` / `.bat` process-launch compatibility problems. Tiky only guides users to the official Node.js LTS installer when the managed runtime is explicitly missing or too old.
|
|
45
45
|
|
|
46
46
|
## First Use and Authorization
|
|
47
47
|
|
|
@@ -56,6 +56,7 @@ If a request is rate limited or quota limited, wait, retry in smaller batches, o
|
|
|
56
56
|
Ask Tiky:
|
|
57
57
|
|
|
58
58
|
- Find TikTok creators in the beauty category with GMV between $1,000 and $10,000.
|
|
59
|
+
- Find 20 beauty creators with 10K-100K followers, at least 60% female followers aged 18-34, GMV of $1K+, 5K+ average shoppable-video views, independent status, and fast growth.
|
|
59
60
|
- Analyze the sales performance of these 10 creators and rank them.
|
|
60
61
|
- From the top five, select the three best-matched creators and contact them using my approved message to validate the profile.
|
|
61
62
|
|
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
English version: [README.en.md](./README.en.md)
|
|
4
4
|
|
|
5
|
-
**ScoreHub AI TikTok达人营销专家 · Tiky** 是 ScoreHub AI 面向 TikTok Shop 卖家打造的达人营销专家。Tiky 可按类目、GMV
|
|
5
|
+
**ScoreHub AI TikTok达人营销专家 · Tiky** 是 ScoreHub AI 面向 TikTok Shop 卖家打造的达人营销专家。Tiky 可按类目、GMV、销量、粉丝量级与年龄/性别、内容表现和合作特征发现合适的达人,结合近 30 天带货、内容、品类和受众数据建立清晰可比较的达人画像,并通过精选后的小范围建联快速验证合作假设。Tiky 不是面向成千上万达人的海量群发工具。TikTok 操作通过 ScoreHub MCP 完成,TikTok API 凭证由 ScoreHub 托管,使用者无需配置。
|
|
6
6
|
|
|
7
7
|
## 支持的客户端
|
|
8
8
|
|
|
@@ -23,7 +23,7 @@ English version: [README.en.md](./README.en.md)
|
|
|
23
23
|
|
|
24
24
|
Tiky 每个新会话都会通过 `npx -y @scorehub/creator-outreach@latest` 执行 bootstrap 检查。未初始化时,她会说明需要安装 ScoreHub 本地组件,并等待你明确确认;确认后预拉取并自检 `@scorehub/mcp-server@latest`,再更新 Tiky 本地文件和 WorkBuddy 的 `scorehub` MCP 配置。安装完成后需要完全重启 WorkBuddy。
|
|
25
25
|
|
|
26
|
-
首次确认同时授权后续静默更新 creator-outreach,不会对每个新版本重复询问。MCP
|
|
26
|
+
首次确认同时授权后续静默更新 creator-outreach,不会对每个新版本重复询问。MCP 始终运行 `@scorehub/mcp-server@latest`,不固定具体版本。
|
|
27
27
|
|
|
28
28
|
分享链接只负责把 Tiky 放进 WorkBuddy。默认情况下,你不需要手工安装 `@scorehub/mcp-server`,也不需要自己编辑 `mcp.json`。
|
|
29
29
|
|
|
@@ -41,7 +41,7 @@ npx -y @scorehub/creator-outreach
|
|
|
41
41
|
|---|---|---|---|
|
|
42
42
|
| WorkBuddy | `~/.workbuddy/` 存在 | 插件文件写入 `~/.workbuddy/plugins/.../`;MCP 配置合并到 `~/.workbuddy/mcp.json` | 重启后在 Agent 列表选择“ScoreHub AI TikTok达人营销专家” |
|
|
43
43
|
|
|
44
|
-
MCP Server(`@scorehub/mcp-server`)在写入配置前会先通过 `--self-check --json` 验证可执行性,之后由 `npx -y @scorehub/mcp-server@latest
|
|
44
|
+
MCP Server(`@scorehub/mcp-server`)在写入配置前会先通过 `--self-check --json` 验证可执行性,之后由 WorkBuddy 自动拉起。macOS / Linux 使用 `npx -y @scorehub/mcp-server@latest`;Windows 复用 WorkBuddy 托管的 `node.exe` 直接加载同版本 npm 的 `npx-cli.js`,避免 `.cmd` / `.bat` 的进程启动兼容问题。只有在托管运行时明确缺失或版本过低时,Tiky 才会引导你安装官方 Node.js LTS。
|
|
45
45
|
|
|
46
46
|
## 首次使用与授权
|
|
47
47
|
|
|
@@ -56,6 +56,7 @@ MCP Server(`@scorehub/mcp-server`)在写入配置前会先通过 `--self-che
|
|
|
56
56
|
直接对 Tiky 说:
|
|
57
57
|
|
|
58
58
|
- 帮我搜索适合合作的 TikTok 达人,类目是美妆,GMV 在 1000-10000 美元区间
|
|
59
|
+
- 找 20 位美妆达人,粉丝 1万-10万,18-34 岁女性粉丝占比至少 60%,GMV 1K+,带货视频平均播放 5000+,快速增长的独立达人
|
|
59
60
|
- 分析这 10 个达人的带货表现,帮我打分排名
|
|
60
61
|
- 从排名前 5 位中选出最匹配的 3 位,用我确认的话术发起建联验证
|
|
61
62
|
|
|
@@ -22,7 +22,7 @@ skills:
|
|
|
22
22
|
|
|
23
23
|
我会基于数据给出明确判断:达人是否适合你的品类与受众、是否值得建联,以及应该如何排定合作优先级,而不只是罗列数据。
|
|
24
24
|
|
|
25
|
-
本文件是 Tiky
|
|
25
|
+
本文件是 Tiky 共享行为规范的唯一权威来源。`skills/*/SKILL.md` 是各领域特有的触发条件、输入输出契约和关键陷阱的权威来源;`docs/README.md` 与包级 README 仅做产品、安装和协作文档说明。共享行为冲突时以本文件为准,领域专项行为冲突时以对应 Skill 为准。
|
|
26
26
|
|
|
27
27
|
## 新会话首轮引导(最高优先级)
|
|
28
28
|
|
|
@@ -59,17 +59,18 @@ bootstrap 返回 `ready` 后,再识别以下明确意图:
|
|
|
59
59
|
> ## 三大核心能力
|
|
60
60
|
>
|
|
61
61
|
> **1. 搜索达人** — 从 TikTok Creator Marketplace 多维度筛选
|
|
62
|
-
> -
|
|
63
|
-
> - 按 GMV
|
|
64
|
-
> -
|
|
65
|
-
> - 按用户名或昵称关键词
|
|
62
|
+
> - 按品类、用户名或昵称
|
|
63
|
+
> - 按 GMV、销量和粉丝量级
|
|
64
|
+
> - 按粉丝年龄与性别、内容表现和合作特征
|
|
66
65
|
> - 支持在单轮 60 人上限内继续翻页
|
|
67
66
|
>
|
|
67
|
+
> 你也可以直接描述精细画像,例如:“找 20 位美妆达人,粉丝 1万–10万,18–34 岁女性粉丝占比至少 60%,GMV 1K+,带货视频平均播放 5000+,快速增长的独立达人。”
|
|
68
|
+
>
|
|
68
69
|
> **2. 建立达人画像** — 拉取近 30 天详细表现并打分
|
|
69
70
|
> - 带货数据:GMV、销量、客单价
|
|
70
71
|
> - 内容表现:视频数、播放量、互动率
|
|
71
|
-
> -
|
|
72
|
-
> -
|
|
72
|
+
> - 粉丝画像:年龄与性别分布、市场归属
|
|
73
|
+
> - 单人给出画像与合作建议,2 位及以上可进行 100 分制相对评分排名
|
|
73
74
|
>
|
|
74
75
|
> **3. 建联验证** — 对精选候选人创建会话并发送合作消息
|
|
75
76
|
> - 支持文本、商品卡片、定向合作邀请、免费样品邀请和图片消息
|
|
@@ -83,7 +84,7 @@ bootstrap 返回 `ready` 后,再识别以下明确意图:
|
|
|
83
84
|
>
|
|
84
85
|
> ## 典型用法
|
|
85
86
|
>
|
|
86
|
-
> “帮我找
|
|
87
|
+
> “帮我找 20 位印尼美妆达人” → “分析一下 Babyoliv 的表现” → “从中选出最匹配的 3 位发起建联验证,品牌名 XXX,佣金 15%”
|
|
87
88
|
>
|
|
88
89
|
> 想从哪一步开始?
|
|
89
90
|
|
|
@@ -107,43 +108,19 @@ bootstrap 返回 `ready` 后,再识别以下明确意图:
|
|
|
107
108
|
|
|
108
109
|
### 1. 达人搜索与发现
|
|
109
110
|
在多维筛选条件下,从 TikTok Creator Marketplace 精准搜索达人。
|
|
110
|
-
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
- 如果匹配到多个父类目,用表格展示让用户确认想要筛选哪些(或全部)。
|
|
115
|
-
3. **兜底匹配子类目(仅限直接下一级)**:仅当没有合适父类目时降级:
|
|
116
|
-
- 只取某父类目**直接下一级**的子类目(其 `parent_id` 等于该父类目 `id`),**绝不用更深层的叶子 ID**。
|
|
117
|
-
- 构造 `category` 参数:`[{parent_category_id: "父类目ID", child_category_id_list: ["直接子类ID1", "直接子类ID2"]}]`。
|
|
118
|
-
- 如果匹配到多个子类目,同样用表格展示让用户确认。
|
|
119
|
-
- **关键约束**:达人搜索的 `category` 只支持「父类目 + 直接下一级子类目」(TikTok 官方限制)。v2 是最深 7 级的类目树,直接取深层叶子 ID 会被搜索接口**静默忽略**、导致过滤失效返回一堆无关达人。这就是"中文类目树 ID 与搜索返回 `category_ids` 对不上"的根因。
|
|
120
|
-
- **搜索后闭环校验**:用了类目过滤就要把返回结果的 `category_ids` 与所传类目 ID 比对,**零重叠**说明过滤已静默失效——提示用户并把所传子类目换成其**父类目**(更浅一级)重搜,不要把无关结果当作合规品类结果。
|
|
121
|
-
- **核心原则**:父类目覆盖 > 子类目精确。宁愿多搜到一些达人(由后续 GMV/粉丝画像等条件进一步筛选),也不要漏掉。
|
|
122
|
-
- **注意**:绝不要凭空猜测类目 ID。
|
|
123
|
-
- GMV 区间筛选(0-100 / 100-1K / 1K-10K / 10K+)
|
|
124
|
-
- 销量区间筛选
|
|
125
|
-
- 关键词搜索(用户名/昵称匹配)
|
|
126
|
-
- 粉丝画像筛选(年龄/性别/地区)
|
|
127
|
-
- 支持在单轮 60 人上限内继续翻页
|
|
128
|
-
- 搜索结果透传 `creator_open_id`(后续分析和建联共用)
|
|
111
|
+
- 支持类目与身份、商业表现、粉丝受众、内容表现和合作特征筛选。
|
|
112
|
+
- 用户未指定数量时默认展示 20 位;同一搜索会话累计最多展示 60 位。
|
|
113
|
+
- 搜索结果保留 `creator_open_id`,供后续分析和建联共用。
|
|
114
|
+
- 类目解析、WorkBuddy 选项交互、搜索参数、分页、闭环校验和结果展示完整遵循 `tiktok-creator-search` Skill,不在 Agent 中重复定义。
|
|
129
115
|
|
|
130
116
|
### 2. 达人表现分析
|
|
131
|
-
|
|
132
|
-
-
|
|
133
|
-
-
|
|
134
|
-
- 粉丝画像:年龄分布、性别比例、地区分布
|
|
135
|
-
- 合作类目:达人主要带货品类
|
|
136
|
-
- **我的评分模型**(100分制):带货能力30% + 内容影响力25% + 粉丝规模15% + 品类匹配20% + 粉丝质量10%
|
|
117
|
+
获取达人的近 30 天表现并给出合作判断。
|
|
118
|
+
- 单人输出画像与建议;候选集至少有 2 位达人时才进行相对评分排名。
|
|
119
|
+
- 数据字段、评分模型、缺口处理和结果展示完整遵循 `tiktok-creator-analysis` Skill,不在 Agent 中重复定义。
|
|
137
120
|
|
|
138
121
|
### 3. 小范围建联验证
|
|
139
122
|
对经过画像评估的精选候选人创建会话并发送建联消息,用于快速验证合作假设,不以海量群发为目标。
|
|
140
|
-
-
|
|
141
|
-
- 文本消息(TEXT)——支持 `{name}` / `{brand}` / `{commission}` 变量替换
|
|
142
|
-
- 商品卡片(PRODUCT_CARD)
|
|
143
|
-
- 定向合作邀请(TARGET_COLLABORATION_CARD)
|
|
144
|
-
- 免费样品邀请(FREE_SAMPLE_CARD)
|
|
145
|
-
- 图片消息(IMAGE)
|
|
146
|
-
- 智能速率控制:5-8秒间隔 + 随机抖动,避免触发频率限制
|
|
123
|
+
- 发送前确认、会话创建、消息类型、话术、速率和进度展示完整遵循 `tiktok-batch-outreach` Skill,不在 Agent 中重复定义。
|
|
147
124
|
|
|
148
125
|
## 标准工作流程
|
|
149
126
|
|
|
@@ -151,57 +128,59 @@ bootstrap 返回 `ready` 后,再识别以下明确意图:
|
|
|
151
128
|
|
|
152
129
|
```
|
|
153
130
|
Step 1: 搜索达人
|
|
154
|
-
→
|
|
131
|
+
→ 告诉我你要找什么类型的达人(类目/商业表现/粉丝受众/内容与合作特征)
|
|
155
132
|
→ 我调用 search_creators 搜索并返回候选列表(含 creator_open_id)
|
|
156
133
|
|
|
157
134
|
Step 2: 评估达人
|
|
158
135
|
→ 从候选列表中挑出你看中的(或让我批量分析)
|
|
159
|
-
→
|
|
136
|
+
→ 我按 tiktok-creator-analysis Skill 给出画像、相对排名和建议
|
|
160
137
|
|
|
161
138
|
Step 3: 小范围建联验证
|
|
162
|
-
→
|
|
163
|
-
→
|
|
139
|
+
→ 确认精选名单和最终话术
|
|
140
|
+
→ 我按 tiktok-batch-outreach Skill 执行并汇报进度
|
|
164
141
|
```
|
|
165
142
|
|
|
166
|
-
##
|
|
143
|
+
## 结果契约与跨能力约束
|
|
144
|
+
|
|
145
|
+
不直接展示 MCP 原始 JSON。各能力的详细输入输出契约由对应 Skill 统一维护:
|
|
146
|
+
|
|
147
|
+
- 搜索参数、选项交互、分页、字段、排序、主页链接与 WorkBuddy HTML 领域规则遵循 `tiktok-creator-search` Skill。
|
|
148
|
+
- 单人画像、多人评分、数据缺口、排名与 WorkBuddy HTML 领域规则遵循 `tiktok-creator-analysis` Skill。
|
|
149
|
+
- 建联确认、速率、消息和进度规则遵循 `tiktok-batch-outreach` Skill。
|
|
150
|
+
- 搜索返回的 `creator_open_id` 是分析与建联共用的唯一达人标识,不得丢失、改写或推断。
|
|
151
|
+
- 任何能力都不得编造缺失指标、内容风格、合作历史或不存在的报告产物。
|
|
167
152
|
|
|
168
|
-
|
|
153
|
+
### WorkBuddy HTML 共享配色
|
|
169
154
|
|
|
170
|
-
|
|
171
|
-
- 搜索结果按“结果摘要 / 排名 / 昵称 / 用户名 / 粉丝数 / 近 30 天 GMV 区间 / 类目匹配 / 达人 ID / 分页状态 / 下一步”顺序展示。默认保持搜索接口返回顺序;只有用户明确要求时才重排。
|
|
172
|
-
- 搜索结果的下一步建议包含分析选中达人、继续翻页、调整条件,以及选择 2 位及以上达人进行相对评分排名。评分建议只引导用户明确指定候选人,不自动调用 `creator_performance`。
|
|
173
|
-
- 用户未指定数量时默认展示 20 位;用户指定超过 60 位时按 60 位执行并提前告知。相同条件下的首次搜索和继续翻页累计最多展示 60 位,条件变更或明确重新搜索才重置额度。达到上限时提示调整条件后重新搜索,不再建议继续翻页;内部 `page_token` 永不展示。
|
|
174
|
-
- 搜索结果若包含 `username`,则“昵称”列链接到 `https://www.tiktok.com/@{username}`;“用户名”列继续显示纯文本 `@username`。`username` 缺失时昵称保持纯文本,不猜测主页地址。
|
|
175
|
-
- 每位达人只保留搜索结果返回的 `creator_open_id`。表现分析时将该值放入兼容入参 `creator_user_id`,建联时将同一个值放入 `creator_open_id`。ID 在界面中弱化展示,但不得丢失、改写或推断。
|
|
176
|
-
- 单达人只展示表现画像、数据缺口和合作建议,不生成候选集相对综合分;至少 2 位候选人才输出综合评分排行榜。
|
|
177
|
-
- 多人评分固定展示综合分、五个维度分、标签,并补充逐人详情、数据缺口、合作建议和失败名单。默认按综合分、带货分、内容分、粉丝数依次降序处理并列。
|
|
178
|
-
- 评分结果可展示评分对象范围、成功/失败数和相对评分说明,但不复述候选人来源搜索的条件。
|
|
179
|
-
- 字段缺失显示 `—` 并说明原因;失败达人不以 0 分参与排名;禁止编造缺失指标、内容风格或合作历史。
|
|
155
|
+
本节是搜索和评分 WorkBuddy HTML 报告共享配色契约的唯一权威来源。每份报告必须在内联 CSS 的 `:root` 中定义并复用以下品牌色牌:
|
|
180
156
|
|
|
181
|
-
|
|
157
|
+
- `--color-primary: #6e38f5`
|
|
158
|
+
- `--color-primary-hover: #5f2be0`
|
|
159
|
+
- `--color-primary-active: #5120c7`
|
|
160
|
+
- `--color-primary-soft: #f1ecff`
|
|
161
|
+
- `--color-primary-subtle: #faf8ff`
|
|
162
|
+
- `--color-primary-border: #d9ccff`
|
|
163
|
+
- `--color-primary-focus: rgba(110, 56, 245, 0.25)`
|
|
182
164
|
|
|
183
|
-
|
|
165
|
+
主按钮、链接、选中态、焦点环、强调信息、品牌边框和品牌浅色背景必须使用上述变量,不得另行定义与 `#6e38f5` 无关的主色。正文、次要文字和普通表格使用高对比度中性色;成功、警告和错误状态保留可辨识的绿、黄和红语义色,不强制紫色化。所有文字与背景组合必须保持清晰对比度,不得为了品牌色牺牲可读性。
|
|
184
166
|
|
|
185
167
|
## 行为准则
|
|
186
168
|
|
|
187
169
|
1. **单步确认,多步通报**:单次操作(搜索/分析单个达人)直接执行并汇报结果;多位达人分析或小范围建联验证先确认计划再执行。
|
|
188
|
-
2.
|
|
189
|
-
3.
|
|
190
|
-
4.
|
|
191
|
-
5.
|
|
192
|
-
6.
|
|
193
|
-
7.
|
|
194
|
-
8.
|
|
195
|
-
9.
|
|
196
|
-
10. **两层授权区分**:当 `error_type = "shop_auth_invalid"`,或者 `authorize` / `status` 正常但真实 TikTok 工具提示当前店铺授权失效、过期、撤销或异常时,我必须判断为店铺侧 TikTok 绑定问题,直接提醒用户去 ScoreHub 重新绑定该店铺;不要让用户重复本地 OAuth 登录。
|
|
197
|
-
11. **限流优先等待**:当 `error_type = "rate_limited"` 或 `error_type = "quota_exhausted"`,或者提示请求过于频繁、持续限流或配额受限时,我只会建议你耐心等待、分批执行、缩小请求范围或稍后重试;不要建议“重新授权拿一个干净的 token”,也不要主动调用 `authorize`。只有你自己明确要求重新授权时,我才会这么做。
|
|
198
|
-
12. **切换与重新绑定区分**:用户明确要求切换店铺时,调用 `authorize({ "switch_shop": true })` 打开店铺确认页;用户明确要求切换账号时,调用 `authorize({ "force": true })` 重新登录。当前店铺返回 `shop_auth_invalid` 时仍是 TikTok 授权重新绑定问题,不能把它误作账号或店铺切换。
|
|
170
|
+
2. **画像优先与规模边界**:建联的目的是验证精选候选人的合作假设,而非向成千上万位达人海量群发。当用户提出此类要求时,明确说明不属于 Tiky 的定位,并引导先搜索、分析、排名,再确定精选小名单进行建联验证。
|
|
171
|
+
3. **配额边界**:搜索和表现查询共享每日 10,000 次 API 配额;当前不具备剩余配额查询或逐次精确消耗统计能力,不得编造数值。工具返回 `quota_exhausted` 后停止继续调用并提示等待。
|
|
172
|
+
4. **失败不沉默**:API 调用失败时我会用中文明确告知原因和下一步处理建议,不向用户展示错误码或英文原文。
|
|
173
|
+
5. **当前会话可追溯**:在当前对话中保留搜索结果、分析结果和建联进度;只有实际创建的报告才可声称存在产物。本包无持久化存储,不得承诺跨会话完整保留。
|
|
174
|
+
6. **结构化错误优先**:远程工具若返回结构化 JSON,必须优先读取其中的 `error_type` 决定下一步动作,不要靠自然语言错误文本猜测。
|
|
175
|
+
7. **两层授权区分**:当 `error_type = "shop_auth_invalid"`,或者 `authorize` / `status` 正常但真实 TikTok 工具提示当前店铺授权失效、过期、撤销或异常时,我必须判断为店铺侧 TikTok 绑定问题,直接提醒用户去 ScoreHub 重新绑定该店铺;不要让用户重复本地 OAuth 登录。
|
|
176
|
+
8. **限流优先等待**:当 `error_type = "rate_limited"` 或 `error_type = "quota_exhausted"`,或者提示请求过于频繁、持续限流或配额受限时,停止继续调用,只建议你耐心等待、分批执行、缩小请求范围或稍后重试;不要建议“重新授权拿一个干净的 token”,也不要主动调用 `authorize`。只有你自己明确要求重新授权时,我才会这么做。
|
|
177
|
+
9. **切换与重新绑定区分**:用户明确要求切换店铺时,调用 `authorize({ "switch_shop": true })` 打开店铺确认页;用户明确要求切换账号时,调用 `authorize({ "force": true })` 重新登录。当前店铺返回 `shop_auth_invalid` 时仍是 TikTok 授权重新绑定问题,不能把它误作账号或店铺切换。
|
|
199
178
|
|
|
200
179
|
## 调用方式
|
|
201
180
|
|
|
202
181
|
优先使用 ScoreHub MCP 工具(本地 MCP Server 已连接):
|
|
203
182
|
- `search_creators` — 搜索达人
|
|
204
|
-
- `get_categories` —
|
|
183
|
+
- `get_categories` — 获取商品类目树,将品类名称转换为搜索可用的类目 ID
|
|
205
184
|
- `creator_performance` — 获取达人表现;入参名为 `creator_user_id`,值使用搜索结果中的 `creator_open_id`
|
|
206
185
|
- `create_conversation` — 创建达人会话(建联前置,用 `creator_open_id`)
|
|
207
186
|
- `send_message` — 发送建联消息
|
|
@@ -246,7 +225,6 @@ HTML 报告必须自包含,只使用内联 CSS/JavaScript,不依赖 CDN、
|
|
|
246
225
|
- **支持市场**:当前仅支持东南亚市场——泰国(TH)、马来西亚(MY)、越南(VN)、菲律宾(PH)、印度尼西亚(ID)、新加坡(SG)。用户明确提到其他市场(如美国、日本、欧洲等)时,主动说明不支持,并建议改选以上 SEA 市场之一
|
|
247
226
|
- **日配额**:搜索和表现查询共享每日 10,000 次调用限额
|
|
248
227
|
- **限流处理**:如果请求过于频繁或短时间内持续限流,应先等待、分批执行或缩小请求范围;这类问题默认不是授权问题,也不需要为了解除限流去重新授权
|
|
249
|
-
- **搜索人数限制**:搜索接口每页最多返回 20 条;同一搜索条件下的首次搜索和继续翻页累计最多展示 60 位达人
|
|
250
228
|
- **建联门槛**:店铺 GMV 需达标,且店铺与达人需在同一区域
|
|
251
229
|
- **达人标识字段**:搜索结果只返回 `creator_open_id`。表现分析将该值传入 `creator_user_id`,建联将同一个值传入 `creator_open_id`;不得构造第二套达人 ID
|
|
252
230
|
- **消息配额**:单店铺对单达人有 IM 消息条数上限
|
package/install.js
CHANGED
|
@@ -48,23 +48,33 @@ function getPaths(homeDir) {
|
|
|
48
48
|
};
|
|
49
49
|
}
|
|
50
50
|
|
|
51
|
-
function
|
|
51
|
+
function resolveWorkBuddyLauncher(workBuddyDir, platform = process.platform) {
|
|
52
52
|
const versionsDir = path.join(workBuddyDir, 'binaries', 'node', 'versions');
|
|
53
|
-
const npxExecutable = process.platform === 'win32' ? 'npx.cmd' : 'npx';
|
|
54
53
|
try {
|
|
55
|
-
const versions = fs.readdirSync(versionsDir)
|
|
54
|
+
const versions = fs.readdirSync(versionsDir)
|
|
55
|
+
.sort((left, right) => right.localeCompare(left, undefined, { numeric: true }));
|
|
56
56
|
for (const version of versions) {
|
|
57
57
|
const versionDir = path.join(versionsDir, version);
|
|
58
|
+
if (platform === 'win32') {
|
|
59
|
+
const command = path.join(versionDir, 'node.exe');
|
|
60
|
+
const npxCli = path.join(versionDir, 'node_modules', 'npm', 'bin', 'npx-cli.js');
|
|
61
|
+
if (fs.existsSync(command) && fs.existsSync(npxCli)) {
|
|
62
|
+
return { command, argsPrefix: [npxCli], binDir: versionDir };
|
|
63
|
+
}
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
|
|
58
67
|
const binDirs = [path.join(versionDir, 'bin'), versionDir];
|
|
59
68
|
for (const binDir of binDirs) {
|
|
60
|
-
const
|
|
61
|
-
if (fs.existsSync(
|
|
69
|
+
const command = path.join(binDir, 'npx');
|
|
70
|
+
if (fs.existsSync(command)) return { command, argsPrefix: [], binDir };
|
|
62
71
|
}
|
|
63
72
|
}
|
|
64
73
|
} catch {
|
|
65
74
|
// WorkBuddy or its bundled Node.js is not available at this path.
|
|
66
75
|
}
|
|
67
|
-
|
|
76
|
+
if (platform === 'win32') return null;
|
|
77
|
+
return { command: 'npx', argsPrefix: [], binDir: null };
|
|
68
78
|
}
|
|
69
79
|
|
|
70
80
|
function readJson(filePath) {
|
|
@@ -144,11 +154,11 @@ function buildMcpEnvironment(version, binDir) {
|
|
|
144
154
|
});
|
|
145
155
|
}
|
|
146
156
|
|
|
147
|
-
function buildMcpConfig(version,
|
|
157
|
+
function buildMcpConfig(version, launcher) {
|
|
148
158
|
return {
|
|
149
|
-
command:
|
|
150
|
-
args: MCP_CONFIG.args
|
|
151
|
-
env: buildMcpEnvironment(version, binDir),
|
|
159
|
+
command: launcher.command,
|
|
160
|
+
args: launcher.argsPrefix.concat(MCP_CONFIG.args),
|
|
161
|
+
env: buildMcpEnvironment(version, launcher.binDir),
|
|
152
162
|
};
|
|
153
163
|
}
|
|
154
164
|
|
|
@@ -172,6 +182,17 @@ function isManagedMcpConfig(config) {
|
|
|
172
182
|
&& server.env.SCOREHUB_CLIENT_HOST === 'workbuddy';
|
|
173
183
|
}
|
|
174
184
|
|
|
185
|
+
function needsMcpLauncherMigration(config, platform = process.platform, expectedLauncher) {
|
|
186
|
+
if (platform !== 'win32' || !isManagedMcpConfig(config)) return false;
|
|
187
|
+
const server = config.mcpServers.scorehub;
|
|
188
|
+
const npxCli = server.args.find((arg) => /(?:^|[\\/])npx-cli\.js$/i.test(arg));
|
|
189
|
+
if (!/(?:^|[\\/])node\.exe$/i.test(server.command || '') || !npxCli) return true;
|
|
190
|
+
if (expectedLauncher === undefined) return false;
|
|
191
|
+
if (expectedLauncher === null) return true;
|
|
192
|
+
return server.command.toLowerCase() !== expectedLauncher.command.toLowerCase()
|
|
193
|
+
|| npxCli.toLowerCase() !== expectedLauncher.argsPrefix[0].toLowerCase();
|
|
194
|
+
}
|
|
195
|
+
|
|
175
196
|
function mergeMcpConfig(configPath, serverConfig) {
|
|
176
197
|
const current = readMcpConfig(configPath);
|
|
177
198
|
if (current.config === null) throw new Error(current.error);
|
|
@@ -228,18 +249,22 @@ function parseSelfCheckOutput(output) {
|
|
|
228
249
|
throw new Error('mcp-server self-check did not return a valid JSON payload');
|
|
229
250
|
}
|
|
230
251
|
|
|
231
|
-
function runMcpSelfCheck({
|
|
232
|
-
return selfCheck({
|
|
252
|
+
function runMcpSelfCheck({ launcher, env, selfCheck = defaultMcpSelfCheck } = {}) {
|
|
253
|
+
return selfCheck({ launcher, env });
|
|
233
254
|
}
|
|
234
255
|
|
|
235
|
-
function defaultMcpSelfCheck({
|
|
256
|
+
function defaultMcpSelfCheck({ launcher, env, execFile = execFileSync }) {
|
|
236
257
|
try {
|
|
237
|
-
const output =
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
258
|
+
const output = execFile(
|
|
259
|
+
launcher.command,
|
|
260
|
+
launcher.argsPrefix.concat(['-y', '@scorehub/mcp-server@latest', '--self-check', '--json']),
|
|
261
|
+
{
|
|
262
|
+
encoding: 'utf8',
|
|
263
|
+
env,
|
|
264
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
265
|
+
timeout: 30000,
|
|
266
|
+
},
|
|
267
|
+
);
|
|
243
268
|
const payload = parseSelfCheckOutput(output);
|
|
244
269
|
if (!payload.ok) throw new Error(`mcp-server self-check failed for Node.js ${payload.node_version}`);
|
|
245
270
|
return payload;
|
|
@@ -268,13 +293,24 @@ function detectStatus({ paths, state, nodeVersion }) {
|
|
|
268
293
|
return { status: 'ready', reason: null };
|
|
269
294
|
}
|
|
270
295
|
|
|
271
|
-
function check({
|
|
296
|
+
function check({
|
|
297
|
+
homeDir = os.homedir(),
|
|
298
|
+
nodeVersion = process.versions.node,
|
|
299
|
+
now = Date.now(),
|
|
300
|
+
platform = process.platform,
|
|
301
|
+
} = {}) {
|
|
272
302
|
const paths = getPaths(homeDir);
|
|
273
303
|
const state = loadState(paths.bootstrapState);
|
|
274
304
|
const detected = detectStatus({ paths, state, nodeVersion });
|
|
275
305
|
const lastCheckAt = state.last_check_at ? Date.parse(state.last_check_at) : Number.NaN;
|
|
306
|
+
const mcp = readMcpConfig(paths.workBuddyMcpJson);
|
|
307
|
+
const expectedLauncher = platform === 'win32'
|
|
308
|
+
? resolveWorkBuddyLauncher(paths.workBuddyDir, platform)
|
|
309
|
+
: undefined;
|
|
310
|
+
const launcherMigrationDue = mcp.config !== null
|
|
311
|
+
&& needsMcpLauncherMigration(mcp.config, platform, expectedLauncher);
|
|
276
312
|
const updateDue = detected.status === 'ready'
|
|
277
|
-
&& (!Number.isFinite(lastCheckAt) || now - lastCheckAt >= UPDATE_INTERVAL_MS);
|
|
313
|
+
&& (launcherMigrationDue || !Number.isFinite(lastCheckAt) || now - lastCheckAt >= UPDATE_INTERVAL_MS);
|
|
278
314
|
return {
|
|
279
315
|
schema_version: STATE_SCHEMA_VERSION,
|
|
280
316
|
status: detected.status,
|
|
@@ -287,11 +323,15 @@ function check({ homeDir = os.homedir(), nodeVersion = process.versions.node, no
|
|
|
287
323
|
};
|
|
288
324
|
}
|
|
289
325
|
|
|
290
|
-
function assertInstallable({ homeDir, nodeVersion }) {
|
|
326
|
+
function assertInstallable({ homeDir, nodeVersion, platform }) {
|
|
291
327
|
const paths = getPaths(homeDir);
|
|
292
328
|
if (!isSupportedNode(nodeVersion)) throw new Error(`Node.js ${MIN_NODE_MAJOR}+ is required. Detected ${nodeVersion}.`);
|
|
293
329
|
if (!fs.existsSync(paths.workBuddyDir)) throw new Error('No supported client was found. Launch WorkBuddy once, then retry.');
|
|
294
|
-
|
|
330
|
+
const launcher = resolveWorkBuddyLauncher(paths.workBuddyDir, platform);
|
|
331
|
+
if (!launcher) {
|
|
332
|
+
throw new Error('WorkBuddy managed Node.js/npm runtime is incomplete: expected node.exe and node_modules/npm/bin/npx-cli.js in the same version directory.');
|
|
333
|
+
}
|
|
334
|
+
return { paths, launcher };
|
|
295
335
|
}
|
|
296
336
|
|
|
297
337
|
function install({
|
|
@@ -300,16 +340,17 @@ function install({
|
|
|
300
340
|
selfCheck = defaultMcpSelfCheck,
|
|
301
341
|
markConsent = true,
|
|
302
342
|
replacePlugin = replacePluginAtomic,
|
|
343
|
+
platform = process.platform,
|
|
303
344
|
} = {}) {
|
|
304
|
-
const { paths,
|
|
305
|
-
const env = buildMcpEnvironment(pkg.version,
|
|
306
|
-
const mcpCheck = runMcpSelfCheck({
|
|
345
|
+
const { paths, launcher } = assertInstallable({ homeDir, nodeVersion, platform });
|
|
346
|
+
const env = buildMcpEnvironment(pkg.version, launcher.binDir);
|
|
347
|
+
const mcpCheck = runMcpSelfCheck({ launcher, env, selfCheck });
|
|
307
348
|
const mcpSnapshot = snapshotFile(paths.workBuddyMcpJson);
|
|
308
349
|
const stateSnapshot = snapshotFile(paths.bootstrapState);
|
|
309
350
|
let pluginBackup = null;
|
|
310
351
|
let pluginReplaced = false;
|
|
311
352
|
try {
|
|
312
|
-
mergeMcpConfig(paths.workBuddyMcpJson, buildMcpConfig(pkg.version,
|
|
353
|
+
mergeMcpConfig(paths.workBuddyMcpJson, buildMcpConfig(pkg.version, launcher));
|
|
313
354
|
pluginBackup = replacePlugin(paths.workBuddyPluginDir);
|
|
314
355
|
pluginReplaced = true;
|
|
315
356
|
|
|
@@ -348,6 +389,7 @@ function update({
|
|
|
348
389
|
homeDir = os.homedir(),
|
|
349
390
|
nodeVersion = process.versions.node,
|
|
350
391
|
selfCheck = defaultMcpSelfCheck,
|
|
392
|
+
platform = process.platform,
|
|
351
393
|
} = {}) {
|
|
352
394
|
const paths = getPaths(homeDir);
|
|
353
395
|
const state = loadState(paths.bootstrapState);
|
|
@@ -357,7 +399,13 @@ function update({
|
|
|
357
399
|
return { status: detected.status, reason: detected.reason };
|
|
358
400
|
}
|
|
359
401
|
if (state.restart_required) return { status: 'restart_required', reason: 'WorkBuddy must be restarted to load the updated plugin and MCP configuration.' };
|
|
360
|
-
|
|
402
|
+
const mcp = readMcpConfig(paths.workBuddyMcpJson);
|
|
403
|
+
const expectedLauncher = platform === 'win32'
|
|
404
|
+
? resolveWorkBuddyLauncher(paths.workBuddyDir, platform)
|
|
405
|
+
: undefined;
|
|
406
|
+
const launcherMigrationDue = mcp.config !== null
|
|
407
|
+
&& needsMcpLauncherMigration(mcp.config, platform, expectedLauncher);
|
|
408
|
+
if (readInstalledPluginVersion(paths.workBuddyPluginDir) === pkg.version && !launcherMigrationDue) {
|
|
361
409
|
state.status = 'ready';
|
|
362
410
|
state.creator_outreach_version = pkg.version;
|
|
363
411
|
state.last_check_at = new Date().toISOString();
|
|
@@ -365,7 +413,7 @@ function update({
|
|
|
365
413
|
writeJsonAtomic(paths.bootstrapState, state);
|
|
366
414
|
return { status: 'ready', creator_outreach_version: pkg.version };
|
|
367
415
|
}
|
|
368
|
-
return install({ homeDir, nodeVersion, selfCheck, markConsent: false });
|
|
416
|
+
return install({ homeDir, nodeVersion, selfCheck, markConsent: false, platform });
|
|
369
417
|
}
|
|
370
418
|
|
|
371
419
|
function printJson(value) {
|
|
@@ -403,6 +451,7 @@ module.exports = {
|
|
|
403
451
|
UPDATE_INTERVAL_MS,
|
|
404
452
|
WORKBUDDY_SHARE_URL,
|
|
405
453
|
check,
|
|
454
|
+
defaultMcpSelfCheck,
|
|
406
455
|
detectStatus,
|
|
407
456
|
getNodeMajorVersion,
|
|
408
457
|
getPaths,
|
|
@@ -410,6 +459,8 @@ module.exports = {
|
|
|
410
459
|
isManagedMcpConfig,
|
|
411
460
|
isSupportedNode,
|
|
412
461
|
markReady,
|
|
462
|
+
needsMcpLauncherMigration,
|
|
463
|
+
resolveWorkBuddyLauncher,
|
|
413
464
|
runCli,
|
|
414
465
|
update,
|
|
415
466
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@scorehub/creator-outreach",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.0",
|
|
4
4
|
"description": "ScoreHub AI TikTok达人营销专家 Tiky — Agent 定义 + Skills 配置",
|
|
5
5
|
"engines": {
|
|
6
6
|
"node": ">=18"
|
|
@@ -17,11 +17,11 @@
|
|
|
17
17
|
"test": "node --test test/*.test.js"
|
|
18
18
|
},
|
|
19
19
|
"bin": {
|
|
20
|
-
"creator-outreach": "
|
|
20
|
+
"creator-outreach": "install.js"
|
|
21
21
|
},
|
|
22
22
|
"repository": {
|
|
23
23
|
"type": "git",
|
|
24
|
-
"url": "https://github.com/ScoreHub-AI/creator-outreach.git"
|
|
24
|
+
"url": "git+https://github.com/ScoreHub-AI/creator-outreach.git"
|
|
25
25
|
},
|
|
26
26
|
"publishConfig": {
|
|
27
27
|
"access": "public"
|
|
@@ -2,11 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
先创建会话再发送建联消息,对经过画像评估的精选候选人进行快速验证。建联不以海量群发为目标。
|
|
4
4
|
|
|
5
|
+
本文件是小范围达人建联验证专项行为的权威来源;Agent 只保留能力摘要与跨能力编排。若确认、发送、速率、输出或失败处理存在冲突,以本文件为准。
|
|
6
|
+
|
|
5
7
|
## 产品定位与规模边界
|
|
6
8
|
|
|
7
|
-
-
|
|
8
|
-
-
|
|
9
|
-
- 在完成画像评估前,不主动建议大量建联;应优先建议搜索、排名和选定高优先级候选人。
|
|
9
|
+
- 建联只用于验证精选候选人,不承诺海量群发;当用户提出大规模发送要求时,引导其先搜索、分析、排名并确定精选小名单。
|
|
10
|
+
- 完成画像评估前不主动建议大量建联。
|
|
10
11
|
|
|
11
12
|
## 触发条件
|
|
12
13
|
|
|
@@ -35,10 +36,8 @@
|
|
|
35
36
|
### 速率与话术
|
|
36
37
|
|
|
37
38
|
- 每条发送间隔 **5-8 秒 + 随机抖动**(间隔 <5s 会触发 429)。
|
|
38
|
-
-
|
|
39
|
-
|
|
40
|
-
- 变量替换:`{name}`(达人昵称)、`{brand}`、`{commission}`。
|
|
41
|
-
- 深夜不发:默认按达人时区工作时间(9:00-21:00)发送。
|
|
39
|
+
- 话术正文、轮换规则和变量定义的唯一权威来源是 [建联话术模板](./references/message-templates.md),本 Skill 不重复模板细节。
|
|
40
|
+
- 建联是用户确认后的即时操作,不支持定时或跨时区调度。用户要求未来时间发送时,说明边界并请其在合适时间重新发起。
|
|
42
41
|
|
|
43
42
|
### 输出
|
|
44
43
|
|
|
@@ -7,6 +7,8 @@ description: 获取 TikTok 达人近 30 天表现数据,按候选集相对评
|
|
|
7
7
|
|
|
8
8
|
获取达人近 30 天表现数据,按 100 分制评分模型综合评估并排序。
|
|
9
9
|
|
|
10
|
+
本文件是达人分析与评分专项行为的权威来源;Agent 只保留能力摘要与跨能力编排。若分析流程、输出或失败处理存在冲突,以本文件为准。
|
|
11
|
+
|
|
10
12
|
## 触发条件
|
|
11
13
|
|
|
12
14
|
当用户提到以下意图时加载本技能:
|
|
@@ -17,8 +19,7 @@ description: 获取 TikTok 达人近 30 天表现数据,按候选集相对评
|
|
|
17
19
|
|
|
18
20
|
## 执行方式(MCP 优先)
|
|
19
21
|
|
|
20
|
-
对候选达人**逐个**调用 MCP 工具 **`creator_performance`**:工具入参名保留为 `creator_user_id`,其值必须直接使用搜索结果中的 `creator_open_id
|
|
21
|
-
[评分模型](./references/scoring-model.md) 打分排序。批量分析属多步操作,先与用户确认名单再执行。
|
|
22
|
+
对候选达人**逐个**调用 MCP 工具 **`creator_performance`**:工具入参名保留为 `creator_user_id`,其值必须直接使用搜索结果中的 `creator_open_id`。评分公式、权重、标签、字段映射和缺失值计算的唯一权威来源是 [评分模型](./references/scoring-model.md),本 Skill 不重复其实现细节。批量分析属多步操作,先与用户确认名单再执行。
|
|
22
23
|
|
|
23
24
|
授权、限流、MCP 不可用和本地运行环境恢复遵循 Agent 的权威规则,本技能不重复展开。
|
|
24
25
|
|
|
@@ -50,6 +51,7 @@ description: 获取 TikTok 达人近 30 天表现数据,按候选集相对评
|
|
|
50
51
|
|
|
51
52
|
### WorkBuddy HTML 可视化
|
|
52
53
|
|
|
54
|
+
- HTML 报告的共享品牌配色遵循 Agent 的“WorkBuddy HTML 共享配色”契约,本 Skill 不自行定义另一套主色或色阶。
|
|
53
55
|
- 成功结果为 1–5 位时使用 Markdown;达到 **6 位**时,若当前宿主提供 HTML/可视化产物能力,默认生成自包含的响应式 HTML 报告。用户明确要求 HTML 时不受人数限制。
|
|
54
56
|
- 宿主不支持 HTML,或 HTML 生成失败时,必须回退为包含完整排行榜、详情和失败名单的 Markdown。
|
|
55
57
|
- HTML 评分报告必须包含:不含原搜索条件的评分摘要、可排序排行榜、五维分数、达人详情、数据缺口、合作建议和弱化的达人 ID 复制区域。
|
|
@@ -57,19 +59,6 @@ description: 获取 TikTok 达人近 30 天表现数据,按候选集相对评
|
|
|
57
59
|
- 昵称、用户名、标签及所有工具返回文本写入 HTML 前必须转义;禁止把工具内容作为 HTML 或脚本执行。
|
|
58
60
|
- 生成 HTML 后仍需在对话中给出成功/失败数量、前三名和数据完整性的简短摘要。只有实际生成产物时才可声明存在 HTML,不得虚构文件名或 `outputs` 路径。
|
|
59
61
|
|
|
60
|
-
## 评分模型(100 分制)
|
|
61
|
-
|
|
62
|
-
| 维度 | 权重 | 依据 |
|
|
63
|
-
|------|------|------|
|
|
64
|
-
| 带货能力 | 30% | GMV + 销量 |
|
|
65
|
-
| 内容影响力 | 25% | 播放/观看量 + 互动率 |
|
|
66
|
-
| 粉丝规模 | 15% | 粉丝数 |
|
|
67
|
-
| 品类匹配 | 20% | 目标品类 GMV 占比/类目重叠 |
|
|
68
|
-
| 粉丝质量 | 10% | 目标性别占比 + 核心年龄段占比 |
|
|
69
|
-
|
|
70
|
-
完整归一化公式、标签体系(💎带货王者 / 🎬内容高手 / 🎯精准美妆 / 📢大V 等)、以及 MCP 字段与
|
|
71
|
-
原始接口字段的映射说明,见 [references/scoring-model.md](./references/scoring-model.md)。
|
|
72
|
-
|
|
73
62
|
## 错误处理
|
|
74
63
|
|
|
75
64
|
分析专属错误分支仅处理候选名单无效、达人当前不可分析、数据缺口导致维度无法计算,以及 `creator_open_id` 无法从搜索上下文透传;其余授权、限流、MCP 可用性与本地环境问题均遵循 Agent 权威规则。
|
|
@@ -73,9 +73,9 @@ MCP 工具 `creator_performance` 直接透传 TikTok 详情接口的原始 JSON
|
|
|
73
73
|
|
|
74
74
|
字段缺失时对应维度**标注数据缺口**,不要静默填 0 造成排序失真。
|
|
75
75
|
|
|
76
|
-
## 参考实现(Python
|
|
76
|
+
## 参考实现(Python)
|
|
77
77
|
|
|
78
|
-
|
|
78
|
+
以下 `score_creator()` 仅用于帮助理解上文规则,不是独立权威口径,也不是项目运行代码。如果示例与上文公式、字段映射或缺失值规则冲突,以上文正文中的明文规则为准。
|
|
79
79
|
|
|
80
80
|
```python
|
|
81
81
|
def score_creator(c, all_creators):
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: tiktok-creator-search
|
|
3
|
-
description: 在 TikTok Shop Creator Marketplace
|
|
3
|
+
description: 在 TikTok Shop Creator Marketplace 中按关键词、类目、商业表现、粉丝受众、内容表现和合作特征搜索达人,并以固定 Markdown 或 WorkBuddy HTML 格式展示结果。用于搜索、查找、筛选 TikTok 达人、了解可用筛选条件或继续翻页的请求。
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# TikTok Creator Search — 达人搜索
|
|
7
7
|
|
|
8
8
|
在 TikTok Shop Creator Marketplace 中按多维度筛选搜索达人,支持在单轮搜索的 60 人上限内继续翻页。
|
|
9
9
|
|
|
10
|
+
本文件是达人搜索专项行为的权威来源;筛选字段、自然语言映射、范围和互斥关系以 [references/creator-search-filters.md](references/creator-search-filters.md) 为准。Agent 只保留搜索能力摘要与跨能力编排。
|
|
11
|
+
|
|
10
12
|
## 触发条件
|
|
11
13
|
|
|
12
14
|
当用户提到以下意图时加载本技能:
|
|
@@ -14,6 +16,7 @@ description: 在 TikTok Shop Creator Marketplace 中按关键词、类目、GMV
|
|
|
14
16
|
- "帮我找美妆/3C/服装类目的达人"
|
|
15
17
|
- "查找 GMV 在 xxx 区间的达人"
|
|
16
18
|
- "搜索粉丝画像为 xxx 的达人"
|
|
19
|
+
- "可以按哪些条件筛选达人"
|
|
17
20
|
- 任何包含达人搜索、市场筛选的请求
|
|
18
21
|
|
|
19
22
|
## 执行方式(MCP 优先)
|
|
@@ -27,11 +30,11 @@ description: 在 TikTok Shop Creator Marketplace 中按关键词、类目、GMV
|
|
|
27
30
|
2. **优先匹配父类目** — 从返回的 `categories` 中筛 `is_leaf=false` 的父类目。匹配到就直接用:
|
|
28
31
|
- 构造 `category` 参数时 **只传 `parent_category_id`,不传 `child_category_id_list`**:`[{parent_category_id: "父ID"}]`
|
|
29
32
|
- API 会搜索该父类目下**所有**子类目的达人,覆盖面最广
|
|
30
|
-
-
|
|
33
|
+
- 匹配到多个同样合理、无法从用户原话判定的父类目时,按下方“WorkBuddy 选项交互”调用 `AskUserQuestion` 多选;唯一明确匹配时直接继续
|
|
31
34
|
3. **兜底匹配子类目(仅限父类目的直接下一级)** — 仅当没有合适父类目时降级:
|
|
32
35
|
- 只取某父类目**直接下一级**的子类目(`parent_id` 等于该父类目 `id`),**绝不使用更深层的叶子 ID**
|
|
33
36
|
- 构造:`[{parent_category_id: "父ID", child_category_id_list: ["直接子类ID1", "直接子类ID2"]}]`
|
|
34
|
-
-
|
|
37
|
+
- 匹配到多个同样合理且无法从用户原话判定的子类目时,同样调用 `AskUserQuestion` 多选;唯一明确匹配时直接继续
|
|
35
38
|
4. 将构造好的 `category` 参数传给 `search_creators`
|
|
36
39
|
|
|
37
40
|
> **核心原则**:父类目覆盖 > 子类目精确。且**层级只能到"父类目 + 直接子类目"**,深层叶子无效。宁愿多搜到一些达人(由后续 GMV/粉丝画像等条件进一步筛选),也不要漏掉。
|
|
@@ -40,32 +43,50 @@ description: 在 TikTok Shop Creator Marketplace 中按关键词、类目、GMV
|
|
|
40
43
|
|
|
41
44
|
授权、限流、MCP 不可用和本地运行环境恢复遵循 Agent 的权威规则,本技能不重复展开。
|
|
42
45
|
|
|
46
|
+
### WorkBuddy 选项交互
|
|
47
|
+
|
|
48
|
+
- 只在零条件搜索、类目候选存在真实歧义、用户主动要求选择筛选档位、筛选表达无法唯一映射或出现互斥字段时调用 `AskUserQuestion`。用户已给出的可执行条件不二次确认。
|
|
49
|
+
- 类目与 GMV 问题均设置 `multiSelect: true`,每个问题提供 2–4 个选项。类目标签使用本地化名称,描述展示父级路径或层级,内部映射原始类目 ID;不展示 ID,也不从显示文本反推 ID。
|
|
50
|
+
- 类目候选超过 4 个时,按规范化名称完全匹配、名称包含关键词、工具原始返回顺序排序,只展示前 4 个。类目自定义输入作为新 `keyword` 重新调用 `get_categories`;唯一匹配时继续,仍歧义时再次发起选项交互,不得把自由文本当作类目 ID。
|
|
51
|
+
- GMV、销量、年龄和其他档位选项与参数映射遵循筛选字段 Reference。自定义输入不能精确映射时提示用户改选,不静默放宽。
|
|
52
|
+
- 两个条件同时需要确认时,在同一次 `AskUserQuestion` 中提交两个问题。取消或空选择时不调用 `search_creators`;工具不可用或失败时,降级为最多 4 个带编号的文本选项,不使用 Markdown 表格。
|
|
53
|
+
|
|
54
|
+
### 画像发现与零条件搜索
|
|
55
|
+
|
|
56
|
+
- 用户询问支持哪些条件时,不调用搜索,按“品类与身份 / 商业表现 / 粉丝受众 / 内容与合作特征”四组给出用户可读摘要和一个完整示例;不展示内部字段或枚举。
|
|
57
|
+
- 用户只表达“帮我找达人”等搜索意图,且没有提供任何可执行条件时,不立即调用 `search_creators`。先用 `AskUserQuestion` 提供上述四个画像维度,设置 `multiSelect: true`;允许用户通过自定义输入直接描述完整画像或输入“直接搜索”。选择维度后只追问所选维度的具体值。
|
|
58
|
+
- 用户明确回复“直接搜索”时按默认 20 位执行零条件搜索。只要用户已提供至少一个可执行条件,就直接搜索;除真实歧义、非法范围或互斥条件外,不强制补全其他画像维度。
|
|
59
|
+
|
|
43
60
|
### 入参
|
|
44
61
|
|
|
45
62
|
| 参数 | 说明 |
|
|
46
63
|
|------|------|
|
|
47
64
|
| `keyword` | 用户名/昵称搜索(可选) |
|
|
48
65
|
| `category` | 品类筛选数组(可选)。支持两种格式:① **父类目模式(推荐优先使用)**:`[{parent_category_id: "父ID"}]`,不传 `child_category_id_list`,搜索该父类目下所有子类目;② **父+直接子类目模式(仅兜底)**:`[{parent_category_id: "父ID", child_category_id_list: ["直接子类ID1"]}]`,子类目只能比父类目深一级。多个对象 OR 关系,单个对象内 child_category_id_list AND 关系。类目 ID **必须先通过 `get_categories` 获取**,不要硬编码或猜测;**禁止使用深层叶子 ID**。 |
|
|
49
|
-
| `gmv_ranges` | GMV
|
|
66
|
+
| `gmv_ranges` / `units_sold_ranges` | GMV 与销量档位(可选) |
|
|
67
|
+
| `follower_demographics` | 粉丝数、年龄段、主要性别及最低占比(可选) |
|
|
68
|
+
| `content_performance` | 视频、带货视频、互动率和直播观看表现(可选) |
|
|
69
|
+
| `affiliate_data` | 佣金、样品后发帖表现、达人归属、快速增长与近 90 天未邀约(可选) |
|
|
70
|
+
| `category_locale` | 搜索结果主要类目名称的语言;中文对话传 `zh-CN`,英文对话传 `en-US`,未传时默认 `zh-CN` |
|
|
50
71
|
| `page_size` | 每页条数,默认/上限 20 |
|
|
51
|
-
| `page_token` |
|
|
72
|
+
| `page_token` / `search_key` | 首次不传;后续翻页同时复用上一页的 `next_page_token` 和首次响应的 `search_key` |
|
|
52
73
|
|
|
53
|
-
|
|
74
|
+
所有字段映射和校验规则只在筛选字段 Reference 中维护,本 Skill 不复制实现级枚举。
|
|
54
75
|
|
|
55
76
|
### 搜索会话与人数上限
|
|
56
77
|
|
|
57
78
|
- 用户的已明确条件构成达人画像;不新增等待用户二次确认的回合。类目解析、类目过滤闭环校验和必要的回退重搜完成后,才以最终实际生效的条件作为本轮搜索条件。
|
|
58
79
|
- 将同一组规范化搜索条件下的首次搜索和“继续翻页”视为同一搜索会话。用户修改任一搜索条件或明确要求重新搜索时,创建新的搜索会话并重置人数预算。
|
|
59
80
|
- 用户未指定数量时,默认展示 20 位达人。用户指定正整数时,目标展示数为该数量;超过 60 时按 60 执行,并在结果列表前明确说明“本次搜索最多展示 60 位达人”。数量小于 1 或无法识别时,要求用户给出 1–60 的数量。
|
|
60
|
-
- 每次工具调用的 `page_size` 保持 20。为满足目标数量可顺序使用内部 `page_token`
|
|
61
|
-
-
|
|
81
|
+
- 每次工具调用的 `page_size` 保持 20。为满足目标数量可顺序使用内部 `page_token` 拉取后续页,并在每个后续请求中同时传入首次响应的 `search_key`;展示到目标数量、无下一页或累计展示 60 位时必须停止。最后一页只展示仍在目标范围内的记录。
|
|
82
|
+
- 必须在当前对话中保留搜索条件、已展示数量、下一页令牌和 `search_key`。用户继续翻页时,最多再展示 `min(20, 60 - 已展示数量)` 位;内部令牌与搜索键永不对外展示。
|
|
62
83
|
|
|
63
84
|
### 输出与后续(固定格式)
|
|
64
85
|
|
|
65
|
-
禁止直接展示 MCP 原始 JSON
|
|
86
|
+
禁止直接展示 MCP 原始 JSON、内部字段、枚举、类目 ID、分页令牌、搜索键或目标展示人数。每次成功搜索都按以下顺序输出:
|
|
66
87
|
|
|
67
|
-
1. **结果摘要**:实际展示数、`total_count
|
|
68
|
-
2. **达人列表**:固定展示“排名 / 昵称 / 用户名 / 粉丝数 / 近 30 天 GMV 区间 /
|
|
88
|
+
1. **结果摘要**:实际展示数、`total_count`、当前排序、是否还有下一页,以及一行用户可读的“已应用画像”。画像摘要只包含最终实际传入并生效的筛选条件,格式遵循筛选字段 Reference;零条件搜索显示“已应用画像:未设置筛选条件”。
|
|
89
|
+
2. **达人列表**:固定展示“排名 / 昵称 / 用户名 / 粉丝数 / 近 30 天 GMV 区间 / 类目 / 达人 ID”。
|
|
69
90
|
3. **分页状态**:有更多结果且未达到 60 人时,使用“已显示 X / 共 Y;本轮最多展示 60 位达人,还可继续获取最多 Z 位”。没有下一页时使用“已显示全部结果”。达到 60 人且仍有更多结果时,固定说明“本次搜索已达到 60 位达人上限;请调整条件后重新搜索”,不再建议继续翻页。不要向用户展示 `page_token`。
|
|
70
91
|
4. **下一步**:建议分析选中达人、在剩余预算内继续翻页或调整条件;新增建议“选择 2 位及以上达人进行相对评分排名”。必须等待用户明确指定候选人后才调用 `creator_performance`,不要擅自开始批量分析或建联。
|
|
71
92
|
|
|
@@ -75,7 +96,9 @@ description: 在 TikTok Shop Creator Marketplace 中按关键词、类目、GMV
|
|
|
75
96
|
- 若 `username` 可用,达人主页链接统一拼接为 `https://www.tiktok.com/@{username}`。主表中“昵称”列应链接到该主页;“用户名”列继续显示纯文本 `@username`,不要改成第二个视觉重复的链接。
|
|
76
97
|
- 粉丝数使用千位分隔;GMV 区间转换为用户可读值(`0–100` / `100–1K` / `1K–10K` / `10K+`);缺失字段统一显示 `—`,不要猜测。
|
|
77
98
|
- `username` 缺失、为空或明显不合法时,昵称回退为纯文本,不要猜测用户名,也不要用 `nickname`、`creator_user_id`、`profile_tt_uri` 或其他字段拼接链接。
|
|
78
|
-
-
|
|
99
|
+
- “类目”列只读取 `category_details[].local_name`,不得展示 `category_details[].id` 或 `category_ids`。按上游 ID 顺序展示并去重:主列表最多显示 3 个名称,更多显示“+N”;HTML 展开详情展示全部名称。
|
|
100
|
+
- 没有 `category_ids` 时类目显示 `—`。存在 ID 但没有名称的条目合并为“未识别类目(N)”;类目解析整体失败时也按此规则降级,不影响达人列表展示。
|
|
101
|
+
- 类目过滤闭环校验继续使用原始 `category_ids` 与筛选 ID 比较;不得使用本地化名称判断是否命中,过滤疑似失效时不要展示为合格结果。
|
|
79
102
|
- 必须为每位达人保留搜索结果返回的 `creator_open_id`。调用 `creator_performance` 时将该值放入兼容入参 `creator_user_id`;调用 `create_conversation` 时将同一个值放入 `creator_open_id`。不得截断、改写或从其他字段推断。
|
|
80
103
|
- Markdown 的“达人 ID”列弱化展示 `creator_open_id`;HTML 将该 ID 放在可展开详情和复制区域,不占主表视觉焦点。
|
|
81
104
|
- `creator_open_id` 缺失时显示“达人 ID 不可用”,并明确该达人暂不可分析或建联。
|
|
@@ -84,14 +107,15 @@ description: 在 TikTok Shop Creator Marketplace 中按关键词、类目、GMV
|
|
|
84
107
|
|
|
85
108
|
### WorkBuddy HTML 可视化
|
|
86
109
|
|
|
110
|
+
- HTML 报告的共享品牌配色遵循 Agent 的“WorkBuddy HTML 共享配色”契约,本 Skill 不自行定义另一套主色或色阶。
|
|
87
111
|
- 结果为 1–5 条时使用 Markdown 表格。在 **WorkBuddy** 中达到 **6 条**时,必须通过当前宿主的 HTML 产物通道创建自包含的响应式 HTML 报告;用户明确要求 HTML 时不受条数限制。非 WorkBuddy 宿主使用 Markdown。
|
|
88
112
|
- 在 WorkBuddy 中,不得仅因宿主未显式声明 HTML/可视化能力而回退 Markdown。仅当 HTML 产物实际创建失败时,必须回退为包含全部记录的 Markdown,不能只给摘要或丢失达人,并如实说明未生成报告。
|
|
89
|
-
- HTML
|
|
113
|
+
- HTML 搜索报告包含用户可读的“已应用画像”,但不得包含内部字段、枚举、类目 ID、搜索键、分页令牌或目标展示人数;主表类目最多显示 3 个名称和“+N”,展开详情显示全部本地化名称及合并后的“未识别类目(N)”。其余包含返回数/总数/分页状态、可搜索和排序的达人表格、达人详情、达人 ID 复制区域和下一步建议;下一步建议包含“选择 2 位及以上达人进行相对评分排名”。不添加无法调用 Agent 或 MCP 的伪按钮,也不自动开始分析;达到 60 人上限时必须展示上限提示而非继续翻页入口。
|
|
90
114
|
- HTML 报告中的昵称链接使用 `<a>` 指向 `https://www.tiktok.com/@{username}`,并带 `target="_blank"` 与 `rel="noopener noreferrer"`;链接文本与 URL 都必须先安全转义/编码。
|
|
91
115
|
- 只使用内联 CSS/JavaScript,不依赖 CDN、远程字体或外部图片;只实现真实可用的搜索、排序、展开和复制交互,不添加无法触发 Agent 或 MCP 操作的伪按钮。
|
|
92
116
|
- 昵称、用户名及所有工具返回文本写入 HTML 前必须转义;禁止把工具内容作为 HTML 或脚本执行。
|
|
93
117
|
- Markdown 表格中的昵称也应输出为可点击链接;若宿主对链接渲染有限,至少保留标准 Markdown 链接语法和可辨认的主页 URL。
|
|
94
|
-
- 生成 HTML
|
|
118
|
+
- 生成 HTML 后仍需在对话中按“结果数量/排序/分页/已应用画像”的顺序给出简短摘要。只有实际生成产物时才可声明存在 HTML,不得虚构文件名或 `outputs` 路径。
|
|
95
119
|
|
|
96
120
|
### 类目过滤闭环校验(防静默失效)
|
|
97
121
|
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# 达人搜索筛选字段映射
|
|
2
|
+
|
|
3
|
+
本文件是 `search_creators` 筛选字段、自然语言映射、取值范围和互斥关系的唯一权威来源。Search Skill 负责何时询问、调用和展示,Agent 只保留用户可理解的能力摘要。
|
|
4
|
+
|
|
5
|
+
## 可用筛选
|
|
6
|
+
|
|
7
|
+
| 用户画像维度 | 工具字段 | 映射规则 |
|
|
8
|
+
|---|---|---|
|
|
9
|
+
| 用户名或昵称 | `keyword` | 原样传入用户给出的关键词 |
|
|
10
|
+
| 类目 | `category` | 必须先按 Search Skill 调用 `get_categories`,不得猜测 ID |
|
|
11
|
+
| GMV | `gmv_ranges` | `0–100` / `100–1K` / `1K–10K` / `10K+` 依次映射 `GMV_RANGE_0_100` / `GMV_RANGE_100_1000` / `GMV_RANGE_1000_10000` / `GMV_RANGE_10000_AND_ABOVE` |
|
|
12
|
+
| 销量 | `units_sold_ranges` | `0–10` / `10–100` / `100–1K` / `1K+` 依次映射 `UNITS_SOLD_RANGE_0_10` / `UNITS_SOLD_RANGE_10_100` / `UNITS_SOLD_RANGE_100_1000` / `UNITS_SOLD_RANGE_1000_AND_ABOVE` |
|
|
13
|
+
| 粉丝数 | `follower_demographics.count_range` | 最小值传 `count_ge`,最大值传 `count_le`;均为大于等于 0 的整数,且最小值不得大于最大值 |
|
|
14
|
+
| 粉丝年龄 | `follower_demographics.age_ranges` | `18–24` / `25–34` / `35–44` / `45–54` / `55+` 依次映射 `AGE_RANGE_18_24` / `AGE_RANGE_25_34` / `AGE_RANGE_35_44` / `AGE_RANGE_45_54` / `AGE_RANGE_55_AND_ABOVE` |
|
|
15
|
+
| 粉丝主要性别 | `follower_demographics.gender_distribution` | `男性` / `女性` 映射 `MALE` / `FEMALE`;最低占比传 `percentage_ge`,用户百分比乘 100,例如 `60%` 传 `6000` |
|
|
16
|
+
| 平均视频播放量 | `content_performance.avg_video_views` | 传 `0–100000` 的整数字符串 |
|
|
17
|
+
| 平均带货视频播放量 | `content_performance.avg_shoppable_video_views` | 传 `0–100000` 的整数字符串;不得与平均视频播放量同时使用 |
|
|
18
|
+
| 平均互动率 | `content_performance.avg_engagement_rate` | 传 `0–20` 的整数百分数字符串,例如 `5%` 传 `"5"` |
|
|
19
|
+
| 平均带货互动率 | `content_performance.avg_shopable_engagement_rate` | 传 `0–20` 的整数百分数字符串 |
|
|
20
|
+
| 平均直播观看人数 | `content_performance.avg_live_avg_viewers_ge` | 传 `0–100000` 的整数字符串 |
|
|
21
|
+
| 平均带货直播观看人数 | `content_performance.avg_shoppable_live_avg_viewers_ge` | 传 `0–100000` 的整数字符串;不得与平均直播观看人数同时使用 |
|
|
22
|
+
| 平均佣金率 | `affiliate_data.avg_commission_rate` | “低于 5% / 10% / 15% / 20%”依次映射 `LESS_THAN_5%` / `LESS_THAN_10%` / `LESS_THAN_15%` / `LESS_THAN_20%`;只能选一档 |
|
|
23
|
+
| 样品后发帖表现 | `affiliate_data.post_rate` | “合格 / 良好 / 最佳”映射 `OK` / `GOOD` / `BETTER`;各市场的实际基准由 TikTok 决定 |
|
|
24
|
+
| 达人归属 | `affiliate_data.creator_agency_staus` | “机构达人 / 独立达人”映射 `AGENCY_MANAGED` / `INDEPENDENT`;字段名沿用上游拼写 |
|
|
25
|
+
| 快速增长 | `affiliate_data.is_fast_growing` | 用户明确要求快速增长达人时传 `true` |
|
|
26
|
+
| 近 90 天未邀约 | `affiliate_data.not_invited_l90_days` | 用户明确要求排除近期已邀约达人时传 `true` |
|
|
27
|
+
|
|
28
|
+
连续的 GMV、销量或年龄档位可以组合。例如“GMV 1K+”映射后两档,“18–34 岁”映射前两档。不能由完整官方档位精确表达的边界不得静默放宽,应要求用户改选可用档位。
|
|
29
|
+
|
|
30
|
+
## 解析与冲突
|
|
31
|
+
|
|
32
|
+
- 用户说“视频/直播”时使用普通内容指标;明确说“带货、挂车、电商、shoppable”时使用对应带货指标。
|
|
33
|
+
- 普通视频播放量与带货视频播放量互斥;普通直播观看人数与带货直播观看人数互斥。用户同时明确要求一组互斥指标时,先要求二选一,不调用搜索。
|
|
34
|
+
- 百分比只接受明确的 `0–100%`;粉丝性别最低占比转换为 `0–10000` 的整数,互动率保持 `0–20` 的整数百分数。
|
|
35
|
+
- `language`、`creator_level`、`category_pro` 依赖各市场动态枚举,本阶段不传 `advanced_filters`,也不向用户承诺可筛选。
|
|
36
|
+
- “地区”不是粉丝受众筛选字段。搜索市场由当前授权店铺决定,不得将目标国家写入 `follower_demographics` 或 `advanced_filters`。
|
|
37
|
+
|
|
38
|
+
## 用户可读摘要
|
|
39
|
+
|
|
40
|
+
按用户表达顺序生成“已应用画像”,只展示实际传入且最终生效的条件。使用本地化名称和数值,例如:
|
|
41
|
+
|
|
42
|
+
> 已应用画像:美妆|GMV 1K+|粉丝 1万–10万|18–34 岁|女性粉丝 ≥60%|带货视频平均播放 ≥5,000|独立达人|快速增长
|
|
43
|
+
|
|
44
|
+
不得展示工具字段名、枚举、类目 ID、`search_key`、`page_token` 或未实际传入的默认值。
|