@strands-agents/sdk 0.4.0 → 0.5.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/dist/src/__fixtures__/agent-helpers.d.ts +10 -1
- package/dist/src/__fixtures__/agent-helpers.d.ts.map +1 -1
- package/dist/src/__fixtures__/agent-helpers.js +13 -2
- package/dist/src/__fixtures__/agent-helpers.js.map +1 -1
- package/dist/src/__fixtures__/mock-span.d.ts +78 -0
- package/dist/src/__fixtures__/mock-span.d.ts.map +1 -0
- package/dist/src/__fixtures__/mock-span.js +93 -0
- package/dist/src/__fixtures__/mock-span.js.map +1 -0
- package/dist/src/__fixtures__/tool-helpers.d.ts +2 -2
- package/dist/src/__fixtures__/tool-helpers.d.ts.map +1 -1
- package/dist/src/__fixtures__/tool-helpers.js +4 -4
- package/dist/src/__fixtures__/tool-helpers.js.map +1 -1
- package/dist/src/__tests__/app-state.test.d.ts +2 -0
- package/dist/src/__tests__/app-state.test.d.ts.map +1 -0
- package/dist/src/{agent/__tests__/state.test.js → __tests__/app-state.test.js} +46 -46
- package/dist/src/__tests__/app-state.test.js.map +1 -0
- package/dist/src/__tests__/mcp.test.js +96 -15
- package/dist/src/__tests__/mcp.test.js.map +1 -1
- package/dist/src/agent/__tests__/agent.test.js +110 -0
- package/dist/src/agent/__tests__/agent.test.js.map +1 -1
- package/dist/src/agent/__tests__/agent.tracer.test.d.ts +2 -0
- package/dist/src/agent/__tests__/agent.tracer.test.d.ts.map +1 -0
- package/dist/src/agent/__tests__/agent.tracer.test.js +470 -0
- package/dist/src/agent/__tests__/agent.tracer.test.js.map +1 -0
- package/dist/src/agent/agent.d.ts +59 -6
- package/dist/src/agent/agent.d.ts.map +1 -1
- package/dist/src/agent/agent.js +187 -60
- package/dist/src/agent/agent.js.map +1 -1
- package/dist/src/{agent/state.d.ts → app-state.d.ts} +7 -7
- package/dist/src/app-state.d.ts.map +1 -0
- package/dist/src/{agent/state.js → app-state.js} +6 -6
- package/dist/src/app-state.js.map +1 -0
- package/dist/src/conversation-manager/sliding-window-conversation-manager.d.ts +1 -1
- package/dist/src/conversation-manager/sliding-window-conversation-manager.js +1 -1
- package/dist/src/index.d.ts +2 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +4 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcp.d.ts +3 -0
- package/dist/src/mcp.d.ts.map +1 -1
- package/dist/src/mcp.js +38 -1
- package/dist/src/mcp.js.map +1 -1
- package/dist/src/models/__tests__/model.test.js +7 -0
- package/dist/src/models/__tests__/model.test.js.map +1 -1
- package/dist/src/models/model.d.ts +4 -0
- package/dist/src/models/model.d.ts.map +1 -1
- package/dist/src/models/model.js +6 -0
- package/dist/src/models/model.js.map +1 -1
- package/dist/src/models/streaming.d.ts +1 -1
- package/dist/src/multiagent/__tests__/events.test.d.ts +2 -0
- package/dist/src/multiagent/__tests__/events.test.d.ts.map +1 -0
- package/dist/src/multiagent/__tests__/events.test.js +189 -0
- package/dist/src/multiagent/__tests__/events.test.js.map +1 -0
- package/dist/src/multiagent/__tests__/nodes.test.js +102 -6
- package/dist/src/multiagent/__tests__/nodes.test.js.map +1 -1
- package/dist/src/multiagent/__tests__/queue.test.d.ts +2 -0
- package/dist/src/multiagent/__tests__/queue.test.d.ts.map +1 -0
- package/dist/src/multiagent/__tests__/queue.test.js +96 -0
- package/dist/src/multiagent/__tests__/queue.test.js.map +1 -0
- package/dist/src/multiagent/base.d.ts +25 -0
- package/dist/src/multiagent/base.d.ts.map +1 -0
- package/dist/src/multiagent/base.js +2 -0
- package/dist/src/multiagent/base.js.map +1 -0
- package/dist/src/multiagent/edge.d.ts +29 -0
- package/dist/src/multiagent/edge.d.ts.map +1 -0
- package/dist/src/multiagent/edge.js +15 -0
- package/dist/src/multiagent/edge.js.map +1 -0
- package/dist/src/multiagent/events.d.ts +115 -4
- package/dist/src/multiagent/events.d.ts.map +1 -1
- package/dist/src/multiagent/events.js +123 -2
- package/dist/src/multiagent/events.js.map +1 -1
- package/dist/src/multiagent/index.d.ts +8 -6
- package/dist/src/multiagent/index.d.ts.map +1 -1
- package/dist/src/multiagent/index.js +4 -3
- package/dist/src/multiagent/index.js.map +1 -1
- package/dist/src/multiagent/nodes.d.ts +62 -14
- package/dist/src/multiagent/nodes.d.ts.map +1 -1
- package/dist/src/multiagent/nodes.js +67 -20
- package/dist/src/multiagent/nodes.js.map +1 -1
- package/dist/src/multiagent/queue.d.ts +67 -0
- package/dist/src/multiagent/queue.d.ts.map +1 -0
- package/dist/src/multiagent/queue.js +59 -0
- package/dist/src/multiagent/queue.js.map +1 -0
- package/dist/src/multiagent/state.d.ts +77 -10
- package/dist/src/multiagent/state.d.ts.map +1 -1
- package/dist/src/multiagent/state.js +98 -9
- package/dist/src/multiagent/state.js.map +1 -1
- package/dist/src/telemetry/__tests__/config.test.node.d.ts +2 -0
- package/dist/src/telemetry/__tests__/config.test.node.d.ts.map +1 -0
- package/dist/src/telemetry/__tests__/config.test.node.js +129 -0
- package/dist/src/telemetry/__tests__/config.test.node.js.map +1 -0
- package/dist/src/telemetry/__tests__/json.test.d.ts +2 -0
- package/dist/src/telemetry/__tests__/json.test.d.ts.map +1 -0
- package/dist/src/telemetry/__tests__/json.test.js +89 -0
- package/dist/src/telemetry/__tests__/json.test.js.map +1 -0
- package/dist/src/telemetry/__tests__/tracer.test.node.d.ts +2 -0
- package/dist/src/telemetry/__tests__/tracer.test.node.d.ts.map +1 -0
- package/dist/src/telemetry/__tests__/tracer.test.node.js +611 -0
- package/dist/src/telemetry/__tests__/tracer.test.node.js.map +1 -0
- package/dist/src/telemetry/config.d.ts +61 -0
- package/dist/src/telemetry/config.d.ts.map +1 -0
- package/dist/src/telemetry/config.js +101 -0
- package/dist/src/telemetry/config.js.map +1 -0
- package/dist/src/telemetry/index.d.ts +34 -0
- package/dist/src/telemetry/index.d.ts.map +1 -0
- package/dist/src/telemetry/index.js +33 -0
- package/dist/src/telemetry/index.js.map +1 -0
- package/dist/src/telemetry/json.d.ts +11 -0
- package/dist/src/telemetry/json.d.ts.map +1 -0
- package/dist/src/telemetry/json.js +25 -0
- package/dist/src/telemetry/json.js.map +1 -0
- package/dist/src/telemetry/tracer.d.ts +219 -0
- package/dist/src/telemetry/tracer.d.ts.map +1 -0
- package/dist/src/telemetry/tracer.js +610 -0
- package/dist/src/telemetry/tracer.js.map +1 -0
- package/dist/src/telemetry/types.d.ts +101 -0
- package/dist/src/telemetry/types.d.ts.map +1 -0
- package/dist/src/telemetry/types.js +5 -0
- package/dist/src/{multiagent → telemetry}/types.js.map +1 -1
- package/dist/src/tools/tool.d.ts +1 -1
- package/dist/src/tools/tool.js +1 -1
- package/dist/src/tsconfig.tsbuildinfo +1 -1
- package/dist/src/types/agent.d.ts +3 -3
- package/dist/src/types/agent.d.ts.map +1 -1
- package/dist/src/types/messages.d.ts +4 -4
- package/dist/src/types/messages.js +1 -1
- package/dist/src/vended-tools/bash/__tests__/bash.test.node.js +2 -2
- package/dist/src/vended-tools/bash/__tests__/bash.test.node.js.map +1 -1
- package/dist/src/vended-tools/file_editor/__tests__/file-editor.test.node.js +4 -4
- package/dist/src/vended-tools/file_editor/__tests__/file-editor.test.node.js.map +1 -1
- package/dist/src/vended-tools/notebook/__tests__/notebook.test.js +2 -2
- package/dist/src/vended-tools/notebook/__tests__/notebook.test.js.map +1 -1
- package/package.json +11 -2
- package/dist/src/agent/__tests__/state.test.d.ts +0 -2
- package/dist/src/agent/__tests__/state.test.d.ts.map +0 -1
- package/dist/src/agent/__tests__/state.test.js.map +0 -1
- package/dist/src/agent/state.d.ts.map +0 -1
- package/dist/src/agent/state.js.map +0 -1
- package/dist/src/multiagent/types.d.ts +0 -5
- package/dist/src/multiagent/types.d.ts.map +0 -1
- package/dist/src/multiagent/types.js +0 -2
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { MultiAgentInitializedEvent, BeforeMultiAgentInvocationEvent, AfterMultiAgentInvocationEvent, BeforeNodeCallEvent, AfterNodeCallEvent, NodeStreamUpdateEvent, NodeResultEvent, MultiAgentHandoffEvent, MultiAgentResultEvent, } from '../events.js';
|
|
3
|
+
import { MultiAgentResult, MultiAgentState, NodeResult, Status } from '../state.js';
|
|
4
|
+
const mockOrchestrator = {
|
|
5
|
+
id: 'test-orchestrator',
|
|
6
|
+
invoke: async () => new MultiAgentResult({ results: [], duration: 0 }),
|
|
7
|
+
// eslint-disable-next-line require-yield
|
|
8
|
+
async *stream() {
|
|
9
|
+
return new MultiAgentResult({ results: [], duration: 0 });
|
|
10
|
+
},
|
|
11
|
+
};
|
|
12
|
+
describe('MultiAgentInitializedEvent', () => {
|
|
13
|
+
it('creates instance with correct properties', () => {
|
|
14
|
+
const event = new MultiAgentInitializedEvent({ orchestrator: mockOrchestrator });
|
|
15
|
+
expect(event).toEqual({
|
|
16
|
+
type: 'multiAgentInitializedEvent',
|
|
17
|
+
orchestrator: mockOrchestrator,
|
|
18
|
+
});
|
|
19
|
+
// @ts-expect-error verifying that property is readonly
|
|
20
|
+
event.orchestrator = mockOrchestrator;
|
|
21
|
+
});
|
|
22
|
+
it('returns false for _shouldReverseCallbacks', () => {
|
|
23
|
+
const event = new MultiAgentInitializedEvent({ orchestrator: mockOrchestrator });
|
|
24
|
+
expect(event._shouldReverseCallbacks()).toBe(false);
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
describe('BeforeMultiAgentInvocationEvent', () => {
|
|
28
|
+
it('creates instance with correct properties', () => {
|
|
29
|
+
const state = new MultiAgentState();
|
|
30
|
+
const event = new BeforeMultiAgentInvocationEvent({ orchestrator: mockOrchestrator, state });
|
|
31
|
+
expect(event).toEqual({
|
|
32
|
+
type: 'beforeMultiAgentInvocationEvent',
|
|
33
|
+
orchestrator: mockOrchestrator,
|
|
34
|
+
state,
|
|
35
|
+
});
|
|
36
|
+
// @ts-expect-error verifying that property is readonly
|
|
37
|
+
event.orchestrator = mockOrchestrator;
|
|
38
|
+
// @ts-expect-error verifying that property is readonly
|
|
39
|
+
event.state = state;
|
|
40
|
+
});
|
|
41
|
+
it('returns false for _shouldReverseCallbacks', () => {
|
|
42
|
+
const state = new MultiAgentState();
|
|
43
|
+
const event = new BeforeMultiAgentInvocationEvent({ orchestrator: mockOrchestrator, state });
|
|
44
|
+
expect(event._shouldReverseCallbacks()).toBe(false);
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
describe('AfterMultiAgentInvocationEvent', () => {
|
|
48
|
+
it('creates instance with correct properties', () => {
|
|
49
|
+
const state = new MultiAgentState();
|
|
50
|
+
const event = new AfterMultiAgentInvocationEvent({ orchestrator: mockOrchestrator, state });
|
|
51
|
+
expect(event).toEqual({
|
|
52
|
+
type: 'afterMultiAgentInvocationEvent',
|
|
53
|
+
orchestrator: mockOrchestrator,
|
|
54
|
+
state,
|
|
55
|
+
});
|
|
56
|
+
// @ts-expect-error verifying that property is readonly
|
|
57
|
+
event.orchestrator = mockOrchestrator;
|
|
58
|
+
// @ts-expect-error verifying that property is readonly
|
|
59
|
+
event.state = state;
|
|
60
|
+
});
|
|
61
|
+
it('returns true for _shouldReverseCallbacks', () => {
|
|
62
|
+
const state = new MultiAgentState();
|
|
63
|
+
const event = new AfterMultiAgentInvocationEvent({ orchestrator: mockOrchestrator, state });
|
|
64
|
+
expect(event._shouldReverseCallbacks()).toBe(true);
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
describe('BeforeNodeCallEvent', () => {
|
|
68
|
+
it('creates instance with correct properties', () => {
|
|
69
|
+
const state = new MultiAgentState();
|
|
70
|
+
const event = new BeforeNodeCallEvent({ orchestrator: mockOrchestrator, state, nodeId: 'node-1' });
|
|
71
|
+
expect(event).toEqual({
|
|
72
|
+
type: 'beforeNodeCallEvent',
|
|
73
|
+
orchestrator: mockOrchestrator,
|
|
74
|
+
state,
|
|
75
|
+
nodeId: 'node-1',
|
|
76
|
+
cancel: false,
|
|
77
|
+
});
|
|
78
|
+
// @ts-expect-error verifying that property is readonly
|
|
79
|
+
event.orchestrator = mockOrchestrator;
|
|
80
|
+
// @ts-expect-error verifying that property is readonly
|
|
81
|
+
event.state = state;
|
|
82
|
+
// @ts-expect-error verifying that property is readonly
|
|
83
|
+
event.nodeId = 'node-1';
|
|
84
|
+
});
|
|
85
|
+
it('returns false for _shouldReverseCallbacks', () => {
|
|
86
|
+
const state = new MultiAgentState();
|
|
87
|
+
const event = new BeforeNodeCallEvent({ orchestrator: mockOrchestrator, state, nodeId: 'node-1' });
|
|
88
|
+
expect(event._shouldReverseCallbacks()).toBe(false);
|
|
89
|
+
});
|
|
90
|
+
it('allows cancel to be set to true', () => {
|
|
91
|
+
const state = new MultiAgentState();
|
|
92
|
+
const event = new BeforeNodeCallEvent({ orchestrator: mockOrchestrator, state, nodeId: 'node-1' });
|
|
93
|
+
expect(event.cancel).toBe(false);
|
|
94
|
+
event.cancel = true;
|
|
95
|
+
expect(event.cancel).toBe(true);
|
|
96
|
+
});
|
|
97
|
+
it('allows cancel to be set to a string message', () => {
|
|
98
|
+
const state = new MultiAgentState();
|
|
99
|
+
const event = new BeforeNodeCallEvent({ orchestrator: mockOrchestrator, state, nodeId: 'node-1' });
|
|
100
|
+
event.cancel = 'node is not ready';
|
|
101
|
+
expect(event.cancel).toBe('node is not ready');
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
describe('AfterNodeCallEvent', () => {
|
|
105
|
+
it('creates instance with correct properties', () => {
|
|
106
|
+
const state = new MultiAgentState();
|
|
107
|
+
const event = new AfterNodeCallEvent({ orchestrator: mockOrchestrator, state, nodeId: 'node-1' });
|
|
108
|
+
expect(event).toEqual({
|
|
109
|
+
type: 'afterNodeCallEvent',
|
|
110
|
+
orchestrator: mockOrchestrator,
|
|
111
|
+
state,
|
|
112
|
+
nodeId: 'node-1',
|
|
113
|
+
});
|
|
114
|
+
// @ts-expect-error verifying that property is readonly
|
|
115
|
+
event.orchestrator = mockOrchestrator;
|
|
116
|
+
// @ts-expect-error verifying that property is readonly
|
|
117
|
+
event.state = state;
|
|
118
|
+
// @ts-expect-error verifying that property is readonly
|
|
119
|
+
event.nodeId = 'node-1';
|
|
120
|
+
});
|
|
121
|
+
it('returns true for _shouldReverseCallbacks', () => {
|
|
122
|
+
const state = new MultiAgentState();
|
|
123
|
+
const event = new AfterNodeCallEvent({ orchestrator: mockOrchestrator, state, nodeId: 'node-1' });
|
|
124
|
+
expect(event._shouldReverseCallbacks()).toBe(true);
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
describe('NodeStreamUpdateEvent', () => {
|
|
128
|
+
it('creates instance with correct properties', () => {
|
|
129
|
+
const innerEvent = { type: 'beforeInvocationEvent' };
|
|
130
|
+
const event = new NodeStreamUpdateEvent({ nodeId: 'node-1', nodeType: 'agentNode', event: innerEvent });
|
|
131
|
+
expect(event).toEqual({
|
|
132
|
+
type: 'nodeStreamUpdateEvent',
|
|
133
|
+
nodeId: 'node-1',
|
|
134
|
+
nodeType: 'agentNode',
|
|
135
|
+
event: innerEvent,
|
|
136
|
+
});
|
|
137
|
+
// @ts-expect-error verifying that property is readonly
|
|
138
|
+
event.nodeId = 'node-1';
|
|
139
|
+
// @ts-expect-error verifying that property is readonly
|
|
140
|
+
event.nodeType = 'agentNode';
|
|
141
|
+
// @ts-expect-error verifying that property is readonly
|
|
142
|
+
event.event = innerEvent;
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
describe('NodeResultEvent', () => {
|
|
146
|
+
it('creates instance with correct properties', () => {
|
|
147
|
+
const result = new NodeResult({ nodeId: 'node-1', status: Status.COMPLETED, duration: 100 });
|
|
148
|
+
const event = new NodeResultEvent({ nodeId: 'node-1', nodeType: 'agentNode', result });
|
|
149
|
+
expect(event).toEqual({
|
|
150
|
+
type: 'nodeResultEvent',
|
|
151
|
+
nodeId: 'node-1',
|
|
152
|
+
nodeType: 'agentNode',
|
|
153
|
+
result,
|
|
154
|
+
});
|
|
155
|
+
// @ts-expect-error verifying that property is readonly
|
|
156
|
+
event.nodeId = 'node-1';
|
|
157
|
+
// @ts-expect-error verifying that property is readonly
|
|
158
|
+
event.nodeType = 'agentNode';
|
|
159
|
+
// @ts-expect-error verifying that property is readonly
|
|
160
|
+
event.result = result;
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
describe('MultiAgentHandoffEvent', () => {
|
|
164
|
+
it('creates instance with correct properties', () => {
|
|
165
|
+
const event = new MultiAgentHandoffEvent({ source: 'node-a', targets: ['node-b', 'node-c'] });
|
|
166
|
+
expect(event).toEqual({
|
|
167
|
+
type: 'multiAgentHandoffEvent',
|
|
168
|
+
source: 'node-a',
|
|
169
|
+
targets: ['node-b', 'node-c'],
|
|
170
|
+
});
|
|
171
|
+
// @ts-expect-error verifying that property is readonly
|
|
172
|
+
event.source = 'node-a';
|
|
173
|
+
// @ts-expect-error verifying that property is readonly
|
|
174
|
+
event.targets = [];
|
|
175
|
+
});
|
|
176
|
+
});
|
|
177
|
+
describe('MultiAgentResultEvent', () => {
|
|
178
|
+
it('creates instance with correct properties', () => {
|
|
179
|
+
const result = new MultiAgentResult({ results: [], duration: 0 });
|
|
180
|
+
const event = new MultiAgentResultEvent({ result });
|
|
181
|
+
expect(event).toEqual({
|
|
182
|
+
type: 'multiAgentResultEvent',
|
|
183
|
+
result,
|
|
184
|
+
});
|
|
185
|
+
// @ts-expect-error verifying that property is readonly
|
|
186
|
+
event.result = result;
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
//# sourceMappingURL=events.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.test.js","sourceRoot":"","sources":["../../../../src/multiagent/__tests__/events.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,17 +1,19 @@
|
|
|
1
1
|
import { beforeEach, describe, expect, it } from 'vitest';
|
|
2
|
+
import { z } from 'zod';
|
|
2
3
|
import { Agent } from '../../agent/agent.js';
|
|
3
4
|
import { MockMessageModel } from '../../__fixtures__/mock-message-model.js';
|
|
4
5
|
import { collectGenerator } from '../../__fixtures__/model-test-helpers.js';
|
|
5
6
|
import { TextBlock } from '../../types/messages.js';
|
|
6
|
-
import { MultiAgentState, Status } from '../state.js';
|
|
7
|
-
import {
|
|
7
|
+
import { MultiAgentResult, MultiAgentState, NodeResult, Status } from '../state.js';
|
|
8
|
+
import { MultiAgentHandoffEvent, NodeStreamUpdateEvent } from '../events.js';
|
|
9
|
+
import { AgentNode, MultiAgentNode, Node } from '../nodes.js';
|
|
8
10
|
/**
|
|
9
11
|
* Concrete Node subclass for testing the abstract base class.
|
|
10
12
|
*/
|
|
11
13
|
class TestNode extends Node {
|
|
12
14
|
_fn;
|
|
13
15
|
constructor(id, fn) {
|
|
14
|
-
super(id);
|
|
16
|
+
super(id, {});
|
|
15
17
|
this._fn = fn;
|
|
16
18
|
}
|
|
17
19
|
async *handle(args, state) {
|
|
@@ -63,16 +65,19 @@ describe('AgentNode', () => {
|
|
|
63
65
|
beforeEach(() => {
|
|
64
66
|
const model = new MockMessageModel().addTurn(new TextBlock('reply'));
|
|
65
67
|
agent = new Agent({ model, printer: false, state: { key1: 'value1' } });
|
|
66
|
-
node = new AgentNode('agent-1', agent);
|
|
68
|
+
node = new AgentNode({ id: 'agent-1', agent });
|
|
67
69
|
state = new MultiAgentState();
|
|
68
70
|
});
|
|
69
71
|
describe('handle', () => {
|
|
70
72
|
it('wraps agent events and returns content', async () => {
|
|
71
73
|
const { items, result } = await collectGenerator(node.stream([new TextBlock('prompt')], state));
|
|
72
|
-
|
|
73
|
-
|
|
74
|
+
const streamEvents = items.filter((e) => e.type === 'nodeStreamUpdateEvent');
|
|
75
|
+
expect(streamEvents.length).toBeGreaterThan(0);
|
|
76
|
+
for (const event of streamEvents) {
|
|
74
77
|
expect(event).toEqual(expect.objectContaining({ type: 'nodeStreamUpdateEvent', nodeId: 'agent-1', nodeType: 'agentNode' }));
|
|
75
78
|
}
|
|
79
|
+
const resultEvent = items.find((e) => e.type === 'nodeResultEvent');
|
|
80
|
+
expect(resultEvent).toEqual(expect.objectContaining({ type: 'nodeResultEvent', nodeId: 'agent-1', nodeType: 'agentNode', result }));
|
|
76
81
|
expect(result).toEqual({
|
|
77
82
|
type: 'nodeResult',
|
|
78
83
|
nodeId: 'agent-1',
|
|
@@ -88,6 +93,22 @@ describe('AgentNode', () => {
|
|
|
88
93
|
expect(agent.messages).toStrictEqual(messagesBefore);
|
|
89
94
|
expect(agent.state.getAll()).toStrictEqual(stateBefore);
|
|
90
95
|
});
|
|
96
|
+
it('passes structuredOutputSchema from state to the agent', async () => {
|
|
97
|
+
const schema = z.object({ agentName: z.string().optional(), message: z.string() });
|
|
98
|
+
const model = new MockMessageModel()
|
|
99
|
+
.addTurn({
|
|
100
|
+
type: 'toolUseBlock',
|
|
101
|
+
name: 'strands_structured_output',
|
|
102
|
+
toolUseId: 'tool-1',
|
|
103
|
+
input: { message: 'hello' },
|
|
104
|
+
})
|
|
105
|
+
.addTurn({ type: 'textBlock', text: 'Done' });
|
|
106
|
+
agent = new Agent({ model, printer: false });
|
|
107
|
+
node = new AgentNode({ id: 'schema-agent', agent });
|
|
108
|
+
state = new MultiAgentState({ structuredOutputSchema: schema });
|
|
109
|
+
const { result } = await collectGenerator(node.stream('test', state));
|
|
110
|
+
expect(result.structuredOutput).toStrictEqual({ message: 'hello' });
|
|
111
|
+
});
|
|
91
112
|
});
|
|
92
113
|
describe('agent', () => {
|
|
93
114
|
it('exposes the wrapped agent instance', () => {
|
|
@@ -95,4 +116,79 @@ describe('AgentNode', () => {
|
|
|
95
116
|
});
|
|
96
117
|
});
|
|
97
118
|
});
|
|
119
|
+
describe('MultiAgentNode', () => {
|
|
120
|
+
const content = [new TextBlock('inner-result')];
|
|
121
|
+
/**
|
|
122
|
+
* Creates a mock orchestrator that yields the given events and returns a result with the given content.
|
|
123
|
+
*/
|
|
124
|
+
function mockOrchestrator(id, events) {
|
|
125
|
+
return {
|
|
126
|
+
id,
|
|
127
|
+
invoke: async () => new MultiAgentResult({ results: [], duration: 0 }),
|
|
128
|
+
async *stream() {
|
|
129
|
+
for (const event of events) {
|
|
130
|
+
yield event;
|
|
131
|
+
}
|
|
132
|
+
return new MultiAgentResult({
|
|
133
|
+
results: [new NodeResult({ nodeId: id, status: Status.COMPLETED, duration: 0, content })],
|
|
134
|
+
content,
|
|
135
|
+
duration: 0,
|
|
136
|
+
});
|
|
137
|
+
},
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
let node;
|
|
141
|
+
let state;
|
|
142
|
+
beforeEach(() => {
|
|
143
|
+
const orchestrator = mockOrchestrator('inner', []);
|
|
144
|
+
node = new MultiAgentNode({ orchestrator });
|
|
145
|
+
state = new MultiAgentState();
|
|
146
|
+
});
|
|
147
|
+
describe('constructor', () => {
|
|
148
|
+
it('derives id from orchestrator', () => {
|
|
149
|
+
expect(node.id).toBe('inner');
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
describe('handle', () => {
|
|
153
|
+
it('passes through inner NodeStreamUpdateEvents', async () => {
|
|
154
|
+
const innerUpdate = new MultiAgentHandoffEvent({ source: 'x', targets: ['y'] });
|
|
155
|
+
const innerEvent = new NodeStreamUpdateEvent({
|
|
156
|
+
nodeId: 'deep-node',
|
|
157
|
+
nodeType: 'agentNode',
|
|
158
|
+
event: innerUpdate,
|
|
159
|
+
});
|
|
160
|
+
const orchestrator = mockOrchestrator('inner', [innerEvent]);
|
|
161
|
+
node = new MultiAgentNode({ orchestrator });
|
|
162
|
+
const { items } = await collectGenerator(node.stream([], state));
|
|
163
|
+
const streamEvents = items.filter((e) => e.type === 'nodeStreamUpdateEvent');
|
|
164
|
+
const passthrough = streamEvents.find((e) => e.nodeId === 'deep-node');
|
|
165
|
+
expect(passthrough).toBe(innerEvent);
|
|
166
|
+
});
|
|
167
|
+
it('wraps non-NodeStreamUpdateEvents with this node identity', async () => {
|
|
168
|
+
const handoff = new MultiAgentHandoffEvent({ source: 'a', targets: ['b'] });
|
|
169
|
+
const orchestrator = mockOrchestrator('inner', [handoff]);
|
|
170
|
+
node = new MultiAgentNode({ orchestrator });
|
|
171
|
+
const { items } = await collectGenerator(node.stream([], state));
|
|
172
|
+
const streamEvents = items.filter((e) => e.type === 'nodeStreamUpdateEvent');
|
|
173
|
+
const wrapped = streamEvents.find((e) => e.nodeId === 'inner' && e.event === handoff);
|
|
174
|
+
expect(wrapped).toBeDefined();
|
|
175
|
+
expect(wrapped.nodeType).toBe('multiAgentNode');
|
|
176
|
+
});
|
|
177
|
+
it('returns orchestrator content', async () => {
|
|
178
|
+
const { result } = await collectGenerator(node.stream([], state));
|
|
179
|
+
expect(result).toEqual(expect.objectContaining({
|
|
180
|
+
nodeId: 'inner',
|
|
181
|
+
status: Status.COMPLETED,
|
|
182
|
+
content,
|
|
183
|
+
}));
|
|
184
|
+
});
|
|
185
|
+
});
|
|
186
|
+
describe('orchestrator', () => {
|
|
187
|
+
it('exposes the wrapped orchestrator instance', () => {
|
|
188
|
+
const orchestrator = mockOrchestrator('test', []);
|
|
189
|
+
node = new MultiAgentNode({ orchestrator });
|
|
190
|
+
expect(node.orchestrator).toBe(orchestrator);
|
|
191
|
+
});
|
|
192
|
+
});
|
|
193
|
+
});
|
|
98
194
|
//# sourceMappingURL=nodes.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nodes.test.js","sourceRoot":"","sources":["../../../../src/multiagent/__tests__/nodes.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AACzD,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AAE5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,CAAA;AAC3E,OAAO,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,CAAA;AAC3E,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"nodes.test.js","sourceRoot":"","sources":["../../../../src/multiagent/__tests__/nodes.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue.test.d.ts","sourceRoot":"","sources":["../../../../src/multiagent/__tests__/queue.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, it } from 'vitest';
|
|
2
|
+
import { Queue } from '../queue.js';
|
|
3
|
+
import { NodeResult, Status } from '../state.js';
|
|
4
|
+
describe('Queue', () => {
|
|
5
|
+
let queue;
|
|
6
|
+
let mockNode;
|
|
7
|
+
beforeEach(() => {
|
|
8
|
+
mockNode = { id: 'node-1' };
|
|
9
|
+
queue = new Queue();
|
|
10
|
+
});
|
|
11
|
+
describe('push and shift', () => {
|
|
12
|
+
it('dequeues in FIFO order', () => {
|
|
13
|
+
const data1 = {
|
|
14
|
+
type: 'result',
|
|
15
|
+
node: mockNode,
|
|
16
|
+
result: new NodeResult({ nodeId: 'node-1', status: Status.COMPLETED, duration: 10 }),
|
|
17
|
+
};
|
|
18
|
+
const data2 = { type: 'error', node: mockNode, error: new Error('fail') };
|
|
19
|
+
queue.push(data1);
|
|
20
|
+
queue.push(data2);
|
|
21
|
+
expect(queue.shift()?.data).toBe(data1);
|
|
22
|
+
expect(queue.shift()?.data).toBe(data2);
|
|
23
|
+
});
|
|
24
|
+
it('returns undefined when empty', () => {
|
|
25
|
+
expect(queue.shift()).toBeUndefined();
|
|
26
|
+
});
|
|
27
|
+
it('provides a no-op ack for fire-and-forget pushes', () => {
|
|
28
|
+
queue.push({ type: 'error', node: mockNode, error: new Error('a') });
|
|
29
|
+
const entry = queue.shift();
|
|
30
|
+
expect(() => entry.ack()).not.toThrow();
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
describe('send', () => {
|
|
34
|
+
it('resolves when consumer calls ack', async () => {
|
|
35
|
+
const data = { type: 'error', node: mockNode, error: new Error('a') };
|
|
36
|
+
let resolved = false;
|
|
37
|
+
const waiting = queue.send(data).then(() => {
|
|
38
|
+
resolved = true;
|
|
39
|
+
});
|
|
40
|
+
await Promise.resolve();
|
|
41
|
+
expect(resolved).toBe(false);
|
|
42
|
+
const entry = queue.shift();
|
|
43
|
+
expect(entry.data).toBe(data);
|
|
44
|
+
await Promise.resolve();
|
|
45
|
+
expect(resolved).toBe(false);
|
|
46
|
+
entry.ack();
|
|
47
|
+
await waiting;
|
|
48
|
+
expect(resolved).toBe(true);
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
describe('size', () => {
|
|
52
|
+
it('reflects the current number of entries', () => {
|
|
53
|
+
expect(queue.size).toBe(0);
|
|
54
|
+
queue.push({ type: 'error', node: mockNode, error: new Error('a') });
|
|
55
|
+
queue.push({ type: 'error', node: mockNode, error: new Error('b') });
|
|
56
|
+
expect(queue.size).toBe(2);
|
|
57
|
+
queue.shift();
|
|
58
|
+
expect(queue.size).toBe(1);
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
describe('wait', () => {
|
|
62
|
+
it('resolves immediately when entries are available', async () => {
|
|
63
|
+
queue.push({ type: 'error', node: mockNode, error: new Error('a') });
|
|
64
|
+
await queue.wait();
|
|
65
|
+
expect(queue.size).toBe(1);
|
|
66
|
+
});
|
|
67
|
+
it('blocks until data is pushed', async () => {
|
|
68
|
+
let resolved = false;
|
|
69
|
+
const waiting = queue.wait().then(() => {
|
|
70
|
+
resolved = true;
|
|
71
|
+
});
|
|
72
|
+
await Promise.resolve();
|
|
73
|
+
expect(resolved).toBe(false);
|
|
74
|
+
queue.push({ type: 'error', node: mockNode, error: new Error('a') });
|
|
75
|
+
await waiting;
|
|
76
|
+
expect(resolved).toBe(true);
|
|
77
|
+
});
|
|
78
|
+
it('blocks until data is sent', async () => {
|
|
79
|
+
let resolved = false;
|
|
80
|
+
const waiting = queue.wait().then(() => {
|
|
81
|
+
resolved = true;
|
|
82
|
+
});
|
|
83
|
+
await Promise.resolve();
|
|
84
|
+
expect(resolved).toBe(false);
|
|
85
|
+
const data = { type: 'error', node: mockNode, error: new Error('a') };
|
|
86
|
+
// Don't await send — it won't resolve until ack
|
|
87
|
+
const sending = queue.send(data);
|
|
88
|
+
await waiting;
|
|
89
|
+
expect(resolved).toBe(true);
|
|
90
|
+
// Clean up: ack so send resolves
|
|
91
|
+
queue.shift().ack();
|
|
92
|
+
await sending;
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
//# sourceMappingURL=queue.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue.test.js","sourceRoot":"","sources":["../../../../src/multiagent/__tests__/queue.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { InvokeArgs } from '../agent/agent.js';
|
|
2
|
+
import type { MultiAgentStreamEvent } from './events.js';
|
|
3
|
+
import type { MultiAgentResult } from './state.js';
|
|
4
|
+
/**
|
|
5
|
+
* Interface for any multi-agent orchestrator that can stream execution.
|
|
6
|
+
* Implement this interface to create custom orchestration patterns that can be
|
|
7
|
+
* composed as nodes within other orchestrators via {@link MultiAgentNode}.
|
|
8
|
+
*/
|
|
9
|
+
export interface MultiAgentBase {
|
|
10
|
+
/** Unique identifier for this orchestrator. */
|
|
11
|
+
readonly id: string;
|
|
12
|
+
/**
|
|
13
|
+
* Execute the orchestrator and return the final result.
|
|
14
|
+
* @param input - Input to pass to the orchestrator
|
|
15
|
+
* @returns The aggregate result from all executed nodes
|
|
16
|
+
*/
|
|
17
|
+
invoke(input: InvokeArgs): Promise<MultiAgentResult>;
|
|
18
|
+
/**
|
|
19
|
+
* Execute the orchestrator and stream events as they occur.
|
|
20
|
+
* @param input - Input to pass to the orchestrator
|
|
21
|
+
* @returns Async generator yielding events and returning the final result
|
|
22
|
+
*/
|
|
23
|
+
stream(input: InvokeArgs): AsyncGenerator<MultiAgentStreamEvent, MultiAgentResult, undefined>;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=base.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/multiagent/base.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AACxD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAElD;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IAEnB;;;;OAIG;IACH,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAA;IAEpD;;;;OAIG;IACH,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,cAAc,CAAC,qBAAqB,EAAE,gBAAgB,EAAE,SAAS,CAAC,CAAA;CAC9F"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/multiagent/base.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { Node } from './nodes.js';
|
|
2
|
+
import type { MultiAgentState } from './state.js';
|
|
3
|
+
/**
|
|
4
|
+
* Evaluates whether an edge should be traversed based on the current execution state.
|
|
5
|
+
*/
|
|
6
|
+
export type EdgeHandler = (state: MultiAgentState) => boolean | Promise<boolean>;
|
|
7
|
+
/**
|
|
8
|
+
* Directed edge between two nodes.
|
|
9
|
+
*/
|
|
10
|
+
export declare class Edge {
|
|
11
|
+
readonly source: Node;
|
|
12
|
+
readonly target: Node;
|
|
13
|
+
/** Edge condition. The edge is always traversed when no handler is provided. */
|
|
14
|
+
readonly handler: EdgeHandler;
|
|
15
|
+
constructor(data: {
|
|
16
|
+
source: Node;
|
|
17
|
+
target: Node;
|
|
18
|
+
handler?: EdgeHandler;
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* An edge definition accepted by orchestration constructors.
|
|
23
|
+
*/
|
|
24
|
+
export interface EdgeDefinition {
|
|
25
|
+
source: string;
|
|
26
|
+
target: string;
|
|
27
|
+
handler?: EdgeHandler;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=edge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edge.d.ts","sourceRoot":"","sources":["../../../src/multiagent/edge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AACtC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAEjD;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,KAAK,EAAE,eAAe,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;AAEhF;;GAEG;AACH,qBAAa,IAAI;IACf,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAA;IACrB,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAA;IACrB,gFAAgF;IAChF,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAA;gBAEjB,IAAI,EAAE;QAAE,MAAM,EAAE,IAAI,CAAC;QAAC,MAAM,EAAE,IAAI,CAAC;QAAC,OAAO,CAAC,EAAE,WAAW,CAAA;KAAE;CAKxE;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,WAAW,CAAA;CACtB"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Directed edge between two nodes.
|
|
3
|
+
*/
|
|
4
|
+
export class Edge {
|
|
5
|
+
source;
|
|
6
|
+
target;
|
|
7
|
+
/** Edge condition. The edge is always traversed when no handler is provided. */
|
|
8
|
+
handler;
|
|
9
|
+
constructor(data) {
|
|
10
|
+
this.source = data.source;
|
|
11
|
+
this.target = data.target;
|
|
12
|
+
this.handler = data.handler ?? (() => true);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=edge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edge.js","sourceRoot":"","sources":["../../../src/multiagent/edge.ts"],"names":[],"mappings":"AAQA;;GAEG;AACH,MAAM,OAAO,IAAI;IACN,MAAM,CAAM;IACZ,MAAM,CAAM;IACrB,gFAAgF;IACvE,OAAO,CAAa;IAE7B,YAAY,IAA2D;QACrE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;QACzB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;QACzB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,CAAC,GAAY,EAAE,CAAC,IAAI,CAAC,CAAA;IACtD,CAAC;CACF"}
|