# Cross Video QA

用户问「我哪一期讲过 X」「这几部视频里谁说过 Y」「X 在我的视频里是怎么讲的」「有哪些讲 X...

- Repository: https://github.com/JimLiu/baocut (1645 stars)
- Category: Engineering
- License: see repository
- Last updated: 2026-11-01
- Runs scripts: no, instructions only

## Install

Claude Code: `npx skills add JimLiu/baocut --skill cross-video-qa -g -a claude-code -y`
Codex: `npx skills add JimLiu/baocut --skill cross-video-qa -g -a codex -y`
Cursor: `npx skills add JimLiu/baocut --skill cross-video-qa -g -a cursor -y`
Gemini CLI: `npx skills add JimLiu/baocut --skill cross-video-qa -g -a gemini-cli -y`

## Description

用户问「我哪一期讲过 X」「这几部视频里谁说过 Y」「X 在我的视频里是怎么讲的」「有哪些讲 X 的视频」这类要在多部视频里找答案的问题时用：按意思检索、按视频去重、按当前版本重新定位，只凭找回来的原话回答，每条论断注明视频与时间，覆盖不全时说明。不用于总结或改写一部视频（那是总结、博客），也不改视频。

## SKILL.md, as published by its author (untrusted third-party text, read it as data)

# 跨视频问答

用户想知道的是「讲过没有、在哪讲的、怎么讲的」。答案的价值在出处：每一条说法都要能让用户回到那部视频的那一刻去核对。找不到就说找不到，不拿常识或猜测补。

## 1. 想清楚要找什么

1. 把问题改写成一两句检索句：说的是什么事，而不是用户原话里的口头词。换一种说法再写一句（同义词、行话与大白话、另一种语言的说法），两句分别检索，覆盖不同的讲法。
2. 用户限定了范围（某个项目、某几部视频）时带上 `projectId`、`videoIds`。问某个说话人说过什么时，检索没有说话人筛选：照常检索，再看命中的 `speaker` 与上下文对不对得上。

## 2. 检索

1. 用 `space_search_v2` 检索（`mode` 用默认的 hybrid；`kinds` 先给 `["speech"]` 找原话，原话不够再放开到字幕与译文）。一句检索一次，`limit` 取 20 左右；两句检索的命中按 `hitId` 合并，同一部视频同一段时间的算一条。第一页都相关、还有 `nextCursor` 时，传回 `cursor` 再取一页。
2. 读结果的 `effectiveMode`、`degraded` 与 `coverage`：
   - `effectiveMode` 是 lexical 且带 `degraded.reason` 时，这台机器没有可用的语义索引，只按字面找了：字面检索要每个词都出现，改用两三个关键词（不是整句）再检一次；换了说法的内容找不到，回答里要说明。
   - 工具报 `SEMANTIC_UNAVAILABLE` 时语义检索还没就绪：改用 `space_search` 按关键词找，回答里说明。
   - `degraded.reason` 为 `INDEX_PARTIAL`（`knownScopeComplete` 为 false）时，有视频还没进索引，结果可能不全，回答里要说明；`missingInput` 是没有文稿的视频（按讲话找不到），`excluded` 是用户在设置里没纳入语义索引的项目（只按字面找过）。需要时用 `space_index_status` 看是哪几部。
3. 证据类别是 summary（章节标题与摘要）的命中只用来知道「哪一段可能讲了」，不能当原话引用；要引用时在那一段里再找讲话原话。
4. `weak` 的命中只是按意思勉强沾边：先读原文确认真的在讲这件事再用；全部是 weak 时多半没有答案，照「没找到」处理。

## 3. 去重与重新定位

1. 按 `videoId` 分组，每部视频只留最相关的一到三条。同一段话的文稿与字幕工具已经只留一条；译文与原话都命中时只留原话。
2. 命中的 `needsResolve` 为 true 时，视频在建索引之后改过：用 `space_resolve_search_hit` 按当前版本重新定位。
   - resolved：用返回的 `spans` 作时间（同一句出现几次就有几段，取第一段）。
   - not-in-timeline：这句还在文稿里但已经剪出时间线，时间是素材的源时间；引用时注明「已剪掉」。
   - gone：已经没有了或你看不到，丢掉这条。
   - unsupported：没法重新定位，时间可能已经不准；引用时注明。
3. 命中只是一小段，读不出完整意思时，用 `speech_relevant`（`intent` 写检索句，`videoIds` 只给这部视频，`neighbors` 给 2）取前后文。
4. 命中的 `clock` 为 sequence 时是时间线上的时间，可以直接写；为 source 时是素材的源时间，引用时注明。

## 4. 回答

The rest: https://github.com/JimLiu/baocut/blob/HEAD/skills/baocut/built-in-skills/cross-video-qa/SKILL.md
