@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.
Files changed (141) hide show
  1. package/dist/src/__fixtures__/agent-helpers.d.ts +10 -1
  2. package/dist/src/__fixtures__/agent-helpers.d.ts.map +1 -1
  3. package/dist/src/__fixtures__/agent-helpers.js +13 -2
  4. package/dist/src/__fixtures__/agent-helpers.js.map +1 -1
  5. package/dist/src/__fixtures__/mock-span.d.ts +78 -0
  6. package/dist/src/__fixtures__/mock-span.d.ts.map +1 -0
  7. package/dist/src/__fixtures__/mock-span.js +93 -0
  8. package/dist/src/__fixtures__/mock-span.js.map +1 -0
  9. package/dist/src/__fixtures__/tool-helpers.d.ts +2 -2
  10. package/dist/src/__fixtures__/tool-helpers.d.ts.map +1 -1
  11. package/dist/src/__fixtures__/tool-helpers.js +4 -4
  12. package/dist/src/__fixtures__/tool-helpers.js.map +1 -1
  13. package/dist/src/__tests__/app-state.test.d.ts +2 -0
  14. package/dist/src/__tests__/app-state.test.d.ts.map +1 -0
  15. package/dist/src/{agent/__tests__/state.test.js → __tests__/app-state.test.js} +46 -46
  16. package/dist/src/__tests__/app-state.test.js.map +1 -0
  17. package/dist/src/__tests__/mcp.test.js +96 -15
  18. package/dist/src/__tests__/mcp.test.js.map +1 -1
  19. package/dist/src/agent/__tests__/agent.test.js +110 -0
  20. package/dist/src/agent/__tests__/agent.test.js.map +1 -1
  21. package/dist/src/agent/__tests__/agent.tracer.test.d.ts +2 -0
  22. package/dist/src/agent/__tests__/agent.tracer.test.d.ts.map +1 -0
  23. package/dist/src/agent/__tests__/agent.tracer.test.js +470 -0
  24. package/dist/src/agent/__tests__/agent.tracer.test.js.map +1 -0
  25. package/dist/src/agent/agent.d.ts +59 -6
  26. package/dist/src/agent/agent.d.ts.map +1 -1
  27. package/dist/src/agent/agent.js +187 -60
  28. package/dist/src/agent/agent.js.map +1 -1
  29. package/dist/src/{agent/state.d.ts → app-state.d.ts} +7 -7
  30. package/dist/src/app-state.d.ts.map +1 -0
  31. package/dist/src/{agent/state.js → app-state.js} +6 -6
  32. package/dist/src/app-state.js.map +1 -0
  33. package/dist/src/conversation-manager/sliding-window-conversation-manager.d.ts +1 -1
  34. package/dist/src/conversation-manager/sliding-window-conversation-manager.js +1 -1
  35. package/dist/src/index.d.ts +2 -1
  36. package/dist/src/index.d.ts.map +1 -1
  37. package/dist/src/index.js +4 -0
  38. package/dist/src/index.js.map +1 -1
  39. package/dist/src/mcp.d.ts +3 -0
  40. package/dist/src/mcp.d.ts.map +1 -1
  41. package/dist/src/mcp.js +38 -1
  42. package/dist/src/mcp.js.map +1 -1
  43. package/dist/src/models/__tests__/model.test.js +7 -0
  44. package/dist/src/models/__tests__/model.test.js.map +1 -1
  45. package/dist/src/models/model.d.ts +4 -0
  46. package/dist/src/models/model.d.ts.map +1 -1
  47. package/dist/src/models/model.js +6 -0
  48. package/dist/src/models/model.js.map +1 -1
  49. package/dist/src/models/streaming.d.ts +1 -1
  50. package/dist/src/multiagent/__tests__/events.test.d.ts +2 -0
  51. package/dist/src/multiagent/__tests__/events.test.d.ts.map +1 -0
  52. package/dist/src/multiagent/__tests__/events.test.js +189 -0
  53. package/dist/src/multiagent/__tests__/events.test.js.map +1 -0
  54. package/dist/src/multiagent/__tests__/nodes.test.js +102 -6
  55. package/dist/src/multiagent/__tests__/nodes.test.js.map +1 -1
  56. package/dist/src/multiagent/__tests__/queue.test.d.ts +2 -0
  57. package/dist/src/multiagent/__tests__/queue.test.d.ts.map +1 -0
  58. package/dist/src/multiagent/__tests__/queue.test.js +96 -0
  59. package/dist/src/multiagent/__tests__/queue.test.js.map +1 -0
  60. package/dist/src/multiagent/base.d.ts +25 -0
  61. package/dist/src/multiagent/base.d.ts.map +1 -0
  62. package/dist/src/multiagent/base.js +2 -0
  63. package/dist/src/multiagent/base.js.map +1 -0
  64. package/dist/src/multiagent/edge.d.ts +29 -0
  65. package/dist/src/multiagent/edge.d.ts.map +1 -0
  66. package/dist/src/multiagent/edge.js +15 -0
  67. package/dist/src/multiagent/edge.js.map +1 -0
  68. package/dist/src/multiagent/events.d.ts +115 -4
  69. package/dist/src/multiagent/events.d.ts.map +1 -1
  70. package/dist/src/multiagent/events.js +123 -2
  71. package/dist/src/multiagent/events.js.map +1 -1
  72. package/dist/src/multiagent/index.d.ts +8 -6
  73. package/dist/src/multiagent/index.d.ts.map +1 -1
  74. package/dist/src/multiagent/index.js +4 -3
  75. package/dist/src/multiagent/index.js.map +1 -1
  76. package/dist/src/multiagent/nodes.d.ts +62 -14
  77. package/dist/src/multiagent/nodes.d.ts.map +1 -1
  78. package/dist/src/multiagent/nodes.js +67 -20
  79. package/dist/src/multiagent/nodes.js.map +1 -1
  80. package/dist/src/multiagent/queue.d.ts +67 -0
  81. package/dist/src/multiagent/queue.d.ts.map +1 -0
  82. package/dist/src/multiagent/queue.js +59 -0
  83. package/dist/src/multiagent/queue.js.map +1 -0
  84. package/dist/src/multiagent/state.d.ts +77 -10
  85. package/dist/src/multiagent/state.d.ts.map +1 -1
  86. package/dist/src/multiagent/state.js +98 -9
  87. package/dist/src/multiagent/state.js.map +1 -1
  88. package/dist/src/telemetry/__tests__/config.test.node.d.ts +2 -0
  89. package/dist/src/telemetry/__tests__/config.test.node.d.ts.map +1 -0
  90. package/dist/src/telemetry/__tests__/config.test.node.js +129 -0
  91. package/dist/src/telemetry/__tests__/config.test.node.js.map +1 -0
  92. package/dist/src/telemetry/__tests__/json.test.d.ts +2 -0
  93. package/dist/src/telemetry/__tests__/json.test.d.ts.map +1 -0
  94. package/dist/src/telemetry/__tests__/json.test.js +89 -0
  95. package/dist/src/telemetry/__tests__/json.test.js.map +1 -0
  96. package/dist/src/telemetry/__tests__/tracer.test.node.d.ts +2 -0
  97. package/dist/src/telemetry/__tests__/tracer.test.node.d.ts.map +1 -0
  98. package/dist/src/telemetry/__tests__/tracer.test.node.js +611 -0
  99. package/dist/src/telemetry/__tests__/tracer.test.node.js.map +1 -0
  100. package/dist/src/telemetry/config.d.ts +61 -0
  101. package/dist/src/telemetry/config.d.ts.map +1 -0
  102. package/dist/src/telemetry/config.js +101 -0
  103. package/dist/src/telemetry/config.js.map +1 -0
  104. package/dist/src/telemetry/index.d.ts +34 -0
  105. package/dist/src/telemetry/index.d.ts.map +1 -0
  106. package/dist/src/telemetry/index.js +33 -0
  107. package/dist/src/telemetry/index.js.map +1 -0
  108. package/dist/src/telemetry/json.d.ts +11 -0
  109. package/dist/src/telemetry/json.d.ts.map +1 -0
  110. package/dist/src/telemetry/json.js +25 -0
  111. package/dist/src/telemetry/json.js.map +1 -0
  112. package/dist/src/telemetry/tracer.d.ts +219 -0
  113. package/dist/src/telemetry/tracer.d.ts.map +1 -0
  114. package/dist/src/telemetry/tracer.js +610 -0
  115. package/dist/src/telemetry/tracer.js.map +1 -0
  116. package/dist/src/telemetry/types.d.ts +101 -0
  117. package/dist/src/telemetry/types.d.ts.map +1 -0
  118. package/dist/src/telemetry/types.js +5 -0
  119. package/dist/src/{multiagent → telemetry}/types.js.map +1 -1
  120. package/dist/src/tools/tool.d.ts +1 -1
  121. package/dist/src/tools/tool.js +1 -1
  122. package/dist/src/tsconfig.tsbuildinfo +1 -1
  123. package/dist/src/types/agent.d.ts +3 -3
  124. package/dist/src/types/agent.d.ts.map +1 -1
  125. package/dist/src/types/messages.d.ts +4 -4
  126. package/dist/src/types/messages.js +1 -1
  127. package/dist/src/vended-tools/bash/__tests__/bash.test.node.js +2 -2
  128. package/dist/src/vended-tools/bash/__tests__/bash.test.node.js.map +1 -1
  129. package/dist/src/vended-tools/file_editor/__tests__/file-editor.test.node.js +4 -4
  130. package/dist/src/vended-tools/file_editor/__tests__/file-editor.test.node.js.map +1 -1
  131. package/dist/src/vended-tools/notebook/__tests__/notebook.test.js +2 -2
  132. package/dist/src/vended-tools/notebook/__tests__/notebook.test.js.map +1 -1
  133. package/package.json +11 -2
  134. package/dist/src/agent/__tests__/state.test.d.ts +0 -2
  135. package/dist/src/agent/__tests__/state.test.d.ts.map +0 -1
  136. package/dist/src/agent/__tests__/state.test.js.map +0 -1
  137. package/dist/src/agent/state.d.ts.map +0 -1
  138. package/dist/src/agent/state.js.map +0 -1
  139. package/dist/src/multiagent/types.d.ts +0 -5
  140. package/dist/src/multiagent/types.d.ts.map +0 -1
  141. package/dist/src/multiagent/types.js +0 -2
