← All examplesEnterprise support
// Production Control
Task Retry with Exponential Backoff
Demonstrates maxRetries, retryDelayMs, and retryBackoff on task config. When a task fails, the framework automatically retries with exponential backoff. The onProgress callback receives task_retry events so you can log retry attempts in real time.
01 Run it
OMA APIs
OpenMultiAgentFrom a clone of the repo — this exact file:
npx tsx packages/core/examples/patterns/task-retry.ts
Prerequisites
- ANTHROPIC_API_KEY env var must be set.
OMA is provider-agnostic — this example is written for the key above, but you can run it on OpenAI, Gemini, Groq and others. All providers →
Open the complete, synchronized source · 132 lines
The complete example, synchronized from the pinned Framework commit.
/*** Task Retry with Exponential Backoff** Demonstrates `maxRetries`, `retryDelayMs`, and `retryBackoff` on task config.* When a task fails, the framework automatically retries with exponential* backoff. The `onProgress` callback receives `task_retry` events so you can* log retry attempts in real time.** Scenario: a two-step pipeline where the first task (data fetch) is configured* to retry on failure, and the second task (analysis) depends on it.** Run:* npx tsx packages/core/examples/patterns/task-retry.ts** Prerequisites:* ANTHROPIC_API_KEY env var must be set.*/import { OpenMultiAgent } from '../../src/index.js'import type { AgentConfig, OrchestratorEvent } from '../../src/types.js'// ---------------------------------------------------------------------------// Agents// ---------------------------------------------------------------------------const fetcher: AgentConfig = {name: 'fetcher',model: 'claude-sonnet-4-6',systemPrompt: `You are a data-fetching agent. When given a topic, produce a shortJSON summary with 3-5 key facts. Output ONLY valid JSON, no markdown fences.Example: {"topic":"...", "facts":["fact1","fact2","fact3"]}`,maxTurns: 2,}const analyst: AgentConfig = {name: 'analyst',model: 'claude-sonnet-4-6',systemPrompt: `You are a data analyst. Read the fetched data from shared memoryand produce a brief analysis (3-4 sentences) highlighting trends or insights.`,maxTurns: 2,}// ---------------------------------------------------------------------------// Progress handler — watch for task_retry events// ---------------------------------------------------------------------------function handleProgress(event: OrchestratorEvent): void {const ts = new Date().toISOString().slice(11, 23)switch (event.type) {case 'task_start':console.log(`[${ts}] TASK START "${event.task}" (agent: ${event.agent})`)breakcase 'task_complete':console.log(`[${ts}] TASK DONE "${event.task}"`)breakcase 'task_retry': {const d = event.data as { attempt: number; maxAttempts: number; error: string; nextDelayMs: number }console.log(`[${ts}] TASK RETRY "${event.task}" — attempt ${d.attempt}/${d.maxAttempts}, next in ${d.nextDelayMs}ms`)console.log(` error: ${d.error.slice(0, 120)}`)break}case 'error':console.log(`[${ts}] ERROR "${event.task}" agent=${event.agent}`)break}}// ---------------------------------------------------------------------------// Orchestrator + team// ---------------------------------------------------------------------------const orchestrator = new OpenMultiAgent({defaultModel: 'claude-sonnet-4-6',onProgress: handleProgress,})const team = orchestrator.createTeam('retry-demo', {name: 'retry-demo',agents: [fetcher, analyst],sharedMemory: true,})// ---------------------------------------------------------------------------// Tasks — fetcher has retry config, analyst depends on it// ---------------------------------------------------------------------------const tasks = [{title: 'Fetch data',description: 'Fetch key facts about the adoption of TypeScript in open-source projects as of 2024. Output a JSON object with a "topic" and "facts" array.',assignee: 'fetcher',// Retry config: up to 2 retries, 500ms base delay, 2x backoff (500ms, 1000ms)maxRetries: 2,retryDelayMs: 500,retryBackoff: 2,},{title: 'Analyze data',description: 'Read the fetched data from shared memory and produce a 3-4 sentence analysis of TypeScript adoption trends.',assignee: 'analyst',dependsOn: ['Fetch data'],// No retry — if analysis fails, just report the error},]// ---------------------------------------------------------------------------// Run// ---------------------------------------------------------------------------console.log('Task Retry Example')console.log('='.repeat(60))console.log('Pipeline: fetch (with retry) → analyze')console.log(`Retry config: maxRetries=2, delay=500ms, backoff=2x`)console.log('='.repeat(60))console.log()const result = await orchestrator.runTasks(team, tasks)// ---------------------------------------------------------------------------// Summary// ---------------------------------------------------------------------------console.log('\n' + '='.repeat(60))console.log(`Overall success: ${result.success}`)console.log(`Tokens — input: ${result.totalTokenUsage.input_tokens}, output: ${result.totalTokenUsage.output_tokens}`)for (const [name, r] of result.agentResults) {const icon = r.success ? 'OK ' : 'FAIL'console.log(` [${icon}] ${name}`)console.log(` ${r.output.slice(0, 200)}`)}
// Learn the concepts
// Enterprise
Taking this to production?
open-multi-agent is MIT-licensed and free to run yourself. When you need it delivered, integrated, or supported on a deadline, 元定义科技 (YuanASI) offers commercial delivery and support.