← CloudflareCONTENT HISTORYWHAT CHANGED · RULE-BASED ANALYSIS
Update to Cloudflare
Snapshot Sep 30, 2026 · 23:18 UTC · version 0.1.2
Collection source: not recorded for this historical snapshot.
First saved snapshot
No earlier snapshot is available to establish a change.
Compare saved observations
Download comparison JSONFull technical diff · 0 changed fields
Full snapshot data
{
"name": "sandbox-sdk",
"description": "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. Biases towards retrieval from Cloudflare docs over pre-trained knowledge.",
"included_files": [
{
"relative_path": "agents/openai.yaml",
"size_in_bytes": 102
},
{
"relative_path": "references/api-quick-ref.md",
"size_in_bytes": 3193
},
{
"relative_path": "references/examples.md",
"size_in_bytes": 1574
}
],
"skill_md_contents": "---\nname: sandbox-sdk\ndescription: 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. Biases towards retrieval from Cloudflare docs over pre-trained knowledge.\n---\n\n# Cloudflare Sandbox SDK\n\nBuild secure, isolated code execution environments on Cloudflare Workers.\n\n## FIRST: Verify Installation\n\n```bash\nnpm install @cloudflare/sandbox\ndocker info # Must succeed - Docker required for local dev\n```\n\n## Retrieval Sources\n\nYour knowledge of the Sandbox SDK may be outdated. **Prefer retrieval over pre-training** for any Sandbox SDK task.\n\n| Resource | URL |\n|----------|-----|\n| Docs | https://developers.cloudflare.com/sandbox/ |\n| API Reference | https://developers.cloudflare.com/sandbox/api/ |\n| Examples | https://github.com/cloudflare/sandbox-sdk/tree/main/examples |\n| Get Started | https://developers.cloudflare.com/sandbox/get-started/ |\n\nWhen implementing features, fetch the relevant doc page or example first.\n\n## Required Configuration\n\n**wrangler.jsonc** (exact - do not modify structure):\n\n```jsonc\n{\n \"containers\": [{\n \"class_name\": \"Sandbox\",\n \"image\": \"./Dockerfile\",\n \"instance_type\": \"lite\",\n \"max_instances\": 1\n }],\n \"durable_objects\": {\n \"bindings\": [{ \"class_name\": \"Sandbox\", \"name\": \"Sandbox\" }]\n },\n \"migrations\": [{ \"new_sqlite_classes\": [\"Sandbox\"], \"tag\": \"v1\" }]\n}\n```\n\n**Worker entry** - must re-export Sandbox class:\n\n```typescript\nimport { getSandbox } from '@cloudflare/sandbox';\nexport { Sandbox } from '@cloudflare/sandbox'; // Required export\n```\n\n## Quick Reference\n\n| Task | Method |\n|------|--------|\n| Get sandbox | `getSandbox(env.Sandbox, 'user-123')` |\n| Run command | `await sandbox.exec('python script.py')` |\n| Run code (interpreter) | `await sandbox.runCode(code, { language: 'python' })` |\n| Write file | `await sandbox.writeFile('/workspace/app.py', content)` |\n| Read file | `await sandbox.readFile('/workspace/app.py')` |\n| Create directory | `await sandbox.mkdir('/workspace/src', { recursive: true })` |\n| List files | `await sandbox.listFiles('/workspace')` |\n| Expose port | `await sandbox.exposePort(8080)` |\n| Destroy | `await sandbox.destroy()` |\n\n## Core Patterns\n\n### Execute Commands\n\n```typescript\nconst sandbox = getSandbox(env.Sandbox, 'user-123');\nconst result = await sandbox.exec('python --version');\n// result: { stdout, stderr, exitCode, success }\n```\n\n### Code Interpreter (Recommended for AI)\n\nUse `runCode()` for executing LLM-generated code with rich outputs:\n\n```typescript\nconst ctx = await sandbox.createCodeContext({ language: 'python' });\n\nawait sandbox.runCode('import pandas as pd; data = [1,2,3]', { context: ctx });\nconst result = await sandbox.runCode('sum(data)', { context: ctx });\n// result.results[0].text = \"6\"\n```\n\n**Languages**: `python`, `javascript`, `typescript`\n\nState persists within context. Create explicit contexts for production.\n\n### File Operations\n\n```typescript\nawait sandbox.mkdir('/workspace/project', { recursive: true });\nawait sandbox.writeFile('/workspace/project/main.py', code);\nconst file = await sandbox.readFile('/workspace/project/main.py');\nconst files = await sandbox.listFiles('/workspace/project');\n```\n\n## When to Use What\n\n| Need | Use | Why |\n|------|-----|-----|\n| Shell commands, scripts | `exec()` | Direct control, streaming |\n| LLM-generated code | `runCode()` | Rich outputs, state persistence |\n| Build/test pipelines | `exec()` | Exit codes, stderr capture |\n| Data analysis | `runCode()` | Charts, tables, pandas |\n\n## Extending the Dockerfile\n\nBase image (`docker.io/cloudflare/sandbox:0.7.0`) includes Python 3.11, Node.js 20, and common tools.\n\nAdd dependencies by extending the Dockerfile:\n\n```dockerfile\nFROM docker.io/cloudflare/sandbox:0.7.0\n\n# Python packages\nRUN pip install requests beautifulsoup4\n\n# Node packages (global)\nRUN npm install -g typescript\n\n# System packages\nRUN apt-get update && apt-get install -y ffmpeg && rm -rf /var/lib/apt/lists/*\n\nEXPOSE 8080 # Required for local dev port exposure\n```\n\nKeep images lean - affects cold start time.\n\n## Preview URLs (Port Exposure)\n\nExpose HTTP services running in sandboxes:\n\n```typescript\nconst { url } = await sandbox.exposePort(8080);\n// Returns preview URL for the service\n```\n\n**Production requirement**: Preview URLs need a custom domain with wildcard DNS (`*.yourdomain.com`). The `.workers.dev` domain does not support preview URL subdomains.\n\nSee: https://developers.cloudflare.com/sandbox/guides/expose-services/\n\n## OpenAI Agents SDK Integration\n\nThe SDK provides helpers for OpenAI Agents at `@cloudflare/sandbox/openai`:\n\n```typescript\nimport { Shell, Editor } from '@cloudflare/sandbox/openai';\n```\n\nSee `examples/openai-agents` for complete integration pattern.\n\n## Sandbox Lifecycle\n\n- `getSandbox()` returns immediately - container starts lazily on first operation\n- Containers sleep after 10 minutes of inactivity (configurable via `sleepAfter`)\n- Use `destroy()` to immediately free resources\n- Same `sandboxId` always returns same sandbox instance\n\n## Anti-Patterns\n\n- **Don't use internal clients** (`CommandClient`, `FileClient`) - use `sandbox.*` methods\n- **Don't skip the Sandbox export** - Worker won't deploy without `export { Sandbox }`\n- **Don't hardcode sandbox IDs for multi-user** - use user/session identifiers\n- **Don't forget cleanup** - call `destroy()` for temporary sandboxes\n\n## Detailed References\n\n- **[references/api-quick-ref.md](references/api-quick-ref.md)** - Full API with options and return types\n- **[references/examples.md](references/examples.md)** - Example index with use cases\n"
}SHA-256: a52fe011936d060928b93056fdc28d3cc5f64c467e272ad0a3f3cc2c2247ab68