Skip to main content

Python SDK for the Brimble Sandbox API

Project description

brimble-sandbox

Python SDK for the Brimble Sandbox API.

Install

pip install brimble-sandbox

Quickstart

from brimble_sandbox import Sandbox

client = Sandbox()  # reads BRIMBLE_SANDBOX_KEY from env

sandbox = client.sandboxes.create_ready(
    {
        "template": "node-22",
        "persistent": True,
        "persistentDiskGB": 20,
        "mountPath": "/workspace",
    }
)

result = sandbox.exec({"cmd": "node -v", "env": {"NODE_ENV": "production"}})
print(result["stdout"])

sandbox.put_files(
    [
        {"path": "/tmp/hello.txt", "body": "hello from batch"},
        {"path": "/tmp/config.json", "body": '{"mode":"dev"}'},
    ]
)

existing = client.sandboxes.get(sandbox.id)
existing.destroy()

Ergonomic helpers

# Create + wait in one call
created = client.sandboxes.create_ready({"template": "node-22"})

# Get + wait in one call
loaded = client.sandboxes.get_ready(created.id)

# Create volume + attach at sandbox creation time
with_volume = client.sandboxes.with_volume(
    {
        "sandbox": {"template": "node-22", "mountPath": "/var/www/html"},
        "volume": {"name": "workspace-disk", "sizeGB": 20},
    }
)

# Auto-wait on runtime calls
with_volume.exec({"cmd": "npm -v"}, wait_until_ready=True)

# Streaming command output
output = with_volume.exec_stream({"cmd": "for i in 1 2 3; do echo $i; done"})
for log in output:
    if log["stream"] == "stdout":
        print(log["data"], end="")
result = output.result()

# Or stream with callbacks and still get the final result
buffered = with_volume.exec(
    {"cmd": "npm install"},
    on_stdout=lambda chunk: print(chunk, end=""),
)

# File downloads
file_stream = with_volume.get_file("tmp/notes.txt")
for chunk in file_stream:
    print(chunk.decode("utf-8"), end="")
file_stream.close()

# Templates + regions
templates = client.sandboxes.list_templates()
node_template = client.sandboxes.get_template("node-22")
regions = client.sandboxes.list_regions()

# Iterate through all sandboxes
for sb in client.sandboxes.iterate({"teamId": "<team>"}):
    print(sb.id, sb.status)

Volume attachment is create-time only. Use create(..., volumeId=...) or with_volume(...).

Network egress

from brimble_sandbox import Sandbox
from brimble_sandbox.enums import SandboxEgressMode

client = Sandbox()

sandbox = client.sandboxes.create_ready({
    "template": "node-22",
    "egress": {
        "mode": SandboxEgressMode.RESTRICTED,
        "allow": ["1.1.1.1", "api.example.com"],
    },
})

updated = sandbox.update_egress({"mode": SandboxEgressMode.DENY_ALL})
print(updated.get("network_updated"))

# Legacy shorthand (maps to deny_all)
client.sandboxes.create({"template": "node-22", "blockOutbound": True})

Modes: open, restricted (allowlist required), deny_all.

Auth

Requests are authenticated with the x-brimble-key header.

  • Pass api_key to Sandbox(...)
  • Or set BRIMBLE_SANDBOX_KEY in your environment

Retry, timeout, idempotency

from brimble_sandbox import RetryOptions, Sandbox

client = Sandbox(
    retry=RetryOptions(max_attempts=3, base_delay_ms=250, max_delay_ms=2000),
)

sandbox = client.sandboxes.create(
    {"template": "node-22"},
    idempotency_key="create-sandbox-123",
)

If region is omitted, the SDK resolves the first available sandbox region automatically.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

brimble_sandbox-0.1.3.tar.gz (20.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

brimble_sandbox-0.1.3-py3-none-any.whl (27.5 kB view details)

Uploaded Python 3

File details

Details for the file brimble_sandbox-0.1.3.tar.gz.

File metadata

  • Download URL: brimble_sandbox-0.1.3.tar.gz
  • Upload date:
  • Size: 20.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.2

File hashes

Hashes for brimble_sandbox-0.1.3.tar.gz
Algorithm Hash digest
SHA256 2a5d2025483633fae475616a6a575405e465d5f2ed240002199d0b53f5fde40c
MD5 30f67a4f73d56ba7762d5550c1be4029
BLAKE2b-256 2121f6cbcc020969e9e240385933dc73f7bdf5bf5a57690ce24b2027b6f0d0a5

See more details on using hashes here.

File details

Details for the file brimble_sandbox-0.1.3-py3-none-any.whl.

File metadata

File hashes

Hashes for brimble_sandbox-0.1.3-py3-none-any.whl
Algorithm Hash digest
SHA256 513478d10cbe90873389cfe39e03d78600a21872d33e6b33ead34de670530fca
MD5 78c002b6221d2eddb45eaf0a70a5cc3e
BLAKE2b-256 4453d2660b9cb985216aeb2d13916885b0ff8c16332cdc12c4a1afe17610c498

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page