Skip to content
🔧 进阶手册第 6 / 8 节

写自己的浏览器任务:Agent 库实战 ​

前四课你一直在「用」Ultrafast:inspector 里看决策、flights.py 复现实录、性能课拆秒表。这一课是 Jev Ultrafast 教程从「照着跑」到「自己写」的转折点——把 Ultrafast 从一个演示变成你代码里的一个库:from jev_ultrafast import Agent,给它一个 URL 和一句目标,它把每一步的状态吐还给你。

官方对这套用法的定位就一句话:同一套策略,换一个 URL 和一句目标,就是新任务(README:The same policy can run a different task)。这一课你会写出自己的 my_task.py、用仓库自带的 run.py 免代码跑任意网页、读懂 state 里的每个字段,并照 flights.py 的模式给自己的任务配上独立验证。

学完你能做什么 ​

  • 用 from jev_ultrafast import Agent 写出自己的浏览器自动化任务脚本,在仓库根目录用 uv run --env-file .env python my_task.py 跑起来
  • 说出 Agent(url, goals, *, record_dir=None, screenshots=False) 每个参数管什么,goals 传字符串和传列表的区别
  • 用 examples/run.py --url … --goal … 不写一行代码跑任意网页任务,--goal 可重复传形成有序目标列表
  • 读懂 run() 逐步返回的 state:history、decisions、text_calls、status、elapsed_ms 各字段怎么用
  • 知道 60 个动作 / 120 次模型调用的预算、blocked 的触发条件,以及为什么 DONE 之后还要自己写验证

你现在的困境 ​

  • inspector 只能跑预置场景,任务框里改两句话倒是可以,但想把 agent 接进自己的脚本——跑完自动验证、存 trace、失败时报警——不知道从哪下手
  • 想让浏览器每天自动帮你查个东西、填个表,可一想到要写选择器、等加载、处理各种控件就劝退了
  • 翻开 agent.py 想抄作业,循环、决策、状态一堆字段,分不清哪些是给你用的、哪些是内部实现

什么时候用这一招 ​

当你需要:

  • 把 Ultrafast 接进自己的代码:跑完拿结果、存 trace、自动验证、失败报警
  • 同一个自定义浏览器 agent 跑不同网站的不同任务,不想为每个站点手写一套选择器脚本
  • 逐步拿到每一步的数据(动作、概率、延迟、文本调用)做调试或统计

而且不想:

  • 被限制在 inspector 的预置场景里点按钮
  • 为每个网站维护 DOM 选择器,页面一改版就成片挂掉
  • 凭模型自己说 DONE 就宣布任务成功

🎒 开始前的准备 ​

  • 完成了 Ultrafast 安装运行:uv sync 装好依赖、.env 里 TYPESAFE_API_KEY 已填好(要打字的任务还得有 TEXT_MODEL_API_KEY,第 6 步细讲)
  • (推荐)跑过一次 Google Flights 实战,见过 verify() 独立验证长什么样
  • 网络能访问 api.typesafe.ai 和你要操作的目标网站
  • 想好一个 5 步以内能完成的网页任务(先小后大;60 步预算在第 4 步讲)
  • 会写 Python 脚本、用过 with——今天只需要这些

核心思路 ​

先纠正一个容易产生的错觉:Ultrafast 不是「一个 demo 附带一点代码」,它就是一个可以 import 的 Python 包。包的入口只有两个名字(__init__.py 的 __all__):Agent 和 Browser——日常你只需要 Agent。

心智模型一句话:你出 URL 和目标,Agent 出循环,你消费 state。

你给的Agent 做的你拿到的
url:起始页面打开后台标签页、首次观察run() 逐步 yield 的 state
goals:一句目标(或列表)循环:观察 → 一次 TypeSafe 请求双决策 → 执行每步的 history / decisions / text_calls
(可选)record_dirstale 处理、预算控制、blocked 判定最终 status:done 或 blocked

三个关键认识:

1. 同一套策略,换 URL 和目标就是新任务。 策略里没有站点脚本、没有预制字段串(第 3 课讲过原话),所以「自定义任务」不等于「写自动化脚本」——你不写选择器,只写目标。

2. state 是你的一切。 你的代码能做什么,取决于 run() 吐给你的 state 里有什么。上一课拆的账单(17 次请求、178 ms 中位延迟、2 次文本生成)全部来自这些字段——这一课教你直接读它们。

