Agentix
Sandboxed rollouts you call like typed Python.
Turn agents, tools, and scorers into Python callables. Package their dependencies into runtime images. Call them from evaluators, trainers, and orchestration code without writing a new runner for every pairing.
The 10-Second Model
Agentix has two primitives:
- Remote calls:
client.remote(fn, *args, **kwargs)runs a Python callable inside a sandbox worker. The callable is serialized with stdlib pickle, Python's native callable reference mechanism. - Bundles:
agentix build [path]packages a Python project and its declared dependencies into a deploy-ready runtime image.
from agentix import RuntimeClient, SandboxConfig, session
from agentix.bash import run
from agentix.deployment.docker import DockerDeployment
config = SandboxConfig(
image="python:3.13-slim",
runtime_image="hello-agentix:0.1.0",
)
async with session(DockerDeployment(), config) as sandbox:
async with RuntimeClient(sandbox.runtime_url) as client:
result = await client.remote(run, command="echo hello from $(uname -a)")
The unit of composition is not a bespoke benchmark runner or agent adapter. It is a Python callable.
Why Agentix Exists
Agent experiments sprawl quickly. One agent needs a CLI wrapper. Another needs a Python harness. A benchmark needs repo setup, grading scripts, and logs. A training loop needs the same pieces batched across many sandboxes.
Agentix collapses that matrix into one execution contract: if Python can serialize the callable and the sandbox has its dependencies, the host can call it.
| You have | You expose | You call |
|---|---|---|
| Claude Code, Codex, Aider, OpenHands, or an internal agent | async def run(...) -> RunResult |
await client.remote(run, ...) |
| Shell, files, repo setup, or local tools | async def run(command: str) -> BashResult |
await client.remote(bash_run, ...) |
| SWE-bench, MLE-Bench, or an internal evaluator | async def score(...) -> Score |
await client.remote(score, ...) |
What Ships
- Unary remote calls (
await client.remote(fn, *args, **kwargs)) across the host-to-sandbox boundary. One shape. Pickled callable + pickled args/kwargs go in; the pickled return value comes back. - One runtime worker process today behind an internal worker backend boundary, so future pools or per-call isolation can stay API-compatible.
- Tracing as an orthogonal layer:
agentix.trace.span(...)inside the sandbox produces Trace/Span/SpanEvent lifecycle events that cross to the host via a side-channel and dispatch to anyagentix.trace.Processorthe host has registered. - Bundle builds from normal Python projects and
pyproject.tomldependencies. - Optional Nix system dependencies when a project includes
default.nix. - Deployment backend plugins through the
agentix.deploymententry point group.
Quickstart
Run the smallest demo from
agentix-cookbook/examples/hello-agentix:
cd examples/hello-agentix
uv sync
uv run agentix build . --name hello-agentix # builds hello-agentix:0.1.0
uv run python run.py
The demo builds hello-agentix:0.1.0, overlays it onto
python:3.13-slim, then calls agentix.bash.run inside the sandbox:
import asyncio
from agentix import RuntimeClient, SandboxConfig, session
from agentix.bash import run
from agentix.deployment.docker import DockerDeployment
async def main() -> None:
deployment = DockerDeployment()
config = SandboxConfig(
image="python:3.13-slim",
runtime_image="hello-agentix:0.1.0",
)
async with session(deployment, config) as sandbox:
print(f"sandbox up at {sandbox.runtime_url}")
async with RuntimeClient(sandbox.runtime_url) as client:
result = await client.remote(run, command="echo hello from $(uname -a)")
print(f"exit={result.exit_code} stdout={result.stdout!r}")
asyncio.run(main())
Read the full quickstart for the project layout, lockfile, and runtime-image details.
Architecture
Host process
RuntimeClient.remote(fn, *args, **kwargs)
builds RemoteCallable from pickle.dumps(fn)
pickles (args, kwargs) as one blob
|
v Socket.IO "unary"
Sandbox
agentix-server
| msgpack frame
v
worker subprocess
RemoteCallable.resolve() -> fn
pickle.loads(arguments) -> args, kwargs
calls fn(*args, **kwargs)
pickles the result back
The wire carries a single shape: unary. Cancellation has its own
event (cancel). Trace lifecycle events cross as a separate
broadcast channel (trace:event). HTTP is kept only for /health.
Errors stay in-band.
Repository Map
Agentix-Runtime-Basic: sandbox primitives such asbashand file operations.Agentix-Deployment-Docker: local Docker deployment backend.Agentix-Deployment-DaytonaandAgentix-Deployment-E2B: hosted sandbox backend packages.agentix-cookbook: working integration recipes for agents and benchmarks.abridge: rollout-to-RL-buffer bridge.
Development
git clone https://github.com/Agentiix/Agentix
cd Agentix
pip install -e '.[dev]'
pytest
ruff check agentix/ tests/
Pair this repo with sibling backend/runtime repos checked out next to it when testing full sandbox rollouts.
Links
Metadata
Release files for agentixx 0.2.6
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| agentixx-0.2.6.tar.gz | 189.3 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| agentixx-0.2.6-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 252.1 kB
Release files / agentixx-0.2.6.tar.gz
| Download URL | agentixx-0.2.6.tar.gz |
|---|---|
| Size | 189.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
8c15c40eabec4c675a81f9d8ab5d9cb0ba6d17f9f199e80acd6ec43413f58337
|
|
BLAKE2b-256 checksum How to use checksums |
8c135ba68a4c76696a9cdf0761e2b6b8440a419df166ed90a67ba6e66232e5ca
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.4 {"installer":{"name":"uv","version":"0.11.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"TencentOS Server","version":"4.4","id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / agentixx-0.2.6-py3-none-any.whl
| Download URL | agentixx-0.2.6-py3-none-any.whl |
|---|---|
| Size | 62.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
1763efb539da0867c7b2b5e854171e76e802f0386b963d7b30a2741d3cd9a0be
|
|
BLAKE2b-256 checksum How to use checksums |
8999637ed22733c6ac99f8b6e4d2988936b1d2932df4545cff0d072b05e36418
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.4 {"installer":{"name":"uv","version":"0.11.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"TencentOS Server","version":"4.4","id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Security for agentixx 0.2.6
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.