What AXL is
AXL is a platform for building agents that do real work on your behalf - answering from your documents, calling your systems, running multi-step processes - and that stay inside boundaries you define rather than boundaries you hope the model respects.
It is written in Rust and runs as a server - one instance on a laptop, or a fleet of identical instances behind a load balancer. You describe agents in configuration files, not in code, and the server loads them. That choice shapes almost everything else about the platform: an agent is a directory you can review, diff, sign, and roll back, and changing what an agent can do is a configuration change rather than a deploy of new code.
The loop at the centre
Every agent runs the same loop. The model receives your request plus whatever context the agent is configured to bring - conversation history, retrieved documents, long-term memory, loaded skills. It replies, and if that reply asks for tools, AXL runs them, feeds the results back, and lets the model continue. The cycle repeats until the model answers or a limit stops it.
This pattern is usually called ReAct: reason, act, observe, repeat. Most of what AXL adds sits around that loop rather than inside it.
- Safety limits bound the loop itself - a maximum number of iterations, a token and cost budget, and a loop guard that notices when an agent calls the same tool with the same arguments over and over.
- Autonomy decides whether an action runs at all. Each agent declares a level, and
require_approvalmeans a person confirms before the action happens. - Middleware wraps the loop in layers. Caching, approval gating, write caps, model routing, and telemetry are all middleware, and each agent enables only the ones it needs.
- The shield sits below everything, scrubbing secrets and fencing untrusted content before it reaches the model and before output reaches you.
A control plane
Most agent frameworks are libraries inside one process. AXL is a horizontally scalable control plane: every instance is identical and stateless, all state lives in shared storage, and any instance can serve any request. Scaling is starting more instances.
The same design makes work durable. A workflow started on one instance finishes on another if the first dies. A streaming client can reconnect to any instance and resume.
What you compose
You compose three things.
| What it is | Reach for it when | |
|---|---|---|
| Agent | One model-driven loop with tools, knowledge, and memory | A single capable worker can own the task |
| Workflow | A durable graph of steps, authored in the AXG language | The sequence matters, must survive restarts, and must not run twice |
| Surface | How people and systems reach an agent | You need it in Slack, on the phone, behind an API, or callable by another company's agent |
An agent is the unit you configure. A workflow orchestrates agents - and tools, and other workflows - when you need branches, loops, parallelism, and exactly-once execution that outlives a process restart. A surface is how the work gets requested: the HTTP API, a chat channel, a voice session, a schedule, or an open protocol like A2A or MCP.
Most projects start with one agent and never need more. Add a workflow when you find yourself wishing the model were less free to improvise about the order of things.
What you can attach to an agent
Everything below is optional. Start with an identity and a model, then add one capability at a time and confirm it behaves before adding the next.
Knowledge and context
| Capability | What it gives the agent | Guide |
|---|---|---|
| Models | A default model per fleet, overridable per agent, across Anthropic, OpenAI, OpenAI-compatible, and Bedrock | Choose a model |
| RAG | Answers grounded in document sets you ingest and version | Add RAG |
| Memory | Preferences, decisions, and facts that survive across conversations | Give an agent memory |
| Context and compaction | Long conversations kept inside the model's context window | Manage long conversations |
| Skills | Instructions and reference material loaded only when relevant | Add reusable skills |
| Images | Pictures from users and from tools, on models that support them | Work with images |
Doing things
| Capability | What it gives the agent | Guide |
|---|---|---|
| Built-in tools | Web fetch, memory, blobs, media, cron, browser, Microsoft Graph | Use built-in tools |
| MCP | Tools from any external MCP server, with per-user auth when needed | Connect an MCP server |
| Sandboxes | A workspace where the agent can run commands and edit files | Choose a sandbox |
| Subagents | Bounded delegation to specialist agents | Delegate to subagents |
| Files | Uploads in, downloadable artifacts out | Work with files |
| Workbench | Repository work driven by a test gate, ending in a pull request | Run coding work |
Control and safety
| Capability | What it gives you | Guide |
|---|---|---|
| Intent and autonomy | An explicit contract: objective, constraints, stop rules, and how much the agent may do alone | Create your first agent |
| Middleware | Caching, approval gating, write caps, model routing, dry runs | Middleware |
| Shield | Secret scrubbing, PII redaction, prompt-injection defense | Configure the shield |
| Authentication | JWTs, federated identity, and API keys on every route | Authenticate callers |
| Signing | Verified agents, skills, and document sets | Verify configuration content |
Reaching your agent
| Surface | Use it for | Guide |
|---|---|---|
| HTTP API | Calling AXL from your own application | |
| Channels | Slack, Discord, Telegram, Teams, WhatsApp, Signal, iMessage | Connect messaging channels |
| Voice | Real-time speech in and speech out | Add real-time voice |
| Schedules | Recurring agent jobs and workflows | Run recurring work |
| A2A and MCP | Other agent systems discovering and delegating to yours | Connect to other agent systems |
Knowing it works
| Capability | What it gives you | Guide |
|---|---|---|
| Observability | Traces, tool audit entries, latency, and cost per run | Observe runs |
| Evaluations | Offline datasets before release, sampled scoring in production | Evaluate agent quality |
| Tasks | Status and cancellation for asynchronous work | Track asynchronous tasks |
A workflow, to make it concrete
Workflows are written in AXG, a small language purpose-built for this. Here is a complete, runnable one:
axg 1
workflow hello {
input name
greet = agent greeter:
"Write a one-line friendly greeting for {{ input.name }}."
greet -> return {
greeting: greet.response
}
}It declares an input, hands it to an agent, and returns the answer. Submit it and you get a run id back immediately; the engine drives the run to completion in the background, across restarts and across server instances.