Skip to main content
The examples on this page omit auth. To authenticate with your W&B API key, install cwsandbox[wandb] and pass auth=AuthStrategy.WANDB to Sandbox.run(), Sandbox(), or Sandbox.session(). See Get started.
This guide covers sandbox configuration options, including resources, mounted files, ports, annotations, and timeouts. Use it as a reference when you need to tailor a sandbox’s runtime environment to match the requirements of a workload, such as reserving GPU capacity, exposing a service, or setting operation timeouts. This page is for developers who use the cwsandbox Python SDK to launch and manage sandboxes.

Overview

You can set sandbox configuration in three places, listed from broadest to most specific scope:
  • SandboxDefaults: Shared defaults for all sandboxes in a session.
  • Sandbox.run() kwargs: Per-sandbox overrides.
  • @session.function() kwargs: Function-specific configuration.
The following sections describe each configuration area in detail.

Resources

ResourceOptions データクラスまたはプレーンな dict を使用して、CPU、メモリ、GPU のリソースを設定します。サーバーレスの配置では、リクエストと制限に同じ値が使用されます。 The following examples use equal requests and limits:
Both forms are equivalent: the SDK automatically converts dicts to ResourceOptions internally. ResourceOptions separates resource requests from limits. Requests tell the scheduler what the sandbox needs. Limits set the maximum it can use. For background on how Kubernetes uses requests and limits to assign Quality of Service classes, see the Kubernetes documentation.

ResourceOptions fields

All fields are optional in the client and default to None. The resolved allocation must satisfy the applicable policy. If you omit the resource allocation, complete, positive CPU and memory defaults from that policy supply both requests and limits.

Guaranteed QoS

When requests equal limits, the sandbox receives a Guaranteed Quality of Service class. The scheduler reserves the full allocation, and Kubernetes evicts Guaranteed Pods last under node resource pressure. A sandbox that tries to use more CPU than its limit is still throttled. Use this for latency-sensitive workloads.
For Guaranteed QoS, a flat dict shorthand is available. The SDK normalizes flat dicts by setting both requests and limits to the same values.

CPU values

Specify CPU in millicores or whole cores. For details, see Resource units in Kubernetes.

Memory values

Memory uses standard Kubernetes memory units:

GPU

Request GPU resources alongside CPU and memory. A GPU request reserves GPUs only, so set CPU and memory explicitly.
GPU configuration keys: type and memory_gb are alternatives. Set at most one of them.

Configuration library interop

All configuration types (NetworkOptions, Secret, ResourceOptions) accept either the dataclass or a plain dict. This means ML configuration libraries that resolve configs to dicts or dict-like objects can pass values directly to the SDK without manual conversion. SandboxDefaults.from_dict() accepts a plain dict or an OmegaConf DictConfig and coerces nested fields automatically. Dicts become NetworkOptions, Secret, or ResourceOptions as needed, and lists become tuples.
Individual fields also accept dicts when you pass them directly to Sandbox.run() or session.sandbox(). The nested dict form for resources maps to ResourceOptions fields. The flat dict form ({"cpu": "1", "memory": "1Gi"}) is also accepted and treated as Guaranteed QoS.

Mounted files

Mounted files let you provide configuration files, scripts, or other read-only assets to the sandbox at startup, without baking them into a container image.

Mount options

Mounted files are read-only. Use write_file() for files that require modification.

Ports

Expose ports so processes inside the sandbox can serve traffic to outside clients:

Port configuration

To give a port an internet-reachable address with platform TLS or TLS passthrough, see Public endpoints.

Network

Configure network options using the NetworkOptions dataclass or a plain dict:
Both forms are equivalent: the SDK automatically converts dicts to NetworkOptions internally.

NetworkOptions fields

All fields are optional and default to None, which uses backend defaults.

Set network in SandboxDefaults

Set a default network configuration for all sandboxes:

Annotations

Add Kubernetes pod annotations to sandboxes. Annotations are key-value string pairs attached to the underlying pod, useful for integrations that read pod metadata, such as schedulers, cost-allocation tools, or external automation.

