A multi-agent orchestration engine that turns declarative YAML agent workflows into a running plan. An LLM coordinator routes events through hub-and-spoke mailboxes with race-safe delivery and zero-data-loss recovery. Runs on any provider goai supports.
A real zenflow flow spec/v1/examples/full-featured.yaml --model google/gemini-3-flash-preview --workdir /tmp/full-feature-gemini --yolo --plan against the Gemini 3 Flash preview. The --plan flag prints the DAG before execution; the coordinator narrates every step boundary; four agents (planner, coder, reviewer, deployer) call read / write / glob / grep / bash tools to plan, implement, review, and ship a feature; the deploy_staging sub-workflow (loaded via includes:) runs after the main DAG completes.
zenflow makes two opinionated choices. The workflow is a YAML file you can review in a PR: versionable, diffable, runnable from any language that can shell out to a binary. And every inter-agent message is either delivered to a mailbox or dropped with a typed reason. There is no third option.
zenflow is built for production embedders: systems that run workflows from a queue, persist state to a database, and need an audit trail when something goes sideways. The whole engine is one Go module with a small, stable Orchestrator API.
zenflow flow workflow.yaml # run a fully-declared YAML DAGzenflow goal "ship the launch" # let the coordinator plan a workflow on the flyzenflow agent "review the diff" # single-agent chat with optional tool loop
The library form (zenflow.New(...).RunFlow(ctx, wf)) is the same engine. The CLI is a thin wrapper that resolves a provider from --model, wires the coordinator, and prints results.
# debate-mini.yamlname: debate-miniagents: pro: { description: "Argues IN FAVOR of the proposition." } con: { description: "Argues AGAINST the proposition." } judge: { description: "Impartial judge declaring a winner." }steps: - id: team-pro agent: pro instructions: "Argue: 'AI assistants will replace junior dev roles within 5 years.'" - id: team-con agent: con instructions: "Argue against the same proposition." - id: verdict agent: judge instructions: "Declare a winner with reasoning." dependsOn: [team-pro, team-con]
(For the full version with moderator-setup and a setup step, see debate.yaml.)
The two debaters run in parallel. The coordinator forwards each side's arguments into the other's mailbox while they think. The judge waits for both before rendering its verdict.