Skip to content

feat(verifier): add evaluator backend facade - #2129

Merged
miguelg719 merged 3 commits into
mainfrom
miguelgonzalez/verifier-01-evaluator-compat
May 20, 2026
Merged

feat(verifier): add evaluator backend facade#2129
miguelg719 merged 3 commits into
mainfrom
miguelgonzalez/verifier-01-evaluator-compat

Conversation

@miguelg719

@miguelg719 miguelg719 commented May 15, 2026

Copy link
Copy Markdown
Collaborator

Why

The verifier rewrite needs to coexist with the legacy v3 evaluator so existing evals and callers do not silently change behavior while the new pipeline is reviewed. This PR creates the compatibility boundary that lets us select the evaluator backend explicitly.

What Changed

  • Extracted the current v3 evaluator behavior into LegacyV3Evaluator.
  • Kept V3Evaluator as the public facade.
  • Added STAGEHAND_EVALUATOR_BACKEND=legacy|verifier and constructor backend options.
  • Defaulted the backend to legacy to preserve current ask() and batchAsk() semantics.
  • Added public API tests for backend selection and invalid backend handling.

Tests

  • pnpm --filter @browserbasehq/stagehand run typecheck
  • pnpm --filter @browserbasehq/stagehand run test:core -- packages/core/dist/esm/tests/unit/public-api/v3-core.test.js
  • git diff --check

@changeset-bot

changeset-bot Bot commented May 15, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 2d3682a

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 4 packages
Name Type
@browserbasehq/stagehand Patch
@browserbasehq/stagehand-evals Patch
@browserbasehq/stagehand-server-v3 Patch
@browserbasehq/stagehand-server-v4 Patch

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

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No issues found across 4 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 Caller Code
    participant Facade as V3Evaluator (Facade)
    participant Legacy as LegacyV3Evaluator
    participant LLM as LLM Client
    participant V3 as V3 Instance
    participant Page as Page (Browser)

    Note over Client,Page: Evaluator Backend Selection Flow

    Client->>Facade: new V3Evaluator(v3, { backend })
    alt backend = "verifier"
        Facade->>Facade: Store backend = "verifier"
        Note over Facade: Verifier backend not yet available
    else backend = "legacy" (default)
        Facade->>Facade: Read STAGEHAND_EVALUATOR_BACKEND env
        Facade->>Legacy: Create LegacyV3Evaluator instance
        Note over Facade,Legacy: NEW: Delegates all calls to LegacyV3Evaluator
    end

    Note over Client,Page: ask() - Legacy Backend Flow

    Client->>Facade: ask(options)
    Facade->>Facade: Check backend
    alt backend = "legacy"
        Facade->>Legacy: ask(options)
        Legacy->>Legacy: Validate question & answer/screenshot
        alt screenshot provided as array
            Legacy->>Legacy: _evaluateWithMultipleScreenshots()
            Legacy->>LLM: createChatCompletion() with multiple images
        else screenshot = true (single)
            Legacy->>Page: awaitActivePage()
            Page-->>Legacy: Page object
            Legacy->>Page: screenshot({ fullPage: false })
            Page-->>Legacy: imageBuffer
            Legacy->>LLM: createChatCompletion() with question + image + answer
        else screenshot = false
            Legacy->>LLM: createChatCompletion() with question + agentReasoning
        end
        LLM-->>Legacy: Parsed response (YES/NO + reasoning)
        Legacy-->>Facade: EvaluationResult
        Facade-->>Client: EvaluationResult
    else backend = "verifier"
        Facade->>Facade: Throw StagehandInvalidArgumentError
        Facade-->>Client: Error: "verifier backend not available"
    end

    Note over Client,Page: batchAsk() - Legacy Backend Flow

    Client->>Facade: batchAsk(options)
    Facade->>Legacy: batchAsk(options)
    Legacy->>Legacy: Validate questions array
    alt screenshot = true
        Legacy->>Page: awaitActivePage()
        Page-->>Legacy: Page object
        Legacy->>Page: screenshot()
        Page-->>Legacy: imageBuffer
    end
    Legacy->>Legacy: Format questions into text
    Legacy->>LLM: createChatCompletion() with formatted questions + screenshot
    LLM-->>Legacy: Parsed batch response
    Legacy-->>Facade: EvaluationResult[]
    Facade-->>Client: EvaluationResult[]

    Note over Client,Page: Error Handling - LLM Failure

    Client->>Facade: ask() / batchAsk()
    Facade->>Legacy: Delegate call
    Legacy->>LLM: createChatCompletion()
    alt LLM returns invalid data
        LLM-->>Legacy: Malformed response
        Legacy->>Legacy: Catch parsing error
        Legacy-->>Facade: { evaluation: "INVALID", reasoning: error }
        Facade-->>Client: Fallback result
    else LLM client throws
        LLM-->>Legacy: Error thrown
        Legacy->>Legacy: Catch error
        Legacy-->>Facade: { evaluation: "INVALID", reasoning: error }
        Facade-->>Client: Fallback result
    end
Loading

Re-trigger cubic

@miguelg719
miguelg719 force-pushed the miguelgonzalez/verifier-01-evaluator-compat branch from 513b9d9 to 469b657 Compare May 18, 2026 23:53
Class names already convey "this is the V3 evaluator facade"; the legacy
backend comment lives where it's still load-bearing (V3EvaluatorOptions).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@miguelg719
miguelg719 merged commit 765861c into main May 20, 2026
394 of 416 checks passed
seanmcguire12 pushed a commit that referenced this pull request Jun 3, 2026
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>
felipeofdev-ai pushed a commit to felipeofdev-ai/stagehand that referenced this pull request Aug 4, 2026
# Why

The verifier rewrite needs to coexist with the legacy v3 evaluator so
existing evals and callers do not silently change behavior while the new
pipeline is reviewed. This PR creates the compatibility boundary that
lets us select the evaluator backend explicitly.

# What Changed

- Extracted the current v3 evaluator behavior into `LegacyV3Evaluator`.
- Kept `V3Evaluator` as the public facade.
- Added `STAGEHAND_EVALUATOR_BACKEND=legacy|verifier` and constructor
backend options.
- Defaulted the backend to `legacy` to preserve current `ask()` and
`batchAsk()` semantics.
- Added public API tests for backend selection and invalid backend
handling.

# Tests

- `pnpm --filter @browserbasehq/stagehand run typecheck`
- `pnpm --filter @browserbasehq/stagehand run test:core --
packages/core/dist/esm/tests/unit/public-api/v3-core.test.js`
- `git diff --check`

---------
felipeofdev-ai pushed a commit to felipeofdev-ai/stagehand that referenced this pull request Aug 4, 2026
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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants