Sandboxed rollouts you call like typed Python (import as `agentix`)
Project description
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
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file agentixx-0.2.6.tar.gz.
File metadata
- Download URL: agentixx-0.2.6.tar.gz
- Upload date:
- Size: 189.3 kB
- Tags: Source
- Uploaded using 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}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8c15c40eabec4c675a81f9d8ab5d9cb0ba6d17f9f199e80acd6ec43413f58337
|
|
| MD5 |
815b421ba5a44e7dd6f28bd44e4898b8
|
|
| BLAKE2b-256 |
8c135ba68a4c76696a9cdf0761e2b6b8440a419df166ed90a67ba6e66232e5ca
|
File details
Details for the file agentixx-0.2.6-py3-none-any.whl.
File metadata
- Download URL: agentixx-0.2.6-py3-none-any.whl
- Upload date:
- Size: 62.9 kB
- Tags: Python 3
- Uploaded using 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}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1763efb539da0867c7b2b5e854171e76e802f0386b963d7b30a2741d3cd9a0be
|
|
| MD5 |
431a84e7fb80d886ec784c68b081dd39
|
|
| BLAKE2b-256 |
8999637ed22733c6ac99f8b6e4d2988936b1d2932df4545cff0d072b05e36418
|