3. 循环自带保险。 页面在决策后变了(stale),循环会丢弃决策、重新观察再来一轮;决策只消费一次,重试不会双击;已生成的文本值只有在输入完全不变时才会复用。这些都不用你写。

三种跑法对比,也是本课的路线图:

inspector(uv run jev)examples/run.py你自己的脚本
写代码不用不用一个 my_task.py
任务来源预置场景 + 任务框--url / --goal 参数你在代码里定
拿到什么眼睛看面板终端进度 + 最终 URL完整 state,随便处理
自动验证无无你自己写(第 5 步)
适合看懂决策快速试一个任务接进自己的系统

💡 想改 agent 的行为?

原理课说过:自定义任务走 Agent 库的标准接口,而不是往策略里塞逻辑。目标写得越具体,agent 走得越稳——这句目标就是你的「编程接口」。

跟我做 ​

第 1 步:认识 jev_ultrafast Agent——自定义任务的唯一入口 ​

为什么:写脚本之前,先知道这个类给你留了哪几个旋钮——一共四个参数,两分钟后你就全认识了。

签名(出自 agent.py):

python
Agent(url, goals, *, record_dir=None, screenshots=False)
参数类型说明
urlstr起始页面。构造时就会打开一个后台标签页(1120×780 视口)并等页面加载完成(最多 15 秒)
goalsstr 或列表一句目标;传列表则按序用换行拼成一段任务文本。空目标直接 ValueError: Supply a task
record_dir路径(可选)录制目录:设置后每步自动存一张 jpg(首屏是 000000.jpg,之后按累计毫秒命名)
screenshotsbool(可选)观察时是否截图,默认 False——默认循环不截图(README 明说);设了 record_dir 会自动带上

三个使用要点:

  • 用 with:Agent 是上下文管理器,with 块结束自动关标签页;构造失败(比如页面打不开)也会先关浏览器再抛错
  • 构造即观察:Agent(...) 一执行就已经打开浏览器、做完首次观察了,不是等你调 run() 才开始
  • 一次性的:跑到 done 或 blocked 后这个 Agent 就结束了,不能续跑(踩坑提醒第 4 条)

你应该看到:在仓库根目录确认一下入口(uv sync 已把包装进环境):

bash
uv run python -c "from jev_ultrafast import Agent; print(Agent)"
text
<class 'jev_ultrafast.agent.Agent'>
  • 能说出四个参数里今天会用到的两个:url 和 goals

第 2 步:写出你的第一个自定义浏览器任务脚本 ​

为什么:README 的「Use the library」一节先给几行骨架(官方骨架里填的就是第 3 课的 Flights 目标),紧接着说 The same policy can run a different task,并给了 Wikipedia 的命令行例子——先把官方例子写成脚本跑通,再把 URL 和目标换成你的。

在仓库根目录新建 my_task.py(和 examples/ 平级;放根目录是因为 uv run 要在仓库根目录执行):

python
from jev_ultrafast import Agent

URL = "https://en.wikipedia.org/wiki/Main_Page"
GOAL = "Find and open the Wikipedia article about Gödel’s incompleteness theorems."

with Agent(URL, GOAL) as agent:
    for state in agent.run():
        print(state["elapsed_ms"], state["status"])
print(state["page"]["url"])

这就是官方 README 的 Wikipedia 例子改写成脚本(run.py 里跑的就是同一句话目标,下一步见)。运行:

bash
uv run --env-file .env python my_task.py

注意:这个任务要在搜索框里打字,所以 .env 里 TEXT_MODEL_API_KEY 也得有值(第 6 步细讲配置)。

你应该看到:Chrome 多出一个后台标签页打开维基百科主页面,终端逐行打印「累计毫秒 + 状态」,大多行是 ready,最后一行状态是 done(如果被 blocked,去第 4 步的预算与无效动作判定找原因,或看下一课排错),随后打印浏览器最终停留的 URL——官方冒烟测试里,同一套策略打开这个条目用时 2.798 秒(performance.md 的 Other checks):

text
<毫秒> ready
<毫秒> ready
……
<毫秒> done
<最终 URL——哥德尔不完备定理的条目页>

(毫秒数与 URL 的具体编码以你本次运行为准)

  • my_task.py 跑完,最后一行打印的 URL 是哥德尔不完备定理的条目页

第 3 步:用 examples/run.py 免写代码跑任意任务 ​

为什么:临时想试一个任务,连建文件都不必——仓库自带的通用 runner 把 URL 和目标全做成了命令行参数。

README 的原始命令(逐字):

