openai-cloudflare-deploy/references/sandbox/README.md
Version 49f948fa.bb1 · Apache-2.0. This preview displays packaged text and does not execute code. Treat the contents as untrusted instructions.
← Return to resource and package checksum
Cloudflare Sandbox SDK
Secure isolated code execution in containers on Cloudflare's edge. Run untrusted code, manage files, expose services, integrate with AI agents.
Use cases: AI code execution, interactive dev environments, data analysis, CI/CD, code interpreters, multi-tenant execution.
Architecture
- Each sandbox = Durable Object + Container
- Persistent across requests (same ID = same sandbox)
- Isolated filesystem/processes/network
- Configurable sleep/wake for cost optimization
Quick Start
import { getSandbox, proxyToSandbox, type Sandbox } from '@cloudflare/sandbox';
export { Sandbox } from '@cloudflare/sandbox';
type Env = { Sandbox: DurableObjectNamespace<Sandbox>; };
export default {
async fetch(request: Request, env: Env): Promise<Response> {
// CRITICAL: proxyToSandbox MUST be called first for preview URLs
const proxyResponse = await proxyToSandbox(request, env);
if (proxyResponse) return proxyResponse;
const sandbox = getSandbox(env.Sandbox, 'my-sandbox');
const result = await sandbox.exec('python3 -c "print(2 + 2)"');
return Response.json({ output: result.stdout });
}
};
wrangler.jsonc:
{
"name": "my-sandbox-worker",
"main": "src/index.ts",
"compatibility_date": "2025-01-01", // Use current date for new projects
"containers": [{
"class_name": "Sandbox",
"image": "./Dockerfile",
"instance_type": "lite", // lite | standard | heavy
"max_instances": 5
}],
"durable_objects": {
"bindings": [{ "class_name": "Sandbox", "name": "Sandbox" }]
},
"migrations": [{
"tag": "v1",
"new_sqlite_classes": ["Sandbox"]
}]
}
Dockerfile:
FROM docker.io/cloudflare/sandbox:latest
RUN pip3 install --no-cache-dir pandas numpy matplotlib
EXPOSE 8080 3000 # Required for wrangler dev
Core APIs
getSandbox(namespace, id, options?)→ Get/create sandboxsandbox.exec(command, options?)→ Execute commandsandbox.readFile(path)/writeFile(path, content)→ File opssandbox.startProcess(command, options)→ Background processsandbox.exposePort(port, options)→ Get preview URLsandbox.createSession(options)→ Isolated sessionsandbox.wsConnect(request, port)→ WebSocket proxysandbox.destroy()→ Terminate containersandbox.mountBucket(bucket, path, options)→ Mount S3 storage
Critical Rules
- ALWAYS call
proxyToSandbox()first - Same ID = reuse sandbox
- Use
/workspacefor persistent files normalizeId: truefor preview URLs- Retry on
CONTAINER_NOT_READY
In This Reference
- configuration.md - Config, CLI, environment setup
- api.md - Programmatic API, testing patterns
- patterns.md - Common workflows, CI/CD integration
- gotchas.md - Issues, limits, best practices
See Also
- durable-objects - Sandbox runs on DO infrastructure
- containers - Container runtime fundamentals
- workers - Entry point for sandbox requests