Jev Ultrafast —— 基于动态索引动作空间的浏览器 Agent
Browser Use 与 TypeSafe 合作的浏览器智能体:把页面转成带编号的可交互元素表,每次决策只发一次请求即可同时给出操作(operation)与目标(target),默认循环不使用截图;官方示例中 Zürich → London 的 Google Flights 搜索耗时 7.1 秒。
社区作者 · zZz
它解决什么问题
项目用途
Jev Ultrafast 是一个「最快、最便宜」的网页智能体(web agent)。使用方式是把一个自然语言目标交给它,由 TypeSafe 的 Jev 决定「执行哪个操作 + 作用在哪个元素」上。只有当操作是 TYPE_TEXT 时,才会调用一个小型 LLM 生成要输入的文本。
配图 1 为项目横幅(Jev Ultrafast · Browser Use × TypeSafe),配图 2 为一次 1× 速度的 Google Flights 真实搜索演示(城市名由模型生成,操作/目标由模型动态决策)。
动作空间与决策机制
- 每次观察(observation)都会生成一张新的元素表,例如:
- [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。只会提供受支持的操作与目标。
- 一次 TypeSafe 请求内同时给出:操作(如 CLICK)、click_target、type_text_target、select_target(如存在)。目标问题是「投机式(speculative)」的:如果操作是 CLICK,只有 click_target 会被执行。两个决策共用一次网络往返。
- 每个 target head 只包含与当前操作兼容的元素;原生下拉选项带有观察到的元素/选项索引。
- 策略中没有站点专用脚本,也没有预先准备好的字段字符串。Flights 示例只提供目标,并独立校验结果;截图层只是事后加标签,不驱动浏览器。
为什么快(官方列出的设计点)
- 每个决策周期只发一次请求,操作头与目标头共享同一份观察状态。
- 默认 agent 循环不使用截图:Jev 消费结构化状态;inspector 才选用截图,视频使用单独的连续录制。
- 每个快照只做一次浏览器调用:原子读取可见控件及其名称、值和文本,并保留真实 DOM 节点的引用。
- 校验所选目标:点击会检查文档、表单值、目标及邻近上下文;动画本身不会强制再次预测;输入前解析当前几何位置并拒绝被遮挡控件。
- 等待「有用状态」:向 combobox 输入后等待可见建议,上限 200 ms;其他交互最多两个动画帧或 50 ms;这些读取发生在执行被记录之后。
- 保持隐藏标签页继续渲染,用焦点模拟避免后台动画节流,而不切换 Chrome 的可见标签。
- 只发送可见文本:屏幕外的正文和页脚不会填充模型上下文。
- 复用被中断的文本请求:只有当文本助手的整个输入未变化时,生成值才会在「页面过旧」重试中保留。
安全边界
- 每个被执行的目标都来自观察到的节点;执行器会重新检查页面新鲜度与点击遮挡。
- 模型输出永远不会变成选择器、坐标、shell 命令或可执行 JavaScript;文本助手输出必须先解析为一个小的 JSON 对象才能输入。
代码结构(文件职责)
- agent.py:完整循环与文本助手交接
- snapshot.js:原子 DOM 快照、带索引的控件、新鲜度保护
- browser.py:浏览器连接、当前几何、执行
- model.py:动态操作/目标头与文本生成
- questions.py:模型指令
- demo.py:本地 inspector
证据与限制
- 当前视频是一次 7,073 ms 的 Google Flights 运行。计时从首次页面观察之后开始,包含模型调用、生成文本、浏览器操作、过期决策与加载等待。独立的全新检查会校验单程设置、Zürich、London、September 20, 2026 以及可见的航班选项。视频以 1× 播放,无开头停顿,结尾定格 0.5 秒。
- 六次交替运行(模型与设置完全相同)中两个版本都是 3/3 通过;中位任务时间从 9.450 s 降到 7.092 s(减少 25%),中位浏览器协议调用从 1,092 降到 101。官方声明这只是同一个浏览器配置上单一任务的三次重复,不是通用可靠性基准。
- 同一策略在 2.798 s 内打开了指定的 Wikipedia 文章,在 1.896 s 内通过了本地酒店搜索/筛选任务。运行、失败、源码哈希与测量边界见 performance.md。
- 选择 DONE 仍需要独立的结果校验。DOM 读取器覆盖常见 HTML 与 ARIA 控件,并非完整的 accessible-name 规范。Shadow root、iframe、canvas、上传、弹出标签、嵌套滚动以及任意键盘控件仍在该 MVP 之外。启用的标签共享现有 Chrome 配置。
适用对象
需要在网页上执行端到端任务、关注单步延迟与调用成本、且希望自定义策略模型/端点的开发者与自动化团队;不适合要求完整可访问性规范覆盖或复杂 iframe/canvas 操作的场景。
— 本文由 AI 根据公开来源辅助整理,命令、版本与许可证请在使用前到原始页面复核。
安装 / 开始使用
以下为来源中给出的完整安装与首次运行步骤(顺序不可调换)。
1)准备环境
- 需要 Python 环境管理工具 uv(来源未给出 uv 自身的安装命令,待核验)。
- 需要 Google Chrome 浏览器;Chrome 通过 Browser Harness 连接,Browser Harness 由
uv sync一并安装。 - 需要两个 API Key:TYPESAFE_API_KEY(TypeSafe 请求)与 TEXT_MODEL_API_KEY(文本生成)。
2)克隆并同步依赖
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.在 .env 中填入 TYPESAFE_API_KEY 与 TEXT_MODEL_API_KEY。
3)启动本地 inspector 并跑第一个 demo
uv run jev然后打开 http://127.0.0.1:8766,点击 Start demo → Run automatically。
- inspector 会显示带编号的元素、操作概率、目标概率以及已执行的动作。
- 选择 “Choose next” 会在执行前暂停。
4)首次运行常见问题
- 如果 Chrome 需要连接,运行
uv run browser-harness --doctor排障; - 当浏览器弹出提示时,允许 Chrome 开启远程调试(Allow remote debugging);
- 来源提示:启用的标签页会共享现有 Chrome profile。
5)文本模型配置说明
- 示例配置中的 TEXT_MODEL_API_KEY 是一个 OpenRouter key。
- 当前 demo 使用
inception/mercury-2.5,并关闭 reasoning。 - Gemini、GLM、DeepSeek 也可以通过 OpenAI 兼容的文本助手使用;需要配置相应的模型、端点(endpoint)与 reasoning 设置。
6)作为库使用
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
7)换一个任务的示例
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说明:examples/flights.py --keep-open 会执行航班搜索,校验实际航线/日期/结果并保存 trace;它不会选择或预订航班。
8)开发与自检命令
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 账号条。凭证与原始 trace 保持被忽略(ignored)状态。