关于 vss-search
vss-search 是用于自然语言检索已索引视频库的技能,指导用户准备可搜索的视频、查询排序片段,并整理文件名和时间信息。
主要功能
- 01自然语言视频检索
- 02上传和列出视频
- 03搜索前生成嵌入
- 04按标签和时间筛选
- 05持久化及监控查询
适用场景
- 01查找符合画面描述的片段
- 02按标签或日期范围缩小结果
- 03持续刷新已保存的查询
- 04显示片段文件名和跳转时间
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ open-edge-platform/ edge-ai-libraries --skill vss-search安装后在 Claude Code 中输入/vss-search确认已加载。
附带文件references/search-request.md
详细介绍
VSS 搜索
在已索引的视频库中进行自然语言搜索。请自行运行 curl 命令
并转述结果。端点使用 nginx /manager 前缀。
设置 HOST=http://${HOST_IP:-localhost}:${APP_HOST_PORT:-12345}。
前提条件
后端运行正常且已启用搜索——先探测;如果未启用,请使用
vss-doctor / vss-up:
curl -sf "$HOST/manager/health" >/dev/null && \
curl -s "$HOST/manager/app/features" | jq '.search // .'
1. 上传视频(如果尚未摄取)
POST /manager/videos — multipart/form-data,字段名为 video,可选的
逗号分隔 tags。文件必须是可流式传输的 MP4(否则服务器会拒绝)。
curl -s -X POST "$HOST/manager/videos" \
-F "video=@/path/to/clip.mp4" \
-F "tags=outdoor,daytime" | jq .
# → { "videoId": "<VIDEO_ID>" }
改为列出 / 检查现有视频。列表响应是一个对象
{ "videos": [...] },不是裸数组;name 是生成的哈希值,因此请使用
url / dataStore.fileName 获取真实文件名:
curl -s "$HOST/manager/videos" | jq '.videos[] | {videoId, file: .dataStore.fileName}'
curl -s "$HOST/manager/videos/<VIDEO_ID>" | jq '.video' # single record is wrapped under .video
2. 生成搜索嵌入
视频只有在嵌入生成后才能搜索。上传后触发生成 (也可用于重试失败的任务):
curl -s -X POST "$HOST/manager/videos/search-embeddings/<VIDEO_ID>" | jq .
等待任务完成(重新检查视频记录)后再查询。
3. 查询
单次查询 — POST /manager/search/query。响应是一个对象
{ "results": [ { "query_id", "results": [ … ] } ] } — 带有包装层,不是裸
数组 — 因此,排序后的片段位于 .results[].results[]:
curl -s -X POST "$HOST/manager/search/query" \
-H 'Content-Type: application/json' \
-d '{
"query": "person wearing a hat",
"tags": "indoor",
"timeFilter": { "value": 7, "unit": "days" }
}' | jq -r '.results[].results[]
| "score=\(.metadata.relevance_score) clip=\(.metadata.segment_start)-\(.metadata.segment_end)s seek=\(.metadata.seek_timestamp)s video_id=\(.metadata.video_id)"'
query(必需):自然语言。tags(可选):逗号分隔,与查询取交集。timeFilter(可选):可以是相对时间(value+unit=minutes|hours|days|weeks),也可以是绝对时间(start/endISO-8601)。参见references/search-request.md。
每个片段的 metadata 包含 relevance_score(0..1;最高命中可恰好为
1)、video_id、video_url、segment_start/segment_end、seek_timestamp、
tags 和 video_metadata(时长/fps)。在搜索模式下,page_content 是一个片段
定位信息(“从 Ns 到 Ms 的视频片段…”),而非字幕。
结果中不包含文件名——metadata 有 video_id,但没有 video /
file_name。要显示片段的文件名,请将 video_id 与视频列表中的
.videos[].dataStore.fileName 关联:
curl -s "$HOST/manager/videos" \
| jq '[.videos[] | {key:.videoId, value:.dataStore.fileName}] | from_entries' > /tmp/idmap.json
curl -s -X POST "$HOST/manager/search/query" -H 'Content-Type: application/json' \
-d '{ "query": "person wearing a hat" }' \
| jq --slurpfile m /tmp/idmap.json -r '.results[].results[]
| "score=\(.metadata.relevance_score) file=\($m[0][.metadata.video_id] // "?") clip=\(.metadata.segment_start)-\(.metadata.segment_end)s"'
展示排名靠前的命中时,附上文件名 + 片段时间范围 + 跳转时间。
4. 已保存 / 托管的查询(可选)
curl -s -X POST "$HOST/manager/search" -H 'Content-Type: application/json' \
-d '{"query":"forklift"}' | jq . # create a persistent query → queryId
curl -s "$HOST/manager/search/<QUERY_ID>" | jq . # fetch results
curl -s -X POST "$HOST/manager/search/<QUERY_ID>/refetch" | jq . # re-run
curl -s -X PATCH "$HOST/manager/search/<QUERY_ID>/watch" \
-H 'Content-Type: application/json' -d '{"watch":true}' # auto-refresh
curl -s "$HOST/manager/search/watched" | jq .
curl -s -X DELETE "$HOST/manager/search/<QUERY_ID>"