Communitygithub.com

DeepAleph/jevreel

搜索和理解视频内容,无需嵌入向量。当用户询问视频文件或视频URL的内容时使用——查找特定时刻(“X事件发生在什么时候”)、根据照片查找人物或物体、读取屏幕上的文字、获取对话内容、跨视频追踪同一事物,或回答关于整个视频的单一问题。通过 jevreel MCP 工具或 `jevreel` CLI 工作。

jevreel 是什么?

jevreel 是一种无需嵌入向量的视频理解技能,专为 AI 代理(如 Claude Code、Cursor 等)设计,用于高效地搜索和分析视频内容。它将视频按每秒一帧的速度铺展在联系表上,并利用 TypeSafe 的快速决策模型 Jev 并行扫描每一张联系表,然后在全帧上重新检查最佳窗口。主要代理随后查看 Jev 找到的结果。Jev 提供类型化答案和概率,而不是描述:阅读、描述和得出结论是代理自己的任务。支持通过 MCP 工具或 `jevreel` CLI 进行索引、询问时刻、从照片中查找物体、获取字幕、进行全视频问答以及运行镜头(lenses)来一次性回答多个问题。它需要 `TYPESAFE_API_KEY`、`ffmpeg` 和 `ffprobe` 才能发挥全部功能,但缩放、字幕和时间线查询无需 API 密钥。结果包括概率、时间戳和缓存状态,帮助代理在回答用户前验证发现。

兼容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/DeepAleph/jevreel/tree/HEAD/skills/jevreel

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

jevreel:询问关于视频的问题

jevreel 将视频按每秒一帧的速度铺展在联系表上,并利用 TypeSafe 的快速决策模型 Jev 并行扫描每一张联系表,然后在全帧上重新检查最佳窗口。你(主要代理)随后查看它找到的内容。Jev 提供类型化答案和概率,而不是描述:阅读、描述和得出结论是你的工作。

设置检查

  • 任何需要询问 Jev 的操作(使用时间线进行索引、询问、查找、定位、全视频、镜头)都必须设置 TYPESAFE_API_KEY。缩放、字幕和时间线查询无需 API 密钥即可工作。
  • ffmpeg 和 ffprobe 必须在 PATH 中。
  • URL 需要 jevreel[url];没有字幕的视频需要 jevreel[asr] 来获取转录文本。

工作流程

  1. 一次索引。 MCP index_video(source) 或 jevreel index <file-or-url>。后续调用使用返回的 id、路径或标题(例如“tears of steel”)。重新索引已索引的视频会立即返回。
  2. 查找时刻。 ask_video(video, query) / jevreel ask <id> "<query>"。
    • 将查询写为对可见或所说内容的简单描述: “幻灯片上的条形图”、“某人打开笔记本电脑”、“演讲者提到定价”。
    • 每个查询只包含一件事。将“一辆红色汽车和一只狗”拆分为两个询问;Jev 在简单问题上最准确。
    • mode:visual(仅屏幕)、speech(仅字幕,最便宜)、both 或 auto。
    • 当用户提到视频的某个部分时,使用 start/end 缩小范围。
  3. 从照片中查找。 find_in_video(video, image_path, note="person") / jevreel find <id> photo.jpg --note person。
  4. 在回答前先查看。 命中的只是线索,不是事实。已验证的命中会附带 frame,即该时刻的全分辨率图像:查看它。zoom_video(video, start, end) / jevreel zoom <id> 12:00 12:10 提供更多帧。locate_in_frame(video, at, target) 在一帧中框选并裁剪一个物体,以便仔细阅读。
  5. 获取所说内容。 video_transcript(video, start, end) / jevreel transcript <id> --start 12:00 --end 13:00。
  6. 全视频问题。 ask_whole_video(video, question, kind, options) / jevreel whole <id> "这是一个教程吗?"。使用 kind=choice 并附带选项,或 kind=score 并附带等级(最低优先,最多 10 个)。

镜头:当相同的问题在整个视频中都很重要时

当用户关心整个视频中的多个事物(谁在屏幕上、安全规则、品牌、天气、幻灯片是否出现)时,不要分别询问每个问题。运行一个镜头:每分钟在一个请求中回答所有问题。然后根据需要随时过滤答案,无需额外费用。

  • MCP run_lens(video, lens) 使用 {"name": "site", "questions": [{"name": "helmet_off", "type": "noul", "ask": "能看到没有戴头盔的工人吗?"}, {"name": "vehicle", "type": "choice", "ask": "哪种车辆最显眼?", "options": ["car", "truck", "none"]}, {"name": "crowd", "type": "score", "ask": "拥挤程度如何?", "levels": ["Empty", "Some", "Busy"]}]}。 CLI:jevreel lens <id> lens.toml。要在索引时包含一个镜头,将其传递给 index_video (或 jevreel index --lens);这样几乎不会增加额外成本。
  • query_timeline(video, "helmet_off > 0.7") / jevreel query <id> "helmet_off > 0.7 and vehicle == truck"。 条件是 column op value 并用 and 连接;如果值包含“and”,请用引号括起来 (place == 'books and a desk')。省略 where 可查看每分钟及其列。 是/否问题也会提供 <name>_at,即该事物最显眼的秒数。
  • 默认的时间线列也存在:people、talking_to_camera、screen_or_slides、 text_on_screen、cut、setting、activity(0-3)、keyframe。

阅读结果

  • probability 是 Jev 的是的概率;strong 表示至少 0.7。对于 verified 命中,它来自全帧,at / time 是最能显示该事物的帧,screened 是之前的联系表概率。未验证的命中仅来自联系表。
  • shown 和 said 分别是屏幕和字幕问题,分开询问。
  • also 列出同一窗口中的其他可能时刻。
  • 概率排序良好,但不能保证校准。在声明任何你未亲眼所见的事物之前先查看,并且当你只有弱命中时也要说明。
  • 没有超过阈值的命中是一个真正的答案,但先检查 weak:Jev 未排除的窗口,包括那些被验证推翻的。在说“未找到”之前,先放大这些窗口。
  • 通过时间引用时刻(例如“在 12:04”),以便用户可以跳转到那里。

成本

Jev 仅对输入令牌收费,重复的相同请求会从 jevreel 的缓存中免费回答(结果中的 cached)。每次询问都会发送范围内的每个联系表一次(每分钟视频一张),再加上每个已验证窗口一个请求,因此使用 start/end 缩小范围会使询问更便宜、更快。结果会报告 requests、cached、input_tokens 和 estimated_usd。

相关技能