agentskit.js
Recipes

Multi-agent topologies

Ready-made supervisor, swarm, hierarchical, and blackboard builders — four ways to combine agents into one.

Picking a topology is half the battle with multi-agent systems. @agentskit/runtime ships the four patterns that actually show up in production; each takes AgentHandles (anything with a name + run(task) method) and returns a new AgentHandle you can plug back into the rest of your system.

Install

Ships with @agentskit/runtime.

Supervisor

A planner agent delegates to workers, then synthesizes. Good for "decompose → delegate → merge" patterns.

import { supervisor } from '@agentskit/runtime'

const team = supervisor({
  supervisor: plannerAgent,
  workers: [researcherAgent, coderAgent],
  maxRounds: 2,
  route: (task, workers) => (/code/i.test(task) ? workers[1]! : workers[0]!),
})

await team.run('Research quantum sort, then implement it in Python.')

Swarm

Every member sees the same task, runs in parallel, results get merged. Good for ensembling answers, voting, or "fan out and pick the best."

import { swarm } from '@agentskit/runtime'

const team = swarm({
  members: [anthropicAgent, openAiAgent, geminiAgent],
  timeoutMs: 30_000,
  merge: results => results.map(r => r.output).join('\n\n---\n\n'),
})

One or more members can fail — the merger still runs as long as any member returned.

Hierarchical

A routing tree. Start at the root, descend as long as a child matches (by tag or custom route), then execute the leaf.

import { hierarchical } from '@agentskit/runtime'

const tree = hierarchical({
  root: {
    agent: triageAgent,
    children: [
      { agent: billingAgent, tags: ['refund', 'invoice', 'billing'] },
      { agent: technicalAgent, tags: ['bug', 'error', 'crash'] },
    ],
  },
  maxDepth: 3,
})

Blackboard

Every agent reads and writes a shared scratchpad. Iterate until isDone says stop. Good for planner + critic loops or collaborative drafting.

import { blackboard } from '@agentskit/runtime'

const team = blackboard({
  agents: [plannerAgent, coderAgent, criticAgent],
  maxIterations: 3,
  isDone: board => board.includes('FINAL OUTPUT:'),
})

Observing

Every topology accepts an onEvent observer:

supervisor({
  supervisor,
  workers,
  onEvent: e => logger.info('[topo]', e.topology, e.phase, e.agent),
})

Phases: dispatch / agent:start / agent:end / merge / done.

See also

✎ Edit this page on GitHub·Found a problem? Open an issue →·How to contribute →

On this page