@jackchen_me/open-multi-agent 0.1.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/ISSUE_TEMPLATE/bug_report.md +40 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +23 -0
- package/.github/pull_request_template.md +14 -0
- package/.github/workflows/ci.yml +23 -0
- package/CLAUDE.md +80 -0
- package/CODE_OF_CONDUCT.md +48 -0
- package/CONTRIBUTING.md +72 -0
- package/DECISIONS.md +43 -0
- package/README.md +144 -144
- package/README_zh.md +277 -0
- package/SECURITY.md +17 -0
- package/dist/agent/agent.d.ts +20 -1
- package/dist/agent/agent.d.ts.map +1 -1
- package/dist/agent/agent.js +233 -12
- package/dist/agent/agent.js.map +1 -1
- package/dist/agent/loop-detector.d.ts +39 -0
- package/dist/agent/loop-detector.d.ts.map +1 -0
- package/dist/agent/loop-detector.js +122 -0
- package/dist/agent/loop-detector.js.map +1 -0
- package/dist/agent/pool.d.ts +2 -1
- package/dist/agent/pool.d.ts.map +1 -1
- package/dist/agent/pool.js +4 -2
- package/dist/agent/pool.js.map +1 -1
- package/dist/agent/runner.d.ts +23 -1
- package/dist/agent/runner.d.ts.map +1 -1
- package/dist/agent/runner.js +113 -12
- package/dist/agent/runner.js.map +1 -1
- package/dist/agent/structured-output.d.ts +33 -0
- package/dist/agent/structured-output.d.ts.map +1 -0
- package/dist/agent/structured-output.js +116 -0
- package/dist/agent/structured-output.js.map +1 -0
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/llm/adapter.d.ts +12 -4
- package/dist/llm/adapter.d.ts.map +1 -1
- package/dist/llm/adapter.js +28 -5
- package/dist/llm/adapter.js.map +1 -1
- package/dist/llm/anthropic.d.ts +1 -1
- package/dist/llm/anthropic.d.ts.map +1 -1
- package/dist/llm/anthropic.js +2 -1
- package/dist/llm/anthropic.js.map +1 -1
- package/dist/llm/copilot.d.ts +92 -0
- package/dist/llm/copilot.d.ts.map +1 -0
- package/dist/llm/copilot.js +427 -0
- package/dist/llm/copilot.js.map +1 -0
- package/dist/llm/gemini.d.ts +65 -0
- package/dist/llm/gemini.d.ts.map +1 -0
- package/dist/llm/gemini.js +317 -0
- package/dist/llm/gemini.js.map +1 -0
- package/dist/llm/grok.d.ts +21 -0
- package/dist/llm/grok.d.ts.map +1 -0
- package/dist/llm/grok.js +24 -0
- package/dist/llm/grok.js.map +1 -0
- package/dist/llm/openai-common.d.ts +54 -0
- package/dist/llm/openai-common.d.ts.map +1 -0
- package/dist/llm/openai-common.js +242 -0
- package/dist/llm/openai-common.js.map +1 -0
- package/dist/llm/openai.d.ts +2 -2
- package/dist/llm/openai.d.ts.map +1 -1
- package/dist/llm/openai.js +23 -226
- package/dist/llm/openai.js.map +1 -1
- package/dist/orchestrator/orchestrator.d.ts +25 -1
- package/dist/orchestrator/orchestrator.d.ts.map +1 -1
- package/dist/orchestrator/orchestrator.js +214 -41
- package/dist/orchestrator/orchestrator.js.map +1 -1
- package/dist/task/queue.d.ts +31 -2
- package/dist/task/queue.d.ts.map +1 -1
- package/dist/task/queue.js +70 -3
- package/dist/task/queue.js.map +1 -1
- package/dist/task/task.d.ts +3 -0
- package/dist/task/task.d.ts.map +1 -1
- package/dist/task/task.js +5 -1
- package/dist/task/task.js.map +1 -1
- package/dist/team/messaging.d.ts.map +1 -1
- package/dist/team/messaging.js +2 -1
- package/dist/team/messaging.js.map +1 -1
- package/dist/tool/text-tool-extractor.d.ts +32 -0
- package/dist/tool/text-tool-extractor.d.ts.map +1 -0
- package/dist/tool/text-tool-extractor.js +187 -0
- package/dist/tool/text-tool-extractor.js.map +1 -0
- package/dist/types.d.ts +167 -7
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/trace.d.ts +12 -0
- package/dist/utils/trace.d.ts.map +1 -0
- package/dist/utils/trace.js +30 -0
- package/dist/utils/trace.js.map +1 -0
- package/examples/05-copilot-test.ts +49 -0
- package/examples/06-local-model.ts +200 -0
- package/examples/07-fan-out-aggregate.ts +209 -0
- package/examples/08-gemma4-local.ts +192 -0
- package/examples/09-structured-output.ts +73 -0
- package/examples/10-task-retry.ts +132 -0
- package/examples/11-trace-observability.ts +133 -0
- package/examples/12-grok.ts +154 -0
- package/examples/13-gemini.ts +48 -0
- package/package.json +14 -3
- package/src/agent/agent.ts +273 -15
- package/src/agent/loop-detector.ts +137 -0
- package/src/agent/pool.ts +9 -2
- package/src/agent/runner.ts +148 -19
- package/src/agent/structured-output.ts +126 -0
- package/src/index.ts +17 -1
- package/src/llm/adapter.ts +29 -5
- package/src/llm/anthropic.ts +2 -1
- package/src/llm/copilot.ts +552 -0
- package/src/llm/gemini.ts +378 -0
- package/src/llm/grok.ts +29 -0
- package/src/llm/openai-common.ts +294 -0
- package/src/llm/openai.ts +31 -261
- package/src/orchestrator/orchestrator.ts +260 -40
- package/src/task/queue.ts +74 -4
- package/src/task/task.ts +8 -1
- package/src/team/messaging.ts +3 -1
- package/src/tool/text-tool-extractor.ts +219 -0
- package/src/types.ts +186 -6
- package/src/utils/trace.ts +34 -0
- package/tests/agent-hooks.test.ts +473 -0
- package/tests/agent-pool.test.ts +212 -0
- package/tests/approval.test.ts +464 -0
- package/tests/built-in-tools.test.ts +393 -0
- package/tests/gemini-adapter.test.ts +97 -0
- package/tests/grok-adapter.test.ts +74 -0
- package/tests/llm-adapters.test.ts +357 -0
- package/tests/loop-detection.test.ts +456 -0
- package/tests/openai-fallback.test.ts +159 -0
- package/tests/orchestrator.test.ts +281 -0
- package/tests/scheduler.test.ts +221 -0
- package/tests/semaphore.test.ts +57 -0
- package/tests/shared-memory.test.ts +122 -0
- package/tests/structured-output.test.ts +331 -0
- package/tests/task-queue.test.ts +244 -0
- package/tests/task-retry.test.ts +368 -0
- package/tests/task-utils.test.ts +155 -0
- package/tests/team-messaging.test.ts +329 -0
- package/tests/text-tool-extractor.test.ts +170 -0
- package/tests/tool-executor.test.ts +193 -0
- package/tests/trace.test.ts +453 -0
- package/vitest.config.ts +9 -0
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Example 11 — Trace Observability
|
|
3
|
+
*
|
|
4
|
+
* Demonstrates the `onTrace` callback for lightweight observability. Every LLM
|
|
5
|
+
* call, tool execution, task lifecycle, and agent run emits a structured trace
|
|
6
|
+
* event with timing data and token usage — giving you full visibility into
|
|
7
|
+
* what's happening inside a multi-agent run.
|
|
8
|
+
*
|
|
9
|
+
* Trace events share a `runId` for correlation, so you can reconstruct the
|
|
10
|
+
* full execution timeline. Pipe them into your own logging, OpenTelemetry, or
|
|
11
|
+
* dashboard.
|
|
12
|
+
*
|
|
13
|
+
* Run:
|
|
14
|
+
* npx tsx examples/11-trace-observability.ts
|
|
15
|
+
*
|
|
16
|
+
* Prerequisites:
|
|
17
|
+
* ANTHROPIC_API_KEY env var must be set.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import { OpenMultiAgent } from '../src/index.js'
|
|
21
|
+
import type { AgentConfig, TraceEvent } from '../src/types.js'
|
|
22
|
+
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
// Agents
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
|
|
27
|
+
const researcher: AgentConfig = {
|
|
28
|
+
name: 'researcher',
|
|
29
|
+
model: 'claude-sonnet-4-6',
|
|
30
|
+
systemPrompt: 'You are a research assistant. Provide concise, factual answers.',
|
|
31
|
+
maxTurns: 2,
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const writer: AgentConfig = {
|
|
35
|
+
name: 'writer',
|
|
36
|
+
model: 'claude-sonnet-4-6',
|
|
37
|
+
systemPrompt: 'You are a technical writer. Summarize research into clear prose.',
|
|
38
|
+
maxTurns: 2,
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// ---------------------------------------------------------------------------
|
|
42
|
+
// Trace handler — log every span with timing
|
|
43
|
+
// ---------------------------------------------------------------------------
|
|
44
|
+
|
|
45
|
+
function handleTrace(event: TraceEvent): void {
|
|
46
|
+
const dur = `${event.durationMs}ms`.padStart(7)
|
|
47
|
+
|
|
48
|
+
switch (event.type) {
|
|
49
|
+
case 'llm_call':
|
|
50
|
+
console.log(
|
|
51
|
+
` [LLM] ${dur} agent=${event.agent} model=${event.model} turn=${event.turn}` +
|
|
52
|
+
` tokens=${event.tokens.input_tokens}in/${event.tokens.output_tokens}out`,
|
|
53
|
+
)
|
|
54
|
+
break
|
|
55
|
+
case 'tool_call':
|
|
56
|
+
console.log(
|
|
57
|
+
` [TOOL] ${dur} agent=${event.agent} tool=${event.tool}` +
|
|
58
|
+
` error=${event.isError}`,
|
|
59
|
+
)
|
|
60
|
+
break
|
|
61
|
+
case 'task':
|
|
62
|
+
console.log(
|
|
63
|
+
` [TASK] ${dur} task="${event.taskTitle}" agent=${event.agent}` +
|
|
64
|
+
` success=${event.success} retries=${event.retries}`,
|
|
65
|
+
)
|
|
66
|
+
break
|
|
67
|
+
case 'agent':
|
|
68
|
+
console.log(
|
|
69
|
+
` [AGENT] ${dur} agent=${event.agent} turns=${event.turns}` +
|
|
70
|
+
` tools=${event.toolCalls} tokens=${event.tokens.input_tokens}in/${event.tokens.output_tokens}out`,
|
|
71
|
+
)
|
|
72
|
+
break
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// ---------------------------------------------------------------------------
|
|
77
|
+
// Orchestrator + team
|
|
78
|
+
// ---------------------------------------------------------------------------
|
|
79
|
+
|
|
80
|
+
const orchestrator = new OpenMultiAgent({
|
|
81
|
+
defaultModel: 'claude-sonnet-4-6',
|
|
82
|
+
onTrace: handleTrace,
|
|
83
|
+
})
|
|
84
|
+
|
|
85
|
+
const team = orchestrator.createTeam('trace-demo', {
|
|
86
|
+
name: 'trace-demo',
|
|
87
|
+
agents: [researcher, writer],
|
|
88
|
+
sharedMemory: true,
|
|
89
|
+
})
|
|
90
|
+
|
|
91
|
+
// ---------------------------------------------------------------------------
|
|
92
|
+
// Tasks — researcher first, then writer summarizes
|
|
93
|
+
// ---------------------------------------------------------------------------
|
|
94
|
+
|
|
95
|
+
const tasks = [
|
|
96
|
+
{
|
|
97
|
+
title: 'Research topic',
|
|
98
|
+
description: 'List 5 key benefits of TypeScript for large codebases. Be concise.',
|
|
99
|
+
assignee: 'researcher',
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
title: 'Write summary',
|
|
103
|
+
description: 'Read the research from shared memory and write a 3-sentence summary.',
|
|
104
|
+
assignee: 'writer',
|
|
105
|
+
dependsOn: ['Research topic'],
|
|
106
|
+
},
|
|
107
|
+
]
|
|
108
|
+
|
|
109
|
+
// ---------------------------------------------------------------------------
|
|
110
|
+
// Run
|
|
111
|
+
// ---------------------------------------------------------------------------
|
|
112
|
+
|
|
113
|
+
console.log('Trace Observability Example')
|
|
114
|
+
console.log('='.repeat(60))
|
|
115
|
+
console.log('Pipeline: research → write (with full trace output)')
|
|
116
|
+
console.log('='.repeat(60))
|
|
117
|
+
console.log()
|
|
118
|
+
|
|
119
|
+
const result = await orchestrator.runTasks(team, tasks)
|
|
120
|
+
|
|
121
|
+
// ---------------------------------------------------------------------------
|
|
122
|
+
// Summary
|
|
123
|
+
// ---------------------------------------------------------------------------
|
|
124
|
+
|
|
125
|
+
console.log('\n' + '='.repeat(60))
|
|
126
|
+
console.log(`Overall success: ${result.success}`)
|
|
127
|
+
console.log(`Tokens — input: ${result.totalTokenUsage.input_tokens}, output: ${result.totalTokenUsage.output_tokens}`)
|
|
128
|
+
|
|
129
|
+
for (const [name, r] of result.agentResults) {
|
|
130
|
+
const icon = r.success ? 'OK ' : 'FAIL'
|
|
131
|
+
console.log(` [${icon}] ${name}`)
|
|
132
|
+
console.log(` ${r.output.slice(0, 200)}`)
|
|
133
|
+
}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Example 12 — Multi-Agent Team Collaboration with Grok (xAI)
|
|
3
|
+
*
|
|
4
|
+
* Three specialized agents (architect, developer, reviewer) collaborate via `runTeam()`
|
|
5
|
+
* to build a minimal Express.js REST API. Every agent uses Grok's coding-optimized model.
|
|
6
|
+
*
|
|
7
|
+
* Run:
|
|
8
|
+
* npx tsx examples/12-grok.ts
|
|
9
|
+
*
|
|
10
|
+
* Prerequisites:
|
|
11
|
+
* XAI_API_KEY environment variable must be set.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { OpenMultiAgent } from '../src/index.js'
|
|
15
|
+
import type { AgentConfig, OrchestratorEvent } from '../src/types.js'
|
|
16
|
+
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
// Agent definitions (all using grok-code-fast-1)
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
const architect: AgentConfig = {
|
|
21
|
+
name: 'architect',
|
|
22
|
+
model: 'grok-code-fast-1',
|
|
23
|
+
provider: 'grok',
|
|
24
|
+
systemPrompt: `You are a software architect with deep experience in Node.js and REST API design.
|
|
25
|
+
Your job is to design clear, production-quality API contracts and file/directory structures.
|
|
26
|
+
Output concise plans in markdown — no unnecessary prose.`,
|
|
27
|
+
tools: ['bash', 'file_write'],
|
|
28
|
+
maxTurns: 5,
|
|
29
|
+
temperature: 0.2,
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const developer: AgentConfig = {
|
|
33
|
+
name: 'developer',
|
|
34
|
+
model: 'grok-code-fast-1',
|
|
35
|
+
provider: 'grok',
|
|
36
|
+
systemPrompt: `You are a TypeScript/Node.js developer. You implement what the architect specifies.
|
|
37
|
+
Write clean, runnable code with proper error handling. Use the tools to write files and run tests.`,
|
|
38
|
+
tools: ['bash', 'file_read', 'file_write', 'file_edit'],
|
|
39
|
+
maxTurns: 12,
|
|
40
|
+
temperature: 0.1,
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const reviewer: AgentConfig = {
|
|
44
|
+
name: 'reviewer',
|
|
45
|
+
model: 'grok-code-fast-1',
|
|
46
|
+
provider: 'grok',
|
|
47
|
+
systemPrompt: `You are a senior code reviewer. Review code for correctness, security, and clarity.
|
|
48
|
+
Provide a structured review with: LGTM items, suggestions, and any blocking issues.
|
|
49
|
+
Read files using the tools before reviewing.`,
|
|
50
|
+
tools: ['bash', 'file_read', 'grep'],
|
|
51
|
+
maxTurns: 5,
|
|
52
|
+
temperature: 0.3,
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// ---------------------------------------------------------------------------
|
|
56
|
+
// Progress tracking
|
|
57
|
+
// ---------------------------------------------------------------------------
|
|
58
|
+
const startTimes = new Map<string, number>()
|
|
59
|
+
|
|
60
|
+
function handleProgress(event: OrchestratorEvent): void {
|
|
61
|
+
const ts = new Date().toISOString().slice(11, 23) // HH:MM:SS.mmm
|
|
62
|
+
switch (event.type) {
|
|
63
|
+
case 'agent_start':
|
|
64
|
+
startTimes.set(event.agent ?? '', Date.now())
|
|
65
|
+
console.log(`[${ts}] AGENT START → ${event.agent}`)
|
|
66
|
+
break
|
|
67
|
+
case 'agent_complete': {
|
|
68
|
+
const elapsed = Date.now() - (startTimes.get(event.agent ?? '') ?? Date.now())
|
|
69
|
+
console.log(`[${ts}] AGENT DONE ← ${event.agent} (${elapsed}ms)`)
|
|
70
|
+
break
|
|
71
|
+
}
|
|
72
|
+
case 'task_start':
|
|
73
|
+
console.log(`[${ts}] TASK START ↓ ${event.task}`)
|
|
74
|
+
break
|
|
75
|
+
case 'task_complete':
|
|
76
|
+
console.log(`[${ts}] TASK DONE ↑ ${event.task}`)
|
|
77
|
+
break
|
|
78
|
+
case 'message':
|
|
79
|
+
console.log(`[${ts}] MESSAGE • ${event.agent} → (team)`)
|
|
80
|
+
break
|
|
81
|
+
case 'error':
|
|
82
|
+
console.error(`[${ts}] ERROR ✗ agent=${event.agent} task=${event.task}`)
|
|
83
|
+
if (event.data instanceof Error) console.error(` ${event.data.message}`)
|
|
84
|
+
break
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// ---------------------------------------------------------------------------
|
|
89
|
+
// Orchestrate
|
|
90
|
+
// ---------------------------------------------------------------------------
|
|
91
|
+
const orchestrator = new OpenMultiAgent({
|
|
92
|
+
defaultModel: 'grok-code-fast-1',
|
|
93
|
+
defaultProvider: 'grok',
|
|
94
|
+
maxConcurrency: 1, // sequential for readable output
|
|
95
|
+
onProgress: handleProgress,
|
|
96
|
+
})
|
|
97
|
+
|
|
98
|
+
const team = orchestrator.createTeam('api-team', {
|
|
99
|
+
name: 'api-team',
|
|
100
|
+
agents: [architect, developer, reviewer],
|
|
101
|
+
sharedMemory: true,
|
|
102
|
+
maxConcurrency: 1,
|
|
103
|
+
})
|
|
104
|
+
|
|
105
|
+
console.log(`Team "${team.name}" created with agents: ${team.getAgents().map(a => a.name).join(', ')}`)
|
|
106
|
+
console.log('\nStarting team run...\n')
|
|
107
|
+
console.log('='.repeat(60))
|
|
108
|
+
|
|
109
|
+
const goal = `Create a minimal Express.js REST API in /tmp/express-api/ with:
|
|
110
|
+
- GET /health → { status: "ok" }
|
|
111
|
+
- GET /users → returns a hardcoded array of 2 user objects
|
|
112
|
+
- POST /users → accepts { name, email } body, logs it, returns 201
|
|
113
|
+
- Proper error handling middleware
|
|
114
|
+
- The server should listen on port 3001
|
|
115
|
+
- Include a package.json with the required dependencies`
|
|
116
|
+
|
|
117
|
+
const result = await orchestrator.runTeam(team, goal)
|
|
118
|
+
|
|
119
|
+
console.log('\n' + '='.repeat(60))
|
|
120
|
+
|
|
121
|
+
// ---------------------------------------------------------------------------
|
|
122
|
+
// Results
|
|
123
|
+
// ---------------------------------------------------------------------------
|
|
124
|
+
console.log('\nTeam run complete.')
|
|
125
|
+
console.log(`Success: ${result.success}`)
|
|
126
|
+
console.log(`Total tokens — input: ${result.totalTokenUsage.input_tokens}, output: ${result.totalTokenUsage.output_tokens}`)
|
|
127
|
+
|
|
128
|
+
console.log('\nPer-agent results:')
|
|
129
|
+
for (const [agentName, agentResult] of result.agentResults) {
|
|
130
|
+
const status = agentResult.success ? 'OK' : 'FAILED'
|
|
131
|
+
const tools = agentResult.toolCalls.length
|
|
132
|
+
console.log(` ${agentName.padEnd(12)} [${status}] tool_calls=${tools}`)
|
|
133
|
+
if (!agentResult.success) {
|
|
134
|
+
console.log(` Error: ${agentResult.output.slice(0, 120)}`)
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// Sample outputs
|
|
139
|
+
const developerResult = result.agentResults.get('developer')
|
|
140
|
+
if (developerResult?.success) {
|
|
141
|
+
console.log('\nDeveloper output (last 600 chars):')
|
|
142
|
+
console.log('─'.repeat(60))
|
|
143
|
+
const out = developerResult.output
|
|
144
|
+
console.log(out.length > 600 ? '...' + out.slice(-600) : out)
|
|
145
|
+
console.log('─'.repeat(60))
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
const reviewerResult = result.agentResults.get('reviewer')
|
|
149
|
+
if (reviewerResult?.success) {
|
|
150
|
+
console.log('\nReviewer output:')
|
|
151
|
+
console.log('─'.repeat(60))
|
|
152
|
+
console.log(reviewerResult.output)
|
|
153
|
+
console.log('─'.repeat(60))
|
|
154
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Quick smoke test for the Gemini adapter.
|
|
3
|
+
*
|
|
4
|
+
* Run:
|
|
5
|
+
* npx tsx examples/13-gemini.ts
|
|
6
|
+
*
|
|
7
|
+
* If GEMINI_API_KEY is not set, the adapter will not work.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { OpenMultiAgent } from '../src/index.js'
|
|
11
|
+
import type { OrchestratorEvent } from '../src/types.js'
|
|
12
|
+
|
|
13
|
+
const orchestrator = new OpenMultiAgent({
|
|
14
|
+
defaultModel: 'gemini-2.5-flash',
|
|
15
|
+
defaultProvider: 'gemini',
|
|
16
|
+
onProgress: (event: OrchestratorEvent) => {
|
|
17
|
+
if (event.type === 'agent_start') {
|
|
18
|
+
console.log(`[start] agent=${event.agent}`)
|
|
19
|
+
} else if (event.type === 'agent_complete') {
|
|
20
|
+
console.log(`[complete] agent=${event.agent}`)
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
console.log('Testing Gemini adapter with gemini-2.5-flash...\n')
|
|
26
|
+
|
|
27
|
+
const result = await orchestrator.runAgent(
|
|
28
|
+
{
|
|
29
|
+
name: 'assistant',
|
|
30
|
+
model: 'gemini-2.5-flash',
|
|
31
|
+
provider: 'gemini',
|
|
32
|
+
systemPrompt: 'You are a helpful assistant. Keep answers brief.',
|
|
33
|
+
maxTurns: 1,
|
|
34
|
+
maxTokens: 256,
|
|
35
|
+
},
|
|
36
|
+
'What is 2 + 2? Reply in one sentence.',
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
if (result.success) {
|
|
40
|
+
console.log('\nAgent output:')
|
|
41
|
+
console.log('─'.repeat(60))
|
|
42
|
+
console.log(result.output)
|
|
43
|
+
console.log('─'.repeat(60))
|
|
44
|
+
console.log(`\nTokens: input=${result.tokenUsage.input_tokens}, output=${result.tokenUsage.output_tokens}`)
|
|
45
|
+
} else {
|
|
46
|
+
console.error('Agent failed:', result.output)
|
|
47
|
+
process.exit(1)
|
|
48
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jackchen_me/open-multi-agent",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "1.0.0",
|
|
4
4
|
"description": "Production-grade multi-agent orchestration framework. Model-agnostic, supports team collaboration, task scheduling, and inter-agent communication.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -41,9 +41,20 @@
|
|
|
41
41
|
"openai": "^4.73.0",
|
|
42
42
|
"zod": "^3.23.0"
|
|
43
43
|
},
|
|
44
|
+
"peerDependencies": {
|
|
45
|
+
"@google/genai": "^1.48.0"
|
|
46
|
+
},
|
|
47
|
+
"peerDependenciesMeta": {
|
|
48
|
+
"@google/genai": {
|
|
49
|
+
"optional": true
|
|
50
|
+
}
|
|
51
|
+
},
|
|
44
52
|
"devDependencies": {
|
|
53
|
+
"@google/genai": "^1.48.0",
|
|
54
|
+
"@types/node": "^22.0.0",
|
|
55
|
+
"@vitest/coverage-v8": "^2.1.9",
|
|
56
|
+
"tsx": "^4.21.0",
|
|
45
57
|
"typescript": "^5.6.0",
|
|
46
|
-
"vitest": "^2.1.0"
|
|
47
|
-
"@types/node": "^22.0.0"
|
|
58
|
+
"vitest": "^2.1.0"
|
|
48
59
|
}
|
|
49
60
|
}
|