Multi-Agent Swarm

Run multiple agents in parallel with configurable concurrency, message passing, and pluggable backends.

The swarm system lets you run multiple agents concurrently, each with its own conversation context. Agents can exchange messages through a shared mailbox and report results back to a coordinator.

Quick start

import { Agent, SwarmManager, InProcessBackend } from "noumen";
import { LocalSandbox } from "noumen/local";

const sandbox = LocalSandbox();
const code = new Agent({ provider, sandbox });
await code.init();

// InProcessBackend takes a ThreadConfig-shaped object (without systemPrompt/model,
// which are set per-member via SwarmMemberConfig).
const backend = new InProcessBackend({
  provider,
  fs: sandbox.fs,
  computer: sandbox.computer,
  sessionDir: ".noumen/sessions",
});
const swarm = new SwarmManager(backend, { maxConcurrent: 3 });

swarm.onEvent((event) => {
  console.log(`[${event.type}] ${event.memberName}: ${event.content ?? ""}`);
});

await swarm.spawn({ name: "researcher", prompt: "Find all TODO comments in the codebase" });
await swarm.spawn({ name: "writer", prompt: "Write tests for the auth module" });

await swarm.waitForAll();

const status = swarm.getStatus();
for (const member of status.members) {
  console.log(`${member.name}: ${member.status} — ${member.result}`);
}

SwarmManager

The SwarmManager orchestrates agent lifecycle:

MethodDescription
spawn(config)Start a new agent member. Respects maxConcurrent.
spawnAll(configs)Spawn multiple members sequentially.
sendMessage(from, to, content)Send a message between members.
kill(memberId)Abort a running member.
waitForAll()Wait for all members to complete.
getStatus()Get current members and messages.
onEvent(handler)Subscribe to swarm events.

SwarmMemberConfig

interface SwarmMemberConfig {
  name: string;
  prompt: string;
  systemPrompt?: string;
  allowedTools?: string[];
  model?: string;
}

When allowedTools is set, the member can only use those tools. Otherwise, it has access to the full tool registry.

Events

EventFires when
swarm_member_startA member begins running.
swarm_member_completeA member finishes successfully.
swarm_member_failedA member throws an error.
swarm_messageA message is sent between members.

Mailbox

The Mailbox handles message passing between swarm members:

const mailbox = new Mailbox();
mailbox.send("researcher", "writer", "Found 12 TODOs in src/auth/");
const messages = mailbox.getMessagesFor("writer");

Custom backends

Implement SwarmBackend to run agents in different environments (containers, remote workers, etc.):

interface SwarmBackend {
  spawn(
    config: SwarmMemberConfig,
    member: SwarmMember,
  ): AsyncGenerator<StreamEvent, string, unknown>;
  kill(memberId: string): Promise<void>;
}

The built-in InProcessBackend runs agents as Thread instances in the same process.