From 77e71139e0d4b483b4450ddc3a417192f317d6d5 Mon Sep 17 00:00:00 2001 From: miguel Date: Thu, 16 Oct 2025 12:52:19 -0700 Subject: [PATCH 1/5] Add support for Haiku 4.5 CUA --- .changeset/polite-dogfish-of-purring.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/polite-dogfish-of-purring.md diff --git a/.changeset/polite-dogfish-of-purring.md b/.changeset/polite-dogfish-of-purring.md new file mode 100644 index 00000000..8acb2e76 --- /dev/null +++ b/.changeset/polite-dogfish-of-purring.md @@ -0,0 +1,5 @@ +--- +"stagehand": patch +--- + +Add support for Haiku 4.5 CUA From 2b2d1ea297aae48dad4e7db993a13f144d496d20 Mon Sep 17 00:00:00 2001 From: miguel Date: Thu, 13 Nov 2025 11:30:35 -0800 Subject: [PATCH 2/5] Properly serialize os on browserbase session create params --- .changeset/fuzzy-uppish-capybara.md | 5 +++++ stagehand/config.py | 28 ++++++++++++++++++++-------- 2 files changed, 25 insertions(+), 8 deletions(-) create mode 100644 .changeset/fuzzy-uppish-capybara.md diff --git a/.changeset/fuzzy-uppish-capybara.md b/.changeset/fuzzy-uppish-capybara.md new file mode 100644 index 00000000..256c81fd --- /dev/null +++ b/.changeset/fuzzy-uppish-capybara.md @@ -0,0 +1,5 @@ +--- +"stagehand": patch +--- + +Properly serialize os on browserbase session create params diff --git a/stagehand/config.py b/stagehand/config.py index e69faa20..f9d08f51 100644 --- a/stagehand/config.py +++ b/stagehand/config.py @@ -71,9 +71,7 @@ class StagehandConfig(BaseModel): alias="domSettleTimeoutMs", description="Timeout for DOM to settle (in ms)", ) - browserbase_session_create_params: Optional[ - Union[BrowserbaseSessionCreateParams, dict[str, Any]] - ] = Field( + browserbase_session_create_params: Optional[dict[str, Any]] = Field( None, alias="browserbaseSessionCreateParams", description="Browserbase session create params", @@ -124,11 +122,25 @@ class StagehandConfig(BaseModel): @classmethod def validate_browserbase_params(cls, v, info): """Validate and convert browserbase session create params.""" - if isinstance(v, dict) and "project_id" not in v: - values = info.data - project_id = values.get("project_id") or values.get("projectId") - if project_id: - v = {**v, "project_id": project_id} + if isinstance(v, dict): + # Make a copy to avoid mutating the original + v = dict(v) + + # Add project_id if not present + if "project_id" not in v: + values = info.data + project_id = values.get("project_id") or values.get("projectId") + if project_id: + v["project_id"] = project_id + + # Handle browser_settings + if "browser_settings" in v: + # Make a copy of browser_settings to avoid mutating + v["browser_settings"] = dict(v["browser_settings"]) + + # Normalize 'os' key to lowercase + if "os" in v["browser_settings"]: + v["browser_settings"]["os"] = v["browser_settings"]["os"].lower() return v def with_overrides(self, **overrides) -> "StagehandConfig": From 71e5f980aa46eacfa2281b126fcf1f3dd8f02999 Mon Sep 17 00:00:00 2001 From: Miguel <36487034+miguelg719@users.noreply.github.com> Date: Thu, 13 Nov 2025 11:45:41 -0800 Subject: [PATCH 3/5] Delete .changeset/polite-dogfish-of-purring.md --- .changeset/polite-dogfish-of-purring.md | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 .changeset/polite-dogfish-of-purring.md diff --git a/.changeset/polite-dogfish-of-purring.md b/.changeset/polite-dogfish-of-purring.md deleted file mode 100644 index 8acb2e76..00000000 --- a/.changeset/polite-dogfish-of-purring.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"stagehand": patch ---- - -Add support for Haiku 4.5 CUA From e49174c0bb7378741b63eb7b0713ca617c37a386 Mon Sep 17 00:00:00 2001 From: miguel Date: Thu, 13 Nov 2025 11:59:50 -0800 Subject: [PATCH 4/5] formatting --- stagehand/config.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/stagehand/config.py b/stagehand/config.py index f9d08f51..677b8df0 100644 --- a/stagehand/config.py +++ b/stagehand/config.py @@ -1,7 +1,6 @@ import os -from typing import Any, Callable, Literal, Optional, Union +from typing import Any, Callable, Literal, Optional -from browserbase.types import SessionCreateParams as BrowserbaseSessionCreateParams from pydantic import BaseModel, ConfigDict, Field, field_validator from stagehand.schemas import AvailableModel From d9058fc25d212980fb5939a6449dd8cbd1748416 Mon Sep 17 00:00:00 2001 From: miguel Date: Thu, 13 Nov 2025 12:35:10 -0800 Subject: [PATCH 5/5] update default model --- stagehand/config.py | 4 +++- stagehand/schemas.py | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/stagehand/config.py b/stagehand/config.py index 677b8df0..2135c7c4 100644 --- a/stagehand/config.py +++ b/stagehand/config.py @@ -84,7 +84,9 @@ class StagehandConfig(BaseModel): description="Session ID for resuming Browserbase sessions", ) model_name: Optional[str] = Field( - AvailableModel.GPT_4O, alias="modelName", description="Name of the model to use" + AvailableModel.GPT_4_1_MINI, + alias="modelName", + description="Name of the model to use", ) self_heal: Optional[bool] = Field( True, alias="selfHeal", description="Enable self-healing functionality" diff --git a/stagehand/schemas.py b/stagehand/schemas.py index 3cb0d54e..de8448b2 100644 --- a/stagehand/schemas.py +++ b/stagehand/schemas.py @@ -15,6 +15,7 @@ class AvailableModel(str, Enum): GPT_4O = "gpt-4o" GPT_4O_MINI = "gpt-4o-mini" + GPT_4_1_MINI = "gpt-4.1-mini" CLAUDE_3_5_SONNET_LATEST = "claude-3-5-sonnet-latest" CLAUDE_3_7_SONNET_LATEST = "claude-3-7-sonnet-latest" COMPUTER_USE_PREVIEW = "computer-use-preview"