The big picture
You write a YAML file. The engine validates it, compiles it into an internal graph, and runs it. Every request goes through the same pipeline:Build phase
Happens once before the engine accepts any requests.- Parses and validates the YAML (schema + semantic checks)
- Validates all references — every tool, resolver, MCP id declared by an agent must exist
- Verifies prompt files exist on disk
- Connects to MCP servers and discovers their tools
- Compiles everything into an immutable
CompiledAgentGraph
Runtime phase
Per request:- A message arrives
- A fresh
ExecutionContextis created (isolated per request) - Protected nodes are filtered based on the access plugin
- The root orchestrator runs — children are exposed to it as callable tools
- The orchestrator routes to the right child
- Resolvers run for that child, filling
{{variables}}in prompts - The agent executes with its tools bound
- The response + trace is returned
ExecutionContext.
Two server modes
Engine (agentctl serve)
Stateless. Takes a
messages array, returns a response. No memory, no sessions. Port 8090.agent-manager
Adds conversation persistence, session management, and SSE streaming on top of the engine. Serves the embeddable widget. Port 8100.
agent-manager. You can use either independently.
Orchestrators vs. agents
Orchestrators are routers. They see their children’sdescription fields and decide where to send the request. They don’t call tools directly.
Agents are executors. They run an LLM with their prompts and can call tools and MCP servers.
Both run a tool-call loop — the model keeps calling tools until it decides it’s done.
Extension points
The engine contains no business logic. Customer-specific code lives in plugins:| Plugin | What it does |
|---|---|
| Resolver | Fills {{variables}} in prompts before a node runs |
| Tool | A Python function the LLM can call |
| Hook | Trusted code at lifecycle points — auth, audit, policy |
| Access plugin | Decides which protected nodes a caller can reach |
generate command — see Quickstart. You fill in the business logic.