sandbox-agent

API universal para orquestrar múltiplos agentes de codificação de IA em ambientes isolados. Suporta quatro agentes de codificação (Claude Code, Codex, OpenCode, Amp) com um esquema unificado para respostas, eventos e gerenciamento de sessão. Implante localmente ou em sandboxes em nuvem, incluindo E2B, Daytona, Docker, Vercel e Cloudflare, com configuração específica do ambiente. Transmita eventos de agente, gerencie persistência de sessão em vários backends (in-memory, SQLite, Postgres, IndexedDB) e lide com intervenção humana no processo...

npx skills add https://github.com/rivet-dev/skills --skill sandbox-agent

Sandbox Agent

Sandbox Agent provides a universal API for orchestrating AI coding agents in sandboxed environments.

What To Do If You Get Stuck

If something is not working as intended or you are stuck, prompt the user to join the Rivet Discord or file an issue on GitHub to report an issue and get help.

Provide the user with a pre-generated report with:

  • Symptoms
    • If this is happening in local dev, deployed, or both
    • The error you're seeing
    • Relevant source code related to this
  • What you've tried to solve it
  • Environment
    • Sandbox Agent version
    • SDK in use (TypeScript, Python, or HTTP)
    • Agent in use (Claude Code, Codex, OpenCode, Amp, Mock)
    • Sandbox provider (E2B, Daytona, Docker, local)

Quickstart

Install skill (optional)

npx

npx skills add rivet-dev/skills -s sandbox-agent

bunx

bunx skills add rivet-dev/skills -s sandbox-agent

Set environment variables

Each coding agent requires API keys to connect to their respective LLM providers.

Local shell

export ANTHROPIC_API_KEY="sk-ant-..."
export OPENAI_API_KEY="sk-..."

E2B

import { Sandbox } from "@e2b/code-interpreter";

const envs: Record<string, string> = {};
if (process.env.ANTHROPIC_API_KEY) envs.ANTHROPIC_API_KEY = process.env.ANTHROPIC_API_KEY;
if (process.env.OPENAI_API_KEY) envs.OPENAI_API_KEY = process.env.OPENAI_API_KEY;

const sandbox = await Sandbox.create({ envs });

Daytona

import { Daytona } from "@daytonaio/sdk";

const envVars: Record<string, string> = {};
if (process.env.ANTHROPIC_API_KEY) envVars.ANTHROPIC_API_KEY = process.env.ANTHROPIC_API_KEY;
if (process.env.OPENAI_API_KEY) envVars.OPENAI_API_KEY = process.env.OPENAI_API_KEY;

const daytona = new Daytona();
const sandbox = await daytona.create({
  snapshot: "sandbox-agent-ready",
  envVars,
});

Docker

docker run -p 2468:2468 \
  -e ANTHROPIC_API_KEY="sk-ant-..." \
  -e OPENAI_API_KEY="sk-..." \
  rivetdev/sandbox-agent:0.4.2-full \
  server --no-token --host 0.0.0.0 --port 2468

Extracting API keys from current machine

Use sandbox-agent credentials extract-env --export to extract your existing API keys (Anthropic, OpenAI, etc.) from local Claude Code or Codex config files.

Testing without API keys

Use the mock agent for SDK and integration testing without provider credentials.

Multi-tenant and per-user billing

For per-tenant token tracking, budget enforcement, or usage-based billing, see LLM Credentials for gateway options like OpenRouter, LiteLLM, and Portkey.

Run the server

curl

Install and run the binary directly.

curl -fsSL https://releases.rivet.dev/sandbox-agent/0.4.x/install.sh | sh
sandbox-agent server --no-token --host 0.0.0.0 --port 2468

npx

Run without installing globally.

npx @sandbox-agent/[email protected] server --no-token --host 0.0.0.0 --port 2468

bunx

Run without installing globally.

bunx @sandbox-agent/[email protected] server --no-token --host 0.0.0.0 --port 2468

npm i -g

Install globally, then run.