bash
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.'

两个参数(出自 run.py 源码):

参数说明
--url必填,起始页面
--goal必填,可重复传(argparse 的 action="append"),按顺序形成有序目标列表

run.py 的循环体就两件事:每步打印「右对齐毫秒 + 已执行动作数 + 状态」,跑完打印浏览器当前 URL:

text
<毫秒> ms  <动作数> actions  <状态>
……
<最终 URL>

你应该看到:和第 2 步同一个任务、同一个结果——这就是「同一套策略,换 URL 和目标就是新任务」的最小证明。换任何网站都行:把 --url 换成你常用的搜索页、文档站,--goal 写一句具体目标(怎么写好目标,见踩坑提醒第 2 条)。

💡 目标传多次会怎样?

--goal 传多次时,Agent 会把几条目标按序用换行拼成一段任务文本(agent.py 第 14 行)——它们作为一个整体任务一起评估,不是跑完一条再自动跑下一条。

  • 用自己的 --url 和 --goal 跑一次 run.py,最后一行 URL 符合预期

第 4 步:读懂 run() 吐出的 state——自定义任务的仪表盘 ​

为什么:上一课的账单能算出来,靠的就是这些字段;你自己的任务要判断「跑到哪了、花了多少、做了什么」,也全在这里。run() 是生成器,每执行一步 yield 一个 state 快照——done / blocked 那一步也会 yield 出来才结束。

state 主要字段(出自 agent.py 的 self.state 与 snapshot()):

字段内容你能用它做什么
statusready / predicted / done / blocked循环结束判定;blocked 时去 history 里找原因
elapsed_ms自首次预测起的累计毫秒计时、性能统计
history已执行动作列表每条含 action(元素标签)、kind、choice、probability、confidence、latency_ms、text、operation、target、page_changed、url、usage、executed_ms 等
decisions每次预测的记录(含 fingerprint、elapsed_ms、request、raw_answers)复盘模型每轮看到了什么、选了什么
text_calls文本 helper 调用记录(model、latency_ms、usage、field、value)统计小 LLM 的调用次数、延迟和生成值
page最近一次页面观察:url、title、text、actions、fingerprint第 5 步的验证就读它
goal拼接后的任务文本核对 agent 收到的目标
elements当前编号元素表(snapshot() 附加)看 agent 眼里的页面

(另有 plan / plan_index / decision / started_at / record 等内部字段;browser 对象不会出现在快照里。)

两道预算和一个自动刹车要记牢(都出自 agent.py,MAX_STEPS = 60):

  • 动作预算:60 个已执行动作,超了状态置 blocked 并抛 ValueError: Stopped at the 60-action demo budget
  • 模型调用预算:120 次预测(MAX_STEPS * 2),超了抛 ValueError: Reached the demo's model-call budget
  • 连续无效动作:最近 3 个动作页面都没变化、且都不是 wait 类型,状态自动置 blocked

给循环加个实用打印(flights.py 同款模式):

python
with Agent(URL, GOAL) as agent:
    for state in agent.run():
        last = state["history"][-1] if state["history"] else {}
        print(state["elapsed_ms"], state["status"], last.get("action", ""))

你应该看到:每行多出一个「刚执行的元素标签」(比如搜索框、某条建议、某个链接),比光看状态直观得多——这就是 inspector 里 Decision trail 的数据版。

  • 能说出 history 里至少 3 个字段的含义
  • 知道自己的任务最多能跑多少步(60 动作 / 120 次模型调用)

第 5 步:给自己的浏览器任务配独立验证——Jev Ultrafast 教程的硬规矩 ​

为什么:README 的 Evidence and limits 写得直白:A DONE choice still requires independent outcome verification。官方示例有 verify() 帮忙,你自己的任务没有——这一步不能省。验证读结果页面,不读模型的回答。

范本是第 3 课拆过的 flights.py 的 verify():它用 page["url"]、字段值、页面文本做了 7 项检查,任一不过就以 SystemExit 非零退出。给 Wikipedia 任务配一个同款:

python
def verify(page):
    """独立检查结果页面,不读模型的 DONE 回答。"""
    ok_url = page["url"].startswith("https://en.wikipedia.org/wiki/")
    ok_title = "incompleteness theorems" in page["title"].lower()
    return {"passed": ok_url and ok_title, "url": page["url"], "title": page["title"]}

接进脚本(跑完立刻验证,不过就非零退出——flights.py 同款收尾):

