- 
                Notifications
    
You must be signed in to change notification settings  - Fork 9.8k
 
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 6 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
        
          
  
    
      
          
            208 changes: 208 additions & 0 deletions
          
          208 
        
  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,208 @@ | ||
| --- | ||
| 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
         | 
||
| 
     | 
||
| 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. | ||
| 
     | 
||
| ```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
         | 
||
| 
     | 
||
| 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.