Pi
Run Pi in a secure E2B sandbox with full filesystem, terminal, and git access.
Pi is a minimal terminal coding agent that can be extended with TypeScript extensions, skills, prompt templates, and themes. E2B provides a pre-built pi template with Pi already installed.
CLI
Create a sandbox with the E2B CLI.
e2b sbx create piOnce inside the sandbox, start Pi.
piUse /login to authenticate with a supported subscription provider, or provide an API key through an environment variable.
Run headless
Use -p for non-interactive print mode. Pi does not show permission prompts for its built-in tools, so no auto-approval flag is needed. The sandbox isolates Pi from your host machine, but sandboxes can reach the open internet by default — restrict outbound traffic with network rules.
Pi supports multiple model providers. The examples below use Anthropic through the ANTHROPIC_API_KEY environment variable.
Pi can read and modify files and run shell commands directly. E2B contains those operations inside the sandbox, so Pi cannot access your host files or credentials. It can still make outbound network requests — use outbound network rules to limit access by CIDR or hostname. Hostname rules apply to HTTP(S) traffic only; use CIDR rules for other protocols.
import { Sandbox } from 'e2b'
const sandbox = await Sandbox.create('pi', {
envs: { ANTHROPIC_API_KEY: process.env.ANTHROPIC_API_KEY },
})
const result = await sandbox.commands.run(
`pi -p "Create a hello world HTTP server in Go"`
)
console.log(result.stdout)
await sandbox.kill()Example: work on a cloned repository
import { Sandbox } from 'e2b'
const sandbox = await Sandbox.create('pi', {
envs: { ANTHROPIC_API_KEY: process.env.ANTHROPIC_API_KEY },
timeoutMs: 600_000,
})
await sandbox.git.clone('https://github.com/your-org/your-repo.git', {
path: '/home/user/repo',
username: 'x-access-token',
password: process.env.GITHUB_TOKEN,
depth: 1,
})
const result = await sandbox.commands.run(
`cd /home/user/repo && pi -p "Add error handling to all API endpoints"`,
{ onStdout: (data) => process.stdout.write(data) }
)
const diff = await sandbox.commands.run('cd /home/user/repo && git diff')
console.log(diff.stdout)
await sandbox.kill()Build a custom template
If you need to customize the environment (e.g. pre-install dependencies, add config files), build your own template on top of the pre-built pi template.
// template.ts
import { Template } from 'e2b'
export const template = Template()
.fromTemplate('pi')// build.ts
import { Template, defaultBuildLogger } from 'e2b'
import { template as piTemplate } from './template'
await Template.build(piTemplate, 'my-pi', {
cpuCount: 2,
memoryMB: 2048,
onBuildLogs: defaultBuildLogger(),
})Run the build script to create the template.
npx tsx build.ts