Communitygithub.com

vercel-labs/vercel-sandbox

Execute agente-browser + Chrome dentro de microVMs Vercel Sandbox para automação de navegador a partir de qualquer aplicação implantada na Vercel.

O que é vercel-sandbox?

Esta skill permite executar automação de navegador headless (Chrome) diretamente de aplicações implantadas na Vercel, usando microVMs efêmeras chamadas Vercel Sandboxes. Ela aproveita a biblioteca `@agent-browser/sandbox` para gerenciar todo o ciclo de vida: uma máquina virtual Linux é iniciada sob demanda, instala as dependências do sistema e do Chromium, executa os comandos do navegador (abrir URL, tirar screenshot, capturar árvore de acessibilidade, preencher formulários, etc.) e é encerrada automaticamente. Com o recurso de 'sandbox snapshot', o tempo de inicialização cai de ~30 segundos para menos de 1 segundo, ideal para produção. A skill funciona com qualquer framework implantado na Vercel (Next.js, SvelteKit, Nuxt, Remix, Astro) e oferece autenticação automática via OIDC em produção, além de suporte a workflows agendados com Cron Jobs da Vercel.

Funciona com~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/vercel-labs/agent-browser/tree/main/skill-data/vercel-sandbox

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

Automação de Navegador com Vercel Sandbox

Execute agente-browser + Chrome headless dentro de microVMs Vercel Sandbox efêmeras. Uma VM Linux é iniciada sob demanda, executa comandos do navegador e é encerrada. Funciona com qualquer framework implantado na Vercel (Next.js, SvelteKit, Nuxt, Remix, Astro, etc.).

Dependências

pnpm add @agent-browser/sandbox @vercel/sandbox

A VM sandbox precisa de dependências de sistema para Chromium além do próprio agente-browser. Os helpers @agent-browser/sandbox instalam-nas por padrão para novas sandboxes e usam sandbox snapshots (abaixo) para inicialização em menos de um segundo. Passe installSystemDependencies: false apenas quando a imagem da sandbox já fornecer as bibliotecas necessárias do Chromium.

Padrão Central

import {
  createAgentBrowserSnapshot,
  runAgentBrowserCommand,
  withAgentBrowserSandbox,
  type VercelSandboxSession,
} from "@agent-browser/sandbox/vercel";

async function withBrowser<T>(
  fn: (sandbox: VercelSandboxSession) => Promise<T>,
): Promise<T> {
  return withAgentBrowserSandbox(fn);
}

Screenshot

O comando screenshot --json salva em um arquivo e retorna o caminho. Leia o arquivo de volta como base64:

export async function screenshotUrl(url: string) {
  return withBrowser(async (sandbox) => {
    await runAgentBrowserCommand(sandbox, ["open", url]);

    const titleResult = await runAgentBrowserCommand<{ data?: { title?: string } }>(sandbox, [
      "get", "title",
    ]);
    const title = titleResult.json?.data?.title || url;

    const ssResult = await runAgentBrowserCommand<{ data?: { path?: string } }>(sandbox, [
      "screenshot",
    ]);
    const ssPath = ssResult.json?.data?.path;
    if (!ssPath) throw new Error("Screenshot não retornou um caminho de arquivo.");
    const b64Result = await sandbox.runCommand("base64", ["-w", "0", ssPath]);
    const screenshot = (await b64Result.stdout()).trim();

    await runAgentBrowserCommand(sandbox, ["close"], { json: false });

    return { title, screenshot };
  });
}

Snapshot de Acessibilidade

export async function snapshotUrl(url: string) {
  return withBrowser(async (sandbox) => {
    await runAgentBrowserCommand(sandbox, ["open", url]);

    const titleResult = await runAgentBrowserCommand<{ data?: { title?: string } }>(sandbox, [
      "get", "title",
    ]);
    const title = titleResult.json?.data?.title || url;

    const snapResult = await runAgentBrowserCommand(sandbox, ["snapshot", "-i", "-c"], {
      json: false,
    });

    await runAgentBrowserCommand(sandbox, ["close"], { json: false });

    return { title, snapshot: snapResult.stdout };
  });
}

Fluxos de Trabalho com Múltiplas Etapas

A sandbox persiste entre comandos, permitindo executar sequências completas de automação:

export async function fillAndSubmitForm(
  url: string,
  data: Record<string, string>,
  postSubmitWaitArgs: string[],
) {
  return withBrowser(async (sandbox) => {
    await runAgentBrowserCommand(sandbox, ["open", url]);

    const snapResult = await runAgentBrowserCommand(sandbox, ["snapshot", "-i"], {
      json: false,
    });
    const snapshot = snapResult.stdout;
    // Analisa o snapshot para encontrar referências de elementos...

    for (const [ref, value] of Object.entries(data)) {
      await runAgentBrowserCommand(sandbox, ["fill", ref, value]);
    }

    await runAgentBrowserCommand(sandbox, ["click", "@e5"]);
    // Passe uma espera específica do aplicativo, como ["--url", "**/checkout/complete"],
    // ["--text", "Obrigado"] ou ["#confirmation"].
    await runAgentBrowserCommand(sandbox, ["wait", ...postSubmitWaitArgs]);

    const ssResult = await runAgentBrowserCommand<{ data?: { path?: string } }>(sandbox, [
      "screenshot",
    ]);
    const ssPath = ssResult.json?.data?.path;
    if (!ssPath) throw new Error("Screenshot não retornou um caminho de arquivo.");
    const b64Result = await sandbox.runCommand("base64", ["-w", "0", ssPath]);
    const screenshot = (await b64Result.stdout()).trim();

    await runAgentBrowserCommand(sandbox, ["close"], { json: false });

    return { screenshot };
  });
}

Snapshots de Sandbox (Inicialização Rápida)

Um sandbox snapshot é uma imagem de VM salva de um Vercel Sandbox com dependências de sistema + agente-browser + Chromium já instalados. Pense nisso como uma imagem Docker: em vez de instalar dependências do zero toda vez, a sandbox é iniciada a partir da imagem pré-construída.

Isso não está relacionado ao recurso de snapshot de acessibilidade do agente-browser (agent-browser snapshot), que despeja a árvore de acessibilidade de uma página. Um sandbox snapshot é um conceito de infraestrutura da Vercel para inicialização rápida de VMs.

Sem um sandbox snapshot, cada execução instala deps do sistema + agente-browser + Chromium (~30s). Com um, a inicialização leva menos de um segundo.

Criando um sandbox snapshot

O snapshot deve incluir dependências de sistema (via dnf), agente-browser e Chromium:

const snapshotId = await createAgentBrowserSnapshot();

Execute isso uma vez e depois defina a variável de ambiente:

AGENT_BROWSER_SNAPSHOT_ID=snap_xxxxxxxxxxxx

Um script auxiliar está disponível no aplicativo de demonstração:

npx tsx examples/environments/scripts/create-snapshot.ts

Recomendado para qualquer implantação em produção que use o padrão Sandbox.

Autenticação

Em implantações na Vercel, o Sandbox SDK autentica automaticamente via OIDC. Para desenvolvimento local ou controle explícito, defina:

VERCEL_TOKEN=<token-de-acesso-pessoal>
VERCEL_TEAM_ID=<id-do-time>
VERCEL_PROJECT_ID=<id-do-projeto>

Esses são espalhados nas chamadas Sandbox.create(). Quando ausentes, o SDK usa VERCEL_OIDC_TOKEN como fallback (automático na Vercel).

Fluxos de Trabalho Agendados (Cron)

Combine com Cron Jobs da Vercel para tarefas recorrentes de navegador:

// app/api/cron/route.ts  (ou equivalente no seu framework)
export async function GET() {
  const result = await withBrowser(async (sandbox) => {
    await sandbox.runCommand("agent-browser", ["open", "https://example.com/pricing"]);
    const snap = await sandbox.runCommand("agent-browser", ["snapshot", "-i", "-c"]);
    await sandbox.runCommand("agent-browser", ["close"]);
    return await snap.stdout();
  });

  // Processar resultados, enviar alertas, armazenar dados...
  return Response.json({ ok: true, snapshot: result });
}
// vercel.json
{ "crons": [{ "path": "/api/cron", "schedule": "0 9 * * *" }] }

Variáveis de Ambiente

VariávelObrigatórioDescrição
AGENT_BROWSER_SNAPSHOT_IDNão (mas recomendado)ID do snapshot de sandbox pré-construído para inicialização em menos de um segundo (veja acima)
VERCEL_TOKENNãoToken de acesso pessoal da Vercel (para desenvolvimento local; OIDC é automático na Vercel)
VERCEL_TEAM_IDNãoID do time da Vercel (para desenvolvimento local)
VERCEL_PROJECT_IDNãoID do projeto da Vercel (para desenvolvimento local)

Exemplos por Framework

O padrão funciona de forma idêntica em todos os frameworks. A única diferença é onde colocar o código do lado do servidor:

FrameworkLocalização do código do servidor
Next.jsServer actions, rotas de API, manipuladores de rota
SvelteKit+page.server.ts, +server.ts
Nuxtserver/api/, server/routes/
RemixFunções loader, action
AstroFrontmatter .astro, rotas de API

Exemplo

Veja examples/environments/ no repositório agent-browser para um aplicativo funcional com o padrão Vercel Sandbox, incluindo um script de criação de sandbox snapshot, UI de progresso com streaming e limitação de taxa.

Individual skills in this repo

This repo contains 8 individual skills — each has its own dedicated page.

agent-browser

Browser automation CLI for AI agents. Use when the user needs to interact with websites, including navigating pages, filling forms, clicking buttons, taking screenshots, extracting data, testing web apps, or automating any browser task. Triggers include requests to

vercel-labs/agentcore

Run agent-browser on AWS Bedrock AgentCore cloud browsers. Use when the user wants to use AgentCore, run browser automation on AWS, use a cloud browser with AWS credentials, or needs a managed browser session backed by AWS infrastructure. Triggers include "use agentcore", "run on AWS", "cloud browser with AWS", "bedrock browser", "agentcore session", or any task requiring AWS-hosted browser automation.

vercel-labs/derive-client

Reverse-engineer a website's internal API by recording browser traffic into a HAR file, then generate a standalone client or CLI that calls the endpoints directly, with no browser needed after the first recording. Use when asked to "derive a client", "build a CLI for <site>", "reverse engineer this site's API", "record network requests", "turn this site into an API", or when the same site will be automated repeatedly and direct HTTP calls would beat driving the browser every time.

vercel-labs/dogfood

Systematically explore and test a web application to find bugs, UX issues, and other problems. Use when asked to "dogfood", "QA", "exploratory test", "find issues", "bug hunt", "test this app/site/platform", or review the quality of a web application. Produces a structured report with full reproduction evidence -- step-by-step screenshots, repro videos, and detailed repro steps for every issue -- so findings can be handed directly to the responsible teams.

vercel-labs/electron

Automate Electron desktop apps (VS Code, Slack, Discord, Figma, Notion, Spotify, etc.) using agent-browser via Chrome DevTools Protocol. Use when the user needs to interact with an Electron app, automate a desktop app, connect to a running app, control a native app, or test an Electron application. Triggers include "automate Slack app", "control VS Code", "interact with Discord app", "test this Electron app", "connect to desktop app", or any task requiring automation of a native Electron application.

vercel-labs/protected-vercel-deployments

Access and test Vercel deployments protected by Vercel Authentication, SSO, or Deployment Protection with agent-browser. Use when a preview or production URL redirects to a Vercel login page, returns a protection 401 or 403, or needs short-lived Trusted Sources OIDC authentication instead of a static bypass secret or public exception.

vercel-labs/slack

Interact with Slack workspaces using browser automation. Use when the user needs to check unread channels, navigate Slack, send messages, extract data, find information, search conversations, or automate any Slack task. Triggers include "check my Slack", "what channels have unreads", "send a message to", "search Slack for", "extract from Slack", "find who said", or any task requiring programmatic Slack interaction.

vercel-labs/webmcp-gen

Build and validate experimental WebMCP tools for an existing web page. Use when an agent needs to expose a site's real workflows as page tools, create webmcp.init.js, define deterministic checks, or compare WebMCP with accessibility-tree automation.

Habilidades Relacionadas