卓琪的开发笔记zhuoqidev.comRSSllms.txt

作品 · Argus

Argus 是怎么看完一段长视频的

往下滚,一步步看它找答案;拖动场景可以转着看。

跳过,直接看项目介绍 ↓
黏土风格的小场景:浏览器窗口里铺着一卷胶片(示例视频),长满眼睛的 Argus 站在旁边,抽出来的帧立在胶片上方;红色出现和消失的两头各有三层越来越密的小帧;一个淡紫色的子代理在看后半段;Argus 身边的托盘里放着最近三批帧和一张字条,旁边一张便签;一张写着 10.0s – 25.0s 的回答卡用红线钉回胶片上的两帧;一根线从 Argus 连到窗口外代表你自己配置的模型的云,线上有小图和一张指令卡。
  1. 一段视频,一个问题

    拿 Argus 自带的 3 分钟示例视频来说:拖进来,问一句「红色的东西什么时候出现?」它先读视频信息:179.6 秒,每秒 10 帧。

    get_video_info()

  2. 先粗扫,交给模型看

    Argus 是一个长满眼睛的 agent。它每 10 秒抽一帧,缩成小图,沿这根线发给你配置的模型;模型看完回一条指令,告诉它下一步抽哪段、抽多密。这一轮在 10 秒和 20 秒的图里看到了红色。

    extract_frames(0–180 秒, 每 10 秒) → 18 张

  3. 在两头一层层抽密

    红色在 0–10 秒之间出现、20–30 秒之间消失。它在这两段每 1 秒抽一帧,再缩到每 0.5 秒、每 0.1 秒,把出现和消失各卡到一帧上。

    extract_frames(0–12 秒、18–32 秒, 每 1 秒) → 每 0.5 秒 → 每 0.1 秒

  4. 派帮手,管好上下文

    30 秒以后还有没有红色?它派一个子代理去看 30–180 秒。子代理自己抽了 64 张图,只交回一段文字结论(没有红色),那些图不进主 agent 的上下文。主 agent 也只留最近 3 批图:第 4 批进来时,最早那批粗扫图换成了一行字,要用时可以再抽回来。

    spawn_subagent(30–180 秒) → 「没有红色」

  5. 记下来,回答带证据

    它先把结论记成一条笔记,之后再问相关的问题不用重看;然后回答:10.0 秒出现,25.0 秒消失。两个时间都钉回抽过的帧(10.0 秒是第一帧有红色,24.9 秒是最后一帧),在 Argus 里点时间戳,播放器就跳到那一刻。

    remember(0–180 秒, 「红色物体」)

  6. 全在你的浏览器里

    视频文件不离开你的浏览器,也没有后端。这一次经这根线发出去的,是 129 张缩小过的帧(宽 300–640 像素:主 agent 65 张,子代理 64 张)和文字,收件方是你自己配置的模型(OpenAI、Anthropic、Gemini 或兼容接口);API Key 只存在本机。

    这几步背后的 Agent 循环和 8 个工具 ↓

场景按 2026-10-08 用 DeepSeek 真跑的一次摆放(完整调用记录),每次跑,过程会有出入。模型是 agent 写 three.js 代码搭的,封面图也是在浏览器里光线追踪出来的。 建模代码

~/projects/argus.md

Argus — 纯前端长视频理解 Agent Harness

Argus(取名自希腊百眼巨人 Argus Panoptes)是我独立设计开发并开源的长视频理解 agent harness——只有前端、没有后端,视频完全在浏览器本地解码处理,API Key 与模型全部用户自填。让多模态 LLM agent 自己调用工具去”看”视频:抽帧、局部放大、记笔记、派子代理,典型场景如监控视频数人数、找特定物品。

🔗 在线体验 Argus 🐙 GitHub 源码

它解决什么

让 LLM 理解长视频的痛点不在模型,而在怎么把视频喂给它:整段上传太贵,盲抽帧又漏信息。Argus 把这个问题交给 agent 自己决策——它先看视频元信息,再自主决定抽哪些帧、用什么频率、哪里需要放大细看,上下文要爆了就派子代理分段处理。同时视频文件不离开你的浏览器,也没有后端:发给模型的只有 agent 挑出来的缩小帧和文字。

架构亮点

  • Agent 循环 — 由 Vercel AI SDK streamText 驱动多步工具调用(stopWhen 限制步数),产品的核心两处自己写:prepareStep 把新抽的帧作为一条用户消息注入下一步,任何视觉模型都看得到(工具结果里带图,在各家 OpenAI 兼容网关之间不通用);旧图自动裁掉(只留最近 3 批,更早的换成一行字,要用时再抽回来),长任务的上下文不会失控。
  • 8 个视频理解工具 — get_video_info / extract_frames(范围+频率抽帧带时间戳)/ extract_frame_at / list_frames / inspect_region(局部放大细看)/ remember / recall(状态记忆,防长上下文遗忘)/ spawn_subagent(超长视频分段,防上下文爆炸)。
  • 浏览器本地硬解码抽帧 — 主路径用 mediabunny(基于 WebCodecs 解封装 + 解码,不用拖 <video> 的进度条);解不了时退回 <video> + <canvas>(含黑帧重试);AVI / WMV / FLV 这类容器第一次遇到时才从 CDN 懒加载 ffmpeg.wasm 在本地转码;mediainfo.js 只在退回路径上补 fps / 编码 / 码率。
  • 211 个 Provider 运行时目录 — 接入 models.dev 目录并归一化为 provider 预设,下拉可搜;自动标记视觉模型并优先默认选中(适配视频理解);OpenAI 兼容 / Anthropic / Gemini 三类传输自动判定,附带 CORS 提示与连接测试。
  • 子代理隔离上下文 — 子代理 = 去掉 spawn_subagent 工具的嵌套 agent 运行,长视频分段理解的中间过程不污染主上下文。

技术栈

前端 · Vite 8 + React 19 + TypeScript 7(native tsc)+ Tailwind 4 + zustand

LLM 接入 · Vercel AI SDK(ai + @ai-sdk/openai / @ai-sdk/anthropic / @ai-sdk/google,均支持自定义 baseURL)· models.dev provider 目录

基建 · GitHub Actions CI/CD · 双线发布(国内阿里云 CDN + OSS,海外 Cloudflare Pages)· Let’s Encrypt DNS-01 证书自动续期

工程实践

  • 零后端 — 纯静态站点,构建产物 7 个文件即可双线发布;用户 API Key 仅存浏览器本地。
  • 同产物双线发布 — 国内(阿里 CDN→OSS)与海外(Cloudflare Pages)从同一次构建的 dist/ 发布,DNS 分线路由,保证两条线内容一致。
  • 证书自动化 — 每周自动检查国内 CDN 证书,剩余不足 30 天走 DNS-01 免费续签并做边缘核验。

我的角色

独立完成:产品设计 · Agent harness 架构 · 前端实现 · 多 provider 接入 · CI/CD 双线部署——从 0 到开源发布,一个人全链路。


开源项目,源码见 GitHub。

来加个微信吧

刘卓琪的微信二维码

微信扫码,或在手机上长按识别

加好友请备注来意,不然可能会漏掉哦~