## Summary
Remove `litellm` from `pyproject.toml` dependencies entirely.
`ChatLiteLLM` wrapper is kept but requires manual installation:
```
pip install litellm
```
## What changed
- **pyproject.toml**: `litellm==1.82.2` removed from core dependencies
- **browser_use/llm/litellm/chat.py**: Added docstring noting manual
install requirement, added `# type: ignore` for pyright since litellm is
no longer in the environment
- **ChatLiteLLM stays in the public API** — it already lazy-imports
litellm inside methods, so users who don't use it are never affected
## Context
litellm versions 1.82.7 and 1.82.8 were backdoored on March 24, 2026 by
TeamPCP via a compromised Trivy CI/CD pipeline. `browser-use==0.12.3`
shipped `litellm>=1.82.2` (unpinned) as a core dependency, and BigQuery
analysis shows ~6,900 installs pulled the backdoored litellm during the
4-hour attack window.
By removing it from dependencies entirely, `pip install browser-use` no
longer pulls litellm, and browser-use will not appear in litellm's
dependency graph.
## References
- [TeamPCP Backdoors LiteLLM — The Hacker
News](https://thehackernews.com/2026/03/teampcp-backdoors-litellm-versions.html)
- [LiteLLM infected via Trivy — The
Register](https://www.theregister.com/2026/03/24/trivy_compromise_litellm/)
<!-- CURSOR_SUMMARY -->
---
> [!NOTE]
> **Medium Risk**
> Medium risk because removing `litellm` from required dependencies can
break existing installs that relied on `ChatLiteLLM` working
out-of-the-box; runtime imports now require manual installation.
>
> **Overview**
> Stops installing `litellm` as a core dependency (and bumps the package
version to `0.12.5`), requiring users to install it explicitly when
using the LiteLLM integration.
>
> Keeps `ChatLiteLLM` but adds a module docstring documenting the manual
install and updates `litellm` imports with `# type: ignore` to avoid
type-check failures when `litellm` is absent.
>
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
d4b9e30188. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
litellm versions 1.82.7 and 1.82.8 were backdoored on March 24, 2026
by TeamPCP via a compromised Trivy CI/CD pipeline. browser-use 0.12.3
shipped litellm>=1.82.2 (unpinned) as a core dependency, exposing
~6,900 users to the backdoored versions during the 4-hour window.
This commit:
- Removes litellm entirely from pyproject.toml (core and optional)
- Keeps ChatLiteLLM wrapper intact with a docstring noting
`pip install litellm` is required separately
- litellm is already lazy-imported inside methods, so users who
don't use ChatLiteLLM are never affected
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Fixes bug where `browser-use` CLI installation failed if the user had
installed via curl and note Homebrew.
`install_uv` checked `command -v uv` before adding `~/.local/bin` to
PATH. This worked for Homebrew but not for curl-based installs, because
Homebrew installs to a directory already in PATH.
<!-- This is an auto-generated description by cubic. -->
---
## Summary by cubic
Fixes `browser-use` CLI installs failing when `uv` was installed via the
curl script, and makes the installer script executable. We now add
common `uv` paths to PATH before detection so it works for both curl and
Homebrew installs.
- **Bug Fixes**
- Prepend `$HOME/.local/bin` and `$HOME/.cargo/bin` to PATH before
`command -v uv`; drop the redundant export after install.
- Mark `browser_use/skill_cli/install.sh` as executable so it can run
directly.
<sup>Written for commit fae8036728.
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
Bump the `browser-use` package version from 0.12.2 to 0.12.3 in
`pyproject.toml` to prepare the 0.12.3 release.
<sup>Written for commit 45bff34a18.
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
Tightens CI workflow permissions and addresses dependency advisories to
reduce risk.
- **Security**
- Set `permissions: contents: read` for `install-script`, `lint`, and
`package` workflows; set `permissions: {}` for `cloud_evals`.
- **Dependencies**
- Removed unused `authlib`; bumped `pypdf` to `6.9.1` and `pillow` to
`12.1.1`.
<sup>Written for commit 3cd7841052.
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
Fixes broken extension loading on Chrome 145+ by migrating defaults to
Manifest V3 and removing Chrome flags that block unpacked extensions.
Extensions now load reliably in MV3-only environments.
- **Bug Fixes**
- Stopped passing flags that block extensions on 145+
(`--disable-component-extensions-with-background-pages`,
`--test-type=gpu`).
- Replaced MV2 `uBlock Origin` with MV3 `uBlock Origin Lite`; removed
`ClearURLs` (MV2).
- Added a manifest check to skip MV2 extensions and log a warning.
<sup>Written for commit 29da480659.
Summary will update on new commits.</sup>
<!-- End of auto-generated description by cubic. -->
New skill providing documentation reference for writing Python code
against the browser-use library and making Cloud REST API calls.
Condensed from CLOUD.md (2700 lines of OpenAPI YAML → 530 lines of
tables) and AGENTS.md (1021 lines → 762 lines with markup stripped and
sections deduplicated).
<!-- This is an auto-generated description by cubic. -->
---
## Summary by cubic
Adds two skills, `open-source` and `cloud`, with focused docs for the
`browser-use` Python library and Cloud APIs/SDKs. Replaces the old
combined docs skill with granular references, a v2/v3 API split with
REST examples, and three integration guides.
- **New Features**
- Split into `skills/open-source/*` (quickstart, models,
agent/browser/tools/actor, integrations/MCP, monitoring, examples) and
`skills/cloud/*` (quickstart/pricing/FAQ, v2 REST and v3 Agent API,
direct CDP browser API, sessions/profiles/1Password, features,
patterns).
- Added guides: chat UI (v3 with `liveUrl`), subagent (Cloud SDK), and
tools integration; removed open‑source imports from cloud guides.
Deleted the old `browser-use-docs` skill. Updated routing for separate
v2/v3 API files.
- Expanded v3 docs with full REST endpoints and polling, plus CDP
discovery and auto‑lifecycle details in the browser API.
- **Bug Fixes**
- v2 file upload now uses multipart POST with presigned form fields;
examples include all returned fields.
- Agent and timing fixes: defaults updated (`max_actions_per_step=5`,
`max_failures=5`, `use_vision=True`, `step_timeout=180`), `llm_timeout`
auto‑detection, `max_steps=500` (was 100), and NavigateToUrl timeout 30s
(was 15s).
- Provider/env fixes and docs polish: correct `ChatVercel`
(`provider_options.gateway`) and `AI_GATEWAY_API_KEY`; use `uv pip
install browser-use-sdk`; add `try/finally` cleanup and guard
`pw.stop()`; define `session.id` before uploads; add missing `await` on
`get_usage_summary()`; distinct MCP server name; fix TOC anchor and
relative link; set full v3 base URL; wrap chat‑ui Python example in
`async def main()` with `asyncio.run()` (removed duplicate sleep).
- Cloud corrections: v3 pricing updated (BU Mini output $4.20, BU Max
$18.00); Selenium `debugger_address` now strips `/devtools/browser/`
suffix; webhooks use `type`/`payload` with 5‑min replay protection and
sorted‑key signature verification.
- Selenium CDP connection examples now handle `wss://` URLs correctly;
webhook examples add a JSON parse guard.
<sup>Written for commit 318eb3b41e.
Summary will update on new commits.</sup>
<!-- End of auto-generated description by cubic. -->
- subagent.md: fix TOC anchor to match renamed heading (#python-agents-cloud-sdk)
- subagent.md: fix relative link to ../features.md from guides/ subdir
- SKILL.md: use full v3 base URL instead of .../api/v3
…back
- AGI-569: after any click that opens a new tab, automatically dispatch
SwitchTabEvent so the agent lands on the new page immediately instead of
requiring a manual switch step (~877 occurrences)
- AGI-548: for <input type="checkbox/radio">, capture checked state
before the CDP mouse click and verify it toggled afterward; if unchanged
(custom-styled or shadow-DOM-backed inputs), fall back to JS
element.click() and report the final checked state in metadata (~1,241
occurrences)
<!-- This is an auto-generated description by cubic. -->
---
## Summary by cubic
Automatically switch to newly opened tabs after clicks and make
checkbox/radio interactions reliable with a JS fallback. Addresses
AGI-569 and AGI-548 to improve navigation flow and form handling.
- **Bug Fixes**
- Auto-switch to new tabs: detect a new tab after a click and dispatch
`SwitchTabEvent`; on failure, add a note to manually switch.
- Checkbox/radio reliability: capture pre-click checked state; if the
CDP click doesn’t toggle, fall back to `element.click()` and include the
final `checked` state in metadata.
<sup>Written for commit 4a65aea6a9.
Summary will update on new commits.</sup>
<!-- End of auto-generated description by cubic. -->
- agent.md: fix llm_timeout docs to match auto-detection logic (Groq 30s,
Gemini 75s, o3/Claude/DeepSeek 90s, default 75s)
- examples.md: guard pw.stop() with None check to prevent UnboundLocalError
- api-v2.md: show all S3 presigned form fields in upload example
<!-- This is an auto-generated description by cubic. -->
## Summary by cubic
Make cross-origin iframe indexing reliable so elements inside them are
included consistently. Handles dynamic iframes and target-attachment
races to prevent missing content during DOM builds.
- **Bug Fixes**
- Fallback to matching iframes by sanitized `src` when `frameId` is
missing or not yet in `all_frames`.
- Use `frameTargetId` directly; fetch details via `get_target()` when
available and fall back to frame metadata if not.
- Remove race in target tracking by creating/updating `Target` inside
the same lock as `_target_sessions`.
- Skip detached targets in `get_all_frames()` by catching `ValueError`,
and wrap iframe DOM recursion in try/except to avoid failing the whole
tree.
<sup>Written for commit 03de83a069.
Summary will update on new commits.</sup>
<!-- End of auto-generated description by cubic. -->
- models.md: fix ChatVercel provider_options and env var (AI_GATEWAY_API_KEY)
- examples.md: add try/finally for browser cleanup in parallel and playwright examples
- agent.md: fix defaults to match source (max_actions_per_step=5, max_failures=5,
use_vision=True, llm_timeout=60, step_timeout=180)
- features.md: fix undefined session_id in workspace example
- monitoring.md: add missing await on get_usage_summary()
- api-v2.md: fix upload flow to use multipart POST with fields (S3-style)
- SKILL.md: use uv pip for cloud SDK install
- integrations.md: use distinct MCP server name for docs endpoint