sandbox_exec preset runs code in. The sandbox slot is a scalar single holder:
install exactly one provider, and which one you install is the execution
mode. The consuming agents keep one code path either way.
Each provider’s full setup — its
<PREFIX>_* settings and its engine
contract — lives on its own plugin page under the Plugins section:
plugins/tai42/sandbox-docker and plugins/tai42/sandbox-local. This page is the
operator narrative that gets you to them.
Install and wire sandbox-docker
Install the provider, name its sandbox_module in the manifest, and point it at
an engine:
- Set
SANDBOX_DOCKER_HOSTto the socket path or thetcp://engine endpoint. - Mount the mTLS client certificates at the fixed path
/certs/client(a volume mount, not an env var). - No
TAI_MCP_SANDBOXselector is needed — installing the plugin patches thesandbox_modulein.
Install and wire sandbox-local
sandbox-local runs the agent’s code directly on the host, with no isolation.
- Name the
sandbox_module, then setSANDBOX_LOCAL_ROOTto the host workspace root. A persistent session lives at<SANDBOX_LOCAL_ROOT>/<workspace_key>. - It provides isolation
noneonly and rejects acontainerorvmisolation floor. A deployment that keeps the defaultsandbox_isolation="container"must lower the floor tononeto run under it.
Both agents’
session_image settings stay required and digest-validated under
sandbox-local, but they are inert: the host is the environment, so the
value is only recorded in session labels and never pulled. Any well-formed
...@sha256: digest reference satisfies them — for example the published image’s
own digest, even though it is never used.Running claude_code direct-on-host
Running claude_code under sandbox-local requires the operator to install
the Claude runtime on the host first — the claude-agent-sdk wheel (it bundles
the Claude Code CLI, no separate Node.js) — because the shipped server image
stays lean and only the container sandbox carries the runtime out of the box.
langchain_deep_agent needs no extra runtime direct-on-host. Under
sandbox-docker both agents run from the pinned session image with nothing extra
to install.
The engine under Compose and Kubernetes
Under Compose the engine is opt-in: theprofiles: ["sandbox"] engine on a
sandbox-ctrl control network. A session is an inner container of the
rootless-dind daemon — NAT’d out for internet egress only, never on the
deployment network, and unable to address serve, the backend, the datastores, or
the engine itself.
On Kubernetes, run the engine as its own workload (its privilege isolated to
the engine pod, the app pod untouched) or point the provider at an external
endpoint.
Durability
An ephemeral session’s scratch dies with it. A persistent session binds the durabletai-sbx-<workspace_key> volume.
Security posture
Set
SANDBOX_DOCKER_READINESS_PROBE_ENABLED to have the provider PROVE, on every
session create, that the engine’s egress firewall is in force before it returns a
session — a throwaway probe container on the egress tier that must not reach the
engine control address and must reach its own resolver — and refuse the create
loudly when it cannot. It is defense in depth for the window an engine restart opens
under a running app; the engine’s own healthcheck-gated start order remains the
primary guarantee. See the sandbox-docker plugin page for the
SANDBOX_DOCKER_READINESS_* settings.The platform tools an agent uses are adapter-proxied: the agent uses exactly the
tool_names the caller grants, executed under the run’s own identity, with no
credential or MCP endpoint exposed to the session. There is no scoped mount or key
to configure for them. (The sandbox_exec contrast — code that runs inside
the session with the injected credentials — is on the
sandbox concept page.)See also
- Sandbox — the contract, isolation floor, and durability model.
- Use the ready-made agents —
claude_codeandlangchain_deep_agent, the shipped sandbox-driving agents. - Plugins — the
sandbox-dockerandsandbox-localplugin pages and their full engine setup.

