Add screenshot option to Extract - #2149
Conversation
🦋 Changeset detectedLatest commit: d0c7500 The changes in this PR will be included in the next version bump. This PR includes changesets to release 5 packages
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
5241d31 to
2b4eca9
Compare
✱ Stainless preview builds for stagehandThis PR will update the
|
There was a problem hiding this comment.
No issues found across 13 files
Confidence score: 5/5
- Automated review surfaced no issues in the provided summaries.
- No files require special attention.
Architecture diagram
sequenceDiagram
participant Client as "Client (User Code)"
participant V3 as "V3.extract()"
participant ExtractHandler as "ExtractHandler"
participant Page as "Page (Playwright)"
participant Inference as "extract() (inference.ts)"
participant LLM as "LLMClient (AI SDK)"
participant Prompts as "Prompt Builders"
Note over Client,Prompts: NEW: Screenshot extraction flow
Client->>V3: extract(instruction, { screenshot: true })
V3->>ExtractHandler: extract({ screenshot: true, ... })
ExtractHandler->>ExtractHandler: resolveLlmClient(model)
alt llmClient.type is NOT 'aisdk'
ExtractHandler-->>Client: throw StagehandInvalidArgumentError
end
ExtractHandler->>Page: captureHybridSnapshot(...)
Page-->>ExtractHandler: snapshot (combinedTree)
ExtractHandler->>Page: page.screenshot({ fullPage: false, type: 'png' })
Page-->>ExtractHandler: screenshotBuffer (Buffer)
ExtractHandler->>Inference: extract({ screenshot: screenshotBuffer, ... })
alt llmClient.type is NOT 'aisdk'
Inference-->>ExtractHandler: throw StagehandInvalidArgumentError
end
Inference->>Prompts: buildExtractSystemPrompt(includeScreenshot=true)
Prompts-->>Inference: system prompt referencing accessibility tree and screenshot
Note over Inference: Builds multimodal user message
Inference->>Prompts: buildExtractUserPrompt(instruction, domElements, screenshotDataUrl)
Prompts->>Prompts: Convert screenshot buffer to data URL
alt screenshotDataUrl present
Prompts-->>Inference: Multimodal message (text + image_url)
else no screenshot
Prompts-->>Inference: Text-only message
end
Inference->>LLM: createChatCompletion(messages with image_url)
LLM-->>Inference: LLM response + usage
Inference-->>ExtractHandler: extracted data
ExtractHandler-->>V3: results
V3-->>Client: extracted content
pirate
left a comment
There was a problem hiding this comment.
looks good, just make sure we dont emit full base64 to any DB/logs
This PR was opened by the [Changesets release](https://github.com/changesets/action) GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated. # Releases ## @browserbasehq/stagehand@3.5.0 ### Minor Changes - [#2149](#2149) [`6e75725`](6e75725) Thanks [@miguelg719](https://github.com/miguelg719)! - Added a `screenshot` option to `extract()` that sends the current viewport screenshot with the a11y tree for extraction. - [#2127](#2127) [`78bcde8`](78bcde8) Thanks [@seanmcguire12](https://github.com/seanmcguire12)! - Add `ignoreDefaultArgs` option to selectively remove chrome-launcher's built-in default flags (e.g. `--disable-extensions`) when running locally - [#2160](#2160) [`49575d6`](49575d6) Thanks [@monadoid](https://github.com/monadoid)! - Forward constructor and request model configuration when initializing API-backed sessions. - [#2171](#2171) [`dc1445d`](dc1445d) Thanks [@seanmcguire12](https://github.com/seanmcguire12)! - add native clipboard API ### Patch Changes - [#2146](#2146) [`3a53ed4`](3a53ed4) Thanks [@shriyatheunicorn](https://github.com/shriyatheunicorn)! - Pass local browser launch options through when attaching over CDP so explicit viewport settings are respected. - [#2107](#2107) [`8fc16d2`](8fc16d2) Thanks [@miguelg719](https://github.com/miguelg719)! - Fix Anthropic CUA `triple_click` action mapping. - [#2118](#2118) [`3e95a87`](3e95a87) Thanks [@monadoid](https://github.com/monadoid)! - Add Vertex auth parameters to the core and server API schemas. - [#2126](#2126) [`ebbdcd3`](ebbdcd3) Thanks [@seanmcguire12](https://github.com/seanmcguire12)! - fix(core): import ToolSet from ai public export - [#2120](#2120) [`12703a6`](12703a6) Thanks [@miguelg719](https://github.com/miguelg719)! - Fix structuredOutputMode for newer Anthropic models - [#2170](#2170) [`1db5f1c`](1db5f1c) Thanks [@Kylejeong2](https://github.com/Kylejeong2)! - Add Claude Opus 4.8 to the supported CUA model whitelist. - [#2116](#2116) [`cb586a1`](cb586a1) Thanks [@seanmcguire12](https://github.com/seanmcguire12)! - include "[selected]" or "[checked]" state in snapshot - [#2129](#2129) [`765861c`](765861c) Thanks [@miguelg719](https://github.com/miguelg719)! - Add a backend-selectable v3 evaluator facade while preserving the legacy evaluator path. - [#2157](#2157) [`2cd60a3`](2cd60a3) Thanks [@miguelg719](https://github.com/miguelg719)! - Add verifier trajectory, rubric, and evaluation-result types with normalized public naming. - [#2131](#2131) [`e102a89`](e102a89) Thanks [@miguelg719](https://github.com/miguelg719)! - Capture verifier trajectory evidence from agent evidence callbacks for offline scoring. ## @browserbasehq/browse-cli@0.6.1 ### Patch Changes - Updated dependencies \[[`3a53ed4`](3a53ed4), [`6e75725`](6e75725), [`8fc16d2`](8fc16d2), [`78bcde8`](78bcde8), [`3e95a87`](3e95a87), [`ebbdcd3`](ebbdcd3), [`12703a6`](12703a6), [`1db5f1c`](1db5f1c), [`cb586a1`](cb586a1), [`765861c`](765861c), [`2cd60a3`](2cd60a3), [`e102a89`](e102a89), [`49575d6`](49575d6), [`dc1445d`](dc1445d)]: - @browserbasehq/stagehand@3.5.0 ## @browserbasehq/stagehand-server-v3@3.7.0 ### Minor Changes - [#2160](#2160) [`49575d6`](49575d6) Thanks [@monadoid](https://github.com/monadoid)! - Forward constructor and request model configuration when initializing API-backed sessions. ### Patch Changes - [#2118](#2118) [`3e95a87`](3e95a87) Thanks [@monadoid](https://github.com/monadoid)! - Add Vertex auth parameters to the core and server API schemas. - [#2167](#2167) [`ce21468`](ce21468) Thanks [@monadoid](https://github.com/monadoid)! - Add SEA binary --version build metadata output. - Updated dependencies \[[`3a53ed4`](3a53ed4), [`6e75725`](6e75725), [`8fc16d2`](8fc16d2), [`78bcde8`](78bcde8), [`3e95a87`](3e95a87), [`ebbdcd3`](ebbdcd3), [`12703a6`](12703a6), [`1db5f1c`](1db5f1c), [`cb586a1`](cb586a1), [`765861c`](765861c), [`2cd60a3`](2cd60a3), [`e102a89`](e102a89), [`49575d6`](49575d6), [`dc1445d`](dc1445d)]: - @browserbasehq/stagehand@3.5.0 ## @browserbasehq/stagehand-evals@2.0.2 ### Patch Changes - Updated dependencies \[[`3a53ed4`](3a53ed4), [`6e75725`](6e75725), [`8fc16d2`](8fc16d2), [`78bcde8`](78bcde8), [`3e95a87`](3e95a87), [`ebbdcd3`](ebbdcd3), [`12703a6`](12703a6), [`1db5f1c`](1db5f1c), [`cb586a1`](cb586a1), [`765861c`](765861c), [`2cd60a3`](2cd60a3), [`e102a89`](e102a89), [`49575d6`](49575d6), [`dc1445d`](dc1445d)]: - @browserbasehq/stagehand@3.5.0 Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
# why
Some pages do not properly encapsulate the necessary information
required to extract the content requested by the user, and can benefit
from a hybrid approach with vision.
# what changed
- New `extract({ options: { screenshot: true } })` flag. Captures the
current viewport as PNG and sends it as an `image_url` part alongside
the a11y tree text in the extraction LLM call.
- Default is `false` — existing callers see no behavior change.
- Gated to AI SDK clients; throws `StagehandInvalidArgumentError`
otherwise (validated in both the handler and `inference.extract`, with
the handler check running before the screenshot is taken).
- Screenshot capture is bracketed by `ensureTimeRemaining()` so it
respects the extract timeout.
- Wired end-to-end: public `ExtractOptions` type,
`ExtractOptionsSchema`, OpenAPI `ExtractOptions`,
`StagehandAPIClient.extract` wire payload, `V3.extract` →
`ExtractHandler` → `inference.extract` →
`buildExtract{System,User}Prompt`.
# test plan
- `extract-screenshot.test.ts` (new) — multimodal message shape on happy
path; rejection for non-AI SDK clients.
- `timeout-handlers.test.ts` — handler captures viewport when enabled,
skips capture by default, rejects screenshot + non-AI SDK client without
touching `page.screenshot` or the snapshot pipeline.
- `api-client-serialization.test.ts` (renamed from
`api-client-observe-variables.test.ts`) — wire payload preserves
`options.screenshot`.
<!-- This is an auto-generated description by cubic. -->
---
## Summary by cubic
Adds a screenshot option to `extract()` that sends the current viewport
screenshot with the accessibility tree to improve results on
visually-driven pages.
- New Features
- `extract({ options: { screenshot: boolean } })` captures a PNG of the
current viewport and includes it with the accessibility tree; defaults
to false; only supported with `aisdk` clients (throws
`StagehandInvalidArgumentError` otherwise).
- Prompts are consolidated and multimodal when enabled: system and user
prompts mention the screenshot and using it with the accessibility tree;
attaches an `image_url` data URI; logs when a screenshot is used.
- Public API, types, and OpenAPI updated (`ExtractOptions.screenshot`);
the API client forwards the flag; tests cover prompt shape, viewport
capture, default-off behavior, timeout guards, client-type validation,
and serialization.
<sup>Written for commit d0c7500.
Summary will update on new commits. <a
href="https://cubic.dev/pr/browserbase/stagehand/pull/2149?utm_source=github">Review
in cubic</a></sup>
<!-- End of auto-generated description by cubic. -->
This PR was opened by the [Changesets release](https://github.com/changesets/action) GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated. # Releases ## @browserbasehq/stagehand@3.5.0 ### Minor Changes - [browserbase#2149](browserbase#2149) [`6e75725`](browserbase@6e75725) Thanks [@miguelg719](https://github.com/miguelg719)! - Added a `screenshot` option to `extract()` that sends the current viewport screenshot with the a11y tree for extraction. - [browserbase#2127](browserbase#2127) [`78bcde8`](browserbase@78bcde8) Thanks [@seanmcguire12](https://github.com/seanmcguire12)! - Add `ignoreDefaultArgs` option to selectively remove chrome-launcher's built-in default flags (e.g. `--disable-extensions`) when running locally - [browserbase#2160](browserbase#2160) [`49575d6`](browserbase@49575d6) Thanks [@monadoid](https://github.com/monadoid)! - Forward constructor and request model configuration when initializing API-backed sessions. - [browserbase#2171](browserbase#2171) [`dc1445d`](browserbase@dc1445d) Thanks [@seanmcguire12](https://github.com/seanmcguire12)! - add native clipboard API ### Patch Changes - [browserbase#2146](browserbase#2146) [`3a53ed4`](browserbase@3a53ed4) Thanks [@shriyatheunicorn](https://github.com/shriyatheunicorn)! - Pass local browser launch options through when attaching over CDP so explicit viewport settings are respected. - [browserbase#2107](browserbase#2107) [`8fc16d2`](browserbase@8fc16d2) Thanks [@miguelg719](https://github.com/miguelg719)! - Fix Anthropic CUA `triple_click` action mapping. - [browserbase#2118](browserbase#2118) [`3e95a87`](browserbase@3e95a87) Thanks [@monadoid](https://github.com/monadoid)! - Add Vertex auth parameters to the core and server API schemas. - [browserbase#2126](browserbase#2126) [`ebbdcd3`](browserbase@ebbdcd3) Thanks [@seanmcguire12](https://github.com/seanmcguire12)! - fix(core): import ToolSet from ai public export - [browserbase#2120](browserbase#2120) [`12703a6`](browserbase@12703a6) Thanks [@miguelg719](https://github.com/miguelg719)! - Fix structuredOutputMode for newer Anthropic models - [browserbase#2170](browserbase#2170) [`1db5f1c`](browserbase@1db5f1c) Thanks [@Kylejeong2](https://github.com/Kylejeong2)! - Add Claude Opus 4.8 to the supported CUA model whitelist. - [browserbase#2116](browserbase#2116) [`cb586a1`](browserbase@cb586a1) Thanks [@seanmcguire12](https://github.com/seanmcguire12)! - include "[selected]" or "[checked]" state in snapshot - [browserbase#2129](browserbase#2129) [`765861c`](browserbase@765861c) Thanks [@miguelg719](https://github.com/miguelg719)! - Add a backend-selectable v3 evaluator facade while preserving the legacy evaluator path. - [browserbase#2157](browserbase#2157) [`2cd60a3`](browserbase@2cd60a3) Thanks [@miguelg719](https://github.com/miguelg719)! - Add verifier trajectory, rubric, and evaluation-result types with normalized public naming. - [browserbase#2131](browserbase#2131) [`e102a89`](browserbase@e102a89) Thanks [@miguelg719](https://github.com/miguelg719)! - Capture verifier trajectory evidence from agent evidence callbacks for offline scoring. ## @browserbasehq/browse-cli@0.6.1 ### Patch Changes - Updated dependencies \[[`3a53ed4`](browserbase@3a53ed4), [`6e75725`](browserbase@6e75725), [`8fc16d2`](browserbase@8fc16d2), [`78bcde8`](browserbase@78bcde8), [`3e95a87`](browserbase@3e95a87), [`ebbdcd3`](browserbase@ebbdcd3), [`12703a6`](browserbase@12703a6), [`1db5f1c`](browserbase@1db5f1c), [`cb586a1`](browserbase@cb586a1), [`765861c`](browserbase@765861c), [`2cd60a3`](browserbase@2cd60a3), [`e102a89`](browserbase@e102a89), [`49575d6`](browserbase@49575d6), [`dc1445d`](browserbase@dc1445d)]: - @browserbasehq/stagehand@3.5.0 ## @browserbasehq/stagehand-server-v3@3.7.0 ### Minor Changes - [browserbase#2160](browserbase#2160) [`49575d6`](browserbase@49575d6) Thanks [@monadoid](https://github.com/monadoid)! - Forward constructor and request model configuration when initializing API-backed sessions. ### Patch Changes - [browserbase#2118](browserbase#2118) [`3e95a87`](browserbase@3e95a87) Thanks [@monadoid](https://github.com/monadoid)! - Add Vertex auth parameters to the core and server API schemas. - [browserbase#2167](browserbase#2167) [`ce21468`](browserbase@ce21468) Thanks [@monadoid](https://github.com/monadoid)! - Add SEA binary --version build metadata output. - Updated dependencies \[[`3a53ed4`](browserbase@3a53ed4), [`6e75725`](browserbase@6e75725), [`8fc16d2`](browserbase@8fc16d2), [`78bcde8`](browserbase@78bcde8), [`3e95a87`](browserbase@3e95a87), [`ebbdcd3`](browserbase@ebbdcd3), [`12703a6`](browserbase@12703a6), [`1db5f1c`](browserbase@1db5f1c), [`cb586a1`](browserbase@cb586a1), [`765861c`](browserbase@765861c), [`2cd60a3`](browserbase@2cd60a3), [`e102a89`](browserbase@e102a89), [`49575d6`](browserbase@49575d6), [`dc1445d`](browserbase@dc1445d)]: - @browserbasehq/stagehand@3.5.0 ## @browserbasehq/stagehand-evals@2.0.2 ### Patch Changes - Updated dependencies \[[`3a53ed4`](browserbase@3a53ed4), [`6e75725`](browserbase@6e75725), [`8fc16d2`](browserbase@8fc16d2), [`78bcde8`](browserbase@78bcde8), [`3e95a87`](browserbase@3e95a87), [`ebbdcd3`](browserbase@ebbdcd3), [`12703a6`](browserbase@12703a6), [`1db5f1c`](browserbase@1db5f1c), [`cb586a1`](browserbase@cb586a1), [`765861c`](browserbase@765861c), [`2cd60a3`](browserbase@2cd60a3), [`e102a89`](browserbase@e102a89), [`49575d6`](browserbase@49575d6), [`dc1445d`](browserbase@dc1445d)]: - @browserbasehq/stagehand@3.5.0
why
Some pages do not properly encapsulate the necessary information required to extract the content requested by the user, and can benefit from a hybrid approach with vision.
what changed
extract({ options: { screenshot: true } })flag. Captures the current viewport as PNG and sends it as animage_urlpart alongside the a11y tree text in the extraction LLM call.false— existing callers see no behavior change.StagehandInvalidArgumentErrorotherwise (validated in both the handler andinference.extract, with the handler check running before the screenshot is taken).ensureTimeRemaining()so it respects the extract timeout.ExtractOptionstype,ExtractOptionsSchema, OpenAPIExtractOptions,StagehandAPIClient.extractwire payload,V3.extract→ExtractHandler→inference.extract→buildExtract{System,User}Prompt.test plan
extract-screenshot.test.ts(new) — multimodal message shape on happy path; rejection for non-AI SDK clients.timeout-handlers.test.ts— handler captures viewport when enabled, skips capture by default, rejects screenshot + non-AI SDK client without touchingpage.screenshotor the snapshot pipeline.api-client-serialization.test.ts(renamed fromapi-client-observe-variables.test.ts) — wire payload preservesoptions.screenshot.Summary by cubic
Adds a screenshot option to
extract()that sends the current viewport screenshot with the accessibility tree to improve results on visually-driven pages.extract({ options: { screenshot: boolean } })captures a PNG of the current viewport and includes it with the accessibility tree; defaults to false; only supported withaisdkclients (throwsStagehandInvalidArgumentErrorotherwise).image_urldata URI; logs when a screenshot is used.ExtractOptions.screenshot); the API client forwards the flag; tests cover prompt shape, viewport capture, default-off behavior, timeout guards, client-type validation, and serialization.Written for commit d0c7500. Summary will update on new commits. Review in cubic