Dynamic Multi-Agent Workflow Orchestration
Your AI planner writes the workflow at runtime. Agentry runs it.
Agentry executes multi-agent workflows that exist only as data: parallel fan out, sequential handoffs, and conditional branches, with timeouts, failure handling, and signed replies, across frameworks and organizations.
Why Static DAGs Fall Short
An LLM planner can emit a plan like "research in parallel, then synthesize if confident, otherwise ask a human". Something has to run that plan, and every existing layer stops short.
| Tool | Orchestrates | Why it does not run an AI-generated plan |
|---|---|---|
| Kubernetes | Containers | No notion of a step, a reply, or a dependency |
| Kubeflow, Argo | Static DAGs | The DAG is compiled ahead of time, but this plan exists only at runtime |
| LangGraph, CrewAI | Graphs inside one app | One ecosystem, context wired by hand, stops at your organization's boundary |
| A2A | Agent to agent wire | Defines how agents talk, not how work executes |
| MCP | Agent to tool | Not agent to agent at all |
The Workflow Is Data on a Message
Add a coordination block to any AMTP message. The planner emits JSON, and the gateway executes it.
Parallel
Fan out to every participant at once. The workflow completes when all required_responses have answered.
Sequential
One agent at a time, in the order given by sequence. Each reply triggers dispatch of the next step.
Conditional
Evaluate the first reply against conditions and dispatch only the matching branch.
All three take a timeout in seconds and an optional stop_on_failure.
POST /v1/messages
{
"sender": "planner@acme.com",
"recipients": ["market@acme.com", "legal@acme.com", "competitor@partner.io"],
"subject": "EU market entry research",
"coordination": {
"type": "parallel",
"timeout": 600,
"required_responses": ["market@acme.com", "legal@acme.com", "competitor@partner.io"],
"stop_on_failure": true
},
"payload": { "question": "Should we enter the EU market?" }
}
One request. The response carries a workflow_id, and the planner is done until results come back. Participants can live behind other organizations' gateways, like competitor@partner.io here.
How a Workflow Runs
Workflow state lives in the gateway, not in the planner's context window.
- Initialize. The gateway assigns a workflow_id, records the participants and the deadline, and persists them.
- Dispatch. Each step is delivered to its agent by push (webhook) or pull (inbox), locally or across domains via DNS discovery.
- Reply. The agent answers with the workflow_id and response_type: workflow_response, or workflow_error to fail its step.
- Advance. The gateway checks that the sender is authenticated and still pending, updates state with an optimistic version check, then dispatches the next step, takes a branch, or finishes.
- Report. workflow@your-domain sends the planner one message with every participant's status and payload.
An agent's reply
# Agentry pushes each step to your webhook
@app.post("/webhook")
def on_message(msg: dict):
result = research_graph.invoke(msg["payload"])
requests.post(f"{GATEWAY}/v1/messages",
headers={"Authorization": f"Bearer {API_KEY}"},
json={
"sender": "market@acme.com",
"recipients": [msg["sender"]],
"workflow_id": msg["workflow_id"],
"response_type": "workflow_response",
"payload": result,
})
Plain HTTP, so any language or framework works. A Python SDK is available: pip install amtp.
The planner's result
{
"workflow_id": "0199...",
"coordination_type": "parallel",
"status": "completed",
"results": [
{ "address": "market@acme.com",
"status": "completed", "payload": { } },
{ "address": "legal@acme.com",
"status": "completed", "payload": { } },
{ "address": "competitor@partner.io",
"status": "completed", "payload": { } }
]
}
Conditional Branching
Let an agent's answer decide what happens next, such as synthesis when a critic is confident and human review when it is not.
{
"sender": "planner@acme.com",
"recipients": ["critic@acme.com"],
"coordination": {
"type": "conditional",
"timeout": 300,
"conditions": [{
"if": "confident == true",
"then": ["synthesis@acme.com"],
"else": ["human-review@acme.com"]
}]
},
"payload": { "draft": "..." }
}
- critic@acme.com replies, and the gateway evaluates the if expression against its payload
- Only the matching branch is dispatched
- Conditions support key == value on the reply payload today
- Numeric comparisons, such as confidence > 0.8, are coming next
Built for Failure
Multi-agent workflows run for minutes or hours, cross networks, and depend on agents you do not control.
| What goes wrong | What Agentry does |
|---|---|
| An agent never answers | A deadline sweeper marks the workflow and pending steps as timed out and notifies the sender |
| An agent fails | A workflow_error reply fails the step, and stop_on_failure ends the workflow early |
| A step is dispatched twice | Each step has a deterministic idempotency key, so receivers drop the duplicate |
| Two replicas process replies at the same instant | An optimistic version check on shared PostgreSQL state, and the loser retries |
| A duplicate or forged reply arrives | Ignored: the participant is no longer pending, or the sender is not authenticated |
| The network blips | Per-message retries with exponential backoff and jitter |
How Agentry Fits with MCP and A2A
Complementary, not competing: keep your agents and tools, and add the layer that runs the plan.
| Layer | Question it answers | Example |
|---|---|---|
| MCP | How does an agent call a tool? | Search, database, code runner |
| Framework | How is one agent built? | LangGraph, CrewAI, your own loop |
| A2A | How do two agents talk? | Agent cards, tasks, streaming |
| Agentry and AMTP | How does a multi-agent plan execute, across organizations? | Addressing, durable delivery, workflow state, signatures |
| Kubernetes | Where do the processes run? | Pods, scaling, restarts |
Use an orchestration engine when
- Plans are generated at runtime, not drawn as graphs in code
- Agents span frameworks, teams, or organizations
- Steps outlive a process: minutes to hours, humans in the loop
- You need timeouts, retries, and an audit trail of who said what
Stay with your framework when
- One team, one framework, one process
- Sub-second tool loops where a network hop is too expensive
Available Today and Coming Next
Works today
- Parallel, sequential, and conditional workflows
- Timeouts, stop on failure, idempotent steps
- Conditions with key == value
- Aggregated results returned to the sender
- Domain signatures and DNS discovery across organizations
Coming next
- Context shared automatically between agents in a workflow
- Token-aware selection and summarization of forwarded context
- Composite plans, such as parallel then conditional, as one workflow
- Numeric conditions
Run Your First Workflow
Agentry Gateway is open source under Apache 2.0. Deploy it in minutes, or talk to us about Agentry Cloud.