Production data analysis (BU2, 24h) shows:
- 36.5% of consecutive failures are AsyncIO CancelledError in get_browser_state_summary
- Complex pages can take 30-60s for DOM extraction alone
- 30s timeout was too aggressive for heavy pages
60s provides 2x buffer while still catching genuinely stuck requests.
Can be overridden via TIMEOUT_BrowserStateRequestEvent env var.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
<!-- This is an auto-generated description by cubic. -->
## Summary by cubic
Bumped browser-use version from 0.11.4 to 0.11.5 in pyproject.toml to
publish the latest patch.
<sup>Written for commit 93fd57258e.
Summary will update on new commits.</sup>
<!-- End of auto-generated description by cubic. -->
Continuation of
[#3801](https://github.com/browser-use/browser-use/pull/3801) by
@Mr-Neutr0n - removed test and resolved lint. Resolves
[#3726](https://github.com/browser-use/browser-use/issues/3726) and
[#3865](https://github.com/browser-use/browser-use/issues/3865).
<!-- This is an auto-generated description by cubic. -->
---
## Summary by cubic
Stop sending screenshots to the judge LLM when use_vision=False to
prevent sensitive data leakage. Resolves#3726 and #3865.
- **Bug Fixes**
- Added use_vision param to construct_judge_messages() and respected it.
- Skipped screenshot selection/encoding when use_vision is False.
- Passed settings.use_vision from _judge_trace() to
construct_judge_messages(); True/'auto' still include images.
<sup>Written for commit b00ffd5380.
Summary will update on new commits.</sup>
<!-- End of auto-generated description by cubic. -->
<!-- This is an auto-generated description by cubic. -->
## Summary by cubic
Adds the bu-2-0 premium model with explicit pricing and SDK support. You
can now select it via llm.bu_2_0 or ChatBrowserUse(model='bu-2-0').
- New Features
- Added bu-2-0 pricing (input/output/cache) to CUSTOM_MODEL_PRICING.
- Exposed bu_2_0 in browser_use.llm.models and listed it in
ChatBrowserUse options.
- Updated example to use bu-2-0; corrected bu-1-0 pricing comments.
<sup>Written for commit c011c529fc.
Summary will update on new commits.</sup>
<!-- End of auto-generated description by cubic. -->
Continuation of
[#3896](https://github.com/browser-use/browser-use/pull/3896) by
@Jacky040124 - condensed comments to match codebase style. Resolves
#3889.
<!-- This is an auto-generated description by cubic. -->
---
## Summary by cubic
Fixes Draft.js editors dropping the first typed character. Detects
Draft.js (class includes DraftEditor or
data-contents/data-block/data-offset-key) and prepends a sacrificial
space only when the input is cleared first, so the space is consumed and
the intended text is preserved.
<sup>Written for commit c62ceafa25.
Summary will update on new commits.</sup>
<!-- End of auto-generated description by cubic. -->
<!-- This is an auto-generated description by cubic. -->
## Summary by cubic
Set Gemini thinking to auto by default. Align thinking config per model
(Gemini 3 Pro, 3 Flash, 2.5) for better defaults and fewer
misconfigurations.
- **Refactors**
- Gemini 3 Pro: uses thinking_level only, defaults to low; warns on
thinking_budget and on minimal/medium.
- Gemini 3 Flash: supports both; uses thinking_level if set, else
thinking_budget = -1.
- Gemini 2.5: uses thinking_budget only, default -1; warns if
thinking_level is set.
- Example: simplified ChatBrowserUse usage by removing explicit model.
<sup>Written for commit ee35b53b12.
Summary will update on new commits.</sup>
<!-- End of auto-generated description by cubic. -->
## Summary
* Fixes `dropdown_options` failing on ARIA combobox elements with
dynamically rendered options.
* Adds proper handling for `aria-controls`-linked listboxes and expands
collapsed comboboxes before extraction.
## Changes
### Updated handler in `default_action_watchdog.py`:
* Detects `role="combobox"` with `aria-controls`.
* Expands the combobox via dispatched focus/click events.
* Waits briefly for dynamic options to render.
* Resolves the listbox by `aria-controls` and extracts
`[role="option"]`.
* Returns structured results consistent with existing dropdown output.
Addresses issue #3694
<!-- This is an auto-generated description by cubic. -->
---
## Summary by cubic
Fixes dropdown option extraction for ARIA comboboxes with dynamic menus
by expanding the control and reading options from its aria-controls
listbox. Resolves#3694 and restores reliable dropdown_options behavior
for ARIA patterns.
- **Bug Fixes**
- Detect role="combobox" with aria-controls and use a dedicated handler.
- Expand collapsed comboboxes (focus/click/mousedown) and wait for
dynamic options.
- Read options from the controlled listbox ([role="option"], with li
fallback), return consistent output, then collapse.
- Keep generic dropdown logic scoped to menu/listbox (combobox handled
separately).
- Clear error messages and logging when listbox or options are missing.
<sup>Written for commit 7cf8575e4a.
Summary will update on new commits.</sup>
<!-- End of auto-generated description by cubic. -->
<!-- This is an auto-generated description by cubic. -->
## Summary by cubic
Always index scrollable dropdown containers so they can be targeted by
select_dropdown, even when they contain interactive descendants.
Addresses #3538.
- **Bug Fixes**
- Detect dropdowns by role (listbox, menu, combobox, menubar, tree,
grid), tag (select), or common classes (dropdown, dropdown-menu,
select-menu, Semantic UI “ui dropdown”).
- Leave other scrollable elements unchanged: only indexed when they have
no interactive descendants.
<sup>Written for commit 7bacbbbfa2.
Summary will update on new commits.</sup>
<!-- End of auto-generated description by cubic. -->
Resolves#2867.
The select_dropdown action was claiming success even when frameworks
like Wix intercepted and reverted the programmatic selection. The agent
would report task completion, but the dropdown value remained unchanged.
- Added verification after setting selection - checks if `element.value
=== expectedValue`
- If framework reverted the value, try click-based fallback (mousedown
-> selectedIndex -> click option -> mouseup -> change)
- If both methods fail, properly report the error instead of claiming
success
- Agent can then recover by clicking visible option elements directly
Only affects native `<select>` elements in
`on_SelectDropdownOptionEvent`. ARIA/custom dropdowns already use
click-based selection.
<!-- This is an auto-generated description by cubic. -->
---
## Summary by cubic
Fixes dropdown selection reliability by verifying the final value and
retrying with a click-based fallback when frameworks revert programmatic
changes. Aligns with #2867 so the agent no longer claims success when
the value doesn’t stick.
- **Bug Fixes**
- Verify selection after setting (element.value === expectedValue).
- If reverted, use click-based fallback (focus, mousedown, set
selectedIndex, click option, mouseup, change, blur).
- If both methods fail, return a clear error so the agent can recover.
- Provide target option and available options when a revert is detected
to aid recovery.
- Scope: affects native <select> in on_SelectDropdownOptionEvent;
ARIA/custom dropdowns unchanged.
<sup>Written for commit 6f8c077932.
Summary will update on new commits.</sup>
<!-- End of auto-generated description by cubic. -->
<!-- This is an auto-generated description by cubic. -->
## Summary by cubic
Removed the duplicate --headed flag from the open subcommand so the
global --headed option is respected. Fixes the parsing bug tracked in
issue #3931.
- **Bug Fixes**
- Removed the open subcommand’s --headed arg that was shadowing the
global flag.
- Added tests to verify --headed works before subcommands, with
--session and --browser, and defaults to False.
<sup>Written for commit acd05e30e0.
Summary will update on new commits.</sup>
<!-- End of auto-generated description by cubic. -->
fixes: #3292
This pull request fixes an issue where table rows (<tr>) and table cells
(<td>) were not being recognized as interactive elements by the
ClickableElementDetector, even when they explicitly defined appropriate
ARIA roles such as role="row" or role="gridcell". Because of this
limitation, the agent was unable to click on interactive rows and cells
in many real-world table and data-grid implementations.
To address this, changes were made in
browser_use/dom/serializer/clickable_elements.py. The roles row, cell,
and gridcell were added to the interactive_roles set, which checks roles
defined via HTML attributes, and also to the interactive_ax_roles set,
which checks roles derived from the Accessibility Tree. This ensures
that both DOM-level role definitions and accessibility-level roles are
consistently treated as interactive when appropriate.
The motivation for this change comes directly from user reports in issue
#3292, where interactive table rows in data grids and tables could not
be clicked by the agent. The previous logic only allowed a narrow set of
roles (such as buttons or links), incorrectly filtering out rows and
cells despite their widespread use as interactive components in modern
web applications.
The fix was verified in two ways. First, an isolated test script was
created to confirm that ClickableElementDetector.is_interactive()
correctly returns True for mocked EnhancedDOMTreeNode objects with roles
set to row and gridcell. Second, full regression testing was performed
by running the entire tests/ci/browser/test_dom_serializer.py test
suite. All tests passed successfully, confirming that the added roles do
not break existing DOM serialization behavior or introduce unintended
interactive elements.
<!-- This is an auto-generated description by cubic. -->
---
## Summary by cubic
Fixes#3292 by treating table rows and cells with ARIA roles as
interactive so the agent can click them in data grids and tables.
- **Bug Fixes**
- Added 'row', 'cell', and 'gridcell' to interactive_roles and
interactive_ax_roles in clickable_elements.py.
- Verified with an isolated test and the dom serializer test suite; no
regressions.
<sup>Written for commit 468d149588.
Summary will update on new commits.</sup>
<!-- End of auto-generated description by cubic. -->
Fixes#3742.
- detect labels without `for` that wrap form controls (up to 2 levels,
e.g. label > span > input)
- skip labels with `for` to avoid double activation
- allow span wrappers that contain form controls
- add AntD-like radios to DOM serializer test page and assert
detection/clicks
Tests:
- uv run pytest tests/ci/browser/test_dom_serializer.py -q
<!-- This is an auto-generated description by cubic. -->
---
## Summary by cubic
Detects AntD-style label/span wrappers around form controls so the DOM
serializer treats them as interactive and clicks them correctly, while
avoiding double activation on labels with a “for” attribute.
- **Bug Fixes**
- Detect labels without “for” that wrap inputs within 2 levels (label >
span > input).
- Skip labels with “for” to prevent double-clicking external inputs.
- Treat span wrappers with nested form controls as interactive.
<sup>Written for commit 794b68b448.
Summary will update on new commits.</sup>
<!-- End of auto-generated description by cubic. -->
Uses CDP Runtime.evaluate with includeCommandLineAPI to access
getEventListeners() and mark elements with click/mousedown/pointerdown
listeners before DOM snapshot capture. Fixes#958.
<!-- This is an auto-generated description by cubic. -->
---
## Summary by cubic
Detects JavaScript click/mouse listeners via CDP and treats those
elements as clickable during the DOM snapshot. Resolves#958 and
captures React/Vue/Angular click handlers without mutating the page.
- **New Features**
- Use Runtime.evaluate (includeCommandLineAPI) with getEventListeners()
to collect element refs, resolve to backend node IDs, and flag nodes as
has_js_click_listener.
- Update clickable element serializer to treat flagged nodes as
interactive.
<sup>Written for commit 1794849886.
Summary will update on new commits.</sup>
<!-- End of auto-generated description by cubic. -->
uses CDP Runtime.evaluate with includeCommandLineAPI to access getEventListeners() and mark elements with click/mousedown/pointerdown listeners before DOM snapshot capture
Use separate system prompts for Opus 4.5 and Haiku 4.5 that are at least
4096 tokens (which is the token minimum for both models' input caching),
enabling input caching and notably reducing cost.
<!-- This is an auto-generated description by cubic. -->
---
## Summary by cubic
Enable input caching for Claude Opus 4.5 and Haiku 4.5 by switching to
dedicated 4096+ token system prompts. This lowers cost and improves
performance for these models.
- **New Features**
- Detect Opus/Haiku 4.5 variants and load long system prompts (standard,
flash, no-thinking).
- Add 4096+ token templates: system_prompt_anthropic.md,
system_prompt_anthropic_flash.md,
system_prompt_anthropic_no_thinking.md.
- Pass model_name to SystemPrompt to drive correct template selection.
<sup>Written for commit f85bbb49c8.
Summary will update on new commits.</sup>
<!-- End of auto-generated description by cubic. -->
Resolves [#3557](https://github.com/browser-use/browser-use/issues/3557)
and similar issues. extract_clean_markdown() does extract DOM elements
not visible; its extraction was just being overly truncated.
<!-- This is an auto-generated description by cubic. -->
---
## Summary by cubic
Increased the extraction character limit from 30,000 to 100,000 to
prevent valid content from being cut off during markdown extraction.
Resolves#3557 by allowing full page content (including non-visible DOM
elements) to be returned without premature truncation.
<sup>Written for commit 80a08a4a03.
Summary will update on new commits.</sup>
<!-- End of auto-generated description by cubic. -->
<!-- CURSOR_SUMMARY -->
---
> [!NOTE]
> **Increase extraction capacity**
>
> - Bumps `MAX_CHAR_LIMIT` in `extract()` (in
`browser_use/tools/service.py`) from `30000` to `100000` to allow larger
page content to be processed without truncation.
>
> *Effect:* fewer cut-offs when extracting long pages; may increase
processing time/token usage.
>
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
80a08a4a03. 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 thinking_level support for Gemini 3 (Pro and Flash) with safe
defaults and warnings to prevent misconfiguration.
- **New Features**
- Adds thinking_level for Gemini 3; Pro supports low/high (default low),
Flash supports minimal/low/medium/high (default minimal).
- Uses thinking_level for Gemini 3 and thinking_budget for Gemini
2.5/flash.
- Warns on unsupported configs (budget on 3, level on 2.5); falls back
to low if minimal/medium set on 3 Pro.
- Sets thinking_budget=0 by default for Gemini 2.5/flash when not
provided.
- **Migration**
- For Gemini 3, use thinking_level (Pro: low/high; Flash:
minimal/low/medium/high); stop using thinking_budget.
- For Gemini 2.5/flash, use thinking_budget (0 disable, -1 dynamic, or
token count).
<sup>Written for commit b63ae37008.
Summary will update on new commits.</sup>
<!-- End of auto-generated description by cubic. -->