python
with Agent(URL, GOAL) as agent:
    for state in agent.run():
        pass  # 想看进度,照第 4 步打印

    result = verify(state["page"])
    print(result)

if not result["passed"]:
    raise SystemExit("Final page did not satisfy the checks")

断言怎么写取决于你的任务,三条路子都行:

验证对象用 state 里的例子
到了正确的页面page["url"]URL 前缀 / 路径断言(flights.py 的 search_page 查 hostname 和路径)
页面内容对page["title"]、page["text"]标题或正文包含期望内容
控件值对page["actions"]按元素标签取值断言(flights.py 的 origin 查 Where from? 的值)

你应该看到:跑完终端多打印一个字典,passed 为 true 才算任务成功。故意把断言写错试一次——脚本应该以非零码退出,验证真的在把关。

  • 自己的任务配上了 verify,且它读的是 state["page"] 而不是模型的回答

第 6 步:任务要打字?把文本 helper 配成 DeepSeek 或 GLM ​

为什么:只要任务里有输入框(第 2 步的搜索就是),操作 TYPE_TEXT 的字符串就由一个 OpenAI 兼容的小 LLM 生成——示例配置走 OpenRouter 的 Mercury;README 明说 Gemini、GLM、DeepSeek 都能用这个 helper。.env 的完整写法第 2 课的方式 A/B/C 讲全了,这里只补任务视角的三个事实。

事实一:Key 缺了不是启动时报错,是打到字才报错。 TEXT_MODEL_API_KEY 只在操作为 TYPE_TEXT 时才检查,错误原文:

text
ValueError: TYPE_TEXT needs TEXT_MODEL_API_KEY; no text is hardcoded or guessed by the executor.

事实二:不配置时代码默认就是 DeepSeek。 TEXT_MODEL_BASE_URL / TEXT_MODEL 不设的话,默认值是 https://api.deepseek.com/v1 + deepseek-chat(model.py 第 164–165 行)——所以「换成 DeepSeek」最省事的写法是 .env 里只填一行:

bash
TEXT_MODEL_API_KEY=<你的 DeepSeek Key>

(从 .env.example 复制的话,TEXT_MODEL_BASE_URL 和 TEXT_MODEL 两行要删掉——留空字符串同样算已设置,不会回落到默认值。换 GLM 等 OpenAI 兼容端点则要配相应的模型名、端点和 reasoning 设置,README 原话:configure the appropriate model, endpoint, and reasoning setting。)

事实三:helper 的输出被严格校验,不合格就不键入。 它必须返回只有一个键的 JSON 对象 {"text": "…"}:非空字符串、不超过 2000 字符;缺值时按指令返回 {"text": null}——null 同样不会键入,并抛出:

text
ValueError: Text helper returned no valid field value; nothing typed.

你应该看到:配好 Key 后重跑第 2 步,搜索框里出现模型生成的检索词并选中建议——state["text_calls"] 里能看到这次调用的模型名、延迟和生成值。

  • .env 里 TEXT_MODEL_API_KEY 有值(DeepSeek / OpenRouter / GLM 任选其一)

检查点 ✅ ​

  • my_task.py 在仓库根目录用 uv run --env-file .env python my_task.py 跑通,终端逐行打印毫秒与状态
  • 能说出 Agent(url, goals, *, record_dir=None, screenshots=False) 四个参数的用途
  • examples/run.py 用自己的 --url 和 --goal 跑完,最终 URL 符合预期
  • 能说出 state 里 history / decisions / text_calls / status / elapsed_ms 各是什么
  • 自己的任务配了独立验证,passed 为 true 才算成功;知道 60 动作 / 120 次模型调用的预算

踩坑提醒 ​

❌ 不带 --env-file .env 就跑脚本 ​

现象:uv run python my_task.py 一启动就抛 KeyError: 'TYPESAFE_API_KEY'。

原因:你自己写的脚本(和 run.py、flights.py 一样)不会自己读 .env——只有 inspector(demo.py)启动时才读。环境变量全靠 uv run --env-file .env 注入,而 model.py 用 os.environ["TYPESAFE_API_KEY"] 直接取值,缺了就是 KeyError。

正确做法:命令逐字带上 --env-file .env,并且在仓库根目录执行(第 3 课的踩坑提醒有完整分析)。

❌ 目标写得太宽泛,agent 提前宣布 DONE ​

现象:状态到 done 了,页面却不是你想要的——比如只打开了首页某个「看起来相关」的链接。

