用途
Antigravity Vision Proxy 用于解决「当前智能体不能直接查看或分析图像,但需要逐帧检查来完成视频分析或补充视觉上下文」的问题。它把 agy --print 作为子进程使用,通过 Gemini 视觉模型分析图像,流程包括:帧提取(ffmpeg)、agy 调用、以及结构化输出解析。
典型使用场景:
- 智能体缺少内置视觉能力,但需要从视频帧中识别游戏、英雄角色或活动。
- 需要对视频帧进行分析,用于打时间戳或场景分类。
- 任何需要视觉上下文、而当前模型看不到的情况。
主要能力
文本与视觉的模态对比
资料给出两种模态的对比维度:
- 延迟与成本:纯文本(ASR + LiveChat)极快、token 成本低;文本 + 视觉(Storyboard / Frames)延迟中等,需要下载约 15MB 的 sb0 并裁剪帧。
- 对话深度:纯文本能捕捉观点、玩笑、语气与调侃;视觉无法听到推理或意图。
- 专有名词准确度:纯文本易受 ASR 语音讹误影响;视觉可精确读取屏幕上的标题卡、标识与 UI 文本。
- 指示代词(如「อันนี้/เกมนี้」):纯文本在没有说出名称时含义模糊;视觉可立即在屏幕上确定目标。
- 静音 / 蒙太奇玩法:纯文本在主播不出声时会失败;视觉能准确跟踪游戏状态与动作。
触发规则(门控触发)
资料强调:不要对每个片段都调用视觉,而应使用「门控触发规则」。触发条件如下:
- 门控触发 1:歧义的指示代词。主播高参与度地谈论「เกมนี้」「ตัวนี้」「คลิปนี้」「ดูอันนี้」,但在 ±30 秒内没有明确说出标题。
- 门控触发 2:未解析的专有名词 / ASR 乱码候选。garbled_notes.json 中 correct: null 的候选,例如 Whisper 的语音乱码「ดัซบลาโด」对应 DUSKBLOODS、「fet bate zี」对应 Phantom Blade Zero。
- 门控触发 3:游戏 / 活动切换边界。游戏启动或标题卡出现的精确秒数,例如从菜单核实确切的 NES/SNES 游戏标题。
- 门控触发 4:静音 / 低语音高活动脉冲。MEME_PULSE 或 LiveChat 聊天爆发,而转录文本少于 5 行语音。
- 门控触发 5:用户明确要求验证。用户要求用视觉验证(/btw i want you to use vision、--vision、ลองใช้ vision ตรวจเช็คดูสิ)。
- 门控触发 6:数字、活动或专有名词出入。主播在数字上卡壳(例如日语 万(10,000)与「ล้าน」混淆,含糊说出「3,500 ล้าน / 30,000 กว่าล้าน」),或 LiveChat 出现实时观众纠正(例如聊天调侃「35 ล้านพอปู่」)。
绕过(保持纯文本):静态播客 / 谈话片段、观点分享、主播逐字朗读标题的新闻阅读,或已由音频与 TF-IDF 信号 100% 确认的游戏。
使用方式
帧提取
方式 A:高分辨率 YouTube 故事板(sb3/sb2/sb1/sb0)——整场直播首选,无需下载完整视频,总计约 15-40MB。步骤如下:
下载最高可用分辨率的故事板 mhtml:
yt-dlp -f "sb3/sb2/sb1/sb0" "https://www.youtube.com/watch?v=VIDEO_ID" -o "frames/storyboard.%(ext)s"
使用 unpack_storyboard.py 解包干净的 MHTML 幻灯片并裁剪高分辨率帧:
python3 ../anibon-stream-activity/scripts/unpack_storyboard.py
--mhtml "frames/storyboard*"
--out-dir "frames/slides"
--crop-sec 597
--duration <DURATION_SEC>
--out-crop "frames/frame_00_09_57.jpg"
方式 B:本地视频 / MP4 文件。
单帧:
ffmpeg -ss HH:MM:SS -i full_video.mp4 -frames:v 1 -q:v 2 frames\frame.jpg
批量(每 N 秒抽取,总计 $duration):
0..([math]::Floor($duration/$interval)) | % { $t = $_ * $interval $ts = "{0:D2}:{1:D2}:{2:D2}" -f [math]::Floor($t/3600),[math]::Floor(($t%3600)/60),($t%60) ffmpeg -ss $ts -i full_video.mp4 -frames:v 1 -q:v 2 "frames\frame_$ts.jpg" }
方式 C:针对性的高分辨率视频片段切片(yt-dlp --download-sections)——最适合抽查,下载约 2-3 秒。当需要检查特定时间段(1–10 分钟)的横幅、打赏弹窗、汉字、UI 文本,或缺少 PIL 无法解包故事板时使用:
下载针对性片段(通过 android player client 且不带 cookie 绕过 SABR HTTP 403):
yt-dlp --extractor-args "youtube:player_client=android"
--download-sections "*00:08:30-00:15:30"
-f "18/best[height<=720]/worst"
-o "target_slice.mp4" "https://www.youtube.com/watch?v=VIDEO_ID"
在精确偏移处提取清晰帧:
ffmpeg -y -ss 00:01:15 -i target_slice.mp4 -frames:v 1 -q:v 2 target_frame.jpg
调用 agy
agy --model "Gemini 3.8 Flash (High)" --dangerously-skip-permissions --print "Identify per frame: 1) Game 2) Heroes/characters 3) Gameplay/menu/cutscene 4) Notable events"
--add-dir frames
必需参数:--dangerously-skip-permissions 与 --add-dir frames。
若需要可解析输出,在提示中要求返回 JSON,例如: 「Return JSON array: [{timestamp, game, heroes, activity}]」
模型选择
- Gemini 3.8 Flash (High):默认模型,成本为默认,用于批量游戏扫描与英雄 / UI 文本识别。
- Gemini 3.1 Pro (Low):成本中等,用于 Flash 误识别时。
常见错误与修复
- agy 提示「cannot access file」:缺少 --add-dir 或路径错误。
- 英雄识别置信度低:与转录文本中的角色名交叉核对。
- 帧质量过低:UI 文本用 -q:v 2,游戏识别用 -q:v 5。
- 抽取过于频繁:每 30 秒超过 1 帧会增加成本且收益递减。
限制
资料未提供收费、价格、平台支持范围等事实,暂未提供。