byted-marketing-agent-competitive-watch
当用户想监控行业竞品重大事件、提取舆情事件/新品发布/发布会/代言/冠名/行业政策/大型营销活动,并获取本品应对建议时使用。手动触发:/competitive-watch
How do I install this agent skill?
npx skills add https://skills.volces.com --skill byted-marketing-agent-competitive-watchIs this agent skill safe to install?
No partner audit is available yet. Read the source before installing.
What does this agent skill do?
竞品重大事件监控
目标
本版本只保留最短主链路:
行业选择 → 拉视频 → 抽品牌 → 确认本品/竞品 → LLM 提取重点事件 → 按固定模板直接输出报告
明确移除以下能力:
- 移除联网搜索与外部核验
- 移除历史记忆读写
- 移除程序渲染报告(不再调用
render_report.py) - 移除行业规则缓存、搜索中间文件、历史去重等重逻辑
因此本 skill 的定位从“核验型情报报告”改为:
基于当期热视频数据的竞品事件线索提取与应对建议。
When to Use
/competitive-watch- 用户问“竞品最近有什么大动作”
- 用户问“最近有哪些新品/代言/发布会/营销活动”
- 用户想快速拿到“竞品事件线索 + 本品应对建议”
最高优先级规则
输出规则
- 执行过程中禁止向用户输出技术过程、命令、脚本路径、临时文件、接口细节。
- 只输出一次最终业务结果:
竞品重大事件报告- 或
暂无数据 / 需要补充信息
- 最终报告必须直接按本文末模板输出,不要调用程序渲染。
事实边界
- 本版本不联网,所以所有结论都基于视频数据本身。
- 视频中的说法默认视为:视频线索,不是外部已证实事实。
- 禁止写出“已官宣”“已发布”“已落地”“已实施”等确定性表述。
- 推荐使用以下措辞:
视频线索显示画面/标题显示疑似出现当前热视频中反复提及可作为重点跟踪线索
交互边界
- 不要在流程开始时直接从上下文替用户决定行业、本品、竞品。
TASK_DATE可以保留用户输入。COMPETITOR_BRANDS只能在本品确认后使用。- 缺失关键入参时才追问:
- 缺行业:先展示行业列表
- 缺本品:在品牌列表后追问
- 缺竞品:推荐 5 个默认竞品,等待用户确认
分析范围
只提取以下 7 类重点事件:
舆情事件新品发布发布会代言冠名行业政策大型营销活动
排除项:
- 普通带货口播
- 常规卖点介绍
- 单纯优惠促销
- 日常种草内容
- 无明确事件属性的内容
若同一品牌多条视频重复表达同一件事:
- 合并为一个事件
- 保留证据最强的 1-2 条代表视频信息
执行流程
Step 0:基础定位
SCRIPTS_DIR=$(dirname "$(find "${OPENCLAW_WORKSPACE_ROOT:-$PWD}" -maxdepth 6 -name "openapi_client.py" -path "*skills/byted-marketing-agent-competitive-watch/scripts/*" 2>/dev/null | head -1)")
SKILL_DIR=$(dirname "$SCRIPTS_DIR")
VENV_PY="$SKILL_DIR/venv/bin/python3"
只要求:
- 能定位
openapi_client.py - 能使用
$VENV_PY执行脚本
若环境未就绪,只输出一句:
当前环境未就绪,暂时无法生成竞品重大事件报告。
Step 1:先拉行业列表,让用户选行业
无论用户是否提过行业,都先获取最新行业列表。
"$VENV_PY" "$SCRIPTS_DIR/openapi_client.py" --format text list-industries
规则:
- 必须先展示行业列表,再让用户选行业。
- 不能跳过此步骤直接查数据。
- 若当前是非交互编排且缺行业,则终止并输出:
需要补充行业。
Step 2:规范化日期
TASK_DATE支持YYYYMMDD和YYYY-MM-DD- 若用户未传日期,则自动探查最新有数据日期
日期规范化:
TASK_DATE=$("$VENV_PY" -c 'import sys; from datetime import datetime; s=sys.argv[1].strip(); fmt="%Y%m%d" if len(s)==8 and s.isdigit() else "%Y-%m-%d"; print(datetime.strptime(s, fmt).strftime("%Y-%m-%d"))' "$TASK_DATE")
自动探查最新日期:
DETECTED_DATE=$("$VENV_PY" "$SCRIPTS_DIR/openapi_client.py" --format text find-latest-date --category "$CATEGORY")
规则:
- 用户指定了日期:优先用用户日期
- 用户没指定日期:用
DETECTED_DATE - 若探查失败:输出
当前时间段内未找到相关视频,建议更换行业或补充日期
Step 3:拉取候选视频
只拉 1 页,每页 500 条,作为事件候选池。
RESULT=$("$VENV_PY" "$SCRIPTS_DIR/openapi_client.py" \
--format json query \
--category "$CATEGORY" \
--query-type hot_video \
${TASK_DATE:+--task-date "$TASK_DATE"} \
--order-by "vv_all DESC" \
--page 1 \
--page-size 500)
将数据落到 rows.json:
CW_SESSION="${CW_SESSION:-cw_$(date +%Y%m%d_%H%M%S)_$$}"
CW_TMP_DIR="${TMPDIR:-/tmp}/${CW_SESSION}"
mkdir -p "$CW_TMP_DIR"
ALL_ROWS_PATH="$CW_TMP_DIR/rows.json"
EVENTS_PATH="$CW_TMP_DIR/events.json"
printf '%s' "$RESULT" | "$VENV_PY" -c 'import json,sys; d=json.load(sys.stdin); json.dump(d.get("data", {}).get("data", []), sys.stdout, ensure_ascii=False)' > "$ALL_ROWS_PATH"
若为空:
当前时间段内未找到相关视频,建议扩展日期范围或检查行业设置。
Step 4:抽取品牌列表,让用户确认本品
UNIQUE_BRANDS_PATH="$CW_TMP_DIR/unique_brands.json"
"$VENV_PY" "$SCRIPTS_DIR/normalize_brands.py" \
--phase extract \
--input "$ALL_ROWS_PATH" \
--output "$UNIQUE_BRANDS_PATH"
读取后,按频次展示品牌列表(最多 30 个)。
规则:
- 必须让用户基于当前品牌列表确认本品。
- 若当前任务为非交互编排且缺本品,终止并输出:
需要补充本品。 - 若用户输入的本品不在列表中,也允许继续,但最终要注明:
本期数据中未检测到本品出现。
Step 5:推荐竞品并等待确认
若用户未给 COMPETITOR_BRANDS:
- 从当前品牌列表中,排除本品
- 推荐 5 个最相近、最活跃的品牌作为默认竞品
- 必须等待用户确认后再继续
若非交互编排:
- 可自动采用推荐竞品继续执行
冻结名单:
- 后续统一使用
FINAL_COMPETITOR_BRANDS - 后面不得再新增、删除、替换竞品
Step 6:LLM 直接阅读提取重点事件(强制无工具模式)
这一阶段的目标不是“再调用工具做抽取”,而是:
把 Step 3 已得到的候选视频数据作为上下文直接交给 LLM,由模型在当前上下文中直接阅读、比对、归纳、去重并输出事件 JSON。
强制规则
- 禁止在 Step 6 调用任何额外工具、脚本、程序或搜索能力。
- 禁止为了抽取事件再次调用 Python / shell / jq / grep / awk / render_report / 搜索脚本 / 记忆模块。
- 禁止把“事件提取”外包给别的子代理、插件或函数。
- 只允许使用当前会话里已经拿到的候选视频数据文本作为唯一输入。
- 必须由当前 LLM 直接完成阅读、筛选、归类、合并和输出。
- 若模型能力较弱,也不能退化为“调用工具帮忙提取”;宁可少提,也不要转为工具抽取。
执行方式
Step 3 得到 rows.json 后,只做一件事:
- 将候选视频中的关键字段整理为可读文本上下文后直接提供给 LLM
- 由 LLM 在单轮中完成重点事件提取
这里的“整理为可读文本上下文”仅指:
- 把已存在的数据字段按顺序放入提示上下文
- 不是再写一个抽取器去替模型做事件判断
本阶段允许使用的数据
仅允许使用候选视频中已有字段,例如:
- 品牌名/归一化品牌名
- 视频标题
- 口播/字幕/文案摘要(若原始数据中有)
- 画面描述字段(若原始数据中有)
- 发布时间
- 播放、点赞、评论、转发、收藏、5秒完看率等热度字段
- 视频链接
提取目标
- 只提取 7 类重点事件
- 优先提取竞品事件,其次提取行业政策
- 本品相关情况单独汇总,不混入竞品详情主表
提取规则
- 只从视频内容里抽事件线索,不做外部核验。
- 常规种草、普通促销、日常卖点介绍全部排除。
- 同一事件合并,避免重复堆砌。
- 事件摘要必须短、清楚、可读。
- 非行业政策事件的
品牌名必须严格属于FINAL_COMPETITOR_BRANDS。 - 若无法稳定归属到已选竞品,则丢弃该事件。
- 不允许编造链接;链接只能来自原始视频数据本身。
- 所有具体数值都只能来自原始数据;缺失则写
-。 - 不要输出“分析过程”“推理过程”“中间草稿”,只输出最终 JSON 结果。
- 若证据不足,宁可不收录,也不要靠常识补全事件。
给 LLM 的硬约束提示词
在执行 Step 6 时,必须显式加入下面这段约束:
你现在处于“强制无工具抽取模式”。
禁止调用任何工具、脚本、搜索、记忆、函数或外部能力。
禁止把事件提取交给 Python、Shell、正则脚本、子代理或任何程序。
你只能基于当前提供的候选视频文本上下文,直接阅读、比较、归纳并提取重点事件。
你必须自己完成:筛选、分类、去重、合并、生成 JSON。
若证据不足,请丢弃,不要脑补。
不要输出分析过程,不要解释,只输出最终 JSON。
LLM 输出格式固定为 JSON
强制规则:LLM 生成的 JSON 必须完整写入文件 $EVENTS_PATH,禁止输出到 stdout、传输流或对话上下文。
{
"events": [
{
"品牌名": "品牌A",
"事件类型": "新品发布",
"事件摘要": "推出血橙西柚味新品",
"证据": "标题提到上新,画面出现新品包装",
"代表视频标题": "品牌A血橙西柚味上新",
"代表视频链接": "https://...",
"视频发布时间": "2026-03-20",
"视频发布距查询日天数": 3,
"视频时效": "近期",
"热度信号": "高",
"线索等级": "强",
"影响判断": "可作为春季上新动作重点跟踪"
}
]
}
字段要求
品牌名:行业政策类可写{CATEGORY};其他必须来自FINAL_COMPETITOR_BRANDS事件类型:必须是 7 类之一事件摘要:8-30 字证据:来自标题/口播/字幕/画面的依据代表视频链接:只能填原始数据中真实存在的链接;没有就留空视频时效:仅允许近期/较早/未知线索等级:仅允许强/中/弱影响判断:一句业务化解释
若 events 为空,也必须继续输出最终报告,只是写:
未识别到明确重点事件
Step 7:直接按固定模板输出最终报告
不要调用 render_report.py。
输入来源:从文件读取事件 JSON
# 读取 Step 6 输出的事件 JSON 文件
if [ -f "$EVENTS_PATH" ]; then
EVENTS_JSON=$(cat "$EVENTS_PATH")
else
echo "未找到事件数据文件,无法生成报告"
exit 1
fi
最终报告由 LLM 基于 $EVENTS_PATH 中的 JSON 数据,按下面模板输出。章节、顺序、表头都不要改。
固定输出模板
## 竞品重大事件报告|{行业}|{查询日期}
### 重点事件总览
| 事件类型 | 品牌/主体 | 视频发布时间 | 视频时效 | 线索等级 | 事件摘要 | 证据来源 | 热度信号 | 影响判断 |
|----------|-----------|--------------|----------|----------|----------|----------|----------|----------|
| 新品发布 | 品牌A | 2026-03-20 | 近期(3天) | 强 | 推出血橙西柚味新品 | 视频标题/画面显示上新 | 高 | 可作为春季上新动作重点跟踪 |
| 代言 | 品牌B | 2026-03-10 | 较早(13天) | 中 | 视频线索显示官宣代言合作 | 标题提及代言,画面出现代言人物料 | 中 | 有助于拉升品牌声量 |
| - | 品牌C | - | - | - | 未识别到明确重点事件 | - | - | - |
### 各竞品事件详情
#### {品牌名}
- **重点事件**:
- `{事件类型}`|视频发布时间 `{视频发布时间}`|线索等级 `{线索等级}`:{事件摘要}
- `{事件类型}`|视频发布时间 `{视频发布时间}`|线索等级 `{线索等级}`:{事件摘要}
- **代表证据**:{代表视频标题}|播放 {真实播放量或-}|点赞 {真实点赞量或-}|评论 {真实评论量或-}|转发 {真实转发量或-}|收藏 {真实收藏量或-}|5秒完看率 {真实5秒完看率或-}
- **线索说明**:基于当前热视频中的标题、口播、字幕、画面提炼,未做外部联网核验
- **潜在影响**:{对品牌声量、渠道、用户心智、营销节奏的潜在影响}
- **备注**:若没有重点事件,明确写“未识别到明确重点事件”
---
### 行业政策与赛道级变化
- {若有则写行业政策/赛道共性动作}
- 若没有,写:本次未识别到明确行业政策或赛道级重大变化
### 本品({本品名})相关情况
- 出现在 {N} 条视频中,识别到的重点事件:{如有则写}
- 若只有普通曝光但无重点事件,写:有曝光,但未识别到明确重点事件
- 若本期未出现,写:本期数据中未检测到本品出现
### 应对策略建议
1. **舆情响应**:针对争议或负面线索,建议持续跟踪评论区反馈与二次传播。
2. **新品与发布节奏**:若竞品集中上新,本品可评估是否需要加快新品沟通或强化卖点差异化。
3. **代言/冠名/活动跟进**:若竞品近期动作频繁,本品可评估是否需要补充品牌合作或事件营销。
4. **赛道观察**:对当前高频出现的事件主题做持续周度跟踪,避免单日样本误判。
输出约束
### 重点事件总览与### 各竞品事件详情中的竞品集合必须严格等于FINAL_COMPETITOR_BRANDS- 即使某个竞品没有事件,也必须保留占位
- 不允许把母公司、合作方、平台方替换成新的竞品主体
- 没有真实链接时,写“无”,不要补造链接
- 没有真实数值时,写
- - 所有结论都要维持“视频线索”口径,避免确定性表述
- 不要输出 JSON、脚本、命令、调试信息
精简版错误处理
- 无行业:
需要补充行业 - 无本品:
需要补充本品 - 无数据:
当前时间段内未找到相关视频,建议扩展日期范围或检查行业设置 - 品牌为空:
当前数据中未检测到品牌信息,无法生成竞品重大事件报告 - 未识别到重点事件:照常输出报告,但写明
未识别到明确重点事件 - 环境未就绪:
当前环境未就绪,暂时无法生成竞品重大事件报告
触发示例
/competitive-watch
/competitive-watch 日期=20260315
/competitive-watch 行业=饮料 日期=20260315
/competitive-watch 本品=元气森林
How can the creator link this skill?
Add the canonical catalog link to the repository README so users can inspect current installs and available audits. The publishing guide covers the complete discovery path.
<a href="https://skillzs.dev/skills/skills.volces.com/byted-marketing-agent-competitive-watch">View byted-marketing-agent-competitive-watch on skillZs</a>