Skip to main content

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.

GitHub Stars Python 3.11+ Docs

Documentation | Quickstart | Cookbook | Architecture

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 any agentix.trace.Processor the host has registered.
  • Bundle builds from normal Python projects and pyproject.toml dependencies.
  • Optional Nix system dependencies when a project includes default.nix.
  • Deployment backend plugins through the agentix.deployment entry 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

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)

Source distribution for agentixx 0.2.6
File Size Uploaded Provenance
agentixx-0.2.6.tar.gz 189.3 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for agentixx 0.2.6
File Interpreter ABI Platform
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.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page