AX is undergoing a significant redesign, moving away from a single CLI with an embedded Python harness toward a general-purpose orchestration layer for agentic tasks. The repository is reorganized around three binaries: ax-server exposes a gRPC API for submitting Task manifests, ax-controller runs as a horizontally scaled reconciler that consumes work from Redis Streams, and ax-task-runner executes tasks inside sandboxed workers. Task state now lives in Redis rather than Kubernetes CRDs so the system can handle millions of short-lived tasks without straining etcd. The legacy Python harness, ATE client, SQL event log, and skill examples are removed, and new design, concepts, manifest, networking, runner, and sandbox docs plus Kubernetes deploy manifests describe the new architecture.
3.5 KiB
Writing manifests
All four kinds can live in one multi-document YAML file. See examples/task.yaml for a complete, working set.
Task
apiVersion: ax.io/v1alpha1
kind: Task
metadata:
name: task123
atespace: default
spec:
image: "ghcr.io/my-org/my-agent-image"
command: ["python", "agent.py"]
env:
- name: ENVIRONMENT
value: "production"
resources:
requests:
cpu: "500m"
memory: "1Gi"
limits:
cpu: "2"
memory: "4Gi"
workspaces:
- name: default-workspace
path: "/workspace"
goal: "Install dependencies and run the test suite" # Antigravity prepares the workspace to this goal on first run
gateway:
name: default-gateway
debug: true # serve guest services inside the sandbox so `ax ssh` works; off by default
Binding several workspaces
spec.workspaces takes as many entries as you like, so a task can compose reusable Workspace resources, for example the code to work on plus a shared set of tools:
spec:
workspaces:
- name: my-service # mounted at /workspace/my-service, the command's working directory
goal: "Install dependencies and run the test suite"
- name: team-tools
path: "/workspace/tools" # explicit mount path
Each entry is set up independently at its own path, in order. Every entry needs a name; without a path it lands at /workspace/<name>, and paths must be unique. The first entry is the working directory of spec.command, and the task reports WorkspaceReady only once all of them are prepared. See examples/multi-workspace.yaml for a complete set.
Workspace
apiVersion: ax.io/v1alpha1
kind: Workspace
metadata:
name: default-workspace
atespace: default
spec:
git:
- name: origin
repo: "https://github.com/chalk/chalk.git"
branch: "main"
mcp:
registries:
- provider: google
query: "mcp.tags:build"
servers:
- name: git-tools
endpoint: "http://git-mcp.default.svc.cluster.local:8080"
skills:
registries:
- provider: google
query: "skills.tags:nodejs"
path: "/.agents/skills"
Gateway
apiVersion: ax.io/v1alpha1
kind: Gateway
metadata:
name: default-gateway
atespace: default
spec:
listeners:
- name: grpc
port: 8494
protocol: gRPC
- name: http
port: 8080
protocol: HTTP
egress:
allowlist:
hosts:
- host: "*" # allow everything on 443; tighten this in production
port: 443
Model
For Google models, store the API key and set provider: google.
kubectl create secret generic gemini-api-secret --from-literal=GEMINI_API_KEY="AIzaSy..."
Then reference it from the Model:
apiVersion: ax.io/v1alpha1
kind: Model
metadata:
name: default-model
atespace: default
spec:
provider: google
model: gemini-3.8-flash
secretKey:
name: gemini-api-secret
key: GEMINI_API_KEY
parameters:
temperature: 0.9
For Anthropic models, store the key the same way and set provider: anthropic.
kubectl create secret generic anthropic-api-secret --from-literal=ANTHROPIC_API_KEY="sk-ant-..."
apiVersion: ax.io/v1alpha1
kind: Model
metadata:
name: claude-model
atespace: default
spec:
provider: anthropic
model: claude-opus-5
secretKey:
name: anthropic-api-secret
key: ANTHROPIC_API_KEY
parameters:
maxTokens: 16000
temperature: 0.9