npm install -g @sandbox-agent/[email protected]
sandbox-agent server --no-token --host 0.0.0.0 --port 2468

bun add -g

Install globally, then run.

bun add -g @sandbox-agent/[email protected]
# Allow Bun to run postinstall scripts for native binaries (required for SandboxAgent.start()).
bun pm -g trust @sandbox-agent/cli-linux-x64 @sandbox-agent/cli-linux-arm64 @sandbox-agent/cli-darwin-arm64 @sandbox-agent/cli-darwin-x64 @sandbox-agent/cli-win32-x64
sandbox-agent server --no-token --host 0.0.0.0 --port 2468

Node.js (local)

For local development, use SandboxAgent.start() to spawn and manage the server as a subprocess.

npm install [email protected]
import { SandboxAgent } from "sandbox-agent";

const sdk = await SandboxAgent.start();

Bun (local)

For local development, use SandboxAgent.start() to spawn and manage the server as a subprocess.

bun add [email protected]
# Allow Bun to run postinstall scripts for native binaries (required for SandboxAgent.start()).
bun pm trust @sandbox-agent/cli-linux-x64 @sandbox-agent/cli-linux-arm64 @sandbox-agent/cli-darwin-arm64 @sandbox-agent/cli-darwin-x64 @sandbox-agent/cli-win32-x64
import { SandboxAgent } from "sandbox-agent";

const sdk = await SandboxAgent.start();

Build from source

If you're running from source instead of the installed CLI.

cargo run -p sandbox-agent -- server --no-token --host 0.0.0.0 --port 2468

Binding to 0.0.0.0 allows the server to accept connections from any network interface, which is required when running inside a sandbox where clients connect remotely.

Configuring token

Tokens are usually not required. Most sandbox providers (E2B, Daytona, etc.) already secure networking at the infrastructure layer.

If you expose the server publicly, use --token "$SANDBOX_TOKEN" to require authentication:

sandbox-agent server --token "$SANDBOX_TOKEN" --host 0.0.0.0 --port 2468

Then pass the token when connecting:

TypeScript

import { SandboxAgent } from "sandbox-agent";

const sdk = await SandboxAgent.connect({
  baseUrl: "http://your-server:2468",
  token: process.env.SANDBOX_TOKEN,
});

curl

curl "http://your-server:2468/v1/health" \
  -H "Authorization: Bearer $SANDBOX_TOKEN"

CLI

sandbox-agent --token "$SANDBOX_TOKEN" api agents list \
  --endpoint http://your-server:2468

CORS

If you're calling the server from a browser, see the CORS configuration guide.

Install agents (optional)

To preinstall agents:

sandbox-agent install-agent --all

If agents are not installed up front, they are lazily installed when creating a session.

Install desktop dependencies (optional, Linux only)

