Skip to content
View as Markdown

Python SDK ​

Two options, depending on what your code already imports.

If you use E2B ​

Nothing to install beyond e2b. Point it at your server:

python
import os
os.environ["E2B_DOMAIN"] = "sandbox.example.com"
os.environ["E2B_API_KEY"] = "e2b_..."

from e2b import Sandbox
sb = Sandbox.create()
print(sb.commands.run("echo hi").stdout)
sb.kill()

Details, key formats and what is verified: E2B drop-in.

The native client ​

pip install sandrpod-cli also installs the client library the CLI uses.

python
from sandrpod_cli.client import SandrPodClient

client = SandrPodClient(api_url="https://cloud.example.com", token="sk_...")

sb = client.create_sandbox("agent-01", provider="local")
result = client.execute("agent-01", "python3 -c 'print(2**10)'")
print(result["stdout"], result["exit_code"])

client.delete_sandbox("agent-01")

Or with plain HTTP, which is the whole contract the client wraps:

python
import requests

API, TOKEN = "https://cloud.example.com", "sk_..."
H = {"X-Sandrpod-Token": TOKEN, "Content-Type": "application/json"}

requests.post(f"{API}/api/v1/sandboxes", headers=H,
              json={"name": "agent-01", "provider_type": "local"}).raise_for_status()

r = requests.post(f"{API}/api/v1/sandboxes/execute?sandbox=agent-01", headers=H,
                  json={"language": "python", "code": "print(2**10)"}).json()
print(r["stdout"])

requests.delete(f"{API}/api/v1/sandboxes/agent-01", headers=H)

Files and streaming ​

python
client.write_file("agent-01", "/workspace/in.txt", b"hello")
client.read_file("agent-01", "/workspace/in.txt")
for chunk in client.stream("agent-01", "for i in range(3): print(i)"):
    print(chunk, end="")

Long-lived work ​

A sandbox stays up as long as its TTL allows. For an agent loop that runs for hours, create once and reuse it; the filesystem persists between execute calls, so state can live in files even though each call is a new process.

python
sb = client.create_sandbox("work", provider="local", ttl_seconds=4 * 3600)

ttl_seconds reaps an idle sandbox; activity resets the clock.

Errors ​

The client raises with the server's message. Two worth handling explicitly:

ErrorMeaning
503 sandbox tunnel not availablethe worker holding this sandbox is not connected; retry after a few seconds, or recreate
403 owner_requiredthe credential is a member, not an owner: spending and access decisions belong to the owner

Apache 2.0 — your clouds, your machines, your rules.