Use a Backend
The Docker backend is the local development path:SandboxConfig,
and call remote directly on the returned live sandbox handle.
provider.session(...) creates the sandbox on entry, closes the runtime
connection, and deletes the container on exit.
For manual lifecycle control, create and delete the sandbox yourself:
from agentix import providers; providers().all() returns {name: ProviderClass} for every
registered backend.
If the bundle was built for a non-default architecture, pass the same
Docker/OCI platform so the task image and runtime overlay match:
Backend Plugins
SandboxProvider packages register classes in theagentix.provider entry
point group.
pyproject.toml
Backend Protocol
Backends subclassSandboxProvider, implement three async methods, and
inherit session().
my_provider/__init__.py
DockerProvider(DockerProviderConfig(container_engine="podman"))
selects the container runtime, network, GPU args, and so on.
Backend-neutral settings (image, bundle, env, resource) belong
in SandboxConfig, not the backend.
CAPE
Thecape backend targets a lease-based GPU capacity pool driven by a
submitter-side cape CLI. One sandbox maps onto exactly one long-lived
CAPE request inside a per-sandbox session: the request bind-mounts the
bundle’s /nix tree read-only, prints an AGENTIX_ENDPOINT marker to
stdout, and execs /nix/runtime/bootstrap.sh; the provider discovers
the endpoint by polling cape status / cape logs for that marker and
health-checks it. No second command is ever submitted into the session.
SandboxConfig.bundle is an opaque node-visible path
to an already-extracted bundle tree — there is no agentix deploy cape
yet, because bundle transport to CAPE nodes is still an open question.
Contract status: the CAPE CLI surface this backend emits is an
assumed contract, reverse-documented from a sibling project’s adapter
and only ever exercised against fakes and emulators. Verify it against
the real cape CLI before production use — see the checklist in
plugins/providers/cape/README.md.
Configuration
The
daytona and e2b backends are placeholders today: they validate
configuration but their lifecycle methods raise NotImplementedError
pending integration. docker/podman, apptainer, and uv are the
working backends. The uv backend materializes the runtime from a local
uv venv with no container — no isolation, but the fastest path to run the
runtime/RPC stack on a bare host for local dev, CI, or trusted eval (see
plugins/providers/uv/README.md).
Fail fast in __init__ when required configuration is missing. The
error should surface before the backend starts creating infrastructure.