| 名称 | vss-ask-video |
| 描述 | 使用此技能向VSS代理的video_understanding工具询问关于已录制片段的全新视觉问题。不适用于先前工具输出、搜索命中或可通过元数据回答的问题。 |
| 开源协议 | Apache-2.0 metadata: |
| 版本 | “3.2.0” github-url: “https://github.com/NVIDIA-AI-Blueprints/video-search-and-summarization” tags: “nvidia blueprint operational” |
通过VSS代理使用VLM进行视频问答
当您需要视频中需要VLM查看视频帧的细节时,请使用此技能——例如代理没有可用的先前答案,需要针对某个特定片段重新查看像素。
使用时机
- 用户询问视频中发生了什么,出现哪些物体/人物/动作、颜色、时间、安全性或其他需要观看片段的视觉事实。
- 用户询问的细节无法仅从现有消息、摘要、Elasticsearch/MCP结果或文件名中回答——您需要对视频进行模型推理。
- 在粗略摘要或报告生成之后,跟进询问内容细节。
当数据库/MCP/先前工具输出已经回答了该问题时,请不要使用此技能,除非用户明确希望对照视频进行验证。
部署前提
此技能需要一个提供 video_understanding 工具的VSS配置——通常是 base(推荐)或 lvs。在任何请求之前:
-
探测VSS代理:
curl -sf --max-time 5 "http://${HOST_IP}:8000/docs" >/dev/null -
如果探测失败,询问用户:
“没有VSS配置运行在
$HOST_IP上。是否要使用/vss-deploy-profile技能部署base(推荐用于每个片段的VLM问答)?如果您更喜欢lvs,请说明。”- 如果是 → 转交
/vss-deploy-profile -p base(如果用户偏好lvs则使用-p lvs)。成功后返回此处。 - 如果否 → 停止。
- 如果是 → 转交
-
如果探测通过,继续。
传感器前提
在任何 /generate 调用之前,您必须列出VST传感器。 即使当用户明确指定了传感器名称,即使当用户断言视频已经上传,即使之前的轮次似乎使用了相同的视频,这也是必需的。不要跳过此步骤。
-
列出传感器:
curl -sf --max-time 5 "http://${HOST_IP}:30888/vst/api/v1/sensor/list" | jq '.[].name' -
将返回的
name值与用户提供的<sensor-id>(或文件名主干,例如warehouse_safety_0001)进行比较。 -
如果存在匹配的传感器 → 进入下面的代理工作流程。
-
如果不存在匹配的传感器 —— 首先上传视频,然后重新列出以确认新传感器出现:
# 文件名:不能包含空白字符 # 时间戳:ISO 8601 UTC — 如果用户未指定,默认为2025-01-01T00:00:00.000Z curl -s -X PUT "http://${HOST_IP}:30888/vst/api/v1/storage/file/<filename>?timestamp=<timestamp>" \ -H "Content-Type: application/octet-stream" \ -H "Content-Length: <file_size_in_bytes>" \ --upload-file /path/to/<filename> | jq .查看
/vss-manage-video-io-storage获取完整的上传语义(v1 vs v2、冲突处理、删除流程)。在交互式运行中,上传前与用户确认。在未先执行上述传感器列表检查之前,绝不要发出无条件的PUT——这正是此前提要防止的失败模式。
代理工作流程
上述传感器前提必须已经确认(或创建)传感器存在于VST上。然后:
- 片段 — 确定一个视频片段的传感器ID、文件名或URL。如果不明确,询问用户。
- 调用带有传感器ID的vss代理,并要求其调用video_understanding工具来回答用户的问题。
- 将vss代理的答案返回给用户。
查询VSS代理 (/generate)
# 从部署中设置(compose / .env / vss-agent监听的主机)
export VSS_AGENT_BASE_URL="http://localhost:8000"
curl -s -X POST "${VSS_AGENT_BASE_URL}/generate" \
-H "Content-Type: application/json" \
-d '{"input_message": "Call video_understanding tool to answer the following question about <sensor-id>: <user query>"}' | jq .
响应契约和提取
/generate 返回一个JSON对象,其中助手输出在 value 中,例如:
{"value":"<agent-think><agent-think-step ...>...</agent-think-step></agent-think>
<final answer>
"}
没有单独的干净答案字段。可消费的答案是 .value 中删除任何 <agent-think>...</agent-think> 块之后的文本。
此技能(以及任何下游调用者)必须处理的内容:
- 从JSON响应中读取
.value。 - 无论出现在哪里,都去除
<agent-think>...</agent-think>部分。 - 仅向用户返回剩余的最终答案文本。
示例提取:
curl -s -X POST "${VSS_AGENT_BASE_URL}/generate" \
-H "Content-Type: application/json" \
-d '{"input_message":"Call video_understanding tool to answer the following question about <sensor-id>: <user query>"}' \
| jq -r '.value' \
| python3 -c 'import re,sys; t=sys.stdin.read(); t=re.sub(r"<agent-think>.*?</agent-think>\s*", "", t, flags=re.S); print(t.strip())'
交叉参考
- vss-manage-video-io-storage — VST存储/重放URL,使**
VIDEO_URL**对VLM有效。 - vss-generate-video-report — 通过模式A(直接VLM)或模式B(视频分析事件)生成带时间戳的报告;此技能是用于临时视频问答的VSS代理
/generate。