Sandbox
Instance properties
sb.owns_lifecycle
create() or start() own lifecycle. Local detached sandboxes, cloud sandboxes, and handles upgraded via SandboxHandle.connect() return False. This is an async property; use await sb.owns_lifecycle.
Returns
True if this handle owns the lifecycle.sb.fs
Example
Example
sb.fs (no await). See Filesystem for API details.
Returns
Static methods
Sandbox.create()
Example
Example
SandboxConfig for the full set. Pulls the image if needed, boots the VM, starts the guest agent, and waits until it is ready to accept commands. Sandbox names must be non-empty and no longer than 128 UTF-8 bytes.
The returned Sandbox is an async context manager. On the local backend, async with guarantees cleanup: exit kills the sandbox and removes its persisted state. Cloud handles do not own the host process, so stop or remove them explicitly before leaving the context.
Parameters
namestr**kwargsSandboxConfigimage, cpus, memory, volumes, ports, network, secrets, detached, and more.Returns
Sandbox.create_with_progress()
Example
Example
create() but returns a PullSession that lets you track image pull progress before the sandbox is ready. This method is synchronous (not awaitable); the async work happens through the PullSession.
Parameters
namestr**kwargsSandboxConfigReturns
Sandbox.start()
Example
Example
Parameters
namestrdetachedboolTrue, the sandbox survives after your process exits. Default False.Returns
Sandbox.get()
Example
Example
Parameters
namestrReturns
Sandbox.list()
Example
Example
Returns
Sandbox.list_with()
Example
Example
Parameters
cursorstr | Nonenext_cursor from the preceding page.limitint | NonelabelsMapping[str, str] | NoneNone returns every sandbox, like list().Returns
Sandbox.remove()
Example
Example
Parameters
namestrInstance methods
Command execution (exec, exec_stream, shell, shell_stream) is documented on the Execution page; SSH (ssh) on the SSH page. The lifecycle, attach, metrics, and logs methods follow.
sb.name()
Example
Example
Returns
sb.attach()
Example
Example
Parameters
cmdstrargslist[str] | Nonecwdstr | Noneuserstr | NoneenvMapping[str, str] | Nonedetach_keysstr | NoneReturns
sb.attach_shell()
Example
Example
Returns
sb.ping()
Example
Example
core.ping and waits for core.pong; it does not start stopped sandboxes and raises an error if the sandbox is not running or agentd cannot respond. After upgrading from a runtime that predates protocol generation 6, restart already-running sandboxes so the guest agent understands the message.
Returns
sb.touch()
Example
Example
core.touch, receives core.touched, and advances the guest activity sequence used by the runtime idle-timeout monitor. It does not start stopped sandboxes and it does not bypass max_duration.
Returns
sb.modify()
Example
Example
ModificationDisposition to classify when each change takes effect, and apply is all-or-nothing.
cpus and memory resize live within the max_cpus / max_memory ceilings; raising a ceiling requires a restart. root_disk_size changes are offline: managed and flat OCI root disks grow only, tmpfs root disks can change in either direction on the next boot, and user-supplied disk images are rejected. Env and workdir changes affect future execs only. On a stopped sandbox, changes are saved for the next boot.
Secret specs are keyed by stable secret name. Each SecretModifySpec selects at most one source (env, value, or store) and may also set placeholder and allowed_hosts; omitting a source updates only the other supplied fields. Plans expose only safe references and metadata; raw secret values never appear in a plan. Removal is explicit through secrets_rm.
The returned SandboxModificationPlan is a typed dictionary:
resize_status reports when the sandbox has finished adjusting.
Parameters
cpusint | Nonemax_cpus.max_cpusint | Nonememoryint | Nonemax_memory.max_memoryint | Noneroot_disk_sizeint | NoneenvMapping[str, str] | Noneenv_rmlist[str] | NonelabelsMapping[str, str] | Nonelabels_rmlist[str] | Noneworkdirstr | NonesecretsMapping[str, SecretModifySpec] | Noneenv, value, or store, plus optional placeholder and allowed_hosts.secrets_rmlist[str] | NoneNO_RESTART (default) applies only changes that can complete without restarting; NEXT_START persists changes for the next start without mutating a running VM; RESTART restarts if needed so restart-required changes become active now.dry_runboolTrue, compute the plan without applying anything. Default False.Returns
dry_run=True.sb.metrics()
Example
Example
Returns
sb.metrics_stream()
Example
Example
MetricsStream supports both recv() and async for.
Parameters
intervalfloat1.0.Returns
sb.logs()
Example
Example
exec.log. Backed by an on-disk JSON Lines file the runtime writes via the relay tap. Works on running and stopped sandboxes alike; there is no protocol traffic. The same method is available on SandboxHandle for callers that don’t want to start the sandbox first.
The default sources are STDOUT, STDERR, and OUTPUT (PTY-merged). Add LogReadSource.SYSTEM to include synthetic lifecycle markers and runtime/kernel diagnostic lines, or use LogReadSource.ALL as shorthand for all four. Timestamps are exposed as float ms since the Unix epoch (UTC) for parity with SandboxMetrics.timestamp_ms.
Parameters
tailint | Nonesince_msfloat | Noneuntil_msfloat | Nonesourceslist[LogReadSource] | NoneNone selects STDOUT, STDERR, and OUTPUT. Add SYSTEM to merge runtime/kernel diagnostics, or use ALL for all four.Returns
sb.log_stream()
Example
Example
LogStream. With follow=True the stream stays open and yields new entries as they are written, like tail -f. Resume an earlier stream by passing the cursor of the last entry you saw as from_cursor. Also available on SandboxHandle.
Parameters
sourceslist[LogReadSource] | Nonesince_msfloat | Nonefrom_cursorstr | Noneuntil_msfloat | NonefollowboolTrue, keep the stream open and yield new entries as they arrive. Default False.Returns
sb.stop()
Example
Example
timeout to override the graceful shutdown window before force-kill escalation.
Parameters
timeoutfloat | NoneNone uses the ten-second default.sb.request_stop()
Example
Example
wait_until_stopped() when the caller needs to observe the terminal state.
sb.kill()
Example
Example
fsync’d may be lost, same durability semantics as a sudden power loss on a physical machine. Prefer stop() for graceful shutdown that gives the workload a chance to flush.
Parameters
timeoutfloat | Nonesb.request_kill()
Example
Example
sb.request_drain()
Example
Example
exec calls are rejected; the sandbox transitions to stopped when all in-flight commands finish. Useful for zero-downtime rotation of worker sandboxes. Use wait_until_stopped() when the caller needs stopped-state observation.
sb.wait_until_stopped()
Example
Example
Returns
sb.detach()
Example
Example
Sandbox.get().
Patch
Factory for pre-boot root filesystem patches.Patch.text()
Example
Example
path.
Parameters
pathstrcontentstrmodeint | None0o644.replaceboolTrue, overwrite an existing path.Patch.file()
path. Use text() for UTF-8 text.
Parameters
pathstrcontentbytesmodeint | None0o644.replaceboolTrue, overwrite an existing path.Patch.append()
content to an existing file at path. If the file lives in a lower image layer, it’s copied up first.
Parameters
pathstrcontentstrPatch.mkdir()
path. Idempotent: a no-op if the directory already exists.
Parameters
pathstrmodeint | None0o755.Patch.remove()
path. Idempotent: a no-op if the path doesn’t exist.
Parameters
pathstrPatch.copy_file()
src into the guest rootfs at dst.
Parameters
srcstrdststrmodeint | None0o644. None keeps the source mode.replaceboolTrue, overwrite an existing path at dst.Patch.copy_dir()
src into the guest rootfs at dst.
Parameters
srcstrdststrreplaceboolTrue, overwrite an existing path at dst.Patch.symlink()
link pointing to target.
Parameters
targetstrlinkstrreplaceboolTrue, overwrite an existing path at link.SandboxHandle
Returned by Sandbox.get() · Sandbox.list() · Sandbox.list_with()
A metadata and lifecycle handle for an existing sandbox.handle.name
str
Sandbox name, up to 128 UTF-8 bytes
handle.status
SandboxStatus
Current status
handle.config_json
str
Raw JSON configuration
handle.created_at
float \| None
Creation timestamp (ms since epoch)
handle.updated_at
float \| None
Last update timestamp (ms since epoch)
handle.config()
Returns
dict[str, Any]
handle.refresh()
Returns
Awaitable[SandboxHandle]
handle.ping()
Returns
Awaitable[SandboxPingResult]
handle.touch()
Returns
Awaitable[SandboxTouchResult]
handle.modify()
modify(). Does not start stopped sandboxes; changes persist for the next boot
Returns
Awaitable[SandboxModificationPlan]
handle.connect()
Returns
Awaitable[Sandbox]
handle.start()
Returns
Awaitable[Sandbox]
handle.stop()
Returns
Awaitable[None]
handle.request_stop()
Returns
Awaitable[None]
handle.kill()
Returns
Awaitable[None]
handle.request_kill()
Returns
Awaitable[None]
handle.request_drain()
Returns
Awaitable[None]
handle.wait_until_stopped()
Returns
Awaitable[SandboxStopResult]
handle.remove()
Returns
Awaitable[None]
handle.metrics()
Returns
Awaitable[SandboxMetrics]
handle.logs()
exec.log (works without starting)
Returns
Awaitable[list[LogEntry]]
handle.log_stream()
Returns
Awaitable[LogStream]
handle.snapshot()
Returns
Awaitable[Snapshot]
MetricsStream
Returned by metrics_stream()
Async stream for receiving periodic metrics snapshots.metrics_stream.aiter()
async for
Returns
SandboxMetrics
metrics_stream.anext()
async for
Returns
SandboxMetrics
LogEntry
Returned by logs() · iterated from LogStream
A single captured log entry returned bylogs() or iterated from a LogStream.
entry.timestamp_ms
float
Wall-clock capture time (ms since Unix epoch, UTC)
entry.source
LogSource
Where the chunk came from
entry.session_id
int \| None
Relay-monotonic session id; None for "system" entries
entry.cursor
str
Opaque resume token; pass back via log_stream(from_cursor=...)
entry.data
bytes
The chunk’s raw bytes
entry.text()
data (lossy; invalid bytes are replaced)
Returns
str
LogStream
Returned by log_stream()
Async stream ofLogEntry values, returned by log_stream().
log_stream.aiter()
async for
Returns
LogEntry
log_stream.anext()
async for
Returns
LogEntry
PullSession
Returned by create_with_progress()
Returned bycreate_with_progress(). The factory itself is synchronous; use the returned session as an async context manager to track image pull progress.
session.progress
AsyncIterator[PullEvent]
Async iterator of pull progress events
session.result()
RuntimeError
Returns
Awaitable[Sandbox]
Types
SandboxConfig
Used by create() · create_with_progress()
The keyword arguments accepted bycreate() and create_with_progress(). There is no SandboxConfig object you construct directly; these are passed as **kwargs.
InitConfig
Used by create(init=…)
Custom init specification. Pass it (or one of the equivalent shorthand shapes) as theinit= kwarg to create() to hand PID 1 inside the guest off to your own init binary after agentd’s setup. Frozen dataclass. See Custom init system for image picks, shutdown semantics, and tradeoffs.
init= kwarg accepts a bare scalar for the simple case, an InitConfig dataclass, or an InitOptions typed dictionary for the rich case.
InitOptions
Used by create(init=…)
Typed-dictionary form ofInitConfig. cmd is required; args and env are optional.
SecurityProfile
Used by create(security=…)
Sandbox-wide in-guest security profile.SandboxPage
One stable, newest-first page returned bySandbox.list() or Sandbox.list_with().
SandboxPingResult
Returned by ping()
Agent reachability result.SandboxTouchResult
Returned by touch()
Explicit idle-refresh result.SandboxStopResult
Returned by wait_until_stopped()
Observed terminal sandbox state returned bywait_until_stopped().
SandboxStatus
Used by SandboxHandle.status · SandboxStopResult.status
Sandbox lifecycle status returned bystatus fields.
BackendKind
Used by set_default_backend() · backend_scope() · returned by default_backend_kind()
ModificationPolicy
Used by modify(policy=…)
Controls how sandbox modifications that cannot apply live are handled.SecretModifySpec
Used by modify(secrets=…)
Desired state for one secret.env, value, and store are mutually exclusive sources. Omit all three to update only the placeholder or allowed hosts.
SandboxModificationPlan
Typed dictionary returned bySandbox.modify() and SandboxHandle.modify(). Config changes and secret changes use different typed shapes and are discriminated by their kind member.
ConfigPlannedChange has kind, field, change, and disposition, plus optional before, after, and reason. SecretPlannedChange has kind, field, name, change, and disposition, plus optional before_ref, after_ref, allow_hosts, and reason. Secret values never appear in a plan.
PlannedChangeKind
Discriminator for entries inSandboxModificationPlan.changes.
ChangeKind
Natural operation for a configuration change.SecretChangeKind
Natural operation for a secret change.ModificationDisposition
When or whether a planned change can take effect.ResourceKind
Resource reported by a live-resize result.ResourceConvergenceState
Observed convergence state for an accepted live resize.SandboxMetrics
Returned by metrics() · metrics_stream()
Point-in-time resource usage snapshot.LogSource
Returned by LogEntry.source
Source attached to eachLogEntry.
LogReadSource
Used by logs(sources=…) · log_stream(sources=…)
Log source selector accepted bylogs() and log_stream().
LogLevel
Used by create(log_level=…)
Sandbox process log verbosity.PullPolicy
Used by create(pull_policy=…)
Controls when the SDK fetches an OCI image from the registry.RegistryAuth
Used by create(registry_auth=…)
Credentials for authenticating to a private container registry. Frozen dataclass; construct directly or viaRegistryAuth.basic(username, password).
PatchConfig
Returned by Patch.* factory methods · used by create(patches=…)
A single rootfs patch. Produced by thePatch factory; you’d normally not construct one directly. Frozen dataclass.
PatchKind
Used by PatchConfig.kind
Rootfs patch operation.PullEvent
Iterated from PullSession.progress
Native event object emitted byPullSession.progress. Inspect event_type and the fields relevant to that event; fields that do not apply to a particular event are None.
PullEventType
Discriminator returned byPullEvent.event_type.