browser-use-to-stagehand
browserbase/skills
Преобразовать скрипты автоматизации браузера (Python) для работы в Stagehand v3 (TypeScript) на платформе Browserbase, по возможности заменив непрозрачные циклы агентов на детерминированные конвейеры.
...Расширить всеbrowser-use → Stagehand на Browserbase (/browser-use-to-stagehand)
Преобразует скрипт browser-use (Python) в идиоматический скрипт Stagehand v3 (TypeScript) на Browserbase, выбирая на каждом шаге подходящий уровень детерминизма, а не создавая однозначную агентную копию.
Основной принцип: browser-use по умолчанию является агентивным (каждое действие определяет LLM). Stagehand позволяет выбрать степень использования ИИ. Удачная миграция заменяет непрозрачные агентские циклы на прозрачный, в основном детерминированный конвейер — с использованием ИИ только там, где поведение страницы действительно непредсказуемо. Это рефакторинг с применением суждения, а не просто транспайлинг.
Источник достоверности и версии. Долгосрочная ценность этого навыка заключается в суждении — в спектре детерминизма и решении «декомпозиция или агент» — а не в особенностях API, которые меняются с каждым выпуском. Приведённые здесь сопоставления кода представляют собой моментальный снимок, проверенный на совместимость с
@browserbasehq/stagehand3.6.x и browser-use 0.13.x (2026-06). В случае любого конфликта приоритет имеют актуальные документации — всегда проверяйте на соответствие установленному пакету и этим исходным кодам перед генерацией кода:
- Stagehand v3: https://docs.stagehand.dev/v3 · установленные типы:
node_modules/@browserbasehq/stagehand- Browserbase: https://docs.browserbase.com
- browser-use: https://docs.browser-use.com
Если основная версия установленного Stagehand не равна 3, рассматривайте этот навык как чисто концептуальный и следуйте актуальной документации для каждой сигнатуры.
Справочные файлы (читайте по мере необходимости)
references/api-mapping.md— механическое сопоставление browser-use → Stagehand: обнаружение вариантов, полная таблица возможностей, код «до» и «после», параметры платформы Browserbase и особенности версии v3. Читайте это при работе с любой нетривиальной конструкцией.references/determinism.md— как выбратьagent()vsact/extract/observevs кэшированныйobserve→act. Дерево принятия решений. Ознакомьтесь с этим при принятии решения о том, как перевести файлAgent(task=…).references/trace-assisted.md— опциональный рабочий процесс «запустить на Browserbase, прочитать логи, затем переписать» для непрозрачных/нестабильных скриптов.references/guide.md— руководство по миграции для людей: смена философии, сопоставление функций, спектр детерминизма и рекомендуемый путь миграции.references/prompt.md— автономная, независимая от инструментов версия этого навыка; вставьте её в любой ИИ-помощник вместе со скриптом для работы в браузере.EXAMPLES.md— пары скриптов «до» и «после».
Рабочий процесс
1. Получите исходный код
Получите скрипт(ы) использования браузера. Если пользователь описал только скрипт, попросите предоставить файл(ы). Обратите внимание на целевую платформу: TypeScript Stagehand на Browserbase, если не указано иное.
Сначала определите область применения — можно ли вообще выполнить миграцию? Не каждый файл «browser-use» является
Agent(task=…)скриптом. Если исходный код — это «browser-use», работающий в качестве сервера MCP (uvx browser-use --mcp,mcpServersконфигурация), то эквивалента Stagehand для него нет — пометьте его как выходящий за пределы области применения, не придумывайте его (см. §3.7b раздела «Сопоставление API»). Если вызов browser-use встроен в более крупное приложение (обёртку класса/инструмента, веб-маршрут, задачу очереди), преобразуйте только поверхность взаимодействия с browser-use и сохраните связующий код окружающего приложения — см. §3.8 раздела «сопоставление API».
2. Определите вариант использования браузера
Определите, что это за версию: устаревшая (до 0.12), стабильная или бета-версия Rust (только если импорты происходят из browser_use.beta)
— см. раздел «api-mapping» §1. Примечание: классический интерфейс верхнего уровня from browser_use import Agent, ChatBrowserUse
по-прежнему активно используется в версии 0.13.x — ChatBrowserUse само по себе не является признаком бета-версии; таковым является только
browser_use.beta import является признаком бета-версии. Все варианты переводятся одинаково, поэтому в случае сомнений используйте
стабильное сопоставление. Перед переводом приведите устаревшие имена к стандартной форме. Укажите, какой вариант вы обнаружили.
3. Составьте перечень скриптов
Перед написанием кода на TypeScript составьте структурированный перечень:
- Задача(и) —
task=строка(и); разбейте каждую на подразумеваемые упорядоченные шаги. - Модель —
Chat*поставщик + идентификатор модели. - Конфигурация браузера — локальная или
cdp_url/Browserbase; безграфический режим; прокси;user_data_dir/storage_state. - Структурированный вывод — любые
output_model_schemaмодели Pydantic. - Секретные данные —
sensitive_data, использование переменных среды, процедуры входа. - Защитные меры —
allowed_domains,max_steps. - Пользовательские действия —
@tools.action/Controllerфункции и то, является ли каждая из них детерминированным побочным эффектом или возможностью агента. - Настройка —
initial_actions, вторичные модели (page_extraction_llm,planner_llm).
4. Определите уровень детерминированности для каждого шага
Для каждого шага из перечня примените дерево решений из файла determinism.md:
- Перейти по известному URL-адресу →
page.goto(url)на странице Stagehand (без ИИ). - Действие на странице →
act("…"); если оно повторяется,observe()один раз, затем повторитеact(action)(без вызова LLM). - Чтение данных →
extract("…", zodSchema). - По-настоящему открытый формат → сохранить
stagehand.agent().execute(...)(уточняется с помощьюmaxSteps/systemPrompt).
По умолчанию — декомпозиция, когда поток известен; сохранить agent() только там, где он неизвестен. Для
первого «lift-and-shift» допустим точный agent() перевод — укажите это и отметьте
путь оптимизации.
5. Создание переписанной версии Stagehand v3
Сначала проверьте API. Перед написанием убедитесь в точности сигнатур, которые вы собираетесь использовать, сверяя их с
установленным пакетом (node_modules/@browserbasehq/stagehand типы) или на сайте https://docs.stagehand.dev/v3.
Приведённые ниже сопоставления являются моментальным снимком версии 3.6.x; если в установленной версии что-либо отличается, приоритет имеет установленная
версия. Затем сгенерируйте исполняемый код TypeScript. Всегда:
import { Stagehand } from "@browserbasehq/stagehand";иimport { z } from "zod";при извлечении.- Получите страницу с помощью
const page = stagehand.context.pages()[0];. - Вызывайте методы AI на экземпляре:
stagehand.act(...),stagehand.extract(...),stagehand.observe(...)— никогдаpage.act(...). - не задавайте модель в качестве
"provider/model"строку. - По умолчанию
env: "BROWSERBASE"; отобразитьenv: "LOCAL"в качестве опции разработчика. - Передавайте секретные данные через
variablesиprocess.env, никогда не указывайте их в коде. await stagehand.init()в начале,await stagehand.close()вfinally.
Включите настройку проекта, чтобы он запускался (см. шаблоны ниже).
6. Напишите краткое описание миграции
Наряду с кодом подготовьте краткую сводку:
- Обнаруженный вариант и сделанный выбор детерминизма (какие шаги стали детерминированными, а какие — AI или агентом), с обоснованием.
- Требуется проверка человеком — всё, что не сопоставилось 1:1: утраченные
allowed_domainsограничительные меры, логика пользовательских действий, намерения вторичной модели, неоднозначные строки задач. - Рекомендуемый следующий шаг — Browserbase Context для повторного использования авторизации, кэширование для производственной среды или путь с поддержкой трассировки, если поток был непрозрачным.
7. Предложите путь с использованием трассировки (только если это оправдано)
Если исходный код представлял собой один большой непрозрачный agent(task=…), нестабильным или если ваше переписание нельзя с уверенностью
сопоставить, предложите рабочий процесс с поддержкой трассировки (trace-assisted.md): запустите исходный код на Browserbase, извлеките
sessions.logs.list, а затем перепишите код на основе наблюдаемого поведения. Не запускайте ничего без согласия пользователя.
Шаблоны вывода
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" }
}
Добавьте
"ai": "^5.0.0"(Vercel AI SDK) только в том случае, если пользовательское действие «использование браузера» сопоставляется с агентомtool. Закрепите версию v5, а не v4 — Stagehand 3.6.x включаетaiv5 и типыagent({ tools })как v5ToolSet, где поле схемы инструмента —inputSchema. Вспомогательная функция v4tool()выдаетparametersвместо этого и не пройдет проверку типов по сравнению с v5 от StagehandToolSet. Если вы не можете контролировать поднятуюaiверсию, пропуститеtool()помощник и передайте простой объект{ description, inputSchema: zodSchema, execute }— он удовлетворяет требованиям v5ToolSetнезависимо от того, какоеaiиз основных резолверов будет выполнен.
.env
BROWSERBASE_API_KEY=...
BROWSERBASE_PROJECT_ID=...
ANTHROPIC_API_KEY=... # or the provider matching your model string
index.ts каркас (разбитый на части, предпочтительный вариант)
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); });
Контрольный список проверки (перед объявлением о завершении)
- Методы ИИ применяются к экземпляру (
stagehand.act/extract/observe), а не на странице. - Страница получена с помощью
stagehand.context.pages()[0]. - Model представляет собой
"provider/model"строка; соответствующий ключ провайдера находится в.env. -
extractиспользует схему Zod;zodнаходится в списке зависимостей. - Секреты используют
variables+process.env; ничего не записано жестко в коде. -
init()/close()присутствует;close()вfinally. - Каждый этап использования браузера учтён и целенаправленно размещён на спектре детерминированности.
- В сводке по миграции перечислены варианты детерминизма и пункты, «требующие проверки человеком».
Распространённые ошибки, которых следует избегать
- Копирование синтаксиса v2 (
page.act(),stagehand.page,modelName/modelClientOptions,enableCaching) из старых записей в блоге. Используйте версию v3 — см. раздел «Примечания по версиям» в документации по сопоставлению API. - Перевод каждого шага в формат
act()— перемещайтесь с помощьюpage.gotoи кэшируйте повторяющиеся шаги с помощьюobserve→act; не тратьте вызов LLM на каждое действие. - Установка всего по умолчанию в
agent()— это просто воспроизводит недетерминизм использования браузера в новом фреймворке. Декомпозируйте там, где поток известен. - Тихое исключение
allowed_domains— у Stagehand нет доменного брандмауэра; пометьте это для проверки. - Придумывание опций Browserbase/Stagehand — если не уверены в значении поля, проверьте https://docs.stagehand.dev/v3 / https://docs.browserbase.com, а не гадайте.
---
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
Скачайте файлы навыков и распакуйте их в каталог .claude/skills/.
Скачать ZIPКлонируйте репозиторий и скопируйте файлы навыка в свой проект.
git clone https://github.com/browserbase/skills/tree/main/skills/browser-use-to-stagehand # Copy SKILL.md to your .claude/skills/ directory
Копировать





Дом