Session-level defaults

Set default annotations for all sandboxes in a session:

Merge behavior

When you provide both SandboxDefaults.annotations and per-sandbox annotations, the SDK merges them. Explicit per-sandbox values win on key collision, matching the same semantics as environment_variables.

Validation

The SDK does not validate annotation keys or values. The server handles validation of reserved key prefixes, value format, and maximum entry count.

シークレット

W&B チームのシークレット注入、認証の要件、Python および TypeScript のサンプルについては、W&B シークレットを使用するを参照してください。

Timeouts

Four settings control how long a sandbox and its operations run. The names are similar, so the following table maps each one to what it bounds. Only max_lifetime_seconds terminates a sandbox. The other three bound individual requests and leave the sandbox running.

max_lifetime_seconds

max_lifetime_seconds sets the total wall-clock lifetime of a sandbox. When a sandbox reaches this age, the platform terminates it even if work is still in progress. If you don’t set max_lifetime_seconds, the runner-policy default applies. If no positive policy default supplies a lifetime, the platform uses 10 minutes. Set the value explicitly for long-running work:
To apply one lifetime to every sandbox a session creates, set it in SandboxDefaults:
An explicit max_lifetime_seconds argument on Sandbox.run() takes precedence over the value in defaults. Because the argument’s default is None, you can’t use it to remove a lifetime that defaults already sets. リクエストできる有効期間の上限は 30 日 (2,592,000 秒) です。これを超える値をリクエストすると、プラットフォームによって拒否されます。
You can’t change max_lifetime_seconds after a sandbox starts. No API extends the lifetime of a running sandbox, so choose the value when you create it. To keep working past the limit, capture what you need and start a new sandbox with a lifetime of up to 30 days.
作成のサンプルについては、長時間実行のサンドボックスを実行するを参照してください。

Behavior when the lifetime expires

The platform enforces the lifetime by terminating the sandbox’s underlying Kubernetes Job, so termination is immediate rather than graceful. Two consequences matter in practice:
  • Processes inside the sandbox don’t receive the grace period that stop() provides. Anything not already written out is lost.
  • The client doesn’t receive a distinct error or reason for the termination. The SDK reports no termination reason on a Sandbox, so you can’t distinguish lifetime expiry from other failures programmatically. Track the age of long-lived sandboxes yourself.
Set a lifetime that comfortably exceeds the work you expect, and stop sandboxes explicitly when you finish rather than relying on expiry.

timeout_seconds

timeout_seconds bounds a single operation on a running sandbox:
This controls how long the client waits for a response. If the wait exceeds the timeout, the SDK raises SandboxTimeoutError. The sandbox keeps running. The clock starts only after the sandbox reaches RUNNING, so startup time doesn’t count against it. Keep timeout_seconds below the sandbox’s max_lifetime_seconds. A command whose timeout exceeds the sandbox’s remaining lifetime stops when the sandbox terminates.

max_timeout_seconds

max_timeout_seconds bounds how long the server waits to place a sandbox on a runner before the attempt fails. It’s a server-side placement budget, not a client read timeout, and it doesn’t affect how long the sandbox runs afterward:
The server accepts values from 1 to 300 seconds and defaults to 30. The server clamps values above 300 to 300. If sandboxes fail to start under heavy cluster load, raise the value. max_timeout_seconds is available on Sandbox.run() and session.sandbox(), but not on SandboxDefaults.

request_timeout_seconds

request_timeout_seconds is the client-side HTTP timeout applied to most RPCs, and it’s the fallback when a call doesn’t pass its own timeout_seconds. Set it in SandboxDefaults:
Status polling uses poll_rpc_timeout_seconds instead, so a stalled poll fails fast rather than blocking for the full request timeout. For the full set of client-side tuning options, see the SandboxDefaults reference.

Complete example

The following example combines defaults, per-sandbox overrides, mounted files, and ports into a single configuration that mirrors how a production workload might be launched:
最終更新日 2026年9月30日