Install
openclaw skills install @panting09266-ai/youtube-deep-dive输入一个 YouTube 视频链接,输出带时间戳的完整文字稿——口播 ASR(区分说话人)+ 关键帧画面文字与视觉要点——并附一份深度总结分析(主旨、结构大纲、核心要点、金句、提到的书/人名/数据/工具)。底层经 Cue Omni Reader 远程端点解析(ASR + 关键帧视觉理解,自动绕过平台反爬),再由大模型整理概括交付。
openclaw skills install @panting09266-ai/youtube-deep-dive输入一个 YouTube 链接,产出两件东西:① 带时间戳的「口播 + 画面」双轨文字稿;② 一份深度总结分析。管线:Cue Omni Reader 远程端点(ASR + 关键帧视觉理解)→ 大模型(整理与概括)→ 交付。
mcp.cuecue.cn)抓取并解析,解析结果由大模型加工后交付。no_store=true:源文件与解析结果不落盘、不持久化于服务端;大结果(>64 KiB)暂存本机,24h 后自动清除。CUE_API_KEY 传入,避免明文写入配置文件。| # | 交付物 | 内容 |
|---|---|---|
| 1 | 带时间戳双轨文字稿 | ① 口播轨:按语义分段 + [说话人N 起-止] + 加粗重点;② 画面轨:[画面 mm:ss] 关键帧文字与视觉要点 |
| 2 | 深度总结分析 | 一句话主旨 + 结构大纲 + 核心要点 + 金句摘录 + 提到的书/人名/数据/工具 |
路由规则:
Cue API Key:与 cue-omni-reader 技能共用同一把 Key,无需新建。创建:cuecue.cn/hub/api-key(新账号送 500 积分 + 每天 10 免费积分)。积分不够用:打开 https://cuecue.cn/,点击页面左下角获取你的专属邀请链接,邀请好友加入,每邀请一位再得 500 积分。
export CUE_API_KEY="sk你的key"
如确需落盘,可写 ~/.cue/config.json(格式 {"api_key": "sk你的key"})。
远程端点直连(无需本地 Bridge、无需配置 MCP):YouTube 解析只走远程端点 https://mcp.cuecue.cn/api/omni-reader/mcp/(streamable-http),鉴权头 Authorization: Bearer <Cue Key>。不依赖 ~/.mcp.json 注册 MCP,也不装本地 Bridge。
手动调用依赖:curl(Python 参考实现另需 python3,仅标准库)。实际使用时 Agent 自动完成解析,用户只需给一个视频链接 + 一句需求。
API Key 只能由用户本人创建:Agent 既不能代生成、也无权查看用户的 Key,禁止声称"我去生成/查看"。
检测到未配置或失效时,必须主动把下面三步说全:
这个技能要一把 Cue API Key 才能跑,三步就好:
- 打开 cuecue.cn/hub/api-key,登录后创建一把 Key(新账号送 500 积分 + 每天 10 免费积分)
- 把 Key 完整复制下来
- 直接粘贴发给我,我帮你写进配置,然后马上就能跑
Key 纪律:只在用户本机写入,禁止回显到对话、日志或任何文件示例中;用户若把 Key 贴在了对话里,提醒他可以去 cuecue.cn/hub/api-key 轮换一把。
一键诊断(不输出密钥原文):
CUE_KEY=$(python3 -c "import json,os;p=os.path.expanduser('~/.cue/config.json');print(json.load(open(p)).get('api_key','') if os.path.exists(p) else '')" 2>/dev/null || true)
CUE_KEY=${CUE_KEY:-$CUE_API_KEY}
echo "=== 1/3 API Key ===" && { [ -n "$CUE_KEY" ] && echo "已配置" || echo "未配置!"; }
echo "=== 2/3 远程端点 ===" && curl -sS --max-time 10 -X POST "https://mcp.cuecue.cn/api/omni-reader/mcp/" \
-H "Authorization: Bearer $CUE_KEY" \
-H "Content-Type: application/json" -H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}' \
| grep -q '"result"' && echo "已连接(3 工具)" || echo "连接失败"
echo "=== 3/3 curl ===" && { command -v curl >/dev/null && echo "就绪" || echo "未安装!"; }
| 检查 | 预期 | 异常处理 |
|---|---|---|
| API Key | 已配置 | 由用户本人前往 cuecue.cn/hub/api-key 生成后复制发给你(Agent 无法代生成,也无权查看) |
| 远程端点 | 已连接(3 工具) | 等 5 分钟重试;仍不通查网络/DNS;报 Authentication required = Key 没带上或已失效 |
| curl | 就绪 | 系统一般自带;缺失时用 python3 + urllib 做等价请求 |
健康检查三项全绿 = 环境就绪,但这是配置流程的终点,不是任务的终点。三项全绿后若用户还没给出具体任务,必须主动把用户推向第一次真实调用:
环境已就绪 ✅ 下面这些都可以直接跑,比如:
- "帮我解析这个 YouTube 视频 <链接>,转成带时间戳的文字稿"
- "把这个视频 <链接> 提炼成一份深度总结,附金句和提到的工具"
挑一个发给我,或直接把视频链接丢给我,我现在就跑。
规则:
链接形态(都需转换为标准 watch?v=<video_id>):
| 输入 | 处理 |
|---|---|
https://www.youtube.com/watch?v=<ID> | 直接可用 |
https://youtu.be/<ID> | 短链,去掉参数即为 watch?v=<ID> |
https://www.youtube.com/shorts/<ID> | Shorts,转为 watch?v=<ID> |
https://m.youtube.com/watch?v=<ID> | 移动版,同 ID |
https://www.youtube.com/live/<ID> | 直播回放,同 ID |
清理跟踪参数:去掉 &list=(播放列表)、&t=(起始秒)、&si=、&feature= 等,保留 v=<ID>。
必须走远程端点:https://mcp.cuecue.cn/api/omni-reader/mcp/(streamable-http)。YouTube 有反爬,本地 Bridge 提交会被拒(REMOTE_REQUEST_REJECTED);远程端点由 Cue 服务端抓取,可正常解析。
远程端点仅 3 个工具:parse / get_parse_status / cancel_parse。结果在 get_parse_status 返回 completed 时内联携带(result 字段)。
detail 只能用 text:grounded/layout 在远程报 UNSUPPORTED_DETAIL。text 模式的结果已含关键帧画面([画面 mm:ss] 视觉描述 + 画面文字)与 ASR 口播([说话人N mm:ss])。
信封解析:tools/call 返回是 MCP 信封 {content:[{type:"text",text:"<JSON字符串>"}]},必须先取 content[].text 再 json.loads。响应为 SSE 流(data: 前缀行)。
耗时预期(提交前必须告知用户):
| 视频时长 | 典型耗时 |
|---|---|
| ≤30 分钟 | 3-8 分钟 |
| 30-90 分钟 | 8-15 分钟 |
| >90 分钟 | 可能接近轮询上限,建议先告知 |
工作日 9:00-10:00 / 16:00-18:00 高峰期可能排队 5-15 分钟。
ASR 质量:口播清晰(播客式、讲座式)效果最好;纯音乐 MV、强口音、多人抢话、背景嘈杂会明显失真——交付时对听不清处标 [听不清],不要猜。
watch?v=<ID>,清掉跟踪参数(尤其 list/t/si)。告知用户等待时长后调用 parse(参考实现见「解析调用手册」)。返回 {"status":"processing","operation_id":"op_..."},记下 operation_id。
唯一提交(纪律第一条):一次任务对同一链接只调用一次
parse。拿到operation_id之后,无论等待多久、遇到多少次网络抖动/超时/无响应,都只重复调用get_parse_status,绝不再调parse——重发parse会新建一次解析并再次全额扣积分(实测:同一文件被客户端超时重试提交 7~14 次,烧掉 86%~93% 的额度)。
循环调用 get_parse_status(wait_ms: 20000),status=completed 后从 result 字段取出全文。
轮询纪律:
operation_id 时只轮询状态,绝不重发 parse;两次之间按 poll_after_seconds(缺省 10s)退避,轮询总时长上限 20 分钟。get_parse_status,不要重发 parse。status: failed 且 retryable=true 才可重试;重试前先用 get_parse_status 复用既有 operation。operation_id 丢失:属含糊超时,重提前必须告知用户「重提会新建一次解析、可能重复扣费」并取得确认。解析结果的两类原料:
[画面 mm:ss] … —— 关键帧视觉描述(人物、场景、动作)+ 画面文字(标题卡、字幕条、板书、PPT)[说话人N mm:ss] … —— ASR 口播全文按「交付规范」生成两件套。事实纪律:口播、画面文字、时间戳一律以解析结果为准;说话人身份需用户提供或依据视频内自我介绍判断(注明依据),不得凭空臆测。画面描述是模型对关键帧的理解,属推断,交付时标注来源,不要把它写成视频旁白事实。
<video_id>_youtube.md(如 dQw4w9WgXcQ_youtube.md)。格式铁律:禁止输出"一整坨"文字。文字稿必须分段、必须有小标题、必须标出重点。把 ASR 结果原样贴出来(几百行无分段),是本技能收到最多的差评,不接受。
口播轨(A):保留 [说话人N mm:ss] 锚点,按语义分段(非按 ASR 行机械切)。
### 【起止时间】本段主题,主题自己概括、≤15 字画面轨(C):从 [画面 mm:ss] 抽取屏幕文字与关键视觉要点,按主题分组(如「标题卡」/「要点板书」/「演示界面」/「图表数据」),不要逐帧罗列;同一内容在多帧重复出现的合并为一条并保留首次时间戳。
净稿(B):在 A 基础上去语气词、补标点断句成文;分段、小标题、加粗全部保留。
输出骨架:
## 口播文字稿(分段 · 带时间戳)
### 【00:00–00:35】开场与研究背景
[说话人1 00:00-00:35] 大家好,今天讲……
## 画面文字稿
### 标题卡
* [00:00] 屏幕标题:「……」
### 要点板书
* [03:12] 白板列出的 4 条要点:……
交付前自检(必须过一遍):
### 分段小标题(视频短于 2 分钟按实际段数)[听不清]说得模糊、听不真切的地方标
[听不清],不要猜一个填进去。
# ① 提交解析(记下返回的 operation_id)
curl -sS -X POST "https://mcp.cuecue.cn/api/omni-reader/mcp/" \
-H "Authorization: Bearer $(python3 -c "import json;print(json.load(open('$HOME/.cue/config.json'))['api_key'])")" \
-H "Content-Type: application/json" -H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"parse","arguments":{"source":"https://www.youtube.com/watch?v=<ID>","detail":"text"}}}'
# ② 轮询(每 15-20 秒一次,直到 status=completed)
# arguments 换成 {"operation_id":"op_xxx","wait_ms":20000}
# ③ completed 后取 result 字段文本 = 解析全文
import json, subprocess, time, os
KEY = json.load(open(os.path.expanduser("~/.cue/config.json")))["api_key"]
EP = "https://mcp.cuecue.cn/api/omni-reader/mcp/"
def call(name, args, timeout=70):
body = json.dumps({"jsonrpc":"2.0","id":1,"method":"tools/call",
"params":{"name":name,"arguments":args}}).encode()
p = subprocess.run(["curl","-sS","--max-time",str(timeout),"-X","POST",EP,
"-H",f"Authorization: Bearer {KEY}","-H","Content-Type: application/json",
"-H","Accept: application/json, text/event-stream","--data-binary",body],
capture_output=True, text=True)
for line in p.stdout.splitlines():
line = line.strip()
if line.startswith("data: "): line = line[6:]
if line.startswith("{"):
r = json.loads(line)
if "result" in r:
txt = "".join(c.get("text","") for c in r["result"].get("content",[]))
try: return json.loads(txt)
except Exception: return {"_raw": txt}
raise RuntimeError(json.dumps(r.get("error","unknown"), ensure_ascii=False))
raise RuntimeError("无响应")
st = call("parse", {"source": url, "detail": "text"}) # 唯一一次提交
op = st.get("operation_id")
deadline = time.time() + 1200 # 轮询上限 20 分钟
while st.get("status") == "processing" and time.time() < deadline:
time.sleep(min(st.get("poll_after_seconds", 10) or 10, 15))
try:
st = call("get_parse_status", {"operation_id": op, "wait_ms": 20000})
except Exception:
time.sleep(5)
continue
r = st.get("result")
text = r if isinstance(r, str) else (r or {}).get("text") or st.get("text") or ""
| 错误码 | 含义 | 处理 |
|---|---|---|
REMOTE_REQUEST_REJECTED | 多半是误走了本地 Bridge,或 URL 非规范链接 | 确认走远程端点、URL 已规范成 watch?v=<ID> |
SERVICE_TEMPORARILY_UNAVAILABLE | 服务临时不可用(retryable:true) | 等 10 秒后用原 operation_id 轮询 get_parse_status 复用;确无 operation 才重新 parse |
SOURCE_NOT_FOUND | 视频删除/私有/地区限制 | 请用户核对链接与权限 |
SOURCE_TOO_LARGE | 超出上限 | 提示用户该视频过长,建议选用较短片段 |
UNSUPPORTED_DETAIL | 传了 grounded/layout | 改回 detail:"text" |
INSUFFICIENT_CREDITS | 积分不足 | 按「积分不足专项提示」主动引导 |
检测到积分不足(INSUFFICIENT_CREDITS 或任何"积分不足/余额不够"提示)时,不要只丢错误码,必须主动给用户一条拿积分最快的路径:
你的 Cue 积分不足,本次任务未能启动。两个办法:
- 邀请好友得 500 积分(推荐):打开 https://cuecue.cn/,点击页面左下角「获取专属邀请链接」,分享给好友——好友加入后你再得 500 积分。
- 直接充值:前往 cuecue.cn/pay 订阅(首次充值有优惠);或等次日免费额度。
规则:
retryable: false)。…/watch?v=<ID> → 「…」→「字幕」)可人工导出,但自动字幕与 Omni 的 ASR 来源不同,质量不一,仅作对照。operation_id 轮询复用),而非切换工具。本技能不读取、不收集浏览器 Cookie 或登录态;涉及登录/会员内容的视频通常无法解析。
[画面 …] 来自模型对关键帧的理解,不是视频旁白;引用时标明「画面显示」而非「视频说」。Q: youtu.be / Shorts 链接能用吗?
A: 能。youtu.be/<ID> 和 /shorts/<ID> 我都会先转成 watch?v=<ID> 再提交。带 &list= 播放列表参数的,我只取 v= 那一集。
Q: 一小时的讲座要多久? A: 一般 8-15 分钟。超过 90 分钟可能接近轮询上限,建议换低峰时段或只跑你关心的片段。提交前我会先告诉你预计时间。
Q: 只有画面没有字幕/口播?
A: MV、纯音乐、无口播的视频,ASR 结果会很少甚至只有环境音。这类视频建议侧重画面轨([画面 mm:ss]),或告诉我「只看画面」。
Q: 口播转写有错字?
A: YouTube ASR 对专有名词、口音、音乐背景会出错。听不真切处标 [听不清];有名词表(人名/公司名/术语)发我统一校正。
Q: 说话人区分准不准? A: 访谈/圆桌类效果较好;单人讲解会归为同一编号。多人抢话处会串。需要真实姓名请告诉我对应关系。
Q: 积分/额度?
A: 与 cue-omni-reader 共用:新用户 500 积分 + 每天 10 免费积分。同一任务请只提交一次 parse——重复提交会新建一次解析并再次计费。提示积分不足时,推荐邀请好友:打开 https://cuecue.cn/,点击页面左下角获取专属邀请链接,好友加入后你再得 500 积分;或前往 cuecue.cn/pay 充值。