−136,866 lines. 80% of the library deleted.
We started over. The agent now writes Python in one persistent REPL, straight on Chrome DevTools Protocol. Nothing in between. It is the same loop that runs Browser Use Cloud, the state-of-the-art web agent, now open source.
● task
│
● model writes a cell new_tab(url); bu.click(41); js(...)
│
● REPL runs it on Chrome (CDP) → output back to the model
│
✓ finish(result)
Same models: up to 33 points higher, 2.7–5.2x cheaper, 2–3x faster.
uv add 'browser-use==1.0.0'
export BROWSER_USE_API_KEY=bu_... # cloud.browser-use.com/new-api-keyfrom browser_use import Agent
print(Agent('Find the number of stars of the browser-use repo').run_sync().final_result())Pin with Need 0.x? Your own model: Read MIGRATING.md first. It lists every 0.x option and its 1.0 answer.
BU Bench v2, 60 tasks x 3 reps, cloud browsers, 2026-11-09.
An OpenAI outage hit this window. Pi lost 18 of 180 runs to provider errors, 1.0 lost 1 (its one retry recovered 13 of 14). So the raw gap overstates quality. With provider errors excluded, paired 1.0 minus Pi: score +1.1 [-3.2, +5.7] (no significant difference), cost -$0.013/task [-0.024, -0.004], time -114 s/task [-202, -31]. Same quality, cheaper and faster.
Both arms ran Report problems at https://github.com/browser-use/browser-use/issues
Full changelog: 0.13.14...1.0.0
==. We ship fast from here.
Upgrading from 0.x, benchmarks, everything that changed
pip install 'browser-use<1'
What changes by default
0.x
1.0
Model ( llm=None)
required
bu-fast on the Browser Use gateway
Browser ( Browser())
local Chromium
a Browser Use Cloud browser; Browser('chromium') for a local one
Key
one per provider
one Browser Use key ( BROWSER_USE_API_KEY, or browser-use login)
Mode
ultrafast (accessibility-tree ids) on bu-fast / bu-ultrafast; mode='default' opts out
run() limits
max_steps=500
max_steps=100, timeout=1700 s
ChatOpenAI, ChatAnthropic, ChatGoogle, or any Pydantic AI model string (llm='groq:llama-3.3-70b-versatile').
Upgrading from 0.x
TypeError naming it before any browser starts or anything is billed. No silent no-ops. 0.x tuning knobs 1.0 has no use for (use_vision=True, flash_mode, max_failures, ...) warn once and are ignored.
ImportError that names the replacement and links MIGRATING.md. except ImportError fallbacks still work.
ActionResult(include_in_memory=...) warns and is ignored: every tool result stays in the conversation.
run() does not raise: a rejected key or model, a browser that fails to start (cloud create 402/5xx/timeout) and failures inside the run all return status='error' with result.error, and a browser that did start is stopped. A missing key still raises before anything is created.
Behavior changes to check
Browser() is a cloud browser. Tasks on localhost or private IPs need Browser('chromium') (one warning says so).
Browser(local=True) now means Browser('chromium'). Your own open Chrome is Browser('chrome').
Browser('chrome') attaches only to a browser whose live DevToolsActivePort is in your own profile dirs. It no longer attaches to whatever answers on 127.0.0.1:9222.
run(max_steps=...) defaults to 100 (was 500). One step is one model request.
is_successful() is None when the agent gave no verdict. Use r.is_done() and r.success is not False for the 0.x default.
errors() returns only the error that ended the run. Recovered cell errors are in result.messages.
result.partial is set only by checkpoint(..., partial=True). To get one, name the flag in the task: "after each page, save the titles with checkpoint('titles.json', titles, partial=True)".
result.cost_usd covers model and web search charges, not the cloud browser or its proxy.
browser-use-*) is kept after the run. A workspace= path is used as given (made absolute, symlinks not resolved), so result.downloads[0].relative_to(workspace) works.
prohibited_domains=['example.com'] also blocks its subdomains. With any domain rule set, every file: URL is blocked. BROWSER_USE_ALLOWED_DOMAINS is not read: Browser() raises while it is set.
bu-2-0, bu-1-0, bu-latest, ...) are rejected. BROWSER_USE_LLM_URL is not read: use ChatBrowserUse(base_url=...).
TypeError. Azure reads AZURE_OPENAI_API_KEY (not AZURE_OPENAI_KEY) and needs OPENAI_API_VERSION.
browser-use --mcp prints a deprecation notice and serves the --cli-mcp tools (browser_exec, browser_screenshot, browser_login). browser-use init was removed.
bu and browser console scripts are gone (they broke uv tool install next to other tools). Use browser-use or browseruse.
aws, oci, video, examples, eval, core, openai-tools, cli-oci are gone (pip warns and installs without them). anthropic, google, mcp, cli, all still resolve; Anthropic, Google and MCP are core dependencies.
Also new
Agent(task, output_model_schema=MyModel) then result.structured_output.
workspace=, downloads in workspace/downloads and result.downloads. The agent uploads the file you named and never creates or overwrites it.
sensitive_data= typed with type_secret() and redacted from cell output, checkpoints, tool results and the result. Not a sandbox; see the trust model in MIGRATING.md.
allowed_domains, prohibited_domains, block_ip_addresses) with the 0.x patterns, in every browser mode.
web_search=True), billed per search to your Browser Use key and added to result.cost_usd.
browser-use pipes Python to browser-harness; browser-use --cli-mcp runs the MCP server; browser-use skill install registers the agent skill.
browseruse/browseruse:1.0.0 and ghcr.io/browser-use/browser-use:1.0.0. Every image build is smoke-tested on amd64 and arm64 in CI, on pull requests too.
Reliability
bu-smart turns no longer end at 300 s.
server_error, overloaded, request_timeout, upstream_stream_failed) or a stream that ends before its final event is retried once per run, like a 429 or 5xx.
Agent raises a low soft open-file limit to min(hard limit, 10240) (macOS defaults to 256). A connection error now names its cause, e.g. ModelConnectionError: Connection error. (OSError: [Errno 24] Too many open files).
ChatOpenAI('gpt-6-luna', base_url=...) gets reasoning_effort='none' on any host, so tools work behind a proxy.
wait_for_network_idle() no longer waits for Web Worker scripts and cross-site iframes, which ran it to its 10 s cap.
beforeunload prompt, or a screenshot with a JS dialog open, names the dialog within seconds.
about:blank.
Benchmark
agent
score [95% CI]
$/task
s/task
browser-use 1.0 ( mode='ultrafast', the mode bu-fast uses)
62.5 [58.3, 66.5]
0.070
650
Browser Use Pi (e7007f2), same window
56.3 [50.2, 62.4]
0.082
743
gpt-6-luna on api.openai.com, judged by gpt-5.6-luna (xhigh). The default bu-fast model on the Browser Use gateway was not part of this run. 95% task-clustered bootstrap intervals.
Known issues
==), and the lockfile is committed. This is a supply-chain policy: you get exactly the versions CI tested. The cost: a project that needs a different version of pydantic, pydantic-ai-slim, mcp, google-genai, pillow or another pinned package cannot install 1.0 next to it. Tell us which pin blocks you.
google-genai stays below 3: 3.0.0 calls the Gemini API on v1, which rejects tools. This goes away once Pydantic AI supports it.
Browser('chromium') for another viewport.
