superserve
Python SDK for the Superserve sandbox API — run code in isolated Firecracker MicroVMs.
Installation
pip install superserve
# or
uv add superserve
# or
poetry add superserve
Requires Python ≥ 3.9.
Quick Start
from superserve import Sandbox
sandbox = Sandbox.create(name="my-sandbox")
result = sandbox.commands.run("echo hello")
print(result.stdout)
sandbox.files.write("/app/data.txt", b"content")
text = sandbox.files.read_text("/app/data.txt")
sandbox.kill()
Preview URLs
Choose the default access for new ports, publish only the ports you intend to expose, and request a signed link for private browser access:
sandbox = Sandbox.create(name="private-preview", preview_access="private")
sandbox.publish_preview_port(3000, access="private")
browser_url = sandbox.get_signed_preview_url(3000, expires_in_seconds=300)
credential = sandbox.get_preview_token(3000)
# Machine clients: {credential.header: credential.token}
Each published port keeps its own public or private mode; preview_access
is only the default for newly published ports. Omitting it defaults a new
sandbox to strict public. legacy_public is returned only for pre-migration
sandboxes.
See the preview URL guide.
Desktop (computer use)
Control a GUI desktop inside a sandbox — screenshot, mouse, keyboard, and a live browser viewer. Requires a desktop-enabled template.
sandbox = Sandbox.create(name="desktop", from_template="superserve/desktop")
shot = sandbox.desktop.screenshot() # PNG bytes + dimensions
sandbox.desktop.click(640, 400)
sandbox.desktop.write("hello") # no per-character pacing
sandbox.desktop.press("ctrl+l")
sandbox.desktop.drag((10, 10), (200, 200)) # one atomic request
# Several model-emitted actions in a single round trip:
sandbox.desktop.actions([
{"type": "click", "x": 640, "y": 32},
{"type": "write", "text": "https://example.com"},
{"type": "press", "key": "enter"},
])
sandbox.desktop.resize(1920, 1080) # live, no restart
viewer = sandbox.desktop.get_stream_url() # noVNC URL
Authentication
Set the SUPERSERVE_API_KEY environment variable:
export SUPERSERVE_API_KEY=ss_live_...
Or pass it explicitly:
sandbox = Sandbox.create(
name="my-sandbox",
api_key="ss_live_...",
base_url="https://api.superserve.ai", # optional
)
Async usage
import asyncio
from superserve import AsyncSandbox
async def main():
sandbox = await AsyncSandbox.create(name="async-example")
try:
result = await sandbox.commands.run("echo hello")
print(result.stdout)
finally:
await sandbox.kill()
asyncio.run(main())
Calls made on an AsyncSandbox reuse its connection. To reuse connections across other calls too, such as AsyncSandbox.create or AsyncSnapshot.get, make them inside async_connection_pool(). The connections close when the block ends.
from superserve import AsyncSandbox, AsyncSnapshot, async_connection_pool
async with async_connection_pool():
sandbox = await AsyncSandbox.create(name="async-example")
snapshots = await AsyncSnapshot.list(sandbox.id)
Streaming command output
result = sandbox.commands.run(
"pip install numpy",
on_stdout=lambda data: print(data, end=""),
on_stderr=lambda data: print(data, end=""),
timeout_seconds=120,
)
Error handling
from superserve import (
SandboxError,
AuthenticationError, # 401
ValidationError, # 400
NotFoundError, # 404
ConflictError, # 409 — invalid state for operation
SandboxTimeoutError, # request timed out (does not shadow builtin TimeoutError)
ServerError, # 500
)
try:
sandbox.pause()
except ConflictError:
# Sandbox is not in a pausable state
pass
Full documentation
Development
# From repo root:
bunx turbo run build --filter=@superserve/python-sdk
bunx turbo run typecheck --filter=@superserve/python-sdk
bunx turbo run lint --filter=@superserve/python-sdk
License
Apache License 2.0.
Metadata
Release files for superserve 0.10.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| superserve-0.10.0.tar.gz | 91.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| superserve-0.10.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 156.6 kB
Release files / superserve-0.10.0.tar.gz
| Download URL | superserve-0.10.0.tar.gz |
|---|---|
| Size | 91.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
eaeae5d88df498e48ed2381b0fbf31d9ed4050f65b1ca7ac44b6042bdc5358a3
|
|
BLAKE2b-256 checksum How to use checksums |
8a8ca5201c47ff276a3d8ef19230a16f47101633a6d9c42aebf737c71137566f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.23 {"installer":{"name":"uv","version":"0.12.23","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / superserve-0.10.0-py3-none-any.whl
| Download URL | superserve-0.10.0-py3-none-any.whl |
|---|---|
| Size | 65.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
8b03fb77511ca577aa1cf611a7f298a644689aa9c477c1c856b1203b57c75641
|
|
BLAKE2b-256 checksum How to use checksums |
e8fa7f5a43b6f6f190b4a15b6c73120ad6fb79924b509ecd2c21199009c5c554
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.23 {"installer":{"name":"uv","version":"0.12.23","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|