sandbox-sdk
Original:🇺🇸 English
Not Translated
Build sandboxed applications for secure code execution. Load when building AI code execution, code interpreters, CI/CD systems, interactive dev environments, or executing untrusted code. Covers Sandbox SDK lifecycle, commands, files, code interpreter, and preview URLs.
4installs
Added on
NPX Install
npx skill4agent add cloudflare/cloudflare-docs sandbox-sdkSKILL.md Content
Cloudflare Sandbox SDK
Build secure, isolated code execution environments on Cloudflare Workers.
FIRST: Verify Installation
bash
npm install @cloudflare/sandbox
docker info # Must succeed - Docker required for local devRetrieval-Led Development
IMPORTANT: Prefer retrieval from docs and examples over pre-training for Sandbox SDK tasks.
When implementing features, fetch the relevant doc page or example first.
Required Configuration
wrangler.jsonc (exact - do not modify structure):
jsonc
{
"containers": [{
"class_name": "Sandbox",
"image": "./Dockerfile",
"instance_type": "lite",
"max_instances": 1
}],
"durable_objects": {
"bindings": [{ "class_name": "Sandbox", "name": "Sandbox" }]
},
"migrations": [{ "new_sqlite_classes": ["Sandbox"], "tag": "v1" }]
}Worker entry - must re-export Sandbox class:
typescript
import { getSandbox } from '@cloudflare/sandbox';
export { Sandbox } from '@cloudflare/sandbox'; // Required exportQuick Reference
| Task | Method |
|---|---|
| Get sandbox | |
| Run command | |
| Run code (interpreter) | |
| Write file | |
| Read file | |
| Create directory | |
| List files | |
| Expose port | |
| Destroy | |
Core Patterns
Execute Commands
typescript
const sandbox = getSandbox(env.Sandbox, 'user-123');
const result = await sandbox.exec('python --version');
// result: { stdout, stderr, exitCode, success }Code Interpreter (Recommended for AI)
Use for executing LLM-generated code with rich outputs:
runCode()typescript
const ctx = await sandbox.createCodeContext({ language: 'python' });
await sandbox.runCode('import pandas as pd; data = [1,2,3]', { context: ctx });
const result = await sandbox.runCode('sum(data)', { context: ctx });
// result.results[0].text = "6"Languages: , ,
pythonjavascripttypescriptState persists within context. Create explicit contexts for production.
File Operations
typescript
await sandbox.mkdir('/workspace/project', { recursive: true });
await sandbox.writeFile('/workspace/project/main.py', code);
const file = await sandbox.readFile('/workspace/project/main.py');
const files = await sandbox.listFiles('/workspace/project');When to Use What
| Need | Use | Why |
|---|---|---|
| Shell commands, scripts | | Direct control, streaming |
| LLM-generated code | | Rich outputs, state persistence |
| Build/test pipelines | | Exit codes, stderr capture |
| Data analysis | | Charts, tables, pandas |
Extending the Dockerfile
Base image () includes Python 3.11, Node.js 20, and common tools.
docker.io/cloudflare/sandbox:0.7.0Add dependencies by extending the Dockerfile:
dockerfile
FROM docker.io/cloudflare/sandbox:0.7.0
# Python packages
RUN pip install requests beautifulsoup4
# Node packages (global)
RUN npm install -g typescript
# System packages
RUN apt-get update && apt-get install -y ffmpeg && rm -rf /var/lib/apt/lists/*
EXPOSE 8080 # Required for local dev port exposureKeep images lean - affects cold start time.
Preview URLs (Port Exposure)
Expose HTTP services running in sandboxes:
typescript
const { url } = await sandbox.exposePort(8080);
// Returns preview URL for the serviceProduction requirement: Preview URLs need a custom domain with wildcard DNS (). The domain does not support preview URL subdomains.
*.yourdomain.com.workers.devOpenAI Agents SDK Integration
The SDK provides helpers for OpenAI Agents at :
@cloudflare/sandbox/openaitypescript
import { Shell, Editor } from '@cloudflare/sandbox/openai';See for complete integration pattern.
examples/openai-agentsSandbox Lifecycle
- returns immediately - container starts lazily on first operation
getSandbox() - Containers sleep after 10 minutes of inactivity (configurable via )
sleepAfter - Use to immediately free resources
destroy() - Same always returns same sandbox instance
sandboxId
Anti-Patterns
- Don't use internal clients (,
CommandClient) - useFileClientmethodssandbox.* - Don't skip the Sandbox export - Worker won't deploy without
export { Sandbox } - Don't hardcode sandbox IDs for multi-user - use user/session identifiers
- Don't forget cleanup - call for temporary sandboxes
destroy()
Detailed References
- references/api-quick-ref.md - Full API with options and return types
- references/examples.md - Example index with use cases