browser-use/jev-ultrafast · 源码研究 → 离线试用 → 真实联网任务
jev-ultrafast 实战工作成果
从安装、31 条契约测试、无 API key 的离线决策循环试跑,到配置真实 key 后在真实 Chrome 上完成 Google Flights 任务并通过 7/7 独立校验——完整记录「决策层浏览器 Agent」的一次落地验证。
日期:2026-09-22
离线契约测试:31/31 通过
真实任务:✅ 7/7 校验通过
真实成本:$0.0114 / 任务
研究对象
browser-use/jev-ultrafast ⚡(17.5k★ / 6 天,MIT)
browser-use 官方出品的超快浏览器 Agent:TypeSafe Jev 从动态索引的动作空间里选出操作与目标元素,只有 TYPE_TEXT 时才由小 LLM 生成文本——「用选择替代生成」。8 种操作:CLICK / TYPE_TEXT / SELECT / SCROLL_UP / SCROLL_DOWN / WAIT / DONE / BLOCKED。
核心机制:投机扇出(Speculative Fan-out)
每轮决策把 operation 与各操作的 target 作为并行 Choice 问题放进一次 TypeSafe 请求,两次判断一次网络往返;每个 target head 只含兼容元素,未命中的 head 作废。官方 Demo:Google Flights 全任务 7.07s,Jev 中位延迟 178ms。
本环境配置
TYPESAFE_API_KEY(jev-latest,实测有效)+ TEXT_MODEL_API_KEY(DeepSeek deepseek-chat)。写入 .env(gitignored,权限 600)。浏览器层:browser-harness 通过 CDP 驱动真实 Chrome(需手动开 chrome://inspect/#remote-debugging)。
工作流程:四步从零到真实任务
STEP 1
安装与契约验证
git clone + uv sync(仅 2 个运行时依赖)。官方离线测试套件 31/31 通过(0.37s,零付费),覆盖 14 条安全契约:非法概率拒绝、过期决策先消费、文本 helper 拒绝猜值等。
✅ 31/31
STEP 2
离线试跑(无 key)
只替换两个网络边界(FakeBrowser 模拟机票站 + 按脚 本作答的假 Jev),驱动真实 Agent 代码路径跑通 9 决策 / 2 文本调用 / done,并产出完整工作日志。
✅ done
STEP 3
配置真实 key
TypeSafe key 与 DeepSeek key 均以最小请求实测验证(成本忽略不计);Chrome 开启远程调试开关后 browser-harness 自动连接 CDP 端口 9222。
✅ 双 key 有效
STEP 4
真实联网任务
真实 Chrome 上跑 Google Flights:3 次运行定位过期日期根因后,第 3 次成功完成并通过独立校验器 7/7 项检查。
🎉 成功
动作工作原理:一条动作的完整生命周期
每一步都经过同一条流水线:观察 → 动作空间 → 一次投机扇出请求 → 严格校验 → 消费决策 → 新鲜度守卫 → 执行 → 先记日志再重观察。模型输出永远只走「从观察到的 DOM 节点解析」这一条窄通道。
安全模型:校验层保证「结构合法」(概率分布、候选一致),不保证「语义正确」——语义靠规则(DONE 需可见证据)与独立结果校验器兜底。模型输出永不成为选择器、坐标、shell 命令或可执行 JS。
工作日志解剖:三层全可审计
Agent 每步产出三层日志,事后审查无需重放。以下字段全部来自真实运行落盘的 state.json。
decisions[] —— 模型判断层
operation 与 target 的选择、完整概率分布(operation_probabilities / target_probabilities)、置信度、延迟、token 用量,以及 request 原始请求体——投机扇出在这里直接可见:questions 同时含 operation + 各操作 head。
history[] —— 执行层
实际执行的 choice、执行概率(target head 的,归因准确)、生成的文本、page_changed(执行后指纹对比,熔断的输入)、text_helper 与其延迟。被过期吞掉的决策不污染历史。
text_calls[] —— 文本生成账本
字段 → 生成值 → 模型 → 延迟 → token,独立于 Jev 计量。真实运行:Where from? → "Zurich"(667ms)、Where to? → "London"(714ms)。
真实联网实测:三次运行定位根因
🎉 第 3 次运行成功:苏黎世 → 伦敦,10 月 20 日,7/7 独立校验全过
独立校验器核验 URL、单程、出发地、目的地、日期、年份与可见航班——DONE 判定从不被当作成功的证据。
| 运行 | 目标日期 | 决策数 | 执行动作 | 结果 | 根因 |
| Run 1 | 2026-09-20 | 10 | 8 | ❌ blocked | 「Open Departure」点击 3 次页面无变化 → 无进展熔断(真实浏览器连接首跑 + 授权弹窗干扰) |
| Run 2 | 2026-09-20 | 28 | ~25 | ❌ blocked | 官方 Demo 硬编码日期已过期:9 月 20 日已成过去,日历中不可选,Agent 在翻月中迷失。熔断正确兜底 |
| Run 3 | 2026-10-20 | 71 | 31 | ✅ passed 7/7 | 换未来日期后成功。总耗时 75.6s,成本 $0.0114 |
研究价值:官方 README 的目标日期(September 20, 2026)在录制时是未来值,发布一周后即失效——任务型 Demo 的可复现性有时效。修正版脚本 flights_future.py 已随报告附带。
实测数据 vs 官方 Demo
809ms
Jev 中位延迟
官方 178ms · 差异=网络 RTT
$0.0114
Jev 成本 / 任务
271,559 输入 token
逐项对比(官方 Demo = 最优路径 + 低延迟链路)
官方 Demo 本环境实测(延迟条以各自较大值为 100% 基准)
Run 3 操作分布
CLICK 22 · WAIT 5 · TYPE_TEXT 2 · SCROLL_DOWN 2 —— 典型的「判断密集、生成极少」形态:全程只有 2 次文本生成(DeepSeek 667ms / 714ms),其余全部是 Jev 的 Choice 判断。
成本结构确认
Jev $0.042/M 输入、输出免费;单任务 $0.0114 ≈ 官方口径的 3 倍(决策数多 4 倍)。token 是唯一变量——页面稳定性直接决定花费。
任务成果:真实航班(2026-10-20 苏黎世 → 伦敦,单程经济舱)
easyJet ✈ 直飞 1h 45m
11:10 苏黎世机场 → 11:55 伦敦盖特威克
SGD 70不含行李架上包费
British Airways ✈ 直飞 2h
20:10 苏黎世机场 → 21:10 伦敦希思罗
SGD 112
SWISS ✈ 直飞 1h 50m
15:35 苏黎世机场 → 16:25 伦敦希思罗
SGD 166
关键发现
Demo 的可复现性有时效
README 硬编码「September 20, 2026」,发布一周后即过期。Agent 面对不可能目标不会硬编,而是 stuck → blocked——熔断机制正确兜底,但复现官方结果必须先换未来日期。
stale 率是真实成本的大头
56% 的决策在执行前因页面 fingerprint 变化被丢弃(价格刷新、动画)。官方「减少浏览器往返」优化针对的正是这个——页面稳定性比模型延迟更影响花费。
「ultrafast」强依赖网络位置
Jev 中位延迟 809ms vs 官方 178ms,纯 RTT 差异。决策循环是串行的,延迟直接乘在每一步上——跨区域使用时体感约慢 4.5 倍。
会 wander,但不越界
搜索页上多次绕路、误点、重复动作,但每次动作都被守卫约束在观察到的节点上;最终靠「DONE 需可见证据」规则自我纠正并通过独立校验。语义错误存在但被架构无害化。
可审计性是设计出来的
71 次决策的概率、置信度、延迟、token 全部落盘;blocked 可解释(3 次重试记录);成本可预算(计费到步)。对生产化而言,这比 7 秒的体感更有价值。
复现方式
cd jev-ultrafast
uv run pytest # 离线契约测试(31/31,零付费)
uv run python ../jev-ultrafast_dryrun.py # 无 key 离线驱动真实 Agent 循环
# 真实运行(.env 填入 TYPESAFE_API_KEY + TEXT_MODEL_API_KEY):
uv run --env-file .env python flights_future.py # 未来日期修正版,✅ 7/7 校验通过
# 产物:artifacts/flights/future-date/state.json(完整三层工作日志)
环境门槛:新版 Chrome 需在 chrome://inspect/#remote-debugging 手动开启「Allow remote debugging」;browser-harness daemon 随 Agent 启动自动拉起并连接 CDP。