原因:模型指令要求 DONE 需要「所有要求都被满足的可见证据」(DONE requires visible evidence that ALL requirements are satisfied),但判断依据只有你那句目标。目标里没写清完成标准,agent 就按自己的理解收工。

正确做法:把完成标准写进目标——flights 的目标就是范本:Stop when matching flight options are visible. Do not select or book a flight.(看到匹配结果就停;不要选择或预订航班)。一句好目标 = 任务 + 停止条件 + 边界。再配第 5 步的独立验证兜底。

❌ 任务太大,跑着跑着抛预算错误 ​

现象:终端抛 ValueError: Stopped at the 60-action demo budget(或 Reached the demo's model-call budget),状态 blocked。

原因:Agent 有两道硬预算:60 个已执行动作、120 次模型调用(MAX_STEPS * 2);另外最近 3 个动作页面都没变化也会自动 blocked。任务步骤太多、或页面迟迟不给反馈,就会撞线。

正确做法:把大任务拆小——一次 Agent 跑一个「5 步内能完成」的目标。确实要多步时,用多个 Agent 串起来(每个 with 块一个,下一个的 url 从上一个的 state["page"]["url"] 接力),或者直接把起始 URL 指到中间页面。

❌ 拿跑完的 Agent 接着用 ​

现象:循环结束后想再 agent.run() 一次,或让同一个 agent 换个目标,抛 ValueError: This run has stopped. Start a fresh demo.。

原因:status 到 done 或 blocked 后,Agent 的预测入口就关了(agent.py 第 73–74 行)——一次构造就是一次任务。

正确做法:新任务新开一个 with Agent(...);要连续任务就写成循环,每轮一个 Agent。标签页随 with 块自动关闭,不会越积越多。

进阶技巧(可选) ​

录一遍回放。 Agent(URL, GOAL, record_dir="artifacts/mytask") 会把每一步存成 jpg(首屏 000000.jpg,之后按累计毫秒六位数命名)——跑完用图片浏览器快速翻页,比读 trace 直观。设了 record_dir 就自动开截图,不用再传 screenshots=True。

存 trace 做分析。 照 flights.py 的收尾模式把快照落盘:

python
import json
from pathlib import Path

# with 块内、run() 结束后:
state = agent.snapshot()
folder = Path("artifacts/mytask")
folder.mkdir(parents=True, exist_ok=True)
(folder / "state.json").write_text(json.dumps(state, indent=2))

state.json 里有完整的 history / decisions / text_calls——上一课的账单就是从这类数据里算出来的。artifacts/ 在仓库 .gitignore 里,不会被误提交。

只截图不落盘。 想在 state 里拿到 base64 截图(page["screenshot"])自己处理,传 screenshots=True 就够,不设 record_dir。

不想本地维护浏览器? README 顶部有个重要提示:Browser Use Cloud 托管的 BU Ultrafast 已上线(云服务里设 model: "bu-ultrafast"),开源版是本地跑的参考实现——两者不是一回事,别把本页的 jev_ultrafast.Agent 用法直接套到云服务上。详见原理课。

本课小结 ​

✅ jev_ultrafast 是个库:入口只有 Agent(和 Browser),Agent(url, goals, *, record_dir=None, screenshots=False) 一次构造就是一次任务,用 with 收尾。

✅ 同一套策略换 URL 和目标就是新任务:你不写选择器,只写目标——一句好目标 = 任务 + 停止条件 + 边界。

✅ run() 逐步 yield state:history(动作)、decisions(预测)、text_calls(文本生成)、status、elapsed_ms——上一课的账单就出自这些字段。

✅ 预算与保险:60 动作 / 120 次模型调用、连续 3 次无变化自动 blocked;stale 自动重观察、决策只消费一次,都不用你写。

✅ Jev Ultrafast 教程的硬规矩:DONE 不算数——照 flights.py 的 verify() 模式给自己的任务配独立验证,读结果页面,不读模型回答。

关键参数与字段回顾:

参数 / 字段推荐值说明
Agent(url, goals)必填url 起始页;goals 一句目标或列表(列表按序换行拼接)
record_dir需要回放时设每步存 jpg,自动开截图
screenshots默认 False默认循环不截图
运行命令uv run --env-file .env python my_task.py仓库根目录执行,--env-file 不能省
--url / --goalrun.py 必填--goal 可重复传,形成有序目标列表
TEXT_MODEL_API_KEY有打字就要配缺了到 TYPE_TEXT 那步才报错;不设端点/模型名时代码默认 DeepSeek
验证每个任务都要有读 state["page"],passed 为 true 才算成功

下一课预告 ​

自己的任务跑起来之后,难免撞上连不上、点不动、跑偏了。下一课 Ultrafast 排错:连不上、点不动、跑偏了怎么办把这些一网打尽。你会学到:

  • Chrome 连不上时 uv run browser-harness --doctor 怎么用
  • 常见报错字符串对照:TEXT_MODEL 报错、Model provider returned HTTP … 各意味着什么
  • 哪些页面能力这个 MVP 不支持(shadow DOM、canvas、上传、弹出新 tab……),跑偏了先对照支持清单
  • blocked 的几种场景怎么排查:连续无效动作、预算超限

附录:源码参考 ​

点击展开查看源码位置

更新时间:2026-11-04(仓库 github.com/browser-use/jev-ultrafast,本地信息源 sources/jev/repo-ultrafast/)

功能文件路径关键位置
库入口(只导出 Agent、Browser)jev_ultrafast/init.pyL1–6 __all__ = ["Agent", "Browser"]
Agent 签名与构造jev_ultrafast/agent.pyL12–26 Agent(url, goals, *, record_dir=None, screenshots=False);goals 字符串/列表换行拼接;空目标 Supply a task;构造即打开浏览器观察,失败先关再抛
state 全部字段jev_ultrafast/agent.pyL27–41 goal / page / decision / history / status / plan / plan_index / decisions / text_calls / elapsed_ms / started_at / record
snapshot()(快照去掉 browser、附加 elements)jev_ultrafast/agent.pyL46–50
run()(yield 到 done/blocked)jev_ultrafast/agent.pyL163–165
预算与 blockedjev_ultrafast/agent.pyL75–76 模型调用预算 MAX_STEPS * 2;L102–104 60 动作预算置 blocked;L153–157 连续 3 次无变化且非 wait 置 blocked
决策只消费一次 / stale 自动重观察jev_ultrafast/agent.pyL55–64 tick 捕获 StalePage 重新观察;L90–91 决策先清空再执行
history / text_calls 条目字段jev_ultrafast/agent.pyL115 text_calls(model / latency_ms / usage / field / value);L121–141 history(step / action / kind / choice / probability / confidence / latency_ms / text / text_helper / text_latency_ms / operation / target / page_changed / url / usage / executed_ms / elapsed_ms)
不能复用结束的 Agentjev_ultrafast/agent.pyL73–74 This run has stopped. Start a fresh demo.
上下文管理器jev_ultrafast/agent.pyL167–174 close() / __enter__ / __exit__
通用 runnerexamples/run.pyL7–10 --url 必填、--goal 可重复(action="append",help:Repeat for an ordered list of goals);L12–15 打印格式与最终 URL
库用法骨架与运行命令README.md「Use the library」:uv run --env-file .env python your_script.py;Wikipedia 命令行例子;The same policy can run a different task
文本 helper 配置与校验jev_ultrafast/model.pyL160–168 TEXT_MODEL_API_KEY 必需(错误原文)、DeepSeek 默认端点与模型、reasoning 三分支;L187–193 输出必须单键 {"text": …}、非空、≤2000 字符,否则不键入
文本 helper 指令jev_ultrafast/questions.pyTEXT_VALUE:缺值返回 {"text": null}、不编造个人信息;MAX_STEPS = 60
verify 模式范本examples/flights.pyL18–38 verify() 7 项独立检查;L63–64 验证不过 SystemExit
Wikipedia 冒烟数据docs/performance.mdOther checks:同一策略 2.798 s 打开该条目;本地酒店任务 1.896 s
云服务与开源版的关系README.md顶部 IMPORTANT:BU Ultrafast(model: "bu-ultrafast")是 Browser Use Cloud 托管版;.env 六变量见 .env.example
页面观察字段jev_ultrafast/browser.pyL115–117 fingerprint 由 url/text/actions/scroll 计算;L188–193 观察返回 info + fingerprint(+screenshot 可选);model.py L110 取 page 的 url/title/text
inspector 才自己读 .envjev_ultrafast/demo.pyL23–29 load_environment()(cwd 的 .env),L132 启动时调用
trace 不进 git.gitignore.env、.venv/、artifacts/ 均被忽略
搞懂AI关于我们怎么写隐私说明

独立的第三方教程,与文中提到的任何产品及其公司没有隶属或合作关系;产品名称和商标归各自所有者。价格和政策以官方页面为准。