8064 Commits

Author SHA1 Message Date
Mert Unsal 63004c624e Pyproject version bump (#3760)
Bump pyproject.toml version to 0.11.1.

---
[Slack
Thread](https://browser-use.slack.com/archives/D092QUQDC56/p1765582772365859?thread_ts=1765582772.365859&cid=D092QUQDC56)

<a
href="https://cursor.com/background-agent?bcId=bc-76ceb7a9-0457-4f46-bbf3-61004bef603d"><picture><source
media="(prefers-color-scheme: dark)"
srcset="https://cursor.com/open-in-cursor-dark.svg"><source
media="(prefers-color-scheme: light)"
srcset="https://cursor.com/open-in-cursor-light.svg"><img alt="Open in
Cursor"
src="https://cursor.com/open-in-cursor.svg"></picture></a>&nbsp;<a
href="https://cursor.com/agents?id=bc-76ceb7a9-0457-4f46-bbf3-61004bef603d"><picture><source
media="(prefers-color-scheme: dark)"
srcset="https://cursor.com/open-in-web-dark.svg"><source
media="(prefers-color-scheme: light)"
srcset="https://cursor.com/open-in-web-light.svg"><img alt="Open in Web"
src="https://cursor.com/open-in-web.svg"></picture></a>



<!-- This is an auto-generated description by cubic. -->
---
## Summary by cubic
Bumped the package version in pyproject.toml from 0.11.0 to 0.11.1 to
prepare the next patch release. This ensures the published artifact
reflects the latest changes.

<sup>Written for commit 06997afaa8.
Summary will update automatically on new commits.</sup>

<!-- End of auto-generated description by cubic. -->
0.11.1
2025-12-12 15:40:56 -08:00
Cursor Agent 06997afaa8 Bump version to 0.11.1
Co-authored-by: mailmertunsal <mailmertunsal@gmail.com>
2025-12-12 23:40:21 +00:00
Mert Unsal a0095f918e Fix structured output for sandboxes (#3759)
# Fix: `output_model_schema` not working with `@sandbox`

## Problem

When using `output_model_schema` with an Agent inside a `@sandbox`
decorated function, the `history.structured_output` property always
returned `None`.

```python
@sandbox()
async def my_task(browser: Browser) -> AgentHistoryList[MyModel]:
    agent = Agent(task="...", browser=browser, llm=llm, output_model_schema=MyModel)
    return await agent.run()

result = await my_task()
result.structured_output  # Always None ❌
```

## Root Cause

`AgentHistoryList` stores the output schema in `_output_model_schema` —
a **Pydantic private attribute** (underscore prefix). Private attributes
are **not serialized** when converting to JSON.

When sandbox executes remotely:

1. Agent runs and sets `history._output_model_schema = MyOutputModel` ✅
2. Result is serialized to JSON for transport → **private attribute
dropped** ❌
3. Client reconstructs `AgentHistoryList` but `_output_model_schema` is
`None`
4. `structured_output` property returns `None` (schema missing)

## Solution

### 1. Added `get_structured_output(output_model)` method

Users can explicitly pass their schema to parse the result:

```python
result.get_structured_output(MyModel)  # Works even without type annotation
```

### 2. Enhanced sandbox parsing for Pydantic generics

When return type is `AgentHistoryList[MyModel]`, the sandbox now:
- Detects Pydantic generic metadata via `__pydantic_generic_metadata__`
- Extracts the type parameter (`MyModel`)
- Auto-sets `_output_model_schema` on the reconstructed object

### 3. Fixed import extraction for Pydantic generics

The sandbox's import extraction wasn't detecting `AgentHistoryList` from
return types like `AgentHistoryList[MyModel]`, causing `NameError` on
remote execution.

## Usage

### Option 1: Generic return type (recommended)

```python
@sandbox()
async def task(browser: Browser) -> AgentHistoryList[MyModel]:
    agent = Agent(task="...", browser=browser, llm=llm, output_model_schema=MyModel)
    return await agent.run()

result = await task()
result.structured_output  # ✅ Works automatically
```

### Option 2: Non-generic return type with explicit method

```python
@sandbox()
async def task(browser: Browser) -> AgentHistoryList:
    agent = Agent(task="...", browser=browser, llm=llm, output_model_schema=MyModel)
    return await agent.run()

result = await task()
result.structured_output  # None (expected)
result.get_structured_output(MyModel)  # ✅ Works
```

## Files Changed

- `browser_use/agent/views.py` - Added `get_structured_output()` method
- `browser_use/sandbox/sandbox.py` - Enhanced
`_parse_with_type_annotation()` and `_get_imports_used_in_function()`
for Pydantic generics
- `tests/ci/test_sandbox_structured_output.py` - Unit tests
- `examples/sandbox/structured_output.py` - Example demonstrating both
approaches



<!-- This is an auto-generated description by cubic. -->
---
## Summary by cubic
Fixes structured output when agents run inside @sandbox.
structured_output now works with AgentHistoryList[Model], and a new
helper lets you parse results without type annotations.

- **Bug Fixes**
- Preserve output model schema in sandbox results by detecting Pydantic
generics and setting it on AgentHistoryList.
- Improve import extraction to include generic types like
AgentHistoryList[MyModel] and prevent NameError.
- Enhance _parse_with_type_annotation to reconstruct AgentHistoryList[T]
and set _output_model_schema correctly.

- **New Features**
- Added AgentHistoryList.get_structured_output(schema) to parse the
final result explicitly when no generic return type is used.

<sup>Written for commit 9b894150d5.
Summary will update automatically on new commits.</sup>

<!-- End of auto-generated description by cubic. -->
2025-12-12 15:39:23 -08:00
mertunsall 9b894150d5 fix structured output for sandboxes 2025-12-12 15:35:34 -08:00
Mert Unsal 8a18ff3580 make coordinates optionally available (#3757)
<!-- This is an auto-generated description by cubic. -->
## Summary by cubic
Enable coordinate-based clicking only for supported models, keeping
clicks index-only by default. This reduces misclicks and keeps the API
simpler.

- **New Features**
- Auto-enable coordinate clicking for models matching: claude-sonnet-4,
claude-opus-4, gemini-3-pro, and browser-use/*.
- Added set_coordinate_clicking(enabled) to toggle coordinate support
and re-register the click action accordingly.
- New ClickElementActionIndexOnly model for index-only clicks;
coordinate and index handlers are retained and shared.

<sup>Written for commit 8c9e3b272c.
Summary will update automatically on new commits.</sup>

<!-- End of auto-generated description by cubic. -->
2025-12-12 14:47:20 -08:00
mertunsall 8c9e3b272c add tests 2025-12-12 14:37:24 -08:00
mertunsall 20247d5c56 make coordinates optionally available 2025-12-12 14:26:13 -08:00
Mert Unsal 463aa200d0 Browser logging constant documentation (#3756)
Update `BROWSER_USE_LOG_LEVEL` to `BROWSER_USE_LOGGING_LEVEL` in docs
and issue templates to reflect the correct environment variable.

---
[Slack
Thread](https://browser-use.slack.com/archives/D092QUQDC56/p1765568387594429?thread_ts=1765568387.594429&cid=D092QUQDC56)

<a
href="https://cursor.com/background-agent?bcId=bc-1026a73d-001f-4cf3-9b58-fdc4d76051c4"><picture><source
media="(prefers-color-scheme: dark)"
srcset="https://cursor.com/open-in-cursor-dark.svg"><source
media="(prefers-color-scheme: light)"
srcset="https://cursor.com/open-in-cursor-light.svg"><img alt="Open in
Cursor"
src="https://cursor.com/open-in-cursor.svg"></picture></a>&nbsp;<a
href="https://cursor.com/agents?id=bc-1026a73d-001f-4cf3-9b58-fdc4d76051c4"><picture><source
media="(prefers-color-scheme: dark)"
srcset="https://cursor.com/open-in-web-dark.svg"><source
media="(prefers-color-scheme: light)"
srcset="https://cursor.com/open-in-web-light.svg"><img alt="Open in Web"
src="https://cursor.com/open-in-web.svg"></picture></a>



<!-- This is an auto-generated description by cubic. -->
---
## Summary by cubic
Use the correct env var name for debug logging across docs and issue
templates: BROWSER_USE_LOGGING_LEVEL. This fixes confusion when enabling
DEBUG logs.

- **Bug Fixes**
- Updated element detection and general bug report templates to use
BROWSER_USE_LOGGING_LEVEL.
- Corrected MCP server docs example to export
BROWSER_USE_LOGGING_LEVEL=DEBUG.

<sup>Written for commit db36243b5f.
Summary will update automatically on new commits.</sup>

<!-- End of auto-generated description by cubic. -->
2025-12-12 11:43:28 -08:00
Cursor Agent db36243b5f Fix typo in logging level environment variable
Co-authored-by: mailmertunsal <mailmertunsal@gmail.com>
2025-12-12 19:40:54 +00:00
Mert Unsal cfccc38d52 Filter sensitive data in history (#3750)
Re-enable sensitive data filtering for state messages to prevent real
sensitive values from action results leaking into LLM messages.

State messages, specifically the `agent_history_description`, include
action results which contain actual sensitive values (e.g., passwords)
after they've been replaced from placeholders during action execution.
The `_filter_sensitive_data` method was previously not called for state
messages, leading to these real values being sent to the LLM. This PR
ensures that state messages are properly filtered, replacing real
sensitive data with placeholder tags before being sent to the LLM. New
integration tests confirm the end-to-end filtering.

---
[Slack
Thread](https://browser-use.slack.com/archives/D092QUQDC56/p1765410795078139?thread_ts=1765410795.078139&cid=D092QUQDC56)

<a
href="https://cursor.com/background-agent?bcId=bc-97cd8546-fd39-4e4f-84af-8882815d705b"><picture><source
media="(prefers-color-scheme: dark)"
srcset="https://cursor.com/open-in-cursor-dark.svg"><source
media="(prefers-color-scheme: light)"
srcset="https://cursor.com/open-in-cursor-light.svg"><img alt="Open in
Cursor"
src="https://cursor.com/open-in-cursor.svg"></picture></a>&nbsp;<a
href="https://cursor.com/agents?id=bc-97cd8546-fd39-4e4f-84af-8882815d705b"><picture><source
media="(prefers-color-scheme: dark)"
srcset="https://cursor.com/open-in-web-dark.svg"><source
media="(prefers-color-scheme: light)"
srcset="https://cursor.com/open-in-web-light.svg"><img alt="Open in Web"
src="https://cursor.com/open-in-web.svg"></picture></a>





<!-- This is an auto-generated description by cubic. -->
---
## Summary by cubic
Restored sensitive data filtering for state messages so real values from
action results never reach the LLM. Sensitive values like passwords and
API keys are replaced with placeholder tags in
agent_history_description.

- **Bug Fixes**
- Filter state messages in MessageManager when sensitive_data is
present; system/context messages remain unfiltered.
- Replace real values in action results with <secret>...</secret>
placeholders before sending to the LLM.
- Added integration tests covering global and domain-specific formats
(e.g., password, api_key) to prevent leaks.

<sup>Written for commit 201b990591.
Summary will update automatically on new commits.</sup>

<!-- End of auto-generated description by cubic. -->
2025-12-10 16:52:22 -08:00
Mert Unsal 201b990591 Merge branch 'main' into cursor/filter-sensitive-data-in-history-5b05 2025-12-10 16:14:01 -08:00
Mert Unsal 9273902621 Fix short line removal bug (#3749)
Fixes `_preprocess_markdown_content` to prevent silent removal of
legitimate short lines, ensuring complete markdown extraction for LLM
processing.

The previous logic `len(stripped) > 2` incorrectly filtered out valid
content like single letters, short words, and numbers, leading to data
loss in markdown output. The fix changes the condition to `if stripped:`
to only remove truly empty or whitespace-only lines, and new tests have
been added to verify this behavior.

---
[Slack
Thread](https://browser-use.slack.com/archives/D092QUQDC56/p1765410993261629?thread_ts=1765410993.261629&cid=D092QUQDC56)

<a
href="https://cursor.com/background-agent?bcId=bc-b30ef5cf-f84b-468d-80ff-eb0a1900291c"><picture><source
media="(prefers-color-scheme: dark)"
srcset="https://cursor.com/open-in-cursor-dark.svg"><source
media="(prefers-color-scheme: light)"
srcset="https://cursor.com/open-in-cursor-light.svg"><img alt="Open in
Cursor"
src="https://cursor.com/open-in-cursor.svg"></picture></a>&nbsp;<a
href="https://cursor.com/agents?id=bc-b30ef5cf-f84b-468d-80ff-eb0a1900291c"><picture><source
media="(prefers-color-scheme: dark)"
srcset="https://cursor.com/open-in-web-dark.svg"><source
media="(prefers-color-scheme: light)"
srcset="https://cursor.com/open-in-web-light.svg"><img alt="Open in Web"
src="https://cursor.com/open-in-web.svg"></picture></a>



<!-- This is an auto-generated description by cubic. -->
---
## Summary by cubic
Fixed markdown preprocessing to preserve legitimate short lines and
prevent data loss during markdown extraction.

- **Bug Fixes**
- Change len(stripped) > 2 to stripped to only remove empty/whitespace
lines.
- Continue dropping large JSON-like lines (>100 chars); keep small JSON.
- Added tests for short lines, digits, list items, newline compression,
stripping, and chars filtered count.

<sup>Written for commit 24e276d5f4.
Summary will update automatically on new commits.</sup>

<!-- End of auto-generated description by cubic. -->
2025-12-10 16:04:12 -08:00
Cursor Agent 8ba95aefa8 Fix: Filter sensitive data from state messages
This change ensures that sensitive data in action results is filtered before being included in state messages sent to the LLM. This prevents accidental leakage of private information. New tests are added to verify this functionality.

Co-authored-by: mailmertunsal <mailmertunsal@gmail.com>
2025-12-11 00:00:37 +00:00
Cursor Agent 24e276d5f4 Refactor markdown preprocessing and add tests
Co-authored-by: mailmertunsal <mailmertunsal@gmail.com>
2025-12-11 00:00:21 +00:00
Saurav Panda 71034cacc1 docs fix ChatOpenAI import path (#3748)
<!-- This is an auto-generated description by cubic. -->
## Summary by cubic
Fixed ChatOpenAI import path in actor docs to
browser_use.llm.openai.chat so code examples import correctly.

<sup>Written for commit ab48cc51df.
Summary will update automatically on new commits.</sup>

<!-- End of auto-generated description by cubic. -->
2025-12-10 15:54:02 -08:00
Saurav Panda ab48cc51df docs fix ChatOpenAI import path 2025-12-10 15:34:27 -08:00
Mert Unsal 87ac8493f0 update system prompts (#3746)
<!-- This is an auto-generated description by cubic. -->
## Summary by cubic
Add support for browser-use fine-tuned models with simplified,
JSON-first system prompts, and reorganize prompt templates into a
dedicated package for reliable loading and packaging.

- **New Features**
- Auto-detect browser-use models (model name contains "browser-use/")
and select simplified prompts for thinking, no-thinking, and flash
modes.
- Plumb is_browser_use_model through MessageManager to load the correct
template.

- **Refactors**
- Moved all prompt templates to browser_use/agent/system_prompts and
load via importlib.resources for package-safe access.
- Updated pyproject to include the new prompt directory and remove old
file paths.

<sup>Written for commit 110b96dc8d.
Summary will update automatically on new commits.</sup>

<!-- End of auto-generated description by cubic. -->
2025-12-10 14:18:06 -08:00
mertunsall 110b96dc8d update system prompts 2025-12-10 18:50:10 +00:00
Saurav Panda b9a37d7ad6 docs: fix default action count in docs (#3741)
<!-- This is an auto-generated description by cubic. -->
## Summary by cubic
Corrected the documented default for max_actions_per_step to 3 to match
current behavior. Cleaned minor formatting in AGENTS.md (removed
trailing spaces and fixed a tips blockquote).

<sup>Written for commit 2e887d0076.
Summary will update automatically on new commits.</sup>

<!-- End of auto-generated description by cubic. -->
2025-12-10 00:59:35 -08:00
Saurav Panda 2e887d0076 Merge branch 'main' into doc-fix-max-action-count 2025-12-10 00:57:00 -08:00
Saurav Panda cafae082de update the agents.md with field
Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>
2025-12-09 23:43:01 -08:00
Gregor Žunič 6811d70c52 Skills Integration (#3724)
<!-- This is an auto-generated description by cubic. -->
## Summary by cubic
Integrates Browser Use API skills into the agent, auto-registering them
as actions with Pydantic-validated parameters and structured outputs.
Adds cookie-aware execution and surfaces unavailable skills (missing
cookies) in the agent prompt; requires BROWSER_USE_API_KEY and passing
skills (or skill_ids) to enable skills.

- **New Features**
- Adds browser_use/skills package with SkillService (fetch/execute),
schema converters, and SDK view wrappers.
- Agent accepts skills or skill_ids (supports '*'); 'skills' takes
precedence and they cannot be set together; lazily loads skills,
registers them as actions with clean slugs, rebuilds action models, and
closes the service on shutdown.
- Validates parameters against skill schemas; fills cookie values from
browser cookies; returns clear errors for missing cookies; supports
output schema conversion.
- Shows "Unavailable Skills" info in the state message when required
cookies are missing.
- Updates BrowserSession.cookies to return all cookies via CDP
Storage.getCookies; removes the urls parameter.

- **Dependencies**
  - Adds browser-use-sdk>=2.0.12.

<sup>Written for commit 22b37f3c11.
Summary will update automatically on new commits.</sup>

<!-- End of auto-generated description by cubic. -->
0.11.0
2025-12-09 17:05:21 -08:00
Gregor Žunič 22b37f3c11 prepare for release 2025-12-09 17:03:21 -08:00
Gregor Žunič 1b75166122 Merge branch 'main' into feature/skills-integration 2025-12-09 16:48:11 -08:00
Gregor Žunič 54f6942f36 fixed readme 2025-12-09 16:44:38 -08:00
Gregor Žunič 90b704b1bf skills example 2025-12-09 16:39:48 -08:00
Gregor Žunič 6c49e622a6 skills_ids = skills, added docs 2025-12-09 16:37:05 -08:00
Mert Unsal 2cd6d215bc fix structured output when tools is passeD (#3739)
<!-- This is an auto-generated description by cubic. -->
## Summary by cubic
Fixes structured output when tools are provided by initializing tools
first and auto-detecting the output model from tools. Ensures the agent
uses the correct schema, with a warning if the agent and tools models
differ.

- **Bug Fixes**
  - Initialize tools before task/LLM setup to allow schema detection.
- Use the tools’ output model when output_model_schema isn’t set; warn
on mismatch (agent schema takes precedence).
- ToolsService now stores and exposes the output model to keep done
action registration consistent.

<sup>Written for commit 1489d55210.
Summary will update automatically on new commits.</sup>

<!-- End of auto-generated description by cubic. -->
2025-12-09 16:15:51 -08:00
mertunsall 063d03e796 quick fix 2025-12-09 16:13:31 -08:00
Saurav Panda 211256a6d1 docs: fix default action count in docs 2025-12-09 16:03:52 -08:00
Gregor Žunič c4fde51d51 query only enabled skills 2025-12-09 15:39:14 -08:00
Mert Unsal 7dc0462057 Merge branch 'main' into mert/fix_structured_when_tools 2025-12-09 15:27:45 -08:00
mertunsall 1489d55210 fix structured output when tools is passeD 2025-12-09 23:27:15 +00:00
Saurav Panda 7871be69b1 added gemini-3-pro-preview to verified models (#3738) 2025-12-09 14:48:24 -08:00
Saurav Panda 49882fb086 added gemini-3-pro-preview to verified models 2025-12-09 13:38:34 -08:00
Gregor Žunič e8ebc8eebf fixed skill calling 2025-12-08 19:32:46 -08:00
Gregor Žunič b768174094 skill slugs 2025-12-08 18:42:01 -08:00
Gregor Žunič 91cdc8b3b3 added proper output types 2025-12-08 18:18:58 -08:00
Gregor Žunič b1e4d6e686 primitive skills impl (with cookies) 2025-12-08 18:07:00 -08:00
Mert Unsal ba95838647 faster scroll (#3732) 2025-12-07 23:24:59 -08:00
mertunsall 2e3aed3045 faster scroll 2025-12-07 23:17:24 -08:00
Gregor Žunič 71d529d14d simple browser use integration 2025-12-05 16:46:36 -08:00
Gregor Žunič 4707bef5e3 added skills with pydantic validation 2025-12-05 15:46:33 -08:00
Saurav Panda b02ff053ec AI: add ai_step to replace extract_content on rerun (#3696)
<!-- This is an auto-generated description by cubic. -->
## Summary by cubic
Added an analysis step for reruns that replaces extract replay,
generating fresh results from filtered page markdown and optional
screenshot. Rerun now routes extract actions through this step and
supports a dedicated LLM.

- **New Features**
- Added _execute_ai_step with system/user prompts, clean markdown
extraction, optional screenshot, and LLM invocation with timeout.
- rerun_history accepts ai_step_llm; extract actions are re-evaluated
via the analysis step, while other actions run in batch with order
preserved.
  - New prompts: get_ai_step_system_prompt and get_ai_step_user_prompt.
- Updated example to show custom LLM usage for the analysis step and
summary.
- Added tests (basic extraction, screenshot handling, error path) in
tests/ci/test_ai_step.py.

<sup>Written for commit 00866bd885.
Summary will update automatically on new commits.</sup>

<!-- End of auto-generated description by cubic. -->
2025-12-04 01:39:04 -08:00
Saurav Panda 00866bd885 Merge branch 'main' into add-ai-step-for-extraction 2025-12-04 00:34:31 -08:00
Magnus Müller 6bd8faa53e Check agent urls in docs (#3714)
Convert all shortcut and relative URLs to full URLs in `AGENTS.md` for
consistency and robustness.

---
[Slack
Thread](https://browser-use.slack.com/archives/C08SZRT860M/p1764777500203789?thread_ts=1764777500.203789&cid=C08SZRT860M)

<a
href="https://cursor.com/background-agent?bcId=bc-d05fbe93-a8fa-4df6-bacf-38d9aae8db3d"><picture><source
media="(prefers-color-scheme: dark)"
srcset="https://cursor.com/open-in-cursor-dark.svg"><source
media="(prefers-color-scheme: light)"
srcset="https://cursor.com/open-in-cursor-light.svg"><img alt="Open in
Cursor"
src="https://cursor.com/open-in-cursor.svg"></picture></a>&nbsp;<a
href="https://cursor.com/agents?id=bc-d05fbe93-a8fa-4df6-bacf-38d9aae8db3d"><picture><source
media="(prefers-color-scheme: dark)"
srcset="https://cursor.com/open-in-web-dark.svg"><source
media="(prefers-color-scheme: light)"
srcset="https://cursor.com/open-in-web-light.svg"><img alt="Open in Web"
src="https://cursor.com/open-in-web.svg"></picture></a>



<!-- This is an auto-generated description by cubic. -->
---
## Summary by cubic
Replaced all relative and shortcut links in AGENTS.md with full absolute
URLs to ensure links work reliably across GitHub and the docs site.
Prevents broken or ambiguous links, improving doc consistency.

<sup>Written for commit ffe8e223fc.
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
a7498839ac. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
2025-12-03 10:52:28 -08:00
Magnus Müller a7498839ac Merge branch 'main' into cursor/check-agent-urls-in-docs-claude-4.5-opus-high-8510 2025-12-03 10:52:17 -08:00
Saurav Panda a4e77e2070 Merge branch 'main' into add-ai-step-for-extraction 2025-12-03 09:14:26 -08:00
Saurav Panda 1011e3e661 feat: added fallback llm support (#3712)
<!-- This is an auto-generated description by cubic. -->
## Summary by cubic
Adds fallback LLM support to keep the agent running when the primary
model hits rate limits or provider errors. Also standardizes HTTP error
handling to custom exceptions used by the agent.

- **New Features**
- Agent accepts a fallback_llm and switches on 401, 402, 429, 500, 502,
503, 504 after primary retries are exhausted.
- Fallback stays active for the rest of the run and is registered with
token cost tracking.
  - New properties: is_using_fallback_llm and current_llm_model.
- Added example and docs for configuring and observing fallback
behavior.

- **Refactors**
- ChatBrowserUse now raises ModelProviderError and ModelRateLimitError
(instead of ValueError) for HTTP failures.
  - Updated tests to cover fallback switching and new exception types.

<sup>Written for commit cad2216410.
Summary will update automatically on new commits.</sup>

<!-- End of auto-generated description by cubic. -->
2025-12-03 09:13:40 -08:00
Saurav Panda cad2216410 Merge branch 'main' into add-model-fallback 2025-12-03 08:40:13 -08:00