@@ -0,0 +1,470 @@
1
+ import { describe, expect, it, vi, beforeEach } from 'vitest';
2
+ import { Agent } from '../agent.js';
3
+ import { MockMessageModel } from '../../__fixtures__/mock-message-model.js';
4
+ import { createMockTool } from '../../__fixtures__/tool-helpers.js';
5
+ import { TextBlock, ToolUseBlock, ToolResultBlock, MaxTokensError, StructuredOutputException } from '../../index.js';
6
+ import { Tracer } from '../../telemetry/tracer.js';
7
+ import { z } from 'zod';
8
+ vi.mock('../../telemetry/tracer.js', () => ({
9
+ Tracer: vi.fn(function () {
10
+ return {
11
+ startAgentSpan: vi.fn().mockReturnValue({ mock: 'agentSpan' }),
12
+ endAgentSpan: vi.fn(),
13
+ startAgentLoopSpan: vi.fn().mockReturnValue({ mock: 'loopSpan' }),
14
+ endAgentLoopSpan: vi.fn(),
15
+ startModelInvokeSpan: vi.fn().mockReturnValue({ mock: 'modelSpan' }),
16
+ endModelInvokeSpan: vi.fn(),
17
+ startToolCallSpan: vi.fn().mockReturnValue({ mock: 'toolSpan' }),
18
+ endToolCallSpan: vi.fn(),
19
+ withSpanContext: vi.fn((_span, fn) => fn()),
20
+ };
21
+ }),
22
+ }));
23
+ function getLatestTracer() {
24
+ return vi.mocked(Tracer).mock.results.at(-1).value;
25
+ }
26
+ describe('Agent tracer integration', () => {
27
+ beforeEach(() => {
28
+ vi.clearAllMocks();
29
+ });
30
+ describe('constructor', () => {
31
+ it('initializes Tracer with traceAttributes from config', () => {
32
+ const traceAttributes = { 'custom.attr': 'value' };
33
+ new Agent({ traceAttributes });
34
+ expect(Tracer).toHaveBeenCalledWith(traceAttributes);
35
+ });
36
+ it('initializes Tracer without traceAttributes when not provided', () => {
37
+ new Agent();
38
+ expect(Tracer).toHaveBeenCalledWith(undefined);
39
+ });
40
+ });
41
+ describe('name and agentId', () => {
42
+ it('defaults name to "Strands Agent"', () => {
43
+ const agent = new Agent();
44
+ expect(agent.name).toBe('Strands Agent');
45
+ });
46
+ it('uses provided name', () => {
47
+ const agent = new Agent({ name: 'My Agent' });
48
+ expect(agent.name).toBe('My Agent');
49
+ });
50
+ it('defaults agentId to "default"', () => {
51
+ const agent = new Agent();
52
+ expect(agent.agentId).toBe('default');
53
+ });
54
+ it('uses provided agentId', () => {
55
+ const agent = new Agent({ agentId: 'custom-id-123' });
56
+ expect(agent.agentId).toBe('custom-id-123');
57
+ });
58
+ });
59
+ describe('agent span lifecycle', () => {
60
+ it('starts and ends agent span on successful invocation', async () => {
61
+ const model = new MockMessageModel().addTurn({ type: 'textBlock', text: 'Hello' });
62
+ const agent = new Agent({ model, name: 'TestAgent', agentId: 'test-id' });
63
+ const tracer = getLatestTracer();
64
+ await agent.invoke('Hi');
65
+ expect(tracer.startAgentSpan).toHaveBeenCalledTimes(1);
66
+ expect(tracer.startAgentSpan).toHaveBeenCalledWith(expect.objectContaining({
67
+ agentName: 'TestAgent',
68
+ agentId: 'test-id',
69
+ modelId: 'test-model',
70
+ }));
71
+ expect(tracer.endAgentSpan).toHaveBeenCalledTimes(1);
72
+ expect(tracer.endAgentSpan).toHaveBeenCalledWith({ mock: 'agentSpan' }, expect.objectContaining({
73
+ response: expect.objectContaining({ role: 'assistant' }),
74
+ stopReason: 'endTurn',
75
+ }));
76
+ });
77
+ it('ends agent span with error when invocation fails', async () => {
78
+ const model = new MockMessageModel().addTurn({ type: 'textBlock', text: 'Partial' }, 'maxTokens');
79
+ const agent = new Agent({ model });
80
+ const tracer = getLatestTracer();
81
+ await expect(agent.invoke('Hi')).rejects.toThrow(MaxTokensError);
82
+ expect(tracer.startAgentSpan).toHaveBeenCalledTimes(1);
83
+ expect(tracer.endAgentSpan).toHaveBeenCalledTimes(1);
84
+ expect(tracer.endAgentSpan).toHaveBeenCalledWith({ mock: 'agentSpan' }, expect.objectContaining({
85
+ error: expect.any(MaxTokensError),
86
+ }));
87
+ });
88
+ it('includes systemPrompt in agent span when configured', async () => {
89
+ const model = new MockMessageModel().addTurn({ type: 'textBlock', text: 'Hello' });
90
+ const agent = new Agent({ model, systemPrompt: 'Be helpful' });
91
+ const tracer = getLatestTracer();
92
+ await agent.invoke('Hi');
93
+ expect(tracer.startAgentSpan).toHaveBeenCalledWith(expect.objectContaining({
94
+ systemPrompt: 'Be helpful',
95
+ }));
96
+ });
97
+ it('includes tools in agent span', async () => {
98
+ const model = new MockMessageModel().addTurn({ type: 'textBlock', text: 'Hello' });
99
+ const tool = createMockTool('myTool', () => new ToolResultBlock({
100
+ toolUseId: 'id',
101
+ status: 'success',
102
+ content: [],
103
+ }));
104
+ const agent = new Agent({ model, tools: [tool] });
105
+ const tracer = getLatestTracer();
106
+ await agent.invoke('Hi');
107
+ expect(tracer.startAgentSpan).toHaveBeenCalledWith(expect.objectContaining({
108
+ tools: expect.arrayContaining([expect.objectContaining({ name: 'myTool' })]),
109
+ }));
110
+ });
111
+ });
112
+ describe('agent loop span lifecycle', () => {
113
+ it('starts and ends loop span for each cycle', async () => {
114
+ const model = new MockMessageModel().addTurn({ type: 'textBlock', text: 'Done' });
115
+ const agent = new Agent({ model });
116
+ const tracer = getLatestTracer();
117
+ await agent.invoke('Hi');
118
+ expect(tracer.startAgentLoopSpan).toHaveBeenCalledTimes(1);
119
+ expect(tracer.startAgentLoopSpan).toHaveBeenCalledWith(expect.objectContaining({ cycleId: 'cycle-1' }));
120
+ expect(tracer.endAgentLoopSpan).toHaveBeenCalledTimes(1);
121
+ expect(tracer.endAgentLoopSpan).toHaveBeenCalledWith({ mock: 'loopSpan' });
122
+ });
123
+ it('creates multiple loop spans for multi-cycle invocations', async () => {
124
+ const model = new MockMessageModel()
125
+ .addTurn({ type: 'toolUseBlock', name: 'testTool', toolUseId: 'tool-1', input: {} })
126
+ .addTurn({ type: 'textBlock', text: 'Done' });
127
+ const tool = createMockTool('testTool', () => new ToolResultBlock({
128
+ toolUseId: 'tool-1',
129
+ status: 'success',
130
+ content: [new TextBlock('Result')],
131
+ }));
132
+ const agent = new Agent({ model, tools: [tool] });
133
+ const tracer = getLatestTracer();
134
+ await agent.invoke('Use tool');
135
+ expect(tracer.startAgentLoopSpan).toHaveBeenCalledTimes(2);
136
+ expect(tracer.startAgentLoopSpan).toHaveBeenNthCalledWith(1, expect.objectContaining({ cycleId: 'cycle-1' }));
137
+ expect(tracer.startAgentLoopSpan).toHaveBeenNthCalledWith(2, expect.objectContaining({ cycleId: 'cycle-2' }));
138
+ expect(tracer.endAgentLoopSpan).toHaveBeenCalledTimes(2);
139
+ });
140
+ it('ends loop span with error when cycle fails', async () => {
141
+ const model = new MockMessageModel().addTurn({ type: 'textBlock', text: 'Partial' }, 'maxTokens');
142
+ const agent = new Agent({ model });
143
+ const tracer = getLatestTracer();
144
+ await expect(agent.invoke('Hi')).rejects.toThrow(MaxTokensError);
145
+ expect(tracer.endAgentLoopSpan).toHaveBeenCalledWith({ mock: 'loopSpan' }, expect.objectContaining({ error: expect.any(MaxTokensError) }));
146
+ });
147
+ it('ends loop span for cycles where structured output forces tool choice via continue', async () => {
148
+ const schema = z.object({ value: z.number() });
149
+ // Turn 1: model returns text (no tool use) → triggers forced tool choice continue
150
+ // Turn 2: model uses the structured output tool → tool execution cycle
151
+ // Turn 3: model returns text (endTurn) → final cycle with result
152
+ const model = new MockMessageModel()
153
+ .addTurn({ type: 'textBlock', text: 'First response' })
154
+ .addTurn({ type: 'toolUseBlock', name: 'strands_structured_output', toolUseId: 'tool-1', input: { value: 42 } })
155
+ .addTurn({ type: 'textBlock', text: 'Done' });
156
+ const agent = new Agent({ model, structuredOutputSchema: schema });
157
+ const tracer = getLatestTracer();
158
+ await agent.invoke('Test');
159
+ // Every started loop span must be ended — including the cycle that hit continue
160
+ expect(tracer.startAgentLoopSpan).toHaveBeenCalledTimes(3);
161
+ expect(tracer.startAgentLoopSpan).toHaveBeenNthCalledWith(1, expect.objectContaining({ cycleId: 'cycle-1' }));
162
+ expect(tracer.startAgentLoopSpan).toHaveBeenNthCalledWith(2, expect.objectContaining({ cycleId: 'cycle-2' }));
163
+ expect(tracer.startAgentLoopSpan).toHaveBeenNthCalledWith(3, expect.objectContaining({ cycleId: 'cycle-3' }));
164
+ expect(tracer.endAgentLoopSpan).toHaveBeenCalledTimes(3);
165
+ // All three cycles end without error (continue cycle, tool use cycle, final cycle)
166
+ expect(tracer.endAgentLoopSpan).toHaveBeenNthCalledWith(1, { mock: 'loopSpan' });
167
+ expect(tracer.endAgentLoopSpan).toHaveBeenNthCalledWith(2, { mock: 'loopSpan' });
168
+ expect(tracer.endAgentLoopSpan).toHaveBeenNthCalledWith(3, { mock: 'loopSpan' });
169
+ });
170
+ });
171
+ describe('model invoke span lifecycle', () => {
172
+ it('starts and ends model span on successful model call', async () => {
173
+ const model = new MockMessageModel().addTurn({ type: 'textBlock', text: 'Hello' });
174
+ const agent = new Agent({ model });
175
+ const tracer = getLatestTracer();
176
+ await agent.invoke('Hi');
177
+ expect(tracer.startModelInvokeSpan).toHaveBeenCalledTimes(1);
178
+ expect(tracer.startModelInvokeSpan).toHaveBeenCalledWith(expect.objectContaining({ modelId: 'test-model' }));
179
+ expect(tracer.endModelInvokeSpan).toHaveBeenCalledTimes(1);
180
+ expect(tracer.endModelInvokeSpan).toHaveBeenCalledWith({ mock: 'modelSpan' }, expect.objectContaining({
181
+ output: expect.objectContaining({ role: 'assistant' }),
182
+ stopReason: 'endTurn',
183
+ }));
184
+ });
185
+ it('ends model span with error when model call fails', async () => {
186
+ const model = new MockMessageModel().addTurn(new Error('Model failed'));
187
+ const agent = new Agent({ model });
188
+ const tracer = getLatestTracer();
189
+ await expect(agent.invoke('Hi')).rejects.toThrow();
190
+ expect(tracer.endModelInvokeSpan).toHaveBeenCalledWith({ mock: 'modelSpan' }, expect.objectContaining({ error: expect.any(Error) }));
191
+ });
192
+ it('creates model span for each model call in multi-cycle invocation', async () => {
193
+ const model = new MockMessageModel()
194
+ .addTurn({ type: 'toolUseBlock', name: 'testTool', toolUseId: 'tool-1', input: {} })
195
+ .addTurn({ type: 'textBlock', text: 'Done' });
196
+ const tool = createMockTool('testTool', () => new ToolResultBlock({
197
+ toolUseId: 'tool-1',
198
+ status: 'success',
199
+ content: [new TextBlock('Result')],
200
+ }));
201
+ const agent = new Agent({ model, tools: [tool] });
202
+ const tracer = getLatestTracer();
203
+ await agent.invoke('Use tool');
204
+ expect(tracer.startModelInvokeSpan).toHaveBeenCalledTimes(2);
205
+ expect(tracer.endModelInvokeSpan).toHaveBeenCalledTimes(2);
206
+ });
207
+ });
208
+ describe('tool call span lifecycle', () => {
209
+ it('starts and ends tool span for each tool execution', async () => {
210
+ const model = new MockMessageModel()
211
+ .addTurn({ type: 'toolUseBlock', name: 'testTool', toolUseId: 'tool-1', input: { key: 'val' } })
212
+ .addTurn({ type: 'textBlock', text: 'Done' });
213
+ const tool = createMockTool('testTool', () => new ToolResultBlock({
214
+ toolUseId: 'tool-1',
215
+ status: 'success',
216
+ content: [new TextBlock('Result')],
217
+ }));
218
+ const agent = new Agent({ model, tools: [tool] });
219
+ const tracer = getLatestTracer();
220
+ await agent.invoke('Use tool');
221
+ expect(tracer.startToolCallSpan).toHaveBeenCalledTimes(1);
222
+ expect(tracer.startToolCallSpan).toHaveBeenCalledWith({
223
+ tool: expect.objectContaining({
224
+ name: 'testTool',
225
+ toolUseId: 'tool-1',
226
+ input: { key: 'val' },
227
+ }),
228
+ });
229
+ expect(tracer.endToolCallSpan).toHaveBeenCalledTimes(1);
230
+ expect(tracer.endToolCallSpan).toHaveBeenCalledWith({ mock: 'toolSpan' }, expect.objectContaining({
231
+ toolResult: expect.objectContaining({ toolUseId: 'tool-1', status: 'success' }),
232
+ }));
233
+ });
234
+ it('ends tool span with error when tool is not found', async () => {
235
+ const model = new MockMessageModel()
236
+ .addTurn({ type: 'toolUseBlock', name: 'missingTool', toolUseId: 'tool-1', input: {} })
237
+ .addTurn({ type: 'textBlock', text: 'Done' });
238
+ const agent = new Agent({ model });
239
+ const tracer = getLatestTracer();
240
+ await agent.invoke('Use tool');
241
+ expect(tracer.endToolCallSpan).toHaveBeenCalledWith({ mock: 'toolSpan' }, expect.objectContaining({
242
+ toolResult: expect.objectContaining({ status: 'error' }),
243
+ }));
244
+ });
245
+ it('ends tool span with error when tool throws', async () => {
246
+ const model = new MockMessageModel()
247
+ .addTurn({ type: 'toolUseBlock', name: 'failTool', toolUseId: 'tool-1', input: {} })
248
+ .addTurn({ type: 'textBlock', text: 'Done' });
249
+ const tool = createMockTool('failTool', () => {
250
+ throw new Error('Tool exploded');
251
+ });
252
+ const agent = new Agent({ model, tools: [tool] });
253
+ const tracer = getLatestTracer();
254
+ await agent.invoke('Use tool');
255
+ expect(tracer.endToolCallSpan).toHaveBeenCalledWith({ mock: 'toolSpan' }, expect.objectContaining({
256
+ error: expect.any(Error),
257
+ toolResult: expect.objectContaining({ status: 'error' }),
258
+ }));
259
+ });
260
+ it('creates spans for multiple tool calls in a single turn', async () => {
261
+ const model = new MockMessageModel()
262
+ .addTurn([
263
+ new ToolUseBlock({ name: 'tool1', toolUseId: 'id-1', input: {} }),
264
+ new ToolUseBlock({ name: 'tool2', toolUseId: 'id-2', input: {} }),
265
+ ])
266
+ .addTurn({ type: 'textBlock', text: 'Done' });
267
+ const tool1 = createMockTool('tool1', () => new ToolResultBlock({
268
+ toolUseId: 'id-1',
269
+ status: 'success',
270
+ content: [new TextBlock('R1')],
271
+ }));
272
+ const tool2 = createMockTool('tool2', () => new ToolResultBlock({
273
+ toolUseId: 'id-2',
274
+ status: 'success',
275
+ content: [new TextBlock('R2')],
276
+ }));
277
+ const agent = new Agent({ model, tools: [tool1, tool2] });
278
+ const tracer = getLatestTracer();
279
+ await agent.invoke('Use tools');
280
+ expect(tracer.startToolCallSpan).toHaveBeenCalledTimes(2);
281
+ expect(tracer.endToolCallSpan).toHaveBeenCalledTimes(2);
282
+ });
283
+ });
284
+ describe('token usage accumulation', () => {
285
+ it('passes accumulated usage to endAgentSpan', async () => {
286
+ const model = new MockMessageModel().addTurn({ type: 'textBlock', text: 'Hello' });
287
+ const agent = new Agent({ model });
288
+ const tracer = getLatestTracer();
289
+ await agent.invoke('Hi');
290
+ expect(tracer.endAgentSpan).toHaveBeenCalledWith({ mock: 'agentSpan' }, expect.objectContaining({
291
+ accumulatedUsage: expect.objectContaining({
292
+ inputTokens: expect.any(Number),
293
+ outputTokens: expect.any(Number),
294
+ totalTokens: expect.any(Number),
295
+ }),
296
+ }));
297
+ });
298
+ });
299
+ describe('null span handling', () => {
300
+ it('completes successfully when startAgentSpan returns null', async () => {
301
+ const model = new MockMessageModel().addTurn({ type: 'textBlock', text: 'Hello' });
302
+ const agent = new Agent({ model });
303
+ const tracer = getLatestTracer();
304
+ tracer.startAgentSpan.mockReturnValue(null);
305
+ const result = await agent.invoke('Hi');
306
+ expect(result.stopReason).toBe('endTurn');
307
+ expect(tracer.endAgentSpan).toHaveBeenCalledWith(null, expect.any(Object));
308
+ });
309
+ it('completes successfully when startAgentLoopSpan returns null', async () => {
310
+ const model = new MockMessageModel().addTurn({ type: 'textBlock', text: 'Hello' });
311
+ const agent = new Agent({ model });
312
+ const tracer = getLatestTracer();
313
+ tracer.startAgentLoopSpan.mockReturnValue(null);
314
+ const result = await agent.invoke('Hi');
315
+ expect(result.stopReason).toBe('endTurn');
316
+ expect(tracer.endAgentLoopSpan).toHaveBeenCalledWith(null);
317
+ });
318
+ it('completes successfully when startModelInvokeSpan returns null', async () => {
319
+ const model = new MockMessageModel().addTurn({ type: 'textBlock', text: 'Hello' });
320
+ const agent = new Agent({ model });
321
+ const tracer = getLatestTracer();
322
+ tracer.startModelInvokeSpan.mockReturnValue(null);
323
+ const result = await agent.invoke('Hi');
324
+ expect(result.stopReason).toBe('endTurn');
325
+ });
326
+ it('completes successfully when startToolCallSpan returns null', async () => {
327
+ const model = new MockMessageModel()
328
+ .addTurn({ type: 'toolUseBlock', name: 'testTool', toolUseId: 'tool-1', input: {} })
329
+ .addTurn({ type: 'textBlock', text: 'Done' });
330
+ const tool = createMockTool('testTool', () => new ToolResultBlock({
331
+ toolUseId: 'tool-1',
332
+ status: 'success',
333
+ content: [new TextBlock('Result')],
334
+ }));
335
+ const agent = new Agent({ model, tools: [tool] });
336
+ const tracer = getLatestTracer();
337
+ tracer.startToolCallSpan.mockReturnValue(null);
338
+ const result = await agent.invoke('Use tool');
339
+ expect(result.stopReason).toBe('endTurn');
340
+ expect(tracer.endToolCallSpan).toHaveBeenCalledWith(null, expect.any(Object));
341
+ });
342
+ });
343
+ describe('span context hierarchy', () => {
344
+ it('resets accumulated usage on each invocation', async () => {
345
+ const model = new MockMessageModel()
346
+ .addTurn({ type: 'textBlock', text: 'First' })
347
+ .addTurn({ type: 'textBlock', text: 'Second' });
348
+ const agent = new Agent({ model });
349
+ const tracer = getLatestTracer();
350
+ await agent.invoke('First');
351
+ await agent.invoke('Second');
352
+ expect(tracer.startAgentSpan).toHaveBeenCalledTimes(2);
353
+ expect(tracer.endAgentSpan).toHaveBeenCalledTimes(2);
354
+ });
355
+ });
356
+ describe('structured output and telemetry interaction', () => {
357
+ it('creates tool span for structured output tool execution', async () => {
358
+ const schema = z.object({ value: z.number() });
359
+ const model = new MockMessageModel()
360
+ .addTurn({ type: 'toolUseBlock', name: 'strands_structured_output', toolUseId: 'tool-1', input: { value: 42 } })
361
+ .addTurn({ type: 'textBlock', text: 'Done' });
362
+ const agent = new Agent({ model, structuredOutputSchema: schema });
363
+ const tracer = getLatestTracer();
364
+ await agent.invoke('Test');
365
+ expect(tracer.startToolCallSpan).toHaveBeenCalledWith({
366
+ tool: expect.objectContaining({ name: 'strands_structured_output' }),
367
+ });
368
+ expect(tracer.endToolCallSpan).toHaveBeenCalledWith({ mock: 'toolSpan' }, expect.objectContaining({
369
+ toolResult: expect.objectContaining({ status: 'success' }),
370
+ }));
371
+ });
372
+ it('ends agent span with error when model refuses structured output tool after forcing', async () => {
373
+ const schema = z.object({ value: z.number() });
374
+ // Single-turn model always returns text — first normally, then when forced
375
+ const model = new MockMessageModel().addTurn({ type: 'textBlock', text: 'I refuse' });
376
+ const agent = new Agent({ model, structuredOutputSchema: schema });
377
+ const tracer = getLatestTracer();
378
+ await expect(agent.invoke('Test')).rejects.toThrow(StructuredOutputException);
379
+ expect(tracer.endAgentSpan).toHaveBeenCalledWith({ mock: 'agentSpan' }, expect.objectContaining({ error: expect.any(StructuredOutputException) }));
380
+ });
381
+ it('ends cycle span with error on StructuredOutputException', async () => {
382
+ const schema = z.object({ value: z.number() });
383
+ const model = new MockMessageModel().addTurn({ type: 'textBlock', text: 'I refuse' });
384
+ const agent = new Agent({ model, structuredOutputSchema: schema });
385
+ const tracer = getLatestTracer();
386
+ await expect(agent.invoke('Test')).rejects.toThrow(StructuredOutputException);
387
+ // Cycle 1: text response → continue (span ended normally)
388
+ // Cycle 2: text response again with forced tool → StructuredOutputException (span ended with error)
389
+ expect(tracer.startAgentLoopSpan).toHaveBeenCalledTimes(2);
390
+ expect(tracer.endAgentLoopSpan).toHaveBeenCalledTimes(2);
391
+ expect(tracer.endAgentLoopSpan).toHaveBeenNthCalledWith(1, { mock: 'loopSpan' });
392
+ expect(tracer.endAgentLoopSpan).toHaveBeenNthCalledWith(2, { mock: 'loopSpan' }, expect.objectContaining({ error: expect.any(StructuredOutputException) }));
393
+ });
394
+ it('ends agent span with result on successful structured output', async () => {
395
+ const schema = z.object({ value: z.number() });
396
+ const model = new MockMessageModel()
397
+ .addTurn({ type: 'toolUseBlock', name: 'strands_structured_output', toolUseId: 'tool-1', input: { value: 42 } })
398
+ .addTurn({ type: 'textBlock', text: 'Done' });
399
+ const agent = new Agent({ model, structuredOutputSchema: schema });
400
+ const tracer = getLatestTracer();
401
+ await agent.invoke('Test');
402
+ expect(tracer.endAgentSpan).toHaveBeenCalledWith({ mock: 'agentSpan' }, expect.objectContaining({
403
+ response: expect.objectContaining({ role: 'assistant' }),
404
+ stopReason: 'endTurn',
405
+ }));
406
+ });
407
+ it('creates correct spans for validation retry cycle', async () => {
408
+ const schema = z.object({ name: z.string(), age: z.number() });
409
+ // Turn 1: invalid input → tool returns error
410
+ // Turn 2: valid input → tool succeeds
411
+ // Turn 3: model finishes
412
+ const model = new MockMessageModel()
413
+ .addTurn({
414
+ type: 'toolUseBlock',
415
+ name: 'strands_structured_output',
416
+ toolUseId: 'tool-1',
417
+ input: { name: 'John', age: 'not-a-number' },
418
+ })
419
+ .addTurn({
420
+ type: 'toolUseBlock',
421
+ name: 'strands_structured_output',
422
+ toolUseId: 'tool-2',
423
+ input: { name: 'John', age: 30 },
424
+ })
425
+ .addTurn({ type: 'textBlock', text: 'Done' });
426
+ const agent = new Agent({ model, structuredOutputSchema: schema });
427
+ const tracer = getLatestTracer();
428
+ await agent.invoke('Test');
429
+ // 3 cycles: invalid tool use, valid tool use, final text — all end without error
430
+ expect(tracer.startAgentLoopSpan).toHaveBeenNthCalledWith(1, expect.objectContaining({ cycleId: 'cycle-1' }));
431
+ expect(tracer.startAgentLoopSpan).toHaveBeenNthCalledWith(2, expect.objectContaining({ cycleId: 'cycle-2' }));
432
+ expect(tracer.startAgentLoopSpan).toHaveBeenNthCalledWith(3, expect.objectContaining({ cycleId: 'cycle-3' }));
433
+ expect(tracer.endAgentLoopSpan).toHaveBeenCalledTimes(3);
434
+ expect(tracer.endAgentLoopSpan).toHaveBeenNthCalledWith(1, { mock: 'loopSpan' });
435
+ expect(tracer.endAgentLoopSpan).toHaveBeenNthCalledWith(2, { mock: 'loopSpan' });
436
+ expect(tracer.endAgentLoopSpan).toHaveBeenNthCalledWith(3, { mock: 'loopSpan' });
437
+ // 3 model calls, one per cycle — all end without error
438
+ expect(tracer.startModelInvokeSpan).toHaveBeenCalledTimes(3);
439
+ expect(tracer.endModelInvokeSpan).toHaveBeenCalledTimes(3);
440
+ for (let i = 1; i <= 3; i++) {
441
+ expect(tracer.endModelInvokeSpan).toHaveBeenNthCalledWith(i, { mock: 'modelSpan' }, expect.objectContaining({ output: expect.objectContaining({ role: 'assistant' }) }));
442
+ }
443
+ // 2 tool calls: first with validation error, second succeeds
444
+ expect(tracer.startToolCallSpan).toHaveBeenCalledTimes(2);
445
+ expect(tracer.startToolCallSpan).toHaveBeenNthCalledWith(1, {
446
+ tool: expect.objectContaining({ name: 'strands_structured_output', toolUseId: 'tool-1' }),
447
+ });
448
+ expect(tracer.startToolCallSpan).toHaveBeenNthCalledWith(2, {
449
+ tool: expect.objectContaining({ name: 'strands_structured_output', toolUseId: 'tool-2' }),
450
+ });
451
+ expect(tracer.endToolCallSpan).toHaveBeenCalledTimes(2);
452
+ expect(tracer.endToolCallSpan).toHaveBeenNthCalledWith(1, { mock: 'toolSpan' }, expect.objectContaining({
453
+ toolResult: expect.objectContaining({ toolUseId: 'tool-1', status: 'error' }),
454
+ }));
455
+ expect(tracer.endToolCallSpan).toHaveBeenNthCalledWith(2, { mock: 'toolSpan' }, expect.objectContaining({
456
+ toolResult: expect.objectContaining({ toolUseId: 'tool-2', status: 'success' }),
457
+ }));
458
+ });
459
+ it('ends agent span with error on maxTokens with structured output schema', async () => {
460
+ const schema = z.object({ value: z.number() });
461
+ const model = new MockMessageModel().addTurn({ type: 'textBlock', text: 'Partial' }, 'maxTokens');
462
+ const agent = new Agent({ model, structuredOutputSchema: schema });
463
+ const tracer = getLatestTracer();
464
+ await expect(agent.invoke('Test')).rejects.toThrow(MaxTokensError);
465
+ expect(tracer.endAgentSpan).toHaveBeenCalledWith({ mock: 'agentSpan' }, expect.objectContaining({ error: expect.any(MaxTokensError) }));
466
+ expect(tracer.endAgentLoopSpan).toHaveBeenCalledWith({ mock: 'loopSpan' }, expect.objectContaining({ error: expect.any(MaxTokensError) }));
467
+ });
468
+ });
469
+ });
470
+ //# sourceMappingURL=agent.tracer.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.tracer.test.js","sourceRoot":"","sources":["../../../../src/agent/__tests__/agent.tracer.test.ts"],"names":[],"mappings":"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"}