Skip to main content
1.0 replaces the engine. The agent no longer picks one action per step from a DOM dump: it writes Python in a persistent REPL with browser-harness helpers and raw CDP, on Pydantic AI. The common surface (Agent, Browser, Tools, run(), final_result()) still works. Anything 1.0 can’t honor raises a clear error before a browser starts or anything is billed, never a silent no-op. A removed feature raises <feature> was removed in browser-use 1.0, plus the 1.0 alternative when there is one and a link to the migration guide. The exception: a few tuning knobs that can’t change the result (use_vision=True, flash_mode, use_thinking, …) log one warning and are ignored.

Stay on 0.x

Pin it:
With uv: uv add 'browser-use<1'. In requirements.txt or pyproject.toml: browser-use<1. The 0.x docs are under Legacy (0.x).

What changed and why

In 0.x the model read an indexed DOM dump and picked one action, like click(index=12), for a local Chromium. In 1.0 the model reads the output of its last cell and writes the next Python cell, which the REPL runs with browser helpers and raw CDP against a cloud browser by default. Agent, Browser, Tools, run() and final_result() keep working. In 0.x the model read an indexed DOM dump and picked one action, like click(index=12), for a local Chromium. In 1.0 the model reads the output of its last cell and writes the next Python cell, which the REPL runs with browser helpers and raw CDP against a cloud browser by default. Agent, Browser, Tools, run() and final_result() keep working.

Common errors

  • MissingAPIKeyError: The default model (bu-fast) needs a Browser Use API key (or Browser() (a Browser Use Cloud browser) needs a Browser Use API key): the default model and Browser() are Browser Use Cloud now. Set BROWSER_USE_API_KEY (create a key at cloud.browser-use.com/new-api-key) or run browser-use login, or stay local: Agent(task, llm=ChatOpenAI(...), browser=Browser('chromium')).
  • ValueError: Browser() (a cloud browser) does not take headless=: headless, executable_path and user_data_dir are for local browsers. Use Browser('chromium', headless=True).
  • TypeError: Agent(<option>=...) was removed in browser-use 1.0: an option 1.0 dropped. The message names the replacement when there is one; the tables below list them all.
  • TypeError: Agent(max_steps=...) is not an option: pass it to agent.run(max_steps=...).
  • ValueError: bu-2-0 needs browser-use<1.0: the 0.x gateway models are gone. Use bu-fast, or stay on 0.x.
  • BrowserConfigError: No Chrome profiles match 'Gaming'. Your profiles: ...: profile= (or cloud_profile_id=) names no profile. It is a ValueError, raised from run() before a browser starts.
  • ModuleNotFoundError / ImportError on a 0.x import: the message names the 1.0 replacement. Import from the top level: from browser_use import Agent, Browser, Tools, ActionResult, ChatOpenAI, ....

The ten most common 0.x patterns

The 0.x snippets are written for browser-use 0.13.14. Run as is on 1.0, each one either works or raises before a browser starts, naming the fix.

1. Your own model

0.x launched a local browser by default. 1.0 starts a cloud browser, so add Browser('chromium') to stay local. max_steps still goes to run().

2. The Browser Use model

ChatBrowserUse() meant bu-2-0 on the 0.x gateway. On 1.0 it is bu-fast on the new gateway, and it is the default, so you can drop llm=. bu-2-0, bu-1-0, bu-2-0-mini-preview and bu-latest raise: they need 0.x.

3. BrowserProfile and BrowserSession

Pass the options to Browser(...). headless, user_data_dir, executable_path and the domain lists are kept. Window size, viewport and user agent are said in the task.

4. Your Chrome profile

Browser('chrome', profile='Default') launches a new Chrome on a temporary copy of that profile (its display name or directory): your logins, sync off, nothing written back. Browser('chrome') attaches to the Chrome you have open instead (turn on chrome://inspect/#remote-debugging once and click Allow). See Browsers.

5. Cloud browsers

Browser() is a cloud browser now; use_cloud=True still works. cloud_profile_id, cloud_proxy_country_code and cloud_timeout are kept.

6. Custom tools

@tools.action is kept. Injected parameters (browser_session, page_extraction_llm, file_system, …) are gone: a tool gets only what the model passes, and the model drives the browser itself. Return a string, any JSON-able value or ActionResult(extracted_content=...).

7. Structured output

output_model_schema is kept. Read the typed instance from result.structured_output instead of parsing final_result().

8. Logins with sensitive_data

Unchanged. The model types a value with type_secret('x_pass') and never sees it. The 0.x <secret>x_pass</secret> placeholder is no longer replaced: code that sends it to a page raises, naming type_secret. See Secrets.

9. Follow-up tasks on one browser

keep_alive=True and add_new_task() are kept. Stop the browser with await browser.stop(); kill() and close() do the same.

10. Step hooks and history

There are no per-step actions in 1.0, so on_step_start / on_step_end and history.urls(), action_names() and the like are gone. Each step logs one line to logging.getLogger('browser_use'), and result.messages holds the full transcript. See Long tasks: Live progress.

Agent

Every 0.x Agent(...) argument, method and attribute. Removed arguments raise TypeError, removed methods and attributes raise AttributeError, both naming the 1.0 replacement. “Dropped” means there is none.

Result

run() still returns an AgentHistoryList.

Browser

Browser, BrowserSession and BrowserProfile are one class now: Browser. Importing BrowserSession, BrowserProfile, BrowserConfig, BrowserContext or BrowserContextConfig raises. See Browsers.

Models

Importing a removed class raises an ImportError that names its replacement. See Models.

Tools

See Tools.

Removed modules

Every 0.x module 1.0 does not have, and every 0.x name a kept module lost, raises an error naming the replacement: ModuleNotFoundError for a module, ImportError for a name. Both are ImportError, so except ImportError fallbacks still work. Import from the top level: from browser_use import Agent, Browser, Tools, ActionResult, ChatBrowserUse, ChatOpenAI, ChatAnthropic, ChatGoogle.

CLI and MCP

The CLI still runs piped Python, and browser-use skill install and browser-use --cli-mcp work as before. New: browser-use login / logout and a browser_login MCP tool. browser-use run, init and the 0.x subcommands (open, state, click, …) print what replaced them. The 0.x browser-use --mcp server ran the removed engine. --mcp now prints a deprecation notice and serves the --cli-mcp tools (browser_exec, browser_screenshot, browser_login) on its own temporary Chromium. The old tool names (browser_navigate, browser_click, browser_type, browser_get_state, browser_extract_content, browser_get_html, browser_scroll, browser_go_back, browser_list_tabs, browser_switch_tab, browser_close_tab, retry_with_browser_use_agent, browser_list_sessions, browser_close_session, browser_close_all) return an error that points to browser_exec. Switch clients to --cli-mcp:
See Browser Use CLI and MCP server.

Environment variables

The same guide, with every detail of domain restrictions and the secrets trust model, is MIGRATING.md in the repo.