-
Notifications
You must be signed in to change notification settings - Fork 9.7k
Create framework #25324
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Create framework #25324
Changes from 5 commits
Commits
Show all changes
27 commits
Select commit
Hold shift + click to select a range
c18c335
Create framework
kathayl 1f7daf1
Initial skeleton
ToriLindsay 6b00289
Delete src/content/docs/browser-rendering/platform/framework
ToriLindsay e1ecee5
Update stagehand.mdx
kathayl e176d50
docs: update Stagehand documentation with AI Gateway and custom model…
kathayl 0c49271
Update stagehand.mdx
kathayl 3471115
Update stagehand.mdx
kathayl ff3174e
Update Stagehand example with simplified code (#25375)
ruifigueira 0853068
Update stagehand.mdx
kathayl 2102ad0
Fix stagehand example code (#25392)
ruifigueira d57fda7
Add example image
ToriLindsay 7a58086
Update src/content/docs/browser-rendering/platform/stagehand.mdx
kathayl c62c6c5
Update src/content/docs/browser-rendering/platform/stagehand.mdx
kathayl 182a8a8
Update src/content/docs/browser-rendering/platform/stagehand.mdx
kathayl 46a0c60
Update src/content/docs/browser-rendering/platform/stagehand.mdx
kathayl d87ee57
Update src/content/docs/browser-rendering/platform/stagehand.mdx
kathayl 8594ed3
Update src/content/docs/browser-rendering/platform/stagehand.mdx
kathayl d505875
Update src/content/docs/browser-rendering/platform/stagehand.mdx
kathayl fe19053
Update src/content/docs/browser-rendering/platform/stagehand.mdx
kathayl 8076c90
Update src/content/docs/browser-rendering/platform/stagehand.mdx
kathayl 8b454ed
Update src/content/docs/browser-rendering/platform/stagehand.mdx
kathayl 04add45
Update src/content/docs/browser-rendering/platform/stagehand.mdx
kathayl 3878b40
Update src/content/docs/browser-rendering/platform/stagehand.mdx
kathayl 3a40045
Update stagehand.mdx
kathayl 9ed937a
Update stagehand.mdx
kathayl 683a458
Update stagehand.mdx
kathayl f17b96b
Update stagehand.mdx
kathayl File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Some comments aren't visible on the classic Files Changed page.
There are no files selected for viewing
214 changes: 214 additions & 0 deletions
214
src/content/docs/browser-rendering/platform/stagehand.mdx
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,214 @@ | ||
| --- | ||
| pcx_content_type: concept | ||
| title: Stagehand | ||
| description: Deploy a Stagehand server that uses Browser Rendering to provide browser automation capabilities to your agents. | ||
| sidebar: | ||
| order: 7 | ||
| badge: Beta | ||
| --- | ||
|
|
||
| import { | ||
| Render, | ||
| WranglerConfig, | ||
| TabItem, | ||
| Tabs, | ||
| PackageManagers, | ||
| } from "~/components"; | ||
|
|
||
| [Stagehand](https://www.stagehand.dev/) is an open-source, AI-powered browser automation library. Rather than dictating exact steps or specifying selectors, Stagehand enables developers to build more reliably and flexibly by combining code with natural-language instructions powered by AI. This makes your agents more resilient to website changes and easier to maintain. | ||
|
|
||
| This guide shows you how to deploy a Worker that uses Stagehand, Browser Rendering, and [Workers AI](/workers-ai/) to automate a web task. | ||
kathayl marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
|
|
||
| ## Use Stagehand in a Worker | ||
|
|
||
| In this example, you will use Stagehand to search for a movie on [The Movie Database](https://www.themoviedb.org/), extract its details (title, year, and director), and return the information along with a screenshot of the webpage. | ||
kathayl marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
|
|
||
| If you want to skip the steps and get started quickly, select **Deploy to Cloudflare** below. | ||
kathayl marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
|
|
||
| [](https://deploy.workers.cloudflare.com/?url=https://github.com/cloudflare/playwright-mcp/tree/main/cloudflare/example) | ||
|
|
||
| After you deploy, you can interact with the Worker using this URL pattern: | ||
| ``` | ||
| https://<your-worker>.workers.dev | ||
| ``` | ||
|
|
||
| #### 1. Set up your project | ||
kathayl marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
|
|
||
| ???DON'T THEY NEED TO INSRALL BROWSERBASE STAGEHAND TOO? | ||
|
|
||
| Install the necessary dependencies: | ||
kathayl marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| ```bash | ||
| npm ci | ||
| ``` | ||
|
|
||
| #### 2. Configure your Worker | ||
kathayl marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
|
|
||
| Update your wrangler configuration file to include the bindings for Browser Rendering and [Workers AI](/workers-ai/): | ||
| <WranglerConfig> | ||
| ```jsonc | ||
| { | ||
| "name": "cloudflare-stagehand-example", | ||
| "main": "src/index.ts", | ||
| "compatibility_flags": ["nodejs_compat", "enable_nodejs_fs_module"], | ||
| "compatibility_date": "2025-09-01", | ||
| "workers_dev": true, | ||
| "upload_source_maps": true, | ||
| "alias": { | ||
| "playwright": "@cloudflare/playwright" | ||
| }, | ||
| "observability": { | ||
| "enabled": true | ||
| }, | ||
| "browser": { | ||
| "binding": "BROWSER", | ||
| "experimental_remote": true | ||
| }, | ||
| "ai": { | ||
| "binding": "AI" | ||
| } | ||
| } | ||
| ``` | ||
| </WranglerConfig> | ||
|
|
||
| #### 3. Write the Worker code | ||
kathayl marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
|
|
||
| ```ts title="src/index.ts" | ||
|
|
||
| import { Stagehand } from "@browserbasehq/stagehand"; | ||
| import { z } from "zod"; | ||
| import { endpointURLString } from "@cloudflare/playwright"; | ||
| import { createWorkersAI } from "workers-ai-provider"; | ||
| import { AISdkClient } from "./aidsk"; | ||
|
|
||
| export default { | ||
| async fetch(request: Request, env: Env) { | ||
| const url = new URL(request.url); | ||
| if (url.pathname !== "/") | ||
| return new Response("Not found", { status: 404 }); | ||
|
|
||
| const workersai = createWorkersAI({ binding: env.AI }); | ||
| // @ts-ignore | ||
| const model = workersai("@cf/meta/llama-3.3-70b-instruct-fp8-fast"); | ||
|
|
||
| const stagehand = new Stagehand({ | ||
| env: "LOCAL", | ||
| localBrowserLaunchOptions: { cdpUrl: endpointURLString("BROWSER") }, | ||
| llmClient: new AISdkClient({ model }), | ||
| verbose: 1, | ||
| }); | ||
|
|
||
| await stagehand.init(); | ||
| const page = stagehand.page; | ||
|
|
||
| await page.goto('https://www.themoviedb.org/'); | ||
| // for multi-step actions, use observe | ||
| const actions = await page.observe('Search for "The Iron Giant" and click the Search button'); | ||
| for (const action of actions) | ||
| await page.act(action); | ||
| await page.act('Click the first search result'); | ||
| let movieInfo = await page.extract({ | ||
| instruction: 'Extract movie information', | ||
| schema: z.object({ | ||
| title: z.string(), | ||
| year: z.number(), | ||
| director: z.string(), | ||
| }), | ||
| }); | ||
|
|
||
| const screenshot = await page.screenshot(); | ||
| await stagehand.close(); | ||
|
|
||
| return new Response(` | ||
| <html> | ||
| <head> | ||
| <title>Cloudflare Stagehand Example</title> | ||
| <style> | ||
| body { | ||
| font-family: system-ui, -apple-system, sans-serif; | ||
| } | ||
| </style> | ||
| </head> | ||
| <body> | ||
| <h1>Stagehand Example</h1> | ||
| <p>This example shows how to use <a href="https://www.stagehand.dev/">stagehand</a> to extract information from a web page.</p> | ||
| <h2>Movie Information</h2> | ||
| <div> | ||
| <p><b>Title:</b> ${movieInfo.title}</p> | ||
| <p><b>Release Year:</b> ${movieInfo.year}</p> | ||
| <p><b>Director:</b> ${movieInfo.director}</p> | ||
| </div> | ||
| <img src="data:image/png;base64,${screenshot.toString('base64')}" /> | ||
| </body> | ||
| </html> | ||
| `, { | ||
| headers: { | ||
| "Content-Type": "text/html; charset=utf-8", | ||
| }, | ||
| }); | ||
| }, | ||
| }; | ||
| ``` | ||
| #### 4. Build the project | ||
kathayl marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
|
|
||
| ```bash | ||
| npm run build | ||
| ``` | ||
| #### 5. Deploy to Cloudflare Workers | ||
kathayl marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
|
|
||
| After you deploy, you can interact with the Worker using this URL pattern: | ||
| ``` | ||
| https://<your-worker>.workers.dev | ||
| ``` | ||
|
|
||
| ```bash | ||
| npm run deploy | ||
| ``` | ||
|
|
||
| ## Use Cloudflare AI Gateway | ||
kathayl marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
|
|
||
| [AI Gateway](/ai-gateway/) is a service that adds observability to your AI applications. By routing your requests through AI Gateway, you can monitor and debug your AI applications. | ||
|
|
||
| You can use AI Gateway with both Workers AI and third-party models. | ||
|
|
||
| To use AI Gateway, first create a gateway in the [Cloudflare dashboard](https://dash.cloudflare.com/?to=/:account/workers/ai-gateway), then add the `baseURL` as shown below. | ||
|
|
||
| ???I SWITCHED THE ORDER AROUND. WE SHOULD FIRST SHOW AI GATEWAY WHILE STILL USING WORKERS AI | ||
|
|
||
| ```typescript | ||
| const stagehand = new Stagehand({ | ||
| env: "LOCAL", | ||
| localBrowserLaunchOptions: { cdpUrl: endpointURLString("BROWSER") }, | ||
| modelName: "openai/gpt-4.1", | ||
| modelClientOptions: { | ||
| baseURL: `https://gateway.ai.cloudflare.com/v1/${env.CLOUDFLARE_ACCOUNT_ID}/${env.AI_GATEWAY_ID}/openai`, | ||
| }, | ||
| }); | ||
| ``` | ||
|
|
||
| ## Use a custom model | ||
|
|
||
| You can configure Stagehand to use models from third-party providers, including OpenAI or Anthropic, by providing your own credentials. | ||
kathayl marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
|
|
||
| ???DOES THIS ONLY WORK WITH CERTAIN PROVIDERS? ONLY MODELS THAT AIGATEWAY SUPPORTS? | ||
|
|
||
| In this example, you will configure Stagehand to use [OpenAI](https://openai.com/). You will need an OpenAI API key. Cloudflare recommends storing your API key as a [secret](/workers/configuration/secrets/). | ||
|
|
||
| ```bash | ||
| npx wrangler secret put OPENAI_API_KEY | ||
| ``` | ||
|
|
||
| Then, configure Stagehand with your provider, model, and API key. | ||
|
|
||
| ```typescript | ||
| const stagehand = new Stagehand({ | ||
| env: "LOCAL", | ||
| localBrowserLaunchOptions: { cdpUrl: endpointURLString("BROWSER") }, | ||
| modelName: "openai/gpt-4.1", | ||
| modelClientOptions: { | ||
| apiKey: env.OPENAI_API_KEY, | ||
| }, | ||
| }); | ||
| ``` | ||
|
|
||
| ## Stagehand API | ||
| For the full list of Stagehand methods and capabilities, refer to the official [Stagehand API documentation](https://docs.stagehand.dev/first-steps/introduction). | ||
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.