browser-use-to-stagehand
browserbase/skills
Konvertieren Sie Skripte zur Browser-Automatisierung (Python) auf Browserbase in Stagehand v3 (TypeScript) und ersetzen Sie dabei, soweit möglich, undurchsichtige Agent-Schleifen durch deterministische Pipelines.
...Alle erweiternbrowser-use → Stagehand auf Browserbase (/browser-use-to-stagehand)
Konvertieren Sie ein „browser-use“-Skript (Python) in ein idiomatisches Stagehand v3-Skript (TypeScript) auf Browserbase, wobei Sie bei jedem Schritt den richtigen Grad an Determinismus wählen, anstatt eine eins-zu-eins-Kopie mit Agenten zu erstellen.
Kernprinzip: „browser-use“ ist standardmäßig agentisch (das LLM entscheidet über jede Aktion). Mit Stagehand können Sie wählen, in welchem Umfang KI zum Einsatz kommen soll. Eine gute Migration ersetzt undurchsichtige Agenten-Schleifen durch eine überprüfbare, größtenteils deterministische Pipeline – wobei KI nur dort eingesetzt wird, wo die Seite tatsächlich unvorhersehbar ist. Dies ist eine Refaktorisierung mit Urteilsvermögen, keine Transpilation.
Quelle der Wahrheit & Versionen. Der dauerhafte Wert dieser Funktion liegt im Urteilsvermögen – dem Determinismus- Spektrum und der Entscheidung zwischen „Dekomponieren“ und „Agent“ – nicht in den API-Spezifikationen, die sich mit jedem Release ändern. Die hier aufgeführten Code-Zuordnungen sind eine Momentaufnahme, die anhand von „
@browserbasehq/stagehand“ 3.6.x und „browser-use“ 0.13.x (2026-06) validiert wurde. Bei Konflikten haben die Live-Dokumente Vorrang – überprüfe stets anhand des installierten Pakets und dieser Quellen, bevor du Code ausgibst:
- Stagehand v3: https://docs.stagehand.dev/v3 · installierte Typen:
node_modules/@browserbasehq/stagehand- Browserbase: https://docs.browserbase.com
- browser-use: https://docs.browser-use.com
Wenn die Hauptversionsnummer des installierten Stagehand nicht 3 ist, betrachten Sie diese Funktion als rein konzeptionell und orientieren Sie sich bei jeder Signatur an der aktuellen Dokumentation.
Referenzdateien (bei Bedarf lesen)
references/api-mapping.md— die mechanische Zuordnung von „browser-use“ zu „Stagehand“ : Variantenerkennung, die vollständige Funktionstabelle, Vorher-Nachher-Code, „Browserbase“-Plattformoptionen und Fallstricke der Version v3. Lies dies bei jeder nicht trivialen Konstruktion.references/determinism.md— So wählen Sieagent()vsact/extract/observevs zwischengespeichertobserve→act. Der Entscheidungsbaum. Lies dies, wenn du entscheidest, wie ein „Agent(task=…)“ übersetzt werden soll.references/trace-assisted.md— Der optionale Workflow „Auf Browserbase ausführen, Protokolle lesen, dann umschreiben“ für undurchsichtige/unzuverlässige Skripte.references/guide.md— Der Leitfaden zur Migration durch Menschen: Paradigmenwechsel, Funktionszuordnung, das Determinismus-Spektrum und ein empfohlener Migrationspfad.references/prompt.md— eine in sich geschlossene, toolunabhängige Version dieser Fähigkeit; füge sie zusammen mit einem Skript zur Browserbenutzung in einen beliebigen KI-Assistenten ein.EXAMPLES.md— Skriptpaare „vorher/nachher“.
Arbeitsablauf
1. Quelle beschaffen
Besorgen Sie sich das/die Browser-Use-Skript(e). Falls der Nutzer lediglich ein Skript beschrieben hat, fragen Sie nach der/den Datei(en). Beachten Sie das Ziel: TypeScript Stagehand auf Browserbase, sofern nicht anders angegeben.
Prüfen Sie zunächst den Umfang – ist dies überhaupt migrierbar? Nicht jede Browser-Use-Datei ist ein
Agent(task=…)Skript. Wenn es sich bei der Quelle um „browser-use“ handelt, das als MCP-Server läuft (uvx browser-use --mcp, einemcpServersKonfiguration), gibt es kein Stagehand-Äquivalent – kennzeichnen Sie es als außerhalb des Geltungsbereichs und erfinden Sie keines (siehe API-Mapping §3.7b). Wenn der „browser-use“-Aufruf in eine größere App eingebettet ist (ein Klassen-/Tool-Wrapper, eine Web-Route, eine Warteschlangenaufgabe), konvertiere nur die „browser-use“-Oberfläche und behalte die umgebenden App-Verbindungen bei – siehe API-Mapping §3.8.
2. Erkenne die „browser-use“-Variante
Unterscheide zwischen Legacy (vor 0.12), Stable und Rust Beta (nur wenn Importe aus browser_use.beta)
– siehe api-mapping §1. Hinweis: Die klassische Top-Level- from browser_use import Agent, ChatBrowserUse
ist in 0.13.x nach wie vor vorhanden – ChatBrowserUse allein ist kein Hinweis auf eine Beta-Version; nur ein
browser_use.beta Import ist es. Alle Varianten werden identisch übersetzt; im Zweifelsfall daher mit der
stabilen Zuordnung fortfahren. Legacy-Namen vor der Übersetzung normalisieren. Geben Sie an, welche Variante Sie gefunden haben.
3. Erstellen Sie eine Bestandsaufnahme des Skripts
Erstellen Sie eine strukturierte Bestandsaufnahme, bevor Sie TypeScript schreiben:
- Aufgabe(n) – die
task=Zeichenkette(n); unterteilen Sie jede in die implizierten, geordneten Schritte. - Modell — die
Chat*Anbieter + Modell-ID. - Browserkonfiguration – lokal vs.
cdp_url/Browserbase; Headless-Modus; Proxys;user_data_dir/storage_state. - Strukturierte Ausgabe – beliebige
output_model_schemaPydantic-Modelle. - Geheime Daten —
sensitive_data, Verwendung von Umgebungsvariablen, Anmeldeabläufe. - Sicherheitsvorkehrungen —
allowed_domains,max_steps. - Benutzerdefinierte Aktionen –
@tools.action/ControllerFunktionen und die Frage, ob es sich bei jeder einzelnen um einen deterministischen Nebeneffekt oder eine Agentenfähigkeit handelt. - Einrichtung —
initial_actions, sekundäre Modelle (page_extraction_llm,planner_llm).
4. Bestimmen Sie den Determinismusgrad pro Schritt
Wende für jeden Schritt aus der Liste den Entscheidungsbaum in determinism.md an:
- Zu einer bekannten URL navigieren →
page.goto(url)auf der „Stagehand“-Seite (keine KI). - Aktion auf der Seite →
act("…"); falls sie sich wiederholt,observe()einmal, dann erneut ausführenact(action)(kein LLM-Aufruf). - Daten lesen →
extract("…", zodSchema). - Wirklich offen → beibehalten
stagehand.agent().execute(...)(eingeschränkt durchmaxSteps/systemPrompt).
Standardmäßig auf Zerlegung, wenn der Ablauf bekannt ist; beibehalten agent() nur dort, wo er nicht bekannt ist. Für einen
ersten „Lift-and-Shift“ ist eine originalgetreue agent() Übersetzung akzeptabel – weisen Sie darauf hin und vermerken Sie den
Optimierungspfad.
5. Erstellen Sie die Stagehand-v3-Umschreibung
Überprüfen Sie zunächst die API. Vergewissern Sie sich vor dem Schreiben, dass die genauen Signaturen, die Sie verwenden wollen, mit
dem installierten Paket übereinstimmen (node_modules/@browserbasehq/stagehand Typen) oder unter https://docs.stagehand.dev/v3.
Die folgenden Zuordnungen stammen aus einem 3.6.x-Snapshot; sollten sich in der installierten Version Abweichungen ergeben, ist die installierte
Version maßgebend. Erzeuge anschließend ausführbares TypeScript. Immer:
import { Stagehand } from "@browserbasehq/stagehand";undimport { z } from "zod";beim Extrahieren.- Rufen Sie die Seite über
const page = stagehand.context.pages()[0];. - Rufen Sie KI-Methoden auf der Instanz auf:
stagehand.act(...),stagehand.extract(...),stagehand.observe(...)— niemalspage.act(...). - Das Modell als
"provider/model"Zeichenkette fest. - Standardmäßig
env: "BROWSERBASE"; zeigeenv: "LOCAL"als Entwicklungsoption an. - Geheimnisse über
variablesundprocess.env, niemals fest codiert. await stagehand.init()zu Beginn,await stagehand.close()in einerfinally.
Fügen Sie die Projekteinstellungen so ein, dass es läuft (siehe die Vorlagen unten).
6. Verfassen Sie die Zusammenfassung der Migration
Erstellen Sie neben dem Code eine kurze Zusammenfassung:
- Erkannte Variante und die getroffenen Entscheidungen zum Determinismus (welche Schritte wurden deterministisch vs. KI vs. Agent), mit Begründung.
- Muss von einem Menschen überprüft werden – alles, was nicht 1:1 zugeordnet werden konnte: fehlende
allowed_domainsLeitplanken, Logik benutzerdefinierter Aktionen, Absicht des Sekundärmodells, mehrdeutige Aufgabenzeichenfolgen. - Empfohlener nächster Schritt – „Browserbase Context“ zur Wiederverwendung der Authentifizierung, Caching für die Produktion oder der trace-gestützte Pfad, falls der Ablauf undurchsichtig war.
7. Bieten Sie den trace-gestützten Pfad an (nur wenn gerechtfertigt)
Wenn die Quelle ein einziger großer und undurchsichtiger agent(task=…), unzuverlässig war oder sich Ihre Neuprogrammierung nicht sicher
abbilden lässt, bieten Sie den trace-gestützten Workflow an (trace-assisted.md): Führen Sie das Original auf Browserbase aus, extrahieren Sie
sessions.logs.listund schreiben Sie den Code anhand des beobachteten Verhaltens um. Führen Sie nichts ohne die Zustimmung des Benutzers aus.
Ausgabevorlagen
package.json
{
"name": "stagehand-migration",
"type": "module",
"scripts": { "start": "tsx index.ts" },
"dependencies": {
"@browserbasehq/stagehand": "^3.0.0",
"dotenv": "^16.0.0",
"zod": "^3.25.0"
},
"devDependencies": { "tsx": "^4.0.0", "typescript": "^5.0.0" }
}
Füge
"ai": "^5.0.0"(Vercel AI SDK) nur hinzu, wenn eine benutzerdefinierte Browser-Nutzungsaktion einem Agenten zugeordnet isttool. Verwenden Sie v5, nicht v4 – Stagehand 3.6.x bündeltaiv5 und Typenagent({ tools })als v5ToolSet, wobei das Schema-Feld eines Tools „inputSchema“ lautet. Der v4-tool()gibt stattdessenparametersstattdessen und scheitert bei der Typüberprüfung gegen Stagehands v5ToolSet. Wenn Sie die heraufgezogeneaiVersion nicht beeinflussen können, lassen Sie dentool()Helper und übergeben Sie ein einfaches Objekt{ description, inputSchema: zodSchema, execute }— dieses erfüllt die Anforderungen von v5ToolSet, unabhängig davon, welcheaiHauptkategorie aufgelöst wird.
.env
BROWSERBASE_API_KEY=...
BROWSERBASE_PROJECT_ID=...
ANTHROPIC_API_KEY=... # or the provider matching your model string
index.ts Skelett (zerlegt, die bevorzugte Form)
import "dotenv/config";
import { Stagehand } from "@browserbasehq/stagehand";
import { z } from "zod";
async function main() {
const stagehand = new Stagehand({
env: "BROWSERBASE",
model: "anthropic/claude-sonnet-4-6",
});
await stagehand.init();
try {
const page = stagehand.context.pages()[0];
await page.goto("https://example.com"); // deterministic skeleton
await stagehand.act("…"); // AI where the page varies
const data = await stagehand.extract("…", z.object({ /* … */ })); // structured reads
console.log(data);
} finally {
await stagehand.close();
}
}
main().catch((err) => { console.error(err); process.exit(1); });
Validierungscheckliste (vor der Erklärung als „fertig“)
- KI-Methoden werden auf der Instanz angewendet (
stagehand.act/extract/observe), nicht auf der Seite. - Seite abgerufen über
stagehand.context.pages()[0]. - Modell ist eine
"provider/model"Zeichenkette; der passende Provider-Schlüssel befindet sich in.env. -
extractverwendet ein ZOD-Schema;zodbefindet sich in den Abhängigkeiten. - Geheimnisse verwenden
variables+process.env; nichts ist fest codiert. -
init()/close()vorhanden;close()infinally. - Jeder Schritt der Browser-Nutzung wird berücksichtigt und bewusst auf dem Determinismus-Spektrum eingeordnet.
- Die Migrationszusammenfassung listet Determinismus-Entscheidungen und Punkte auf, die „eine Überprüfung durch einen Menschen erfordern“.
Häufige Fehler, die es zu vermeiden gilt
- Das Kopieren der v2-Syntax (
page.act(),stagehand.page,modelName/modelClientOptions,enableCaching) aus alten Blogbeiträgen. Verwenden Sie v3 – siehe „Versionshinweise“ im API-Mapping. - Jeden Schritt in „
act()“ übersetzen – navigieren Sie mitpage.gotound speichere wiederholbare Schritte überobserve→act; verschwenden Sie nicht bei jeder Aktion einen LLM-Aufruf. - Alles standardmäßig auf „
agent()“ setzen – das reproduziert lediglich den Nichtdeterminismus der Browser-Nutzung in einem neuen Framework. Zerlege den Ablauf dort, wo er bekannt ist. allowed_domainsstillschweigend weglassen – Stagehand hat keine Domänen-Firewall; zur Überprüfung markieren.- Neue Browserbase-/Stagehand-Optionen erfinden — wenn du dir bei einem Feld unsicher bist, schau lieber unter https://docs.stagehand.dev/v3 / https://docs.browserbase.com nach, anstatt zu raten.
---
name: browser-use-to-stagehand
description: Convert browser-use (Python) browser-automation scripts to Stagehand v3 (TypeScript) on Browserbase, replacing opaque agent loops with deterministic pipelines where possible.
license: MIT
---
# browser-use → Stagehand on Browserbase (`/browser-use-to-stagehand`)
Convert a browser-use (Python) script into an idiomatic **Stagehand v3 (TypeScript)** script on
**Browserbase**, choosing the right level of determinism at each step rather than producing a
one-to-one agentic copy.
**Core principle:** browser-use is agentic-by-default (the LLM decides every action). Stagehand
lets you choose how much AI to use. A good migration replaces opaque agent loops with an
inspectable, mostly-deterministic pipeline — using AI only where the page is genuinely
unpredictable. This is a refactor with judgment, not a transpile.
> **Source of truth & versions.** This skill's durable value is the *judgment* — the determinism
> spectrum and the decompose-vs-agent decision — not the API specifics, which drift every release.
> The code mappings here are a **snapshot validated against `@browserbasehq/stagehand` 3.6.x and
> browser-use 0.13.x (2026-06)**. On any conflict, the **live docs win** — always verify against the
> installed package and these sources before emitting code:
> - Stagehand v3: <https://docs.stagehand.dev/v3> · installed types: `node_modules/@browserbasehq/stagehand`
> - Browserbase: <https://docs.browserbase.com>
> - browser-use: <https://docs.browser-use.com>
>
> If the installed Stagehand major is **not 3**, treat this skill as conceptual only and follow the
> live docs for every signature.
## Reference files (read as needed)
- [`references/api-mapping.md`](references/api-mapping.md) — the mechanical browser-use → Stagehand
mapping: variant detection, the full feature table, before/after code, Browserbase platform
options, and v3 version gotchas. **Read this for any non-trivial construct.**
- [`references/determinism.md`](references/determinism.md) — how to choose `agent()` vs
`act`/`extract`/`observe` vs cached `observe`→`act`. The decision tree. **Read this when deciding
how to translate an `Agent(task=…)`.**
- [`references/trace-assisted.md`](references/trace-assisted.md) — the optional "run it on
Browserbase, read the logs, then rewrite" workflow for opaque/flaky scripts.
- [`references/guide.md`](references/guide.md) — the human migration guide: philosophy shift,
feature mapping, the determinism spectrum, and a recommended migration path.
- [`references/prompt.md`](references/prompt.md) — a self-contained, tool-agnostic version of this
skill; paste it into any AI assistant along with a browser-use script.
- [`EXAMPLES.md`](EXAMPLES.md) — before/after script pairs.
## Workflow
### 1. Get the source
Obtain the browser-use script(s). If the user only described a script, ask for the file(s). Note
the target: **TypeScript Stagehand on Browserbase** unless they say otherwise.
> **First, gate on scope — is this even migratable?** Not every browser-use file is an
> `Agent(task=…)` script. If the source is **browser-use running as an MCP server**
> (`uvx browser-use --mcp`, a `mcpServers` config) there is **no Stagehand equivalent** — flag it as
> out of scope, don't invent one (see api-mapping §3.7b). If the browser-use call is **embedded in a
> larger app** (a class/tool wrapper, web route, queue task), convert only the browser-use surface and
> preserve the surrounding app glue — see api-mapping §3.8.
### 2. Detect the browser-use variant
Identify legacy (pre-0.12) vs stable vs Rust beta (only when imports come from `browser_use.beta`)
— see api-mapping §1. Note: the classic top-level `from browser_use import Agent, ChatBrowserUse`
surface is alive and well in 0.13.x — `ChatBrowserUse` alone is **not** a beta tell; only a
`browser_use.beta` import is. All variants translate identically, so when unsure, proceed with the
stable mapping. Normalize legacy names before translating. State which variant you found.
### 3. Inventory the script
Extract a structured inventory before writing any TypeScript:
- **Task(s)** — the `task=` string(s); split each into its implied ordered steps.
- **Model** — the `Chat*` provider + model id.
- **Browser config** — local vs `cdp_url`/Browserbase; headless; proxies; `user_data_dir`/`storage_state`.
- **Structured output** — any `output_model_schema` Pydantic models.
- **Secrets** — `sensitive_data`, env-var usage, login flows.
- **Guardrails** — `allowed_domains`, `max_steps`.
- **Custom actions** — `@tools.action` / `Controller` functions, and whether each is a deterministic
side-effect or an agent capability.
- **Setup** — `initial_actions`, secondary models (`page_extraction_llm`, `planner_llm`).
### 4. Decide the determinism level per step
For each step from the inventory, apply the decision tree in determinism.md:
- Navigate to a known URL → `page.goto(url)` on the Stagehand page (no AI).
- On-page action → `act("…")`; if it repeats, `observe()` once then replay `act(action)` (no LLM call).
- Reading data → `extract("…", zodSchema)`.
- Genuinely open-ended → keep `stagehand.agent().execute(...)` (tightened with `maxSteps`/`systemPrompt`).
Default to **decomposition** when the flow is known; keep `agent()` only where it isn't. For a
first lift-and-shift, a faithful `agent()` translation is acceptable — say so and note the
optimization path.
### 5. Produce the Stagehand v3 rewrite
**First, verify the API.** Before writing, confirm the exact signatures you're about to use against
the installed package (`node_modules/@browserbasehq/stagehand` types) or <https://docs.stagehand.dev/v3>.
The mappings below are a 3.6.x snapshot; if anything differs in the installed version, the installed
version wins. Then emit runnable TypeScript. Always:
- `import { Stagehand } from "@browserbasehq/stagehand";` and `import { z } from "zod";` when extracting.
- Get the page via `const page = stagehand.context.pages()[0];`.
- Call AI methods on the **instance**: `stagehand.act(...)`, `stagehand.extract(...)`,
`stagehand.observe(...)` — **never** `page.act(...)`.
- Set the model as a `"provider/model"` string.
- Default to `env: "BROWSERBASE"`; show `env: "LOCAL"` as the dev option.
- Pass secrets via `variables` and `process.env`, never hardcoded.
- `await stagehand.init()` at the start, `await stagehand.close()` in a `finally`.
Include the project setup so it runs (see the templates below).
### 6. Write the migration summary
Alongside the code, produce a short summary:
- **Variant detected** and the determinism choices made (which steps became deterministic vs AI vs agent), with the reasoning.
- **Needs human review** — anything that didn't map 1:1: lost `allowed_domains` guardrails,
custom-action logic, secondary-model intent, ambiguous task strings.
- **Recommended next step** — Browserbase Context for auth reuse, caching for production, or the
trace-assisted path if the flow was opaque.
### 7. Offer the trace-assisted path (only if warranted)
If the source was one large opaque `agent(task=…)`, was flaky, or your rewrite can't be confidently
mapped, offer the trace-assisted workflow (trace-assisted.md): run the original on Browserbase, pull
`sessions.logs.list`, and rewrite from observed behavior. Don't run anything without the user's go-ahead.
## Output templates
**`package.json`**
```json
{
"name": "stagehand-migration",
"type": "module",
"scripts": { "start": "tsx index.ts" },
"dependencies": {
"@browserbasehq/stagehand": "^3.0.0",
"dotenv": "^16.0.0",
"zod": "^3.25.0"
},
"devDependencies": { "tsx": "^4.0.0", "typescript": "^5.0.0" }
}
```
> Add `"ai": "^5.0.0"` (Vercel AI SDK) **only** if a custom browser-use action maps to an agent
> `tool`. **Pin v5, not v4** — Stagehand 3.6.x bundles `ai` v5 and types `agent({ tools })` as the v5
> `ToolSet`, where a tool's schema field is **`inputSchema`**. The v4 `tool()` helper emits
> `parameters` instead and will **fail to type-check** against Stagehand's v5 `ToolSet`. If you can't
> control the hoisted `ai` version, skip the `tool()` helper and pass a plain object
> `{ description, inputSchema: zodSchema, execute }` — it satisfies the v5 `ToolSet` regardless of which
> `ai` major resolves.
**`.env`**
```bash
BROWSERBASE_API_KEY=...
BROWSERBASE_PROJECT_ID=...
ANTHROPIC_API_KEY=... # or the provider matching your model string
```
**`index.ts` skeleton** (decomposed, the preferred shape)
```typescript
import "dotenv/config";
import { Stagehand } from "@browserbasehq/stagehand";
import { z } from "zod";
async function main() {
const stagehand = new Stagehand({
env: "BROWSERBASE",
model: "anthropic/claude-sonnet-4-6",
});
await stagehand.init();
try {
const page = stagehand.context.pages()[0];
await page.goto("https://example.com"); // deterministic skeleton
await stagehand.act("…"); // AI where the page varies
const data = await stagehand.extract("…", z.object({ /* … */ })); // structured reads
console.log(data);
} finally {
await stagehand.close();
}
}
main().catch((err) => { console.error(err); process.exit(1); });
```
## Validation checklist (before declaring done)
- [ ] AI methods are on the **instance** (`stagehand.act/extract/observe`), not the page.
- [ ] Page obtained via `stagehand.context.pages()[0]`.
- [ ] Model is a `"provider/model"` string; the matching provider key is in `.env`.
- [ ] `extract` uses a zod schema; `zod` is in dependencies.
- [ ] Secrets use `variables` + `process.env`; nothing hardcoded.
- [ ] `init()` / `close()` present; `close()` in `finally`.
- [ ] Each browser-use step is accounted for, placed deliberately on the determinism spectrum.
- [ ] Migration summary lists determinism choices and "needs human review" items.
## Common mistakes to avoid
- **Copying v2 syntax** (`page.act()`, `stagehand.page`, `modelName`/`modelClientOptions`,
`enableCaching`) from old blog posts. Use v3 — see api-mapping "Version notes".
- **Translating every step into `act()`** — navigate with `page.goto` and cache repeatable steps via `observe`→`act`; don't spend an LLM call on every action.
- **Defaulting everything to `agent()`** — that just reproduces browser-use's non-determinism in a
new framework. Decompose where the flow is known.
- **Silently dropping `allowed_domains`** — Stagehand has no domain firewall; flag it for review.
- **Inventing Browserbase/Stagehand options** — if unsure of a field, check
<https://docs.stagehand.dev/v3> / <https://docs.browserbase.com> rather than guessing.
browser-use-to-stagehand installieren
Laden Sie die Skill-Dateien herunter und entpacken Sie sie in Ihr Verzeichnis „.claude/skills/“.
ZIP herunterladenKlonen Sie das Repository und kopieren Sie die Skill-Dateien in Ihr Projekt.
git clone https://github.com/browserbase/skills/tree/main/skills/browser-use-to-stagehand # Copy SKILL.md to your .claude/skills/ directory
Kopieren





Heim
