源码导读
Vision-Jev 源码导读:图像描述、动作判断与失败出口
这个项目把职责分得很具体:浏览器生成描述,Jev 选择类型化标签,游戏代码执行速度和计时。本导读沿固定提交追踪这条边界,不是在测试 Jev 直接接收图片的能力。
1. 跟着一张图片走到动作
拖动图片时,Pipeline.prefetch 就开始生成描述;描述按图片 URL 缓存,失败项会删除。perceive 把位图交给浏览器 worker,后者串行处理描述,并加载固定 revision e88a44ea 的 Florence-2-base-ft,以 384 × 384 像素运行 CAPTION 任务。WebGPU 加载模型失败会退到 Wasm;之后的预热或描述失败则上报错误。
放下图片后,Pipeline 向 /api/decide 发送 {caption, zone}。服务端将它们改写成 object_seen 和位置句子,一次 Jev 调用询问 action(7 个标签)、category(10 个)、speed_limit(5 个)。例如,“一个人”的描述加 own_lane,让 Jev 判断本车道情境;停车、变速如何执行,则由游戏代码负责。
2. 输入校验与失败回退解决不同问题
Worker 要求有效会话,将请求体限制为 8 KiB,只接受 caption 与四种 zone 之一。描述最多 300 字符,会被压成单行;多余字段会被拒绝。Jev 适配器检查答案标签是否合法、confidence 是否在 [0,1];每个标签缺失或非法的概率被置零,但没有检查概率和是否为一、choice 是否为概率最大项。
描述或请求失败会进入确定性回退:本车道 stop,对向车道 slow_down,两侧人行道 continue。合法但低置信度的答案仍按选中动作执行,resolveBehavior 没有置信度阈值。change_speed 配 speed_limit=none 时保持速度。因此,类型校验能拦住未知动作标签,不能使错误描述或错误动作变安全。
3. 取消请求与耗时要分开看
同一物体的新判断会中止旧请求;引擎在应用答案前还会检查 requestSeq,避免移动物体后旧答案覆盖新状态。这个序号检查不能证明浏览器取消请求时,服务端也停止了处理或不再计费。
每次 /api/decide 尝试都在会话验证完成后获得 10 秒超时;遇到 401 会刷新一次会话并重试,因此它不是端到端最多 10 秒。visionMs 只计描述执行,不含排队和模型加载;latencyMs 计 ai.run;浏览器 roundTripMs 包含验证和重试。测总反应时间时,需要明确把哪些阶段纳入。
4. 作者的 151/156 测量了什么
README 报告,156 个有评分标准的“描述+位置”案例中,151 个动作符合可接受答案;另四个没有参考答案的探索案例未计分。同一批案例也用于调策略。这是调参集内的策略一致度,不是留出图片测试或端到端驾驶安全成绩。
代码通过 Cloudflare AI 调用 typesafe/jev。Worker 记录 result.model、Jev 耗时和输入 token,但浏览器响应没有返回模型来源;上游没给 model 时,适配器会把别名本身记作模型名。复现时应记录实际返回的模型(若可得)、视觉模型 revision、策略提交、设备/后端和分阶段耗时,不能仅凭别名归因到某版 Jev。
把这条边界用于自己的原型
让感知、语义选择和执行分别可观察。第一步可用已知描述验证策略,再注入请求错误,最后返回一个合法但低置信度的动作:三者走的路径不同。请求未完成时移动物体,应另测旧响应是否被丢弃。
2026-11-02 核对 README;2026-11-03 在同一提交补充源码导读。包声明 Node ≥22.18、pnpm 11.0.3、Transformers.js 4.3.0。本站已读源码,未运行浏览器/WebGPU/Cloudflare 完整链路,也未复现作者测量;这里讨论的是游戏原型的设计。