Skip to main content

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.

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

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

agentixx-0.2.6.tar.gz (189.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

agentixx-0.2.6-py3-none-any.whl (62.9 kB view details)

Uploaded Python 3

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

Hashes for agentixx-0.2.6.tar.gz
Algorithm Hash digest
SHA256 8c15c40eabec4c675a81f9d8ab5d9cb0ba6d17f9f199e80acd6ec43413f58337
MD5 815b421ba5a44e7dd6f28bd44e4898b8
BLAKE2b-256 8c135ba68a4c76696a9cdf0761e2b6b8440a419df166ed90a67ba6e66232e5ca

See more details on using hashes here.

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

Hashes for agentixx-0.2.6-py3-none-any.whl
Algorithm Hash digest
SHA256 1763efb539da0867c7b2b5e854171e76e802f0386b963d7b30a2741d3cd9a0be
MD5 431a84e7fb80d886ec784c68b081dd39
BLAKE2b-256 8999637ed22733c6ac99f8b6e4d2988936b1d2932df4545cff0d072b05e36418

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page