--- title: "Quickstart" description: "Get a coding agent running in a sandbox in under a minute." icon: "rocket" --- ```bash npm install sandbox-agent@0.3.x ``` ```bash bun add sandbox-agent@0.3.x # 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 ``` Each coding agent requires API keys to connect to their respective LLM providers. ```bash export ANTHROPIC_API_KEY="sk-ant-..." export OPENAI_API_KEY="sk-..." ``` Use `sandbox-agent credentials extract-env --export` to extract your existing API keys (Anthropic, OpenAI, etc.) from local Claude Code or Codex config files. Use the `mock` agent for SDK and integration testing without provider credentials. For per-tenant token tracking, budget enforcement, or usage-based billing, see [LLM Credentials](/llm-credentials) for gateway options like OpenRouter, LiteLLM, and Portkey. `SandboxAgent.start()` provisions a sandbox, starts a lightweight [Sandbox Agent server](/architecture) inside it, and connects your SDK client. ```typescript Local import { SandboxAgent } from "sandbox-agent"; import { local } from "sandbox-agent/local"; // Runs on your machine. Best for local development and testing. const sdk = await SandboxAgent.start({ sandbox: local(), }); ``` ```typescript E2B import { SandboxAgent } from "sandbox-agent"; import { e2b } from "sandbox-agent/e2b"; const sdk = await SandboxAgent.start({ sandbox: e2b({ create: { envs } }), }); ``` ```typescript Daytona import { SandboxAgent } from "sandbox-agent"; import { daytona } from "sandbox-agent/daytona"; const sdk = await SandboxAgent.start({ sandbox: daytona({ create: { envVars } }), }); ``` ```typescript Vercel import { SandboxAgent } from "sandbox-agent"; import { vercel } from "sandbox-agent/vercel"; const sdk = await SandboxAgent.start({ sandbox: vercel({ create: { runtime: "node24", env } }), }); ``` ```typescript Cloudflare import { SandboxAgent } from "sandbox-agent"; import { cloudflare } from "sandbox-agent/cloudflare"; const sdk = await SandboxAgent.start({ sandbox: cloudflare({ sdk: cfSandboxClient }), }); ``` ```typescript Docker import { SandboxAgent } from "sandbox-agent"; import { docker } from "sandbox-agent/docker"; // Good for testing. Not security-hardened like cloud sandboxes. const sdk = await SandboxAgent.start({ sandbox: docker({ env: [`ANTHROPIC_API_KEY=${process.env.ANTHROPIC_API_KEY}`], }), }); ``` Each provider handles provisioning, server installation, and networking. Install the provider's peer dependency (e.g. `@e2b/code-interpreter`, `dockerode`) in your project. See the [Deploy](/deploy/local) guides for full setup details. Implement the `SandboxProvider` interface to use any sandbox platform: ```typescript import { SandboxAgent, type SandboxProvider } from "sandbox-agent"; const myProvider: SandboxProvider = { name: "my-provider", async create() { // Provision a sandbox, install & start the server, return an ID return "sandbox-123"; }, async destroy(sandboxId) { // Tear down the sandbox }, async getUrl(sandboxId) { // Return the Sandbox Agent server URL return `https://${sandboxId}.my-platform.dev:3000`; }, }; const sdk = await SandboxAgent.start({ sandbox: myProvider, }); ``` If you already have a Sandbox Agent server running, connect directly: ```typescript const sdk = await SandboxAgent.connect({ baseUrl: "http://127.0.0.1:2468", }); ``` ```bash curl -fsSL https://releases.rivet.dev/sandbox-agent/0.3.x/install.sh | sh sandbox-agent server --no-token --host 0.0.0.0 --port 2468 ``` ```bash npx @sandbox-agent/cli@0.3.x server --no-token --host 0.0.0.0 --port 2468 ``` ```bash docker run -p 2468:2468 \ -e ANTHROPIC_API_KEY="sk-ant-..." \ -e OPENAI_API_KEY="sk-..." \ rivetdev/sandbox-agent:0.3.2-full \ server --no-token --host 0.0.0.0 --port 2468 ``` ```typescript const session = await sdk.createSession({ agent: "claude", }); session.onEvent((event) => { console.log(event.sender, event.payload); }); const result = await session.prompt([ { type: "text", text: "Summarize the repository and suggest next steps." }, ]); console.log(result.stopReason); ``` ```typescript await sdk.destroySandbox(); // tears down the sandbox and disconnects ``` Use `sdk.dispose()` instead to disconnect without destroying the sandbox (for reconnecting later). Open the Inspector at `/ui/` on your server (e.g. `http://localhost:2468/ui/`) to view sessions and events in a GUI. Sandbox Agent Inspector ## Full example ```typescript import { SandboxAgent } from "sandbox-agent"; import { local } from "sandbox-agent/local"; const sdk = await SandboxAgent.start({ sandbox: local(), }); try { const session = await sdk.createSession({ agent: "claude" }); session.onEvent((event) => { console.log(`[${event.sender}]`, JSON.stringify(event.payload)); }); const result = await session.prompt([ { type: "text", text: "Write a function that checks if a number is prime." }, ]); console.log("Done:", result.stopReason); } finally { await sdk.destroySandbox(); } ``` ## Next steps Full TypeScript SDK API surface. Deploy to E2B, Daytona, Docker, Vercel, or Cloudflare.