reason-machines/trending-skills1 file

Open Multi Agent Orchestration

Expertise in using open-multi-agent, a TypeScript framework for building production-grade multi-agent AI teams with task scheduling, dependency graphs, and inter-agent communication.

Specification
Skill ID
reason-machines/trending-skills/open-multi-agent-orchestration
Publisher
reason-machines
Repository
trending-skills
Installs
0
Files
1
Synced
Sep 23, 2026
How to use it

Open any RiverX project, open the Skills panel in the chat, and search for this identifier. The files are fetched from the source repository at install time.

reason-machines/trending-skills/open-multi-agent-orchestrationInstalls these files
  • SKILL.md

What this skill tells the agent

Open Multi-Agent Orchestration

Skill by ara.so — Daily 2026 Skills collection.

open-multi-agent is a TypeScript framework for building AI agent teams where agents with different roles, models, and tools collaborate on complex goals. The framework handles task dependency resolution (DAG scheduling), parallel execution, shared memory, and inter-agent communication — all in-process with no subprocess overhead.

Installation

npm install @jackchen_me/open-multi-agent
# or
pnpm add @jackchen_me/open-multi-agent

Set environment variables:

export ANTHROPIC_API_KEY=your_key_here
export OPENAI_API_KEY=your_key_here   # optional, only if using OpenAI models

Core Concepts

ConceptDescription
OpenMultiAgentTop-level orchestrator — entry point for all operations
TeamA named group of agents sharing a message bus, task queue, and optional shared memory
AgentConfigDefines an agent's name, model, provider, system prompt, and allowed tools
TaskA unit of work with a title, description, assignee, and optional dependsOn list
LLMAdapterPluggable interface — built-in adapters for Anthropic and OpenAI
ToolRegistryRegistry of available tools; built-ins + custom tools via defineTool()

Quick Start — Single Agent

import { OpenMultiAgent } from '@jackchen_me/open-multi-agent'

const orchestrator = new OpenMultiAgent({ defaultModel: 'claude-sonnet-4-6' })

const result = await orchestrator.runAgent(
  {
    name: 'coder',
    model: 'claude-sonnet-4-6',
    tools: ['bash', 'file_write'],
  },
  'Write a TypeScript function that reverses a string, save it to /tmp/reverse.ts, and run it.',
)

console.log(result.output)

Multi-Agent Team

import { OpenMultiAgent } from '@jackchen_me/open-multi-agent'
import type { AgentConfig } from '@jackchen_me/open-multi-agent'

const architect: AgentConfig = {
  name: 'architect',
  model: 'claude-sonnet-4-6',
  systemPrompt: 'You design clean API contracts and file structures.',
  tools: ['file_write'],
}

const developer: AgentConfig = {
  name: 'developer',
  model: 'claude-sonnet-4-6',
  systemPrompt: 'You implement what the architect designs.',
  tools: ['bash', 'file_read', 'file_write', 'file_edit'],
}

const reviewer: AgentConfig = {
  name: 'reviewer',
  model: 'claude-sonnet-4-6',
  systemPrompt: 'You review code for correctness and clarity.',
  tools: ['file_read', 'grep'],
}

const orchestrator = new OpenMultiAgent({
  defaultModel: 'claude-sonnet-4-6',
  onProgress: (event) => console.log(event.type, event.agent ?? event.task ?? ''),
})

const team = orchestrator.createTeam('api-team', {
  name: 'api-team',
  agents: [architect, developer, reviewer],
  sharedMemory: true,
})

const result = await orchestrator.runTeam(
  team,
  'Create a REST API for a todo list in /tmp/todo-api/',
)

console.log(`Success: ${result.success}`)
console.log(`Output tokens: ${result.totalTokenUsage.output_tokens}`)

Task Pipeline — Explicit DAG Control

Use runTasks() when you need precise control over task ordering, assignments, and parallelism:

const result = await orchestrator.runTasks(team, [
  {
    title: 'Design the data model',
    description: 'Write a TypeScript interface spec to /tmp/spec.md',
    assignee: 'architect',
  },
  {
    title: 'Implement the module',
    description: 'Read /tmp/spec.md and implement the module in /tmp/src/',
    assignee: 'developer',
    dependsOn: ['Design the data model'], // blocked until design completes
  },
  {
    title: 'Write tests',
    description: 'Read the implementation and write Vitest tests.',
    assignee: 'developer',
    dependsOn: ['Implement the module'],
  },
  {
    title: 'Review code',
    description: 'Review /tmp/src/ and produce a structured code review.',
    assignee: 'reviewer',
    dependsOn: ['Implement the module'], // runs in parallel with "Write tests"
  },
])

Tasks with no unresolved dependsOn entries run in parallel automatically. The framework cascades failures — if a task fails, dependent tasks are skipped.

Multi-Model Teams (Claude + GPT)

const claudeAgent: AgentConfig = {
  name: 'strategist',
  model: 'claude-opus-4-6',
  provider: 'anthropic',
  systemPrompt: 'You plan high-level approaches.',
  tools: ['file_write'],
}

const gptAgent: AgentConfig = {
  name: 'implementer',
  model: 'gpt-5.4',
  provider: 'openai',
  systemPrompt: 'You implement plans as working code.',
  tools: ['bash', 'file_read', 'file_write'],
}

const team = orchestrator.createTeam('mixed-team', {
  name: 'mixed-team',
  agents: [claudeAgent, gptAgent],
  sharedMemory: true,
})

const result = await orchestrator.runTeam(team, 'Build a CLI tool that converts JSON to CSV.')

Custom Tools with Zod Schemas

import { z } from 'zod'
import {
  defineTool,
  Agent,
  ToolRegistry,
  ToolExecutor,
  registerBuiltInTools,
} from '@jackchen_me/open-multi-agent'

// Define the tool
const weatherTool = defineTool({
  name: 'get_weather',
  description: 'Get current weather for a city.',
  inputSchema: z.object({
    city: z.string().describe('The city name.'),
    units: z.enum(['celsius', 'fahrenheit']).optional().describe('Temperature units.'),
  }),
  execute: async ({ city, units = 'celsius' }) => {
    // Replace with your actual weather API call
    const data = await fetchWeatherAPI(city, units)
    return { data: JSON.stringify(data), isError: false }
  },
})

// Wire up registry
const registry = new ToolRegistry()
registerBuiltInTools(registry)        // adds bash, file_read, file_write, file_edit, grep
registry.register(weatherTool)        // add your custom tool

const executor = new ToolExecutor(registry)
const agent = new Agent(
  {
    name: 'weather-agent',
    model: 'claude-sonnet-4-6',
    tools: ['get_weather', 'file_write'],
  },
  registry,
  executor,
)

const result = await agent.run('Get the weather for Tokyo and save a report to /tmp/weather.txt')

Streaming Output

import { Agent, ToolRegistry, ToolExecutor, registerBuiltInTools } from '@jackchen_me/open-multi-agent'

const registry = new ToolRegistry()
registerBuiltInTools(registry)
const executor = new ToolExecutor(registry)

const agent = new Agent(
  { name: 'writer', model: 'claude-sonnet-4-6', maxTurns: 3 },
  registry,
  executor,
)

for await (const event of agent.stream('Explain dependency injection in two paragraphs.')) {
  if (event.type === 'text' && typeof event.data === 'string') {
    process.stdout.write(event.data)
  }
}

Progress Monitoring

const orchestrator = new OpenMultiAgent({
  defaultModel: 'claude-sonnet-4-6',
  onProgress: (event) => {
    switch (event.type) {
      case 'task:start':
        console.log(`▶ Task started: ${event.task}`)
        break
      case 'task:complete':
        console.log(`✓ Task done: ${event.task}`)
        break
      case 'task:failed':
        console.error(`✗ Task failed: ${event.task}`)
        break
      case 'agent:thinking':
        console.log(`  [${event.agent}] thinking...`)
        break
      case 'agent:tool_use':
        console.log(`  [${event.agent}] using tool: ${event.tool}`)
        break
    }
  },
})

Built-in Tools Reference

ToolKey OptionsNotes
bashcommand, timeout, cwdReturns stdout + stderr
file_readpath, offset, limitUse offset/limit for large files
file_writepath, contentAuto-creates parent directories
file_editpath, old_string, new_stringExact string match replacement
greppattern, path, flagsUses ripgrep if available, falls back to Node.js

AgentConfig Options

interface AgentConfig {
  name: string                    // unique within a team

Use this skill in a project

Open any RiverX project, search the Skills panel for reason-machines/trending-skills/open-multi-agent-orchestration, and install it in one click.

Use this skill