fixes#3463
<!-- This is an auto-generated description by cubic. -->
---
## Summary by cubic
Update README FAQ to reflect the new custom tools API. The example now
uses browser_use.Tools with @tools.action and passes tools=tools to
Agent, replacing the old Tool decorator and use_custom_tools parameter.
<sup>Written for commit ea1f614cd5.
Summary will update automatically on new commits.</sup>
<!-- End of auto-generated description by cubic. -->
<!-- CURSOR_SUMMARY -->
---
> [!NOTE]
> <sup>[Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) is
generating a summary for commit
a8f70b2b3b. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
fixes#3268
<!-- This is an auto-generated description by cubic. -->
---
## Summary by cubic
Improves OpenAI error handling with clearer messages and typed
rate-limit errors. Fixes#3268.
- **Bug Fixes**
- Raise ModelRateLimitError on rate limits for better retry handling and
logging.
- Simplify API error mapping by using SDK-provided message/status
instead of manual JSON parsing.
<sup>Written for commit 687f166a29.
Summary will update automatically on new commits.</sup>
<!-- End of auto-generated description by cubic. -->
Auto-generated PR for: change example
<!-- CURSOR_SUMMARY -->
---
> [!NOTE]
> Updates the agentmail 2FA example to use ChatBrowserUse for the LLM
and adds an asyncio entrypoint.
>
> - **Examples**:
> - **`examples/integrations/agentmail/2fa.py`**:
> - Switch LLM from `models.azure_gpt_4_1_mini` to `ChatBrowserUse`;
update import accordingly.
> - Add asyncio entrypoint with `asyncio.run(main())`; import `asyncio`.
>
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
857182c042. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
<!-- This is an auto-generated description by cubic. -->
## Summary by cubic
Adds sandboxed remote code execution with SSE streaming and first-class
cloud browser parameters (profile, proxy country, timeout) to simplify
remote runs and cloud configuration. Also replaces legacy globals with a
client-based flow and updates docs, examples, and tests.
- **New Features**
- Remote execution: @sandbox decorator packages code and closures via
cloudpickle, streams logs/results via SSE, and supports callbacks
(browser created, instance ready, log, result, error).
- Cloud browser params: Pass cloud_profile_id, cloud_proxy_country_code,
and cloud_timeout directly to Browser/BrowserSession (auto-enables
use_cloud). Supports extra headers on create/stop.
- Typed event models for SSE, type-preserving result parsing
(Pydantic/dataclasses/enums), and a new AgentHistoryList.load_from_dict
helper.
- **Migration**
- Replace get_cloud_browser_cdp_url/stop_cloud_browser_session with
CloudBrowserClient().create_browser(CreateBrowserRequest(...)) and
stop_browser().
- Prefer cloud_* params over cloud_browser; cloud_browser remains as
alias for use_cloud.
- Set BROWSER_USE_API_KEY for remote/cloud usage; update imports to use
browser_use.browser.cloud.cloud and browser_use.browser.cloud.views.
- New dependency: cloudpickle.
<sup>Written for commit 0159108e11.
Summary will update automatically on new commits.</sup>
<!-- End of auto-generated description by cubic. -->
<!-- This is an auto-generated description by cubic. -->
## Summary by cubic
Set README images to default to light mode by switching <img> fallbacks
to the light assets. Ensures correct rendering on PyPI, which forces
light mode and strips theme detection.
<sup>Written for commit a4f76e40c4.
Summary will update automatically on new commits.</sup>
<!-- End of auto-generated description by cubic. -->
1.support unicode characters in filenames and improve path handling.
2.fixed path validation failures in Windows OS environments.
<!-- This is an auto-generated description by cubic. -->
---
## Summary by cubic
Adds Unicode filename support and fixes Windows path validation by
matching only the base file name, improving cross-platform path
handling.
- **Bug Fixes**
- Expanded filename regex to include CJK characters.
- Use os.path.basename in validation to avoid rejecting full paths on
Windows.
<sup>Written for commit f46ee16. Summary will update automatically on
new commits.</sup>
<!-- End of auto-generated description by cubic. -->
<!-- CURSOR_SUMMARY -->
---
> [!NOTE]
> Support CJK characters in filenames and validate only the base name to
avoid Windows path validation issues.
>
> - **Filesystem**:
> - **Filename validation**: Expand regex to include CJK range
(`\u4e00-\u9fff`) and apply it to `os.path.basename(file_name)` to avoid
rejecting full paths, improving Windows compatibility.
>
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
f46ee167da. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
Closes#3263
<!-- This is an auto-generated description by cubic. -->
---
## Summary by cubic
Adds support for an extra_body parameter in ChatOpenRouter to pass
custom request fields to OpenRouter API calls. This adds flexibility for
provider-specific options and fulfills Linear #3263.
- **New Features**
- Added extra_body field to ChatOpenRouter and spread it into ainvoke
requests.
- Default is None, so no breaking changes.
<sup>Written for commit 7e477ea. Summary will update automatically on
new commits.</sup>
<!-- End of auto-generated description by cubic. -->
<!-- CURSOR_SUMMARY -->
---
> [!NOTE]
> <sup>[Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) is
generating a summary for commit
f54d0929b1. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
<!-- This is an auto-generated description by cubic. -->
## Summary by cubic
Switch template generation to a GitHub-backed template-library, fetching
templates and manifests at runtime for instant updates. Refactors the
init command to create per-template projects, handle extra files
(including binaries), and show clear next steps.
- **New Features**
- Fetch template list and files from the template-library GitHub repo at
runtime.
- Manifest-driven generation: writes extra files, supports binaries, and
sets executables.
- Creates a per-template directory with main.py and displays next steps
(from manifest or defaults).
- Template selection via --list or interactive prompt with numeric
hotkeys.
- Graceful offline error with a clear message when GitHub is
unreachable.
- **Refactors**
- Removed local CLI templates (default, advanced, tools).
- Replaced hardcoded choices with dynamic discovery from templates.json.
- --template now accepts any manifest key (string), not a fixed set.
- Centralized GitHub fetch helpers; removed fallback templates.
<sup>Written for commit 24ec8e6. Summary will update automatically on
new commits.</sup>
<!-- End of auto-generated description by cubic. -->
- Remove local template files (advanced, default, tools)
- Fetch templates dynamically from template-library repo
- Add templates.json for dynamic template discovery
- Fetch both template list and content at runtime from GitHub
- Fall back to hardcoded FALLBACK_TEMPLATES for offline use
- Add binary file fetching support for PDFs and assets
- Enable instant template updates without code changes
Templates now managed in: https://github.com/browser-use/template-library
Benefits:
- Add new templates by editing template-library only
- Users get instant access without PyPI releases
- Cleaner separation of concerns
- No template files in main codebase
<!-- This is an auto-generated description by cubic. -->
## Summary by cubic
Adds first-class cloud browser parameters (profile, proxy country,
timeout) to Browser/BrowserSession and routes creation through
CloudBrowserClient. Updates docs and examples, and removes legacy global
helpers in favor of session-managed cleanup.
- **New Features**
- Pass cloud_profile_id, cloud_proxy_country_code, and cloud_timeout
directly to Browser/BrowserSession, or via cloud_browser_params.
- Auto-enables use_cloud when any cloud param is provided.
- BrowserSession now creates the cloud session via CloudBrowserClient
and sets cdp_url transparently.
- Docs and examples updated with parameter limits (free: 15 min, paid:
240 min) and supported proxy countries.
- **Migration**
- Removed get_cloud_browser_cdp_url and stop_cloud_browser_session. Use
CloudBrowserClient().create_browser(CreateBrowserRequest(...)) or set
cloud_* params on Browser.
- cloud_browser still works as an alias for use_cloud; prefer the new
cloud_* params moving forward.
<sup>Written for commit 9c88c5a. Summary will update automatically on
new commits.</sup>
<!-- End of auto-generated description by cubic. -->
Auto-generated PR for branch: fix-scroll
<!-- CURSOR_SUMMARY -->
---
> [!NOTE]
> Refines scrollable element interactivity to avoid conflicting
descendants and adds robust datepicker format metadata (including
AngularJS), plus minor write_file docs tweak.
>
> - **DOM Serialization (serializer.py)**:
> - Refines interactive indexing: only mark scrollable containers as
interactive when they have no interactive descendants
(`_has_interactive_descendants` + new logic in
`_assign_interactive_indices_and_mark_new_nodes`).
> - Enhances date/time input metadata: detects AngularJS
`uib-datepicker-popup` and adds `expected_format` and `format`; expands
jQuery/Bootstrap detection; preserves key attributes by protecting them
from deduplication.
> - **DOM Views (views.py)**:
> - Exposes new synthetic attributes in `DEFAULT_INCLUDE_ATTRIBUTES`:
`format`, `expected_format`.
> - **Tools (service.py)**:
> - Clarifies `write_file` action description with allowed
filename/extension formats.
>
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
ea784626e6. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->