Stagehand
npx @buildinternet/releases get stagehandnpx @buildinternet/releases get stagehandThis changelog covers the public Stagehand TypeScript and Python SDKs. Entries before 4.0.0 describe the TypeScript SDK.
e2c8946 Thanks @miguelg719! - Expose Browserbase Search and Fetch through the Stagehand browserbase facade in TypeScript, Python, and Go.#2827 6555e81 Thanks @seanmcguire12! - make browser.close() and browser.context.close() always terminate the browser regardless of keepAlive.
#2878 50146e4 Thanks @seanmcguire12! - support discovering and invoking WebMCP tools in out-of-process iframes (OOPIFs)
#2912 67a4668 Thanks @miguelg719! - Fail fast on protocol compatibility errors
#2790 1011177 Thanks @seanmcguire12! - fail fast on browserbase.connect() when extension is not present
#2818 341433a Thanks @seanmcguire12! - make stagehand.close() preserve the browser and allow another Stagehand instance to attach later
#2754 a21633d Thanks @monadoid! - remove the redundant image type from page screenshot protocol responses.
e2c8946 Thanks @miguelg719! - Expose Browserbase Search and Fetch through the Stagehand browserbase facade in TypeScript, Python, and Go.#2827 6555e81 Thanks @seanmcguire12! - make browser.close() and browser.context.close() always terminate the browser regardless of keepAlive.
#2878 50146e4 Thanks @seanmcguire12! - support discovering and invoking WebMCP tools in out-of-process iframes (OOPIFs)
#2912 67a4668 Thanks @miguelg719! - Fail fast on protocol compatibility errors
#2790 1011177 Thanks @seanmcguire12! - fail fast on browserbase.connect() when extension is not present
#2818 341433a Thanks @seanmcguire12! - make stagehand.close() preserve the browser and allow another Stagehand instance to attach later
#2754 a21633d Thanks @monadoid! - remove the redundant image type from page screenshot protocol responses.
#2864 d2d9169 Thanks @seanmcguire12! - Make python and golang SDKs reject occupied local chrome debugging ports, and make local browser launch wait for readiness in python.
#2827 6555e81 Thanks @seanmcguire12! - make browser.close() and browser.context.close() always terminate the browser regardless of keepAlive.
#2878 50146e4 Thanks @seanmcguire12! - support discovering and invoking WebMCP tools in out-of-process iframes (OOPIFs)
#2818 341433a Thanks @seanmcguire12! - make stagehand.close() preserve the browser and allow another Stagehand instance to attach later
#2754 a21633d Thanks @monadoid! - remove the redundant image type from page screenshot protocol responses.
e2c8946 Thanks @miguelg719! - Expose Browserbase Search and Fetch through the Stagehand browserbase facade in TypeScript, Python, and Go.#2827 6555e81 Thanks @seanmcguire12! - make browser.close() and browser.context.close() always terminate the browser regardless of keepAlive.
#2878 50146e4 Thanks @seanmcguire12! - support discovering and invoking WebMCP tools in out-of-process iframes (OOPIFs)
#2912 67a4668 Thanks @miguelg719! - Fail fast on protocol compatibility errors
#2790 1011177 Thanks @seanmcguire12! - fail fast on browserbase.connect() when extension is not present
#2818 341433a Thanks @seanmcguire12! - make stagehand.close() preserve the browser and allow another Stagehand instance to attach later
#2754 a21633d Thanks @monadoid! - remove the redundant image type from page screenshot protocol responses.
#2864 d2d9169 Thanks @seanmcguire12! - Make python and golang SDKs reject occupied local chrome debugging ports, and make local browser launch wait for readiness in python.
#2827 6555e81 Thanks @seanmcguire12! - make browser.close() and browser.context.close() always terminate the browser regardless of keepAlive.
#2754 a21633d Thanks @monadoid! - remove the redundant image type from page screenshot protocol responses.
c0a2734 Thanks @monadoid! - Allow SDK clients to reattach to an initialized Stagehand extension runtime.c0a2734 Thanks @monadoid! - Allow SDK clients to reattach to an initialized Stagehand extension runtime.c0a2734 Thanks @monadoid! - Allow SDK clients to reattach to an initialized Stagehand extension runtime.c0a2734 Thanks @monadoid! - Allow SDK clients to reattach to an initialized Stagehand extension runtime.#2666 00fc44c Thanks @miguelg719! - Allow overriding the extension asset locations via STAGEHAND_EXTENSION_ARCHIVE_PATH and STAGEHAND_EXTENSION_DIRECTORY_PATH
#2691 7e09557 Thanks @shrey150! - Track the Stagehand SDK version in Browserbase session metadata.
Rebuilt Stagehand around its v4 browser protocol and TypeScript SDK. Stagehand is now a protocol-first monorepo with TypeScript, Python, and Go SDKs over a shared core.
Check the migration guide for upgrading from v3.
Rebuilt the Stagehand Python SDK around the v4 browser protocol.
Check the migration guide for upgrading from v3.
#2359 2cd1edf Thanks @shrey150! - Remove the noisy AI SDK "system message in messages" warning from act(), extract(), and observe() (including when the agent's own tools call them internally).
#2347 84197d8 Thanks @miguelg719! - Allow OpenAI-compatible models to select the Chat Completions API with openaiEndpointFormat: "chat"
#2283 871ca7e Thanks @seanmcguire12! - add context.setDomainPolicy({ allowedDomains: ["allowed.domain"] }) which allows users to define a set of domains that are accessible to stagehand
#2274 f31980f Thanks @seanmcguire12! - add context.setDomainPolicy({blockedDomains: ["some.domain"]}) which allows users to define a list of domains that will be blocked by stagehand
#2305 cd1daad Thanks @shrey150! - Remove the noisy AI SDK "system message in messages" warning logged on every hybrid/DOM agent.execute() call.
#2328 d287ff4 Thanks @miguelg719! - Allow modelName "auto" in the constructor and per-primitive model overrides when running through the Stagehand API
#2294 3938590 Thanks @seanmcguire12! - automatically close popups that violate user defined domain policy
#2298 892701a Thanks @seanmcguire12! - Fix CUA keypress actions to press key combinations as a single chord.
#2345 21826c7 Thanks @monadoid! - Repair malformed UTF-16 snapshot text before it reaches model prompts.
#2306 8dcef1b Thanks @seanmcguire12! - Use the screenshot provider's declared media type when sending CUA image payloads. The setScreenshotProvider callback now returns ScreenshotProviderResult ({ base64, mediaType }) instead of a bare base64 string.
#2273 93a23d3 Thanks @miguelg719! - Add support for the new google/gemini-3.5-flash computer-use tools model
#2278 022d68f Thanks @shrey150! - Fix TypeError: Converting circular structure to JSON when creating an agent with MCP integrations that include a Client instance (e.g. a local/stdio server from connectToMCPServer). The agent-creation log serialized the raw integrations array, and a live MCP Client is circular. It now logs a safe descriptor (URL strings kept, client instances summarized) so agent({ integrations: [client] }) works.
#2288 bb5ffa6 Thanks @seanmcguire12! - clean up cdp session event handlers on target detach
c49a3fc Thanks @seanmcguire12! - add support for WebMCP#2217 147e310 Thanks @monadoid! - Add Azure OpenAI Microsoft Entra ID model auth support.
#2231 cf3603d Thanks @miguelg719! - Add claude-fable-5 support: native structured outputs via the @ai-sdk/anthropic bump, adaptive thinking (including the new "xhigh" effort) on the agent path, the API's built-in server-side refusal fallback to claude-opus-4-8, and auto tool choice for the final done call on models that reject forced tool use.
#2233 8d7d414 Thanks @seanmcguire12! - Normalize URLs in ActCache key derivation by sorting query parameters before hashing. Semantically equivalent URLs that differ only in parameter order (e.g. ?utm_source=email&id=42 vs ?id=42&utm_source=email) now hit the cache instead of silently missing. Fragments and duplicate keys are preserved.
#2229 fd42e65 Thanks @seanmcguire12! - launch local browser with --enable-features=WebMCPTesting,DevToolsWebMCPSupport by default
#2220 a64c6b7 Thanks @monadoid! - Fix Stagehand-generated shadow-root XPath resolution so deterministic actions can target elements inside web components.
#2132 ed3e566 Thanks @miguelg719! - Add canonical verifier evidence normalization for screenshots and text signals without requiring image dependencies in core installs.
#2133 840aac8 Thanks @miguelg719! - Add the rubric-based verifier engine with normalized public rubric output and bounded failure-step parsing.
#2149 6e75725 Thanks @miguelg719! - Added a screenshot option to extract() that sends the current viewport screenshot with the a11y tree for extraction.
#2127 78bcde8 Thanks @seanmcguire12! - Add ignoreDefaultArgs option to selectively remove chrome-launcher's built-in default flags (e.g. --disable-extensions) when running locally
#2160 49575d6 Thanks @monadoid! - Forward constructor and request model configuration when initializing API-backed sessions.
#2171 dc1445d Thanks @seanmcguire12! - add native clipboard API
#2146 3a53ed4 Thanks @shriyatheunicorn! - Pass local browser launch options through when attaching over CDP so explicit viewport settings are respected.
#2107 8fc16d2 Thanks @miguelg719! - Fix Anthropic CUA triple_click action mapping.
#2118 3e95a87 Thanks @monadoid! - Add Vertex auth parameters to the core and server API schemas.
#2126 ebbdcd3 Thanks @seanmcguire12! - fix(core): import ToolSet from ai public export
#2120 12703a6 Thanks @miguelg719! - Fix structuredOutputMode for newer Anthropic models
#2170 1db5f1c Thanks @Kylejeong2! - Add Claude Opus 4.8 to the supported CUA model whitelist.
#2116 cb586a1 Thanks @seanmcguire12! - include "[selected]" or "[checked]" state in snapshot
#2129 765861c Thanks @miguelg719! - Add a backend-selectable v3 evaluator facade while preserving the legacy evaluator path.
#2157 2cd60a3 Thanks @miguelg719! - Add verifier trajectory, rubric, and evaluation-result types with normalized public naming.
#2131 e102a89 Thanks @miguelg719! - Capture verifier trajectory evidence from agent evidence callbacks for offline scoring.
#2084 0641d44 Thanks @seanmcguire12! - add ignoreSelectors param to extract()
#2096 a11603d Thanks @seanmcguire12! - add ignoreSelectors to observe()
#2080 21c78b3 Thanks @miguelg719! - Add variables support to v3 agentExecute API schema and remove experimental requirement
#2077 f437f73 Thanks @monadoid! - Fix frame registry handling for OOPIF pages
#2098 a783b99 Thanks @seanmcguire12! - bump transitive deps to patched versions
#2089 8d2f354 Thanks @shrey150! - Strengthen observe prompts so LLMs return complete encoded element IDs.
#2047 a87c1fc Thanks @tkattkat! - Set default agent mode to hybrid with auto routing to dom for non compatible models
#2101 26e6c96 Thanks @seanmcguire12! - move playwright-core, puppeteer-core, patchright-core from optional dependencies to peer dependencies
#2068 1d176c4 Thanks @filip-michalsky! - Remove the default temperature setting from v3 agent AI SDK calls so reasoning models that do not support temperature run without provider warnings.
#2040 1fa9613 Thanks @monadoid! - Prefer STAGEHAND_API_URL for Stagehand API overrides while retaining STAGEHAND_BASE_URL as a deprecated fallback.
#2065 9ff70dd Thanks @miguelg719! - Add support for CUA models: openai/gpt-5.4-mini, openai/gpt-5.5, and anthropic/claude-haiku-4-5
#2039 7640381 Thanks @monadoid! - Deprecate Browserbase project ID configuration.
e471d2e Thanks @shrey150! - Support Browserbase verified session settings and bump the Browserbase SDK.#1954 732b384 Thanks @github-actions! - Update Anthropic CUA to use adaptive thinking
#2001 20b601d Thanks @shrey150! - Include agent.execute() usage in stagehand.metrics for API-backed sessions.
#1983 8543c11 Thanks @github-actions! - Add variable substitution to the keys tool in both live execution and cache replay paths. When keys steps with method="type" contain %variableName% tokens, they are now resolved against the provided variables. This brings the keys tool to parity with the type tool's variable handling.
#1973 14b64ec Thanks @monadoid! - Enable strict structured outputs for supported model paths.
#2028 a500de1 Thanks @tkattkat! - Remove deprecated provider option
#1975 8f7192c Thanks @seanmcguire12! - make file upload elements more explicit in page snapshot
#1843 144e18e Thanks @seanmcguire12! - apply user defined toolTimeout to all agent tools (other than wait & think tools)
#1872 d3c3736 Thanks @tkattkat! - Add support for LLM provider middleware
#1953 5c889df Thanks @github-actions! - (NEW) Model Gateway: make model api key optional on API
#1924 a1ab39e Thanks @seanmcguire12! - fix issue where stagehand could not attach to new tabs that were created manually.
#1874 f3fe7ce Thanks @miguelg719! - Add headers (LLM) to ModelConfig
#1964 5fb9785 Thanks @github-actions! - chore: update examples
#1901 f5d1f1f Thanks @seanmcguire12! - pass timeout as timeoutMs in goto()
#1858 8bf5db8 Thanks @monadoid! - Add explicit SSE event names for local v3 streaming and update the generated SDK contract to match.
#1899 6dc2276 Thanks @tkattkat! - fix: include screenshot in openai cua agents first message
#1779 2f43ffa Thanks @shrey150! - feat: add cdpHeaders option to localBrowserLaunchOptions for passing custom HTTP headers when connecting to an existing browser via CDP URL
#1834 63ee247 Thanks @tkattkat! - Update stagehand agents search tool
#1774 521a10e Thanks @seanmcguire12! - add new page.setExtraHTTPHeaders() method
#1759 505e8c6 Thanks @shrey150! - Add bedrock to the provider enum in model configuration schemas and regenerate OpenAPI spec.
#1814 7dc35f5 Thanks @tkattkat! - Change usage of openai provider in agent to default to store:false
#1846 335cf47 Thanks @aq17! - Fix streaming finished event being silently dropped. The final SSE event containing the result payload (success status, message, actions, usage, and messages) was previously discarded instead of being yielded to the caller.
#1764 6ba0a1d Thanks @shrey150! - Expose headers in GoogleVertexProviderSettings so model configs can pass custom provider headers (for example X-Goog-Priority) without TypeScript errors.
#1847 4ff3bb8 Thanks @miguelg719! - Enable FlowLogger on BROWSERBASE_FLOW_LOGS=1
#1752 c27054b Thanks @derekmeegan! - fix: pause Browserbase agents while captcha solving is active and improve CUA recovery after the solve completes
#1800 2abf5b9 Thanks @shrey150! - Make projectId optional for Browserbase sessions — only BROWSERBASE_API_KEY is required
#1766 7817fcc Thanks @tkattkat! - Add configurable timeout to tools in agent
#1749 7390508 Thanks @pirate! - When connecting to a browser session that has zero open tabs, Stagehand now automatically creates an initial about:blank tab so the connection can continue.
#1761 611f43a Thanks @seanmcguire12! - fix issue where handlePossibleNavigation was producing unnecessary error logs on clicks that trigger page close
#1817 2402a3c Thanks @tkattkat! - Add support for passing custom headers in clientOptions
#1681 e3db9aa Thanks @tkattkat! - Add cookie management APIs: context.addCookies(), context.clearCookies(), & context.cookies()
#1672 b65756e Thanks @seanmcguire12! - add boolean keepAlive parameter to allow for configuring whether the browser should be closed when stagehand.close() is called.
#1708 176d420 Thanks @seanmcguire12! - add context.setExtraHTTPHeaders()
#1611 8a3c066 Thanks @monadoid! - Using mode enum instead of old cua boolean in openapi spec