If you want to use /v1/desktop/*, install the desktop runtime packages first:

sandbox-agent install desktop --yes

Then use GET /v1/desktop/status or sdk.getDesktopStatus() to verify the runtime is ready before calling desktop screenshot or input APIs.

Create a session

import { SandboxAgent } from "sandbox-agent";

const sdk = await SandboxAgent.connect({
  baseUrl: "http://127.0.0.1:2468",
});

const session = await sdk.createSession({
  agent: "claude",
  sessionInit: {
    cwd: "/",
    mcpServers: [],
  },
});

console.log(session.id);

Send a message

const result = await session.prompt([
  { type: "text", text: "Summarize the repository and suggest next steps." },
]);

console.log(result.stopReason);

Read events

const off = session.onEvent((event) => {
  console.log(event.sender, event.payload);
});

const page = await sdk.getEvents({
  sessionId: session.id,
  limit: 50,
});

console.log(page.items.length);
off();

Test with Inspector

Open the Inspector UI at /ui/ on your server (for example, http://localhost:2468/ui/) to inspect sessions and events in a GUI.

Sandbox Agent Inspector

Next steps

  • Session Persistence — Configure in-memory, Rivet Actor state, IndexedDB, SQLite, and Postgres persistence.

  • Deploy to a Sandbox — Deploy your agent to E2B, Daytona, Docker, Vercel, or Cloudflare.

  • SDK Overview — Use the latest TypeScript SDK API.

Reference Map

Agents

AI

Deploy

General

Mais skills de rivet-dev

rivetkit-actors
rivet-dev
Construa backends com estado usando Rivet Actors: processos de alto desempenho, de longa duração, em memória e persistidos. Use quando você superar HTTP, bancos de dados ou filas.…
official
agent-browser
rivet-dev
Automatiza interações com o navegador para testes web, preenchimento de formulários, capturas de tela e extração de dados. Use quando o usuário precisar navegar em sites, interagir com páginas web…
official
multiplayer-game
rivet-dev
Padrões pragmáticos para construir jogos multiplayer: matchmaking, loops de tick, estado em tempo real, gerenciamento de interesse e validação. Inclui código inicial e padrões de arquitetura para 10 tipos de jogos (battle royale, arena, estilo IO, mundo aberto, festa, física 2D/3D, ranqueado, baseado em turnos, idle) com topologia de atores, diagramas de ciclo de vida e estratégias de netcode. Aborda fundamentos de simulação de servidor: loops de tempo real fixos vs. atualizações orientadas por ações, seleção de motor de física (Rapier 2D/3D) e espacial...
official
rivetkit
rivet-dev
Computação de longa duração e com estado para agentes de IA, aplicativos multiplayer e automação de workflows. Atores são processos persistentes em memória que mantêm estado entre requisições sem idas e vindas ao banco de dados, com escalonamento automático de zero a milhões de instâncias concorrentes. Comunicação em tempo real integrada via WebSockets e eventos, filas duráveis para processamento ordenado de mensagens e SQLite para consultas estruturadas de dados. O estado persiste entre reinicializações e falhas através do Rivet Cloud ou auto-hospedagem...
official
rivetkit-actors
rivet-dev
Construa backends com estado usando Rivet Actors: processos de alto desempenho, de longa duração, em memória e persistidos. Use quando você superar HTTP, bancos de dados ou filas.…
official
rivetkit-client-javascript
rivet-dev
Cliente JavaScript para conectar-se a Rivet Actors com conexões stateless ou stateful. Suporta ambientes de navegador, Node.js e Bun com detecção automática de endpoint via variáveis de ambiente ou configuração explícita. Oferece dois modos de interação: chamadas de ação stateless para requisições independentes e conexões stateful com assinaturas de eventos em tempo real. Inclui acesso de baixo nível a HTTP e WebSocket para atores que implementam handlers onRequest ou onWebSocket. Fornece acesso baseado em array composto...
official
rivetkit-client-react
rivet-dev
Cliente React para conectar-se a Rivet Actors com hooks e gerenciamento de estado em tempo real. Crie hooks tipados com createRivetKit() e conecte-se a instâncias de actor usando useActor() com chaves e parâmetros opcionais. Inscreva-se em eventos de actor com useEvent() e monitore o ciclo de vida da conexão através dos estados connStatus e error. Use createClient() para chamadas únicas sem estado, métodos de descoberta de actor (get, getOrCreate, create, getForId) e acesso de baixo nível a HTTP/WebSocket. Suporta chaves de array compostas...
official
rivetkit-client-swift
rivet-dev
Cliente Swift para conectar-se a Rivet Actors com modos de conexão stateless e stateful. Suporta chamadas de ação stateless e conexões WebSocket persistentes com streaming de eventos em tempo real via AsyncStream. Fornece chamadas de ação tipadas com 0 a 5 argumentos posicionais, além de fallback JSON bruto para contagens maiores de argumentos. Inclui monitoramento do ciclo de vida da conexão por meio de streams de mudanças de status, erros, aberturas e fechamentos. Suporta acesso HTTP e WebSocket de baixo nível para onRequest personalizado e...
official