Repository navigation
browser-use 1.0: CDP is all you need
−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. No DOM serializer, no action schema, nothing in between. Simplicity wins: it is now the state-of-the-art web agent.
● 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 ==. We ship fast from here.
Upgrading from 0.x, benchmarks, everything that changed
Need 0.x? 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 |
Your own model: ChatOpenAI, ChatAnthropic, ChatGoogle, or any Pydantic AI model string (llm='groq:llama-3.3-70b-versatile').
Upgrading from 0.x
Read MIGRATING.md first. It lists every 0.x option and its 1.0 answer.
- An option 1.0 cannot honor raises a
TypeErrornaming 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. - Every removed 0.x import (all module paths from 0.1 to 0.13, and every public name of a module 1.0 kept) raises an
ImportErrorthat names the replacement and links MIGRATING.md.except ImportErrorfallbacks still work. ActionResult(include_in_memory=...)warns and is ignored: every tool result stays in the conversation.- Once configuration checks pass,
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 returnstatus='error'withresult.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 needBrowser('chromium')(one warning says so).Browser(local=True)now meansBrowser('chromium'). Your own open Chrome isBrowser('chrome').Browser('chrome')attaches only to a browser whose liveDevToolsActivePortis 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()isNonewhen the agent gave no verdict. User.is_done() and r.success is not Falsefor the 0.x default.errors()returns only the error that ended the run. Recovered cell errors are inresult.messages.result.partialis set only bycheckpoint(..., 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_usdcovers model and web search charges, not the cloud browser or its proxy.- The workspace (default: a new temp dir
browser-use-*) is kept after the run. Aworkspace=path is used as given (made absolute, symlinks not resolved), soresult.downloads[0].relative_to(workspace)works. prohibited_domains=['example.com']also blocks its subdomains. With any domain rule set, everyfile:URL is blocked.BROWSER_USE_ALLOWED_DOMAINSis not read:Browser()raises while it is set.- The 0.x gateway models (
bu-2-0,bu-1-0,bu-latest, ...) are rejected.BROWSER_USE_LLM_URLis not read: useChatBrowserUse(base_url=...). - LangChain chat models raise
TypeError. Azure readsAZURE_OPENAI_API_KEY(notAZURE_OPENAI_KEY) and needsOPENAI_API_VERSION. browser-use --mcpprints a deprecation notice and serves the--cli-mcptools (browser_exec,browser_screenshot,browser_login).browser-use initwas removed.- The
buandbrowserconsole scripts are gone (they brokeuv tool installnext to other tools). Usebrowser-useorbrowseruse. - Extras
aws,oci,video,examples,eval,core,openai-tools,cli-ociare gone (pip warns and installs without them).anthropic,google,mcp,cli,allstill resolve; Anthropic, Google and MCP are core dependencies.
Also new
- Typed results:
Agent(task, output_model_schema=MyModel)thenresult.structured_output. - Uploads and downloads on local and cloud browsers: inputs from
workspace=, downloads inworkspace/downloadsandresult.downloads. The agent uploads the file you named and never creates or overwrites it. - Secrets:
sensitive_data=typed withtype_secret()and redacted from cell output, checkpoints, tool results and the result. Not a sandbox; see the trust model in MIGRATING.md. - Domain restrictions (
allowed_domains,prohibited_domains,block_ip_addresses) with the 0.x patterns, in every browser mode. - Web search (
web_search=True), billed per search to your Browser Use key and added toresult.cost_usd. - CLI and MCP:
browser-usepipes Python to browser-harness;browser-use --cli-mcpruns the MCP server;browser-use skill installregisters the agent skill. - Docker:
browseruse/browseruse:1.0.0andghcr.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
- Streamed Responses. Every OpenAI Responses request (the Browser Use gateway and api.openai.com) is streamed. A streamed turn gets 300 s to its first event, then runs while events flow, up to 930 s. Long
bu-smartturns no longer end at 300 s. - One transient retry. A failure reported inside HTTP 200 (
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. - Compaction. A Responses request over the context window compacts once and is sent again. Models with smaller windows (gpt-4o, 128k) compact before they overflow. A streamed compaction item is sent back exactly as a non-streamed response would carry it, and a 400 on it resends the request once without the item.
- Many agents in one process. An
Agentraises a low soft open-file limit tomin(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). - Proxied gpt-6-luna.
ChatOpenAI('gpt-6-luna', base_url=...)getsreasoning_effort='none'on any host, so tools work behind a proxy. - Pages with workers.
wait_for_network_idle()no longer waits for Web Worker scripts and cross-site iframes, which ran it to its 10 s cap. - Dialogs. A navigation held by a
beforeunloadprompt, or a screenshot with a JS dialog open, names the dialog within seconds. - keep_alive. A run after a dead browser daemon continues in the agent's tab, not on
about:blank.
Benchmark
BU Bench v2, 60 tasks x 3 reps, cloud browsers, 2026-11-09.
| 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 |
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 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
- Every dependency is pinned exactly (
==), 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 ofpydantic,pydantic-ai-slim,mcp,google-genai,pillowor another pinned package cannot install 1.0 next to it. Tell us which pin blocks you. google-genaistays below 3: 3.0.0 calls the Gemini API on v1, which rejects tools. This goes away once Pydantic AI supports it.- Viewport emulation does not work on cloud browsers yet. Use
Browser('chromium')for another viewport.
Report problems at https://github.com/browser-use/browser-use/issues
Full changelog: 0.13.14...1.0.0
