Jev Ultrafast ⚡
一个拥有动态、可索引动作空间的浏览器智能体。
只需给它一个目标。TypeSafe 的 Jev 会选择一个操作和一个元素。只有当操作为 TYPE_TEXT 时,小模型才会生成文本。
7.1 秒内在 Google Flights 上完成苏黎世→伦敦的搜索。 包含一个自然语言目标、实际的文本生成以及加载等待。
动作空间
每次观察都会生成一个新的元素表:
[1] button Change ticket type · Round trip
[2] combobox Where from? · San Francisco
[3] combobox Where to? · empty
[4] textbox Departure · empty
...
操作包括 CLICK、TYPE_TEXT、SELECT、SCROLL_UP、SCROLL_DOWN、WAIT、DONE 和 BLOCKED。系统只提供受支持的操作和目标。
one TypeSafe request
┌───────────────────────────┐
page → element table → operation │
│ click_target │
│ type_text_target │
│ select_target, if present │
└─────────────┬─────────────┘
use the matching target
│
CLICK [7] ─────┤──→ browser
TYPE_TEXT [3] ─────┘
↓
small LLM → text → browser
目标问题是投机性的。如果操作是 CLICK,只有 click_target 可以执行。两次决策,一次网络往返。每个目标头只包含兼容的元素。原生下拉选项携带观察到的元素/选项索引。
策略中没有任何针对特定站点的动作脚本或预置字段字符串。Flights 示例只提供一个目标并独立验证结果。截图渲染器是在事后添加标签;它并不驱动浏览器。
试用
git clone https://github.com/browser-use/jev-ultrafast.git
cd jev-ultrafast
uv sync
cp .env.example .env
# Add TYPESAFE_API_KEY and TEXT_MODEL_API_KEY.
uv run jev
打开 http://127.0.0.1:8766 并点击 Start demo → Run automatically。检查器会显示带编号的元素、操作概率、目标概率以及已执行的动作。Choose next 会在执行前暂停。
Chrome 通过 Browser Harness 连接,由 uv sync 安装。如果需要连接,可运行 uv run browser-harness --doctor。在提示时允许 Chrome 远程调试。
在示例配置中,TEXT_MODEL_API_KEY 是一个 OpenRouter 密钥。当前演示使用关闭推理功能的 inception/mercury-2.5。Gemini、GLM 和 DeepSeek 也可以使用 OpenAI 兼容的文本助手;请配置相应的模型、端点和推理设置。
作为库使用
from jev_ultrafast import Agent
with Agent(
"https://www.google.com/travel/flights?hl=en",
"Find one-way flights from Zurich to London on September 20, 2026, "
"for one adult in economy. Stop when matching flight options are visible.",
) as agent:
for state in agent.run():
print(state["elapsed_ms"], state["status"])
使用 uv run --env-file .env python your_script.py 运行。同一策略可以运行不同的任务:
uv run --env-file .env python examples/run.py \
--url https://en.wikipedia.org/wiki/Main_Page \
--goal 'Find and open the Wikipedia article about Gödel's incompleteness theorems.'
uv run --env-file .env python examples/flights.py --keep-open 会执行航班搜索,检查实际的航线/日期/结果,并保存其轨迹。它不会选择或预订航班。
它为什么快
- 每个决策周期只发一次请求。 操作头和目标头共享同一个观察状态。
- 默认智能体循环不使用截图。 Jev 消费结构化状态。检查器可选择启用截图;视频使用的是单独的持续屏幕录制。
- 每个快照只调用一次浏览器。 原子化读取可见控件及其名称、值和文本。保留对实际 DOM 节点的引用。
- 验证选定的目标。 点击会检查文档、表单值、目标和附近上下文。仅有动画不会强制重新预测。在输入前解析当前几何信息并拒绝被遮挡的控件。
- 等待有用的状态。 在组合框中输入后,等待可见建议出现,上限 200 毫秒。其他交互最多等待两个动画帧或 50 毫秒。这些读取发生在执行被记录之后。
- 保持隐藏标签页持续渲染。 焦点模拟可防止后台动画节流,而无需切换 Chrome 的可见标签页。
- 只发送可见文本。 屏幕外的文章正文和页脚不会填满模型上下文。
- 复用被中断的文本请求。 只有当文本助手的完整输入未发生变化时,已生成的值才能在过期页面重试后继续使用。
每个执行的目标都从观察到的节点解析。执行器会重新检查页面新鲜度和点击遮挡情况。模型输出永远不会变成选择器、坐标、shell 命令或可执行的 JavaScript。文本助手的输出必须能解析为一个小的 JSON 对象后才会被输入。
小到可以通读
| 文件 | 职责 |
|---|---|
| agent.py | 完整循环与文本助手交接 |
| snapshot.js | 原子化 DOM 快照、索引控件、新鲜度守卫 |
| browser.py | 浏览器连接、当前几何信息、执行 |
| model.py | 动态操作/目标头与文本生成 |
| questions.py | 模型指令 |
| demo.py | 本地检查器 |
证据与局限
当前视频是一段 7,073 毫秒 的 Google Flights 运行。计时从初始页面观察之后开始,包括模型调用、生成的文本、浏览器工作、过期决策和加载等待。一次全新的独立检查验证了单程设置、苏黎世、伦敦、2026 年 9 月 20 日以及可见的航班选项。视频以 1× 播放,开头无停顿,结尾有 0.5 秒停顿。
在使用相同模型和设置的六次交替运行中,两个版本都通过了 3/3。任务时间中位数从 9.450 秒降至 7.092 秒,降幅 25%;浏览器协议调用中位数从 1,092 降至 101。这是在单个浏览器配置文件上对一个任务的三次重复,并非通用的可靠性基准。
同一策略在 2.798 秒 内打开了指定的 Wikipedia 文章,并在 1.896 秒 内通过了一项本地酒店搜索/筛选任务。运行记录、失败情况、源码哈希和测量边界见 performance.md。
选择 DONE 后仍需独立的结果验证。DOM 读取器处理常见的 HTML 和 ARIA 控件,而非完整的可访问名称规范。Shadow roots、frames、canvas、上传、弹出标签页、嵌套滚动和任意键盘控件仍在此 MVP 之外。所属标签页共享现有的 Chrome 配置文件。
开发
uv run ruff check .
uv run pytest
node --check jev_ultrafast/static/app.js
node --check jev_ultrafast/snapshot.js
uv build
测试离线运行。uv run python scripts/check_guards.py 可在本地浏览器中检查真实控件,无需模型调用。在线示例和录制脚本会产生付费 API 调用。scripts/record_flights.py <new-folder> 捕获原始浏览器时间戳;scripts/render_demo.py <recording-folder> 以 1× 渲染经验证的运行并裁掉 Google 账户条。凭据和原始轨迹保持被忽略。
Browser Use · Browser Harness · TypeSafe speculative fan-out
