@strands-agents/sdk 0.3.0 → 0.4.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 (215) hide show
  1. package/README.md +43 -0
  2. package/dist/src/__fixtures__/mock-hook-provider.d.ts +3 -7
  3. package/dist/src/__fixtures__/mock-hook-provider.d.ts.map +1 -1
  4. package/dist/src/__fixtures__/mock-hook-provider.js +3 -9
  5. package/dist/src/__fixtures__/mock-hook-provider.js.map +1 -1
  6. package/dist/src/__fixtures__/mock-message-model.d.ts +8 -2
  7. package/dist/src/__fixtures__/mock-message-model.d.ts.map +1 -1
  8. package/dist/src/__fixtures__/mock-message-model.js +1 -0
  9. package/dist/src/__fixtures__/mock-message-model.js.map +1 -1
  10. package/dist/src/__fixtures__/mock-storage-provider.d.ts +37 -0
  11. package/dist/src/__fixtures__/mock-storage-provider.d.ts.map +1 -0
  12. package/dist/src/__fixtures__/mock-storage-provider.js +105 -0
  13. package/dist/src/__fixtures__/mock-storage-provider.js.map +1 -0
  14. package/dist/src/__fixtures__/slim-types.d.ts +50 -0
  15. package/dist/src/__fixtures__/slim-types.d.ts.map +1 -0
  16. package/dist/src/__fixtures__/slim-types.js +6 -0
  17. package/dist/src/__fixtures__/slim-types.js.map +1 -0
  18. package/dist/src/__fixtures__/tool-helpers.d.ts +8 -3
  19. package/dist/src/__fixtures__/tool-helpers.d.ts.map +1 -1
  20. package/dist/src/__fixtures__/tool-helpers.js +1 -1
  21. package/dist/src/__fixtures__/tool-helpers.js.map +1 -1
  22. package/dist/src/agent/__tests__/agent.hook.test.js +18 -18
  23. package/dist/src/agent/__tests__/agent.hook.test.js.map +1 -1
  24. package/dist/src/agent/__tests__/agent.test.js +124 -8
  25. package/dist/src/agent/__tests__/agent.test.js.map +1 -1
  26. package/dist/src/agent/__tests__/printer.test.js +5 -9
  27. package/dist/src/agent/__tests__/printer.test.js.map +1 -1
  28. package/dist/src/agent/__tests__/snapshot.test.d.ts +2 -0
  29. package/dist/src/agent/__tests__/snapshot.test.d.ts.map +1 -0
  30. package/dist/src/agent/__tests__/snapshot.test.js +249 -0
  31. package/dist/src/agent/__tests__/snapshot.test.js.map +1 -0
  32. package/dist/src/agent/__tests__/state.test.js +19 -0
  33. package/dist/src/agent/__tests__/state.test.js.map +1 -1
  34. package/dist/src/agent/agent.d.ts +19 -4
  35. package/dist/src/agent/agent.d.ts.map +1 -1
  36. package/dist/src/agent/agent.js +104 -34
  37. package/dist/src/agent/agent.js.map +1 -1
  38. package/dist/src/agent/printer.d.ts +4 -0
  39. package/dist/src/agent/printer.d.ts.map +1 -1
  40. package/dist/src/agent/printer.js +18 -6
  41. package/dist/src/agent/printer.js.map +1 -1
  42. package/dist/src/agent/snapshot.d.ts +132 -0
  43. package/dist/src/agent/snapshot.d.ts.map +1 -0
  44. package/dist/src/agent/snapshot.js +151 -0
  45. package/dist/src/agent/snapshot.js.map +1 -0
  46. package/dist/src/agent/state.d.ts +14 -1
  47. package/dist/src/agent/state.d.ts.map +1 -1
  48. package/dist/src/agent/state.js +21 -0
  49. package/dist/src/agent/state.js.map +1 -1
  50. package/dist/src/errors.d.ts +15 -0
  51. package/dist/src/errors.d.ts.map +1 -1
  52. package/dist/src/errors.js +18 -0
  53. package/dist/src/errors.js.map +1 -1
  54. package/dist/src/hooks/__tests__/events.test.js +102 -21
  55. package/dist/src/hooks/__tests__/events.test.js.map +1 -1
  56. package/dist/src/hooks/events.d.ts +156 -22
  57. package/dist/src/hooks/events.d.ts.map +1 -1
  58. package/dist/src/hooks/events.js +158 -18
  59. package/dist/src/hooks/events.js.map +1 -1
  60. package/dist/src/hooks/index.d.ts +12 -4
  61. package/dist/src/hooks/index.d.ts.map +1 -1
  62. package/dist/src/hooks/index.js +11 -3
  63. package/dist/src/hooks/index.js.map +1 -1
  64. package/dist/src/hooks/registry.d.ts +5 -5
  65. package/dist/src/hooks/registry.d.ts.map +1 -1
  66. package/dist/src/hooks/registry.js.map +1 -1
  67. package/dist/src/hooks/types.d.ts +5 -5
  68. package/dist/src/hooks/types.d.ts.map +1 -1
  69. package/dist/src/index.d.ts +4 -2
  70. package/dist/src/index.d.ts.map +1 -1
  71. package/dist/src/index.js +4 -3
  72. package/dist/src/index.js.map +1 -1
  73. package/dist/src/models/__tests__/anthropic.test.js +31 -42
  74. package/dist/src/models/__tests__/anthropic.test.js.map +1 -1
  75. package/dist/src/models/__tests__/bedrock.test.js +70 -107
  76. package/dist/src/models/__tests__/bedrock.test.js.map +1 -1
  77. package/dist/src/models/__tests__/gemini.test.js +18 -18
  78. package/dist/src/models/__tests__/gemini.test.js.map +1 -1
  79. package/dist/src/models/__tests__/model.test.js +14 -13
  80. package/dist/src/models/__tests__/model.test.js.map +1 -1
  81. package/dist/src/models/__tests__/openai.test.js +73 -83
  82. package/dist/src/models/__tests__/openai.test.js.map +1 -1
  83. package/dist/src/models/streaming.d.ts +8 -0
  84. package/dist/src/models/streaming.d.ts.map +1 -1
  85. package/dist/src/models/streaming.js +17 -0
  86. package/dist/src/models/streaming.js.map +1 -1
  87. package/dist/src/multiagent/__tests__/nodes.test.d.ts +2 -0
  88. package/dist/src/multiagent/__tests__/nodes.test.d.ts.map +1 -0
  89. package/dist/src/multiagent/__tests__/nodes.test.js +98 -0
  90. package/dist/src/multiagent/__tests__/nodes.test.js.map +1 -0
  91. package/dist/src/multiagent/events.d.ts +24 -0
  92. package/dist/src/multiagent/events.d.ts.map +1 -0
  93. package/dist/src/multiagent/events.js +19 -0
  94. package/dist/src/multiagent/events.js.map +1 -0
  95. package/dist/src/multiagent/index.d.ts +11 -0
  96. package/dist/src/multiagent/index.d.ts.map +1 -0
  97. package/dist/src/multiagent/index.js +7 -0
  98. package/dist/src/multiagent/index.js.map +1 -0
  99. package/dist/src/multiagent/nodes.d.ts +75 -0
  100. package/dist/src/multiagent/nodes.d.ts.map +1 -0
  101. package/dist/src/multiagent/nodes.js +101 -0
  102. package/dist/src/multiagent/nodes.js.map +1 -0
  103. package/dist/src/multiagent/state.d.ts +55 -0
  104. package/dist/src/multiagent/state.d.ts.map +1 -0
  105. package/dist/src/multiagent/state.js +43 -0
  106. package/dist/src/multiagent/state.js.map +1 -0
  107. package/dist/src/multiagent/types.d.ts +5 -0
  108. package/dist/src/multiagent/types.d.ts.map +1 -0
  109. package/dist/src/multiagent/types.js +2 -0
  110. package/dist/src/multiagent/types.js.map +1 -0
  111. package/dist/src/registry/tool-registry.d.ts +2 -1
  112. package/dist/src/registry/tool-registry.d.ts.map +1 -1
  113. package/dist/src/registry/tool-registry.js +4 -2
  114. package/dist/src/registry/tool-registry.js.map +1 -1
  115. package/dist/src/session/__tests__/file-storage.test.node.d.ts +2 -0
  116. package/dist/src/session/__tests__/file-storage.test.node.d.ts.map +1 -0
  117. package/dist/src/session/__tests__/file-storage.test.node.js +218 -0
  118. package/dist/src/session/__tests__/file-storage.test.node.js.map +1 -0
  119. package/dist/src/session/__tests__/s3-storage.test.node.d.ts +2 -0
  120. package/dist/src/session/__tests__/s3-storage.test.node.d.ts.map +1 -0
  121. package/dist/src/session/__tests__/s3-storage.test.node.js +375 -0
  122. package/dist/src/session/__tests__/s3-storage.test.node.js.map +1 -0
  123. package/dist/src/session/__tests__/validation.test.d.ts +2 -0
  124. package/dist/src/session/__tests__/validation.test.d.ts.map +1 -0
  125. package/dist/src/session/__tests__/validation.test.js +20 -0
  126. package/dist/src/session/__tests__/validation.test.js.map +1 -0
  127. package/dist/src/session/file-storage.d.ts +79 -0
  128. package/dist/src/session/file-storage.d.ts.map +1 -0
  129. package/dist/src/session/file-storage.js +144 -0
  130. package/dist/src/session/file-storage.js.map +1 -0
  131. package/dist/src/session/index.d.ts +19 -0
  132. package/dist/src/session/index.d.ts.map +1 -0
  133. package/dist/src/session/index.js +18 -0
  134. package/dist/src/session/index.js.map +1 -0
  135. package/dist/src/session/s3-storage.d.ts +93 -0
  136. package/dist/src/session/s3-storage.d.ts.map +1 -0
  137. package/dist/src/session/s3-storage.js +150 -0
  138. package/dist/src/session/s3-storage.js.map +1 -0
  139. package/dist/src/session/storage.d.ts +91 -0
  140. package/dist/src/session/storage.d.ts.map +1 -0
  141. package/dist/src/session/storage.js +2 -0
  142. package/dist/src/session/storage.js.map +1 -0
  143. package/dist/src/session/types.d.ts +49 -0
  144. package/dist/src/session/types.d.ts.map +1 -0
  145. package/dist/src/session/types.js +2 -0
  146. package/dist/src/session/types.js.map +1 -0
  147. package/dist/src/session/validation.d.ts +10 -0
  148. package/dist/src/session/validation.d.ts.map +1 -0
  149. package/dist/src/session/validation.js +16 -0
  150. package/dist/src/session/validation.js.map +1 -0
  151. package/dist/src/structured-output/__tests__/context.test.d.ts +2 -0
  152. package/dist/src/structured-output/__tests__/context.test.d.ts.map +1 -0
  153. package/dist/src/structured-output/__tests__/context.test.js +201 -0
  154. package/dist/src/structured-output/__tests__/context.test.js.map +1 -0
  155. package/dist/src/structured-output/__tests__/exceptions.test.d.ts +2 -0
  156. package/dist/src/structured-output/__tests__/exceptions.test.d.ts.map +1 -0
  157. package/dist/src/structured-output/__tests__/exceptions.test.js +103 -0
  158. package/dist/src/structured-output/__tests__/exceptions.test.js.map +1 -0
  159. package/dist/src/structured-output/__tests__/tool.test.d.ts +2 -0
  160. package/dist/src/structured-output/__tests__/tool.test.d.ts.map +1 -0
  161. package/dist/src/structured-output/__tests__/tool.test.js +256 -0
  162. package/dist/src/structured-output/__tests__/tool.test.js.map +1 -0
  163. package/dist/src/structured-output/__tests__/utils.test.d.ts +2 -0
  164. package/dist/src/structured-output/__tests__/utils.test.d.ts.map +1 -0
  165. package/dist/src/structured-output/__tests__/utils.test.js +183 -0
  166. package/dist/src/structured-output/__tests__/utils.test.js.map +1 -0
  167. package/dist/src/structured-output/context.d.ts +91 -0
  168. package/dist/src/structured-output/context.d.ts.map +1 -0
  169. package/dist/src/structured-output/context.js +112 -0
  170. package/dist/src/structured-output/context.js.map +1 -0
  171. package/dist/src/structured-output/exceptions.d.ts +18 -0
  172. package/dist/src/structured-output/exceptions.d.ts.map +1 -0
  173. package/dist/src/structured-output/exceptions.js +28 -0
  174. package/dist/src/structured-output/exceptions.js.map +1 -0
  175. package/dist/src/structured-output/tool.d.ts +33 -0
  176. package/dist/src/structured-output/tool.d.ts.map +1 -0
  177. package/dist/src/structured-output/tool.js +73 -0
  178. package/dist/src/structured-output/tool.js.map +1 -0
  179. package/dist/src/structured-output/utils.d.ts +23 -0
  180. package/dist/src/structured-output/utils.d.ts.map +1 -0
  181. package/dist/src/structured-output/utils.js +104 -0
  182. package/dist/src/structured-output/utils.js.map +1 -0
  183. package/dist/src/tools/zod-tool.d.ts.map +1 -1
  184. package/dist/src/tools/zod-tool.js +2 -5
  185. package/dist/src/tools/zod-tool.js.map +1 -1
  186. package/dist/src/tsconfig.tsbuildinfo +1 -1
  187. package/dist/src/types/__tests__/media.test.js +216 -1
  188. package/dist/src/types/__tests__/media.test.js.map +1 -1
  189. package/dist/src/types/__tests__/messages.test.js +193 -4
  190. package/dist/src/types/__tests__/messages.test.js.map +1 -1
  191. package/dist/src/types/agent.d.ts +13 -7
  192. package/dist/src/types/agent.d.ts.map +1 -1
  193. package/dist/src/types/agent.js +8 -1
  194. package/dist/src/types/agent.js.map +1 -1
  195. package/dist/src/types/json.d.ts +61 -0
  196. package/dist/src/types/json.d.ts.map +1 -1
  197. package/dist/src/types/json.js +24 -0
  198. package/dist/src/types/json.js.map +1 -1
  199. package/dist/src/types/media.d.ts +84 -4
  200. package/dist/src/types/media.d.ts.map +1 -1
  201. package/dist/src/types/media.js +194 -0
  202. package/dist/src/types/media.js.map +1 -1
  203. package/dist/src/types/messages.d.ts +148 -9
  204. package/dist/src/types/messages.d.ts.map +1 -1
  205. package/dist/src/types/messages.js +234 -7
  206. package/dist/src/types/messages.js.map +1 -1
  207. package/dist/src/types/serializable.d.ts +31 -0
  208. package/dist/src/types/serializable.d.ts.map +1 -0
  209. package/dist/src/types/serializable.js +19 -0
  210. package/dist/src/types/serializable.js.map +1 -0
  211. package/dist/src/utils/zod.d.ts +11 -0
  212. package/dist/src/utils/zod.d.ts.map +1 -0
  213. package/dist/src/utils/zod.js +14 -0
  214. package/dist/src/utils/zod.js.map +1 -0
  215. package/package.json +7 -2
@@ -1,8 +1,9 @@
1
1
  import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
- import { BedrockRuntimeClient } from '@aws-sdk/client-bedrock-runtime';
2
+ import { BedrockRuntimeClient, ConverseStreamCommand, ValidationException } from '@aws-sdk/client-bedrock-runtime';
3
3
  import { isNode } from '../../__fixtures__/environment.js';
4
4
  import { BedrockModel } from '../bedrock.js';
5
5
  import { ContextWindowOverflowError, ModelThrottledError } from '../../errors.js';
6
+ import { Message, ReasoningBlock, ToolUseBlock, ToolResultBlock, JsonBlock } from '../../types/messages.js';
6
7
  import { TextBlock, GuardContentBlock, CachePointBlock } from '../../types/messages.js';
7
8
  import { collectIterator } from '../../__fixtures__/model-test-helpers.js';
8
9
  /**
@@ -259,7 +260,6 @@ describe('BedrockModel', () => {
259
260
  });
260
261
  });
261
262
  describe('format_message', async () => {
262
- const { ConverseStreamCommand } = await import('@aws-sdk/client-bedrock-runtime');
263
263
  const mockConverseStreamCommand = vi.mocked(ConverseStreamCommand);
264
264
  it('formats the request to bedrock properly', async () => {
265
265
  const provider = new BedrockModel({
@@ -277,7 +277,7 @@ describe('BedrockModel', () => {
277
277
  MyExtraArg: 'ExtraArg',
278
278
  },
279
279
  });
280
- const messages = [{ type: 'message', role: 'user', content: [{ type: 'textBlock', text: 'Hello' }] }];
280
+ const messages = [new Message({ role: 'user', content: [new TextBlock('Hello')] })];
281
281
  const options = {
282
282
  systemPrompt: 'You are a helpful assistant',
283
283
  toolSpecs: [
@@ -326,22 +326,19 @@ describe('BedrockModel', () => {
326
326
  });
327
327
  });
328
328
  it('formats tool use messages', async () => {
329
- const { ConverseStreamCommand } = await import('@aws-sdk/client-bedrock-runtime');
330
329
  const mockConverseStreamCommand = vi.mocked(ConverseStreamCommand);
331
330
  const provider = new BedrockModel();
332
331
  const messages = [
333
- {
334
- type: 'message',
332
+ new Message({
335
333
  role: 'assistant',
336
334
  content: [
337
- {
338
- type: 'toolUseBlock',
335
+ new ToolUseBlock({
339
336
  name: 'calculator',
340
337
  toolUseId: 'tool-123',
341
338
  input: { a: 5, b: 3 },
342
- },
339
+ }),
343
340
  ],
344
- },
341
+ }),
345
342
  ];
346
343
  // Run the stream but ignore the output
347
344
  collectIterator(provider.stream(messages));
@@ -366,21 +363,16 @@ describe('BedrockModel', () => {
366
363
  it('formats tool result messages', async () => {
367
364
  const provider = new BedrockModel();
368
365
  const messages = [
369
- {
370
- type: 'message',
366
+ new Message({
371
367
  role: 'user',
372
368
  content: [
373
- {
374
- type: 'toolResultBlock',
369
+ new ToolResultBlock({
375
370
  toolUseId: 'tool-123',
376
371
  status: 'success',
377
- content: [
378
- { type: 'textBlock', text: 'Result: 8' },
379
- { type: 'jsonBlock', json: { hello: 'world' } },
380
- ],
381
- },
372
+ content: [new TextBlock('Result: 8'), new JsonBlock({ json: { hello: 'world' } })],
373
+ }),
382
374
  ],
383
- },
375
+ }),
384
376
  ];
385
377
  // Start the stream
386
378
  collectIterator(provider.stream(messages));
@@ -415,21 +407,18 @@ describe('BedrockModel', () => {
415
407
  it('formats reasoning messages properly', async () => {
416
408
  const provider = new BedrockModel();
417
409
  const messages = [
418
- {
419
- type: 'message',
410
+ new Message({
420
411
  role: 'user',
421
412
  content: [
422
- {
423
- type: 'reasoningBlock',
413
+ new ReasoningBlock({
424
414
  text: 'Hello',
425
415
  signature: 'World',
426
- },
427
- {
428
- type: 'reasoningBlock',
416
+ }),
417
+ new ReasoningBlock({
429
418
  redactedContent: new Uint8Array(1),
430
- },
419
+ }),
431
420
  ],
432
- },
421
+ }),
433
422
  ];
434
423
  // Start the stream but don't await it
435
424
  collectIterator(provider.stream(messages));
@@ -461,14 +450,10 @@ describe('BedrockModel', () => {
461
450
  it('formats cache point blocks in messages', async () => {
462
451
  const provider = new BedrockModel();
463
452
  const messages = [
464
- {
465
- type: 'message',
453
+ new Message({
466
454
  role: 'user',
467
- content: [
468
- { type: 'textBlock', text: 'Message with cache point' },
469
- { type: 'cachePointBlock', cacheType: 'default' },
470
- ],
471
- },
455
+ content: [new TextBlock('Message with cache point'), new CachePointBlock({ cacheType: 'default' })],
456
+ }),
472
457
  ];
473
458
  collectIterator(provider.stream(messages));
474
459
  // Verify ConverseStreamCommand was called with properly formatted request
@@ -514,7 +499,7 @@ describe('BedrockModel', () => {
514
499
  });
515
500
  mockBedrockClientImplementation({ send: mockSend });
516
501
  const provider = new BedrockModel({ stream });
517
- const messages = [{ type: 'message', role: 'user', content: [{ type: 'textBlock', text: 'Hello' }] }];
502
+ const messages = [new Message({ role: 'user', content: [new TextBlock('Hello')] })];
518
503
  const events = await collectIterator(provider.stream(messages));
519
504
  expect(events).toContainEqual({ role: 'assistant', type: 'modelMessageStartEvent' });
520
505
  expect(events).toContainEqual({ type: 'modelContentBlockStartEvent' });
@@ -575,9 +560,7 @@ describe('BedrockModel', () => {
575
560
  });
576
561
  mockBedrockClientImplementation({ send: mockSend });
577
562
  const provider = new BedrockModel({ stream });
578
- const messages = [
579
- { type: 'message', role: 'user', content: [{ type: 'textBlock', text: 'Weather?' }] },
580
- ];
563
+ const messages = [new Message({ role: 'user', content: [new TextBlock('Weather?')] })];
581
564
  const events = await collectIterator(provider.stream(messages));
582
565
  const startEvent = events.find((e) => e.type === 'modelContentBlockStartEvent');
583
566
  const inputDeltaEvent = events.find((e) => e.type === 'modelContentBlockDeltaEvent' && e.delta.type === 'toolUseInputDelta');
@@ -635,9 +618,7 @@ describe('BedrockModel', () => {
635
618
  });
636
619
  mockBedrockClientImplementation({ send: mockSend });
637
620
  const provider = new BedrockModel({ stream });
638
- const messages = [
639
- { type: 'message', role: 'user', content: [{ type: 'textBlock', text: 'A question.' }] },
640
- ];
621
+ const messages = [new Message({ role: 'user', content: [new TextBlock('A question.')] })];
641
622
  const events = await collectIterator(provider.stream(messages));
642
623
  expect(events).toContainEqual({ role: 'assistant', type: 'modelMessageStartEvent' });
643
624
  expect(events).toContainEqual({ type: 'modelContentBlockStartEvent' });
@@ -690,9 +671,7 @@ describe('BedrockModel', () => {
690
671
  });
691
672
  mockBedrockClientImplementation({ send: mockSend });
692
673
  const provider = new BedrockModel({ stream });
693
- const messages = [
694
- { type: 'message', role: 'user', content: [{ type: 'textBlock', text: 'A sensitive question.' }] },
695
- ];
674
+ const messages = [new Message({ role: 'user', content: [new TextBlock('A sensitive question.')] })];
696
675
  const events = await collectIterator(provider.stream(messages));
697
676
  expect(events).toContainEqual({ role: 'assistant', type: 'modelMessageStartEvent' });
698
677
  expect(events).toContainEqual({ type: 'modelContentBlockStartEvent' });
@@ -709,7 +688,6 @@ describe('BedrockModel', () => {
709
688
  });
710
689
  });
711
690
  describe('error handling', async () => {
712
- const { ValidationException } = await import('@aws-sdk/client-bedrock-runtime');
713
691
  it.each([
714
692
  {
715
693
  name: 'ContextWindowOverflowError for context overflow',
@@ -726,7 +704,7 @@ describe('BedrockModel', () => {
726
704
  const mockSendError = vi.fn().mockRejectedValue(error);
727
705
  mockBedrockClientImplementation({ send: mockSendError });
728
706
  const provider = new BedrockModel();
729
- const messages = [{ type: 'message', role: 'user', content: [{ type: 'textBlock', text: 'Hello' }] }];
707
+ const messages = [new Message({ role: 'user', content: [new TextBlock('Hello')] })];
730
708
  await expect(collectIterator(provider.stream(messages))).rejects.toThrow(expected);
731
709
  });
732
710
  });
@@ -744,7 +722,7 @@ describe('BedrockModel', () => {
744
722
  yield { metadata: { usage: { inputTokens: 10, outputTokens: 5, totalTokens: 15 } } };
745
723
  });
746
724
  const provider = new BedrockModel();
747
- const messages = [{ type: 'message', role: 'user', content: [{ type: 'textBlock', text: 'Hello' }] }];
725
+ const messages = [new Message({ role: 'user', content: [new TextBlock('Hello')] })];
748
726
  const events = await collectIterator(provider.stream(messages));
749
727
  expect(events).toContainEqual({
750
728
  type: 'modelContentBlockDeltaEvent',
@@ -773,7 +751,7 @@ describe('BedrockModel', () => {
773
751
  yield { metadata: { usage: { inputTokens: 10, outputTokens: 5, totalTokens: 15 } } };
774
752
  });
775
753
  const provider = new BedrockModel();
776
- const messages = [{ type: 'message', role: 'user', content: [{ type: 'textBlock', text: 'Hello' }] }];
754
+ const messages = [new Message({ role: 'user', content: [new TextBlock('Hello')] })];
777
755
  const events = await collectIterator(provider.stream(messages));
778
756
  expect(events).toContainEqual({
779
757
  type: 'modelContentBlockDeltaEvent',
@@ -811,7 +789,7 @@ describe('BedrockModel', () => {
811
789
  yield { unknown: 'type' };
812
790
  });
813
791
  const provider = new BedrockModel();
814
- const messages = [{ type: 'message', role: 'user', content: [{ type: 'textBlock', text: 'Hello' }] }];
792
+ const messages = [new Message({ role: 'user', content: [new TextBlock('Hello')] })];
815
793
  const events = await collectIterator(provider.stream(messages));
816
794
  const reasoningDelta = events.find((e) => e.type === 'modelContentBlockDeltaEvent' && e.delta.type === 'reasoningContentDelta');
817
795
  expect(reasoningDelta).toBeDefined();
@@ -835,7 +813,7 @@ describe('BedrockModel', () => {
835
813
  yield { metadata: { usage: { inputTokens: 10, outputTokens: 5, totalTokens: 15 } } };
836
814
  });
837
815
  const provider = new BedrockModel();
838
- const messages = [{ type: 'message', role: 'user', content: [{ type: 'textBlock', text: 'Hello' }] }];
816
+ const messages = [new Message({ role: 'user', content: [new TextBlock('Hello')] })];
839
817
  const events = await collectIterator(provider.stream(messages));
840
818
  const reasoningDelta = events.find((e) => e.type === 'modelContentBlockDeltaEvent' && e.delta.type === 'reasoningContentDelta');
841
819
  expect(reasoningDelta).toBeDefined();
@@ -865,7 +843,7 @@ describe('BedrockModel', () => {
865
843
  };
866
844
  });
867
845
  const provider = new BedrockModel();
868
- const messages = [{ type: 'message', role: 'user', content: [{ type: 'textBlock', text: 'Hello' }] }];
846
+ const messages = [new Message({ role: 'user', content: [new TextBlock('Hello')] })];
869
847
  const events = await collectIterator(provider.stream(messages));
870
848
  const metadataEvent = events.find((e) => e.type === 'modelMetadataEvent');
871
849
  expect(metadataEvent).toBeDefined();
@@ -889,7 +867,7 @@ describe('BedrockModel', () => {
889
867
  };
890
868
  });
891
869
  const provider = new BedrockModel();
892
- const messages = [{ type: 'message', role: 'user', content: [{ type: 'textBlock', text: 'Hello' }] }];
870
+ const messages = [new Message({ role: 'user', content: [new TextBlock('Hello')] })];
893
871
  const events = await collectIterator(provider.stream(messages));
894
872
  const metadataEvent = events.find((e) => e.type === 'modelMetadataEvent');
895
873
  expect(metadataEvent).toBeDefined();
@@ -907,7 +885,7 @@ describe('BedrockModel', () => {
907
885
  yield { metadata: { usage: { inputTokens: 10, outputTokens: 5, totalTokens: 15 } } };
908
886
  });
909
887
  const provider = new BedrockModel();
910
- const messages = [{ type: 'message', role: 'user', content: [{ type: 'textBlock', text: 'Hello' }] }];
888
+ const messages = [new Message({ role: 'user', content: [new TextBlock('Hello')] })];
911
889
  const events = await collectIterator(provider.stream(messages));
912
890
  const stopEvent = events.find((e) => e.type === 'modelMessageStopEvent');
913
891
  expect(stopEvent).toBeDefined();
@@ -934,9 +912,7 @@ describe('BedrockModel', () => {
934
912
  yield { metadata: { usage: { inputTokens: 10, outputTokens: 5, totalTokens: 15 } } };
935
913
  });
936
914
  const provider = new BedrockModel();
937
- const messages = [
938
- { type: 'message', role: 'user', content: [{ type: 'textBlock', text: 'Hello' }] },
939
- ];
915
+ const messages = [new Message({ role: 'user', content: [new TextBlock('Hello')] })];
940
916
  const events = [];
941
917
  for await (const event of provider.stream(messages)) {
942
918
  events.push(event);
@@ -956,7 +932,7 @@ describe('BedrockModel', () => {
956
932
  yield { throttlingException: { message: 'Rate exceeded' } };
957
933
  });
958
934
  const provider = new BedrockModel();
959
- const messages = [{ type: 'message', role: 'user', content: [{ type: 'textBlock', text: 'Hello' }] }];
935
+ const messages = [new Message({ role: 'user', content: [new TextBlock('Hello')] })];
960
936
  await expect(async () => {
961
937
  for await (const _ of provider.stream(messages)) {
962
938
  // consume stream
@@ -969,7 +945,7 @@ describe('BedrockModel', () => {
969
945
  yield { throttlingException: { message: 'Too many requests' } };
970
946
  });
971
947
  const provider = new BedrockModel();
972
- const messages = [{ type: 'message', role: 'user', content: [{ type: 'textBlock', text: 'Hello' }] }];
948
+ const messages = [new Message({ role: 'user', content: [new TextBlock('Hello')] })];
973
949
  await expect(async () => {
974
950
  for await (const _ of provider.stream(messages)) {
975
951
  // consume stream
@@ -982,7 +958,7 @@ describe('BedrockModel', () => {
982
958
  yield { throttlingException: {} };
983
959
  });
984
960
  const provider = new BedrockModel();
985
- const messages = [{ type: 'message', role: 'user', content: [{ type: 'textBlock', text: 'Hello' }] }];
961
+ const messages = [new Message({ role: 'user', content: [new TextBlock('Hello')] })];
986
962
  await expect(async () => {
987
963
  for await (const _ of provider.stream(messages)) {
988
964
  // consume stream
@@ -992,14 +968,13 @@ describe('BedrockModel', () => {
992
968
  });
993
969
  });
994
970
  describe('system prompt formatting', async () => {
995
- const { ConverseStreamCommand } = await import('@aws-sdk/client-bedrock-runtime');
996
971
  const mockConverseStreamCommand = vi.mocked(ConverseStreamCommand);
997
972
  beforeEach(() => {
998
973
  vi.clearAllMocks();
999
974
  });
1000
975
  it('formats string system prompt with cachePrompt config', async () => {
1001
976
  const provider = new BedrockModel({ cachePrompt: 'default' });
1002
- const messages = [{ type: 'message', role: 'user', content: [{ type: 'textBlock', text: 'Hello' }] }];
977
+ const messages = [new Message({ role: 'user', content: [new TextBlock('Hello')] })];
1003
978
  const options = {
1004
979
  systemPrompt: 'You are a helpful assistant',
1005
980
  };
@@ -1017,7 +992,7 @@ describe('BedrockModel', () => {
1017
992
  });
1018
993
  it('formats array system prompt with text blocks only', async () => {
1019
994
  const provider = new BedrockModel();
1020
- const messages = [{ type: 'message', role: 'user', content: [{ type: 'textBlock', text: 'Hello' }] }];
995
+ const messages = [new Message({ role: 'user', content: [new TextBlock('Hello')] })];
1021
996
  const options = {
1022
997
  systemPrompt: [
1023
998
  { type: 'textBlock', text: 'You are a helpful assistant' },
@@ -1038,7 +1013,7 @@ describe('BedrockModel', () => {
1038
1013
  });
1039
1014
  it('formats array system prompt with cache points', async () => {
1040
1015
  const provider = new BedrockModel();
1041
- const messages = [{ type: 'message', role: 'user', content: [{ type: 'textBlock', text: 'Hello' }] }];
1016
+ const messages = [new Message({ role: 'user', content: [new TextBlock('Hello')] })];
1042
1017
  const options = {
1043
1018
  systemPrompt: [
1044
1019
  { type: 'textBlock', text: 'You are a helpful assistant' },
@@ -1065,7 +1040,7 @@ describe('BedrockModel', () => {
1065
1040
  it('warns when both array system prompt and cachePrompt config are provided', async () => {
1066
1041
  const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => { });
1067
1042
  const provider = new BedrockModel({ cachePrompt: 'default' });
1068
- const messages = [{ type: 'message', role: 'user', content: [{ type: 'textBlock', text: 'Hello' }] }];
1043
+ const messages = [new Message({ role: 'user', content: [new TextBlock('Hello')] })];
1069
1044
  const options = {
1070
1045
  systemPrompt: [
1071
1046
  { type: 'textBlock', text: 'You are a helpful assistant' },
@@ -1090,7 +1065,7 @@ describe('BedrockModel', () => {
1090
1065
  });
1091
1066
  it('handles empty array system prompt', async () => {
1092
1067
  const provider = new BedrockModel();
1093
- const messages = [{ type: 'message', role: 'user', content: [{ type: 'textBlock', text: 'Hello' }] }];
1068
+ const messages = [new Message({ role: 'user', content: [new TextBlock('Hello')] })];
1094
1069
  const options = {
1095
1070
  systemPrompt: [],
1096
1071
  };
@@ -1108,7 +1083,7 @@ describe('BedrockModel', () => {
1108
1083
  });
1109
1084
  it('formats array system prompt with guard content', async () => {
1110
1085
  const provider = new BedrockModel();
1111
- const messages = [{ type: 'message', role: 'user', content: [{ type: 'textBlock', text: 'Hello' }] }];
1086
+ const messages = [new Message({ role: 'user', content: [new TextBlock('Hello')] })];
1112
1087
  const options = {
1113
1088
  systemPrompt: [
1114
1089
  new TextBlock('You are a helpful assistant'),
@@ -1144,7 +1119,7 @@ describe('BedrockModel', () => {
1144
1119
  });
1145
1120
  it('formats mixed system prompt with text, guard content, and cache points', async () => {
1146
1121
  const provider = new BedrockModel();
1147
- const messages = [{ type: 'message', role: 'user', content: [{ type: 'textBlock', text: 'Hello' }] }];
1122
+ const messages = [new Message({ role: 'user', content: [new TextBlock('Hello')] })];
1148
1123
  const options = {
1149
1124
  systemPrompt: [
1150
1125
  new TextBlock('You are a helpful assistant'),
@@ -1184,7 +1159,7 @@ describe('BedrockModel', () => {
1184
1159
  });
1185
1160
  it('formats guard content with all qualifier types', async () => {
1186
1161
  const provider = new BedrockModel();
1187
- const messages = [{ type: 'message', role: 'user', content: [{ type: 'textBlock', text: 'Hello' }] }];
1162
+ const messages = [new Message({ role: 'user', content: [new TextBlock('Hello')] })];
1188
1163
  const options = {
1189
1164
  systemPrompt: [
1190
1165
  new GuardContentBlock({
@@ -1218,7 +1193,7 @@ describe('BedrockModel', () => {
1218
1193
  });
1219
1194
  it('formats guard content with image in system prompt', async () => {
1220
1195
  const provider = new BedrockModel();
1221
- const messages = [{ type: 'message', role: 'user', content: [{ type: 'textBlock', text: 'Hello' }] }];
1196
+ const messages = [new Message({ role: 'user', content: [new TextBlock('Hello')] })];
1222
1197
  const imageBytes = new Uint8Array([1, 2, 3, 4]);
1223
1198
  const options = {
1224
1199
  systemPrompt: [
@@ -1253,7 +1228,6 @@ describe('BedrockModel', () => {
1253
1228
  });
1254
1229
  });
1255
1230
  describe('guard content in messages', async () => {
1256
- const { ConverseStreamCommand } = await import('@aws-sdk/client-bedrock-runtime');
1257
1231
  const mockConverseStreamCommand = vi.mocked(ConverseStreamCommand);
1258
1232
  beforeEach(() => {
1259
1233
  vi.clearAllMocks();
@@ -1261,8 +1235,7 @@ describe('BedrockModel', () => {
1261
1235
  it('formats guard content with text in message', async () => {
1262
1236
  const provider = new BedrockModel();
1263
1237
  const messages = [
1264
- {
1265
- type: 'message',
1238
+ new Message({
1266
1239
  role: 'user',
1267
1240
  content: [
1268
1241
  new TextBlock('Verify this information:'),
@@ -1273,7 +1246,7 @@ describe('BedrockModel', () => {
1273
1246
  },
1274
1247
  }),
1275
1248
  ],
1276
- },
1249
+ }),
1277
1250
  ];
1278
1251
  collectIterator(provider.stream(messages));
1279
1252
  expect(mockConverseStreamCommand).toHaveBeenLastCalledWith({
@@ -1300,8 +1273,7 @@ describe('BedrockModel', () => {
1300
1273
  const provider = new BedrockModel();
1301
1274
  const imageBytes = new Uint8Array([1, 2, 3, 4]);
1302
1275
  const messages = [
1303
- {
1304
- type: 'message',
1276
+ new Message({
1305
1277
  role: 'user',
1306
1278
  content: [
1307
1279
  new TextBlock('Is this image safe?'),
@@ -1312,7 +1284,7 @@ describe('BedrockModel', () => {
1312
1284
  },
1313
1285
  }),
1314
1286
  ],
1315
- },
1287
+ }),
1316
1288
  ];
1317
1289
  collectIterator(provider.stream(messages));
1318
1290
  expect(mockConverseStreamCommand).toHaveBeenLastCalledWith({
@@ -1337,24 +1309,21 @@ describe('BedrockModel', () => {
1337
1309
  });
1338
1310
  });
1339
1311
  describe('includeToolResultStatus configuration', async () => {
1340
- const { ConverseStreamCommand } = await import('@aws-sdk/client-bedrock-runtime');
1341
1312
  const mockConverseStreamCommand = vi.mocked(ConverseStreamCommand);
1342
1313
  describe('when includeToolResultStatus is true', () => {
1343
1314
  it('always includes status field in tool results', async () => {
1344
1315
  const provider = new BedrockModel({ includeToolResultStatus: true });
1345
1316
  const messages = [
1346
- {
1347
- type: 'message',
1317
+ new Message({
1348
1318
  role: 'user',
1349
1319
  content: [
1350
- {
1351
- type: 'toolResultBlock',
1320
+ new ToolResultBlock({
1352
1321
  toolUseId: 'tool-123',
1353
1322
  status: 'success',
1354
- content: [{ type: 'textBlock', text: 'Result' }],
1355
- },
1323
+ content: [new TextBlock('Result')],
1324
+ }),
1356
1325
  ],
1357
- },
1326
+ }),
1358
1327
  ];
1359
1328
  collectIterator(provider.stream(messages));
1360
1329
  expect(mockConverseStreamCommand).toHaveBeenLastCalledWith({
@@ -1380,18 +1349,16 @@ describe('BedrockModel', () => {
1380
1349
  it('never includes status field in tool results', async () => {
1381
1350
  const provider = new BedrockModel({ includeToolResultStatus: false });
1382
1351
  const messages = [
1383
- {
1384
- type: 'message',
1352
+ new Message({
1385
1353
  role: 'user',
1386
1354
  content: [
1387
- {
1388
- type: 'toolResultBlock',
1355
+ new ToolResultBlock({
1389
1356
  toolUseId: 'tool-123',
1390
1357
  status: 'success',
1391
- content: [{ type: 'textBlock', text: 'Result' }],
1392
- },
1358
+ content: [new TextBlock('Result')],
1359
+ }),
1393
1360
  ],
1394
- },
1361
+ }),
1395
1362
  ];
1396
1363
  collectIterator(provider.stream(messages));
1397
1364
  expect(mockConverseStreamCommand).toHaveBeenLastCalledWith({
@@ -1419,18 +1386,16 @@ describe('BedrockModel', () => {
1419
1386
  includeToolResultStatus: 'auto',
1420
1387
  });
1421
1388
  const messages = [
1422
- {
1423
- type: 'message',
1389
+ new Message({
1424
1390
  role: 'user',
1425
1391
  content: [
1426
- {
1427
- type: 'toolResultBlock',
1392
+ new ToolResultBlock({
1428
1393
  toolUseId: 'tool-123',
1429
1394
  status: 'success',
1430
- content: [{ type: 'textBlock', text: 'Result' }],
1431
- },
1395
+ content: [new TextBlock('Result')],
1396
+ }),
1432
1397
  ],
1433
- },
1398
+ }),
1434
1399
  ];
1435
1400
  collectIterator(provider.stream(messages));
1436
1401
  expect(mockConverseStreamCommand).toHaveBeenLastCalledWith({
@@ -1458,18 +1423,16 @@ describe('BedrockModel', () => {
1458
1423
  modelId: 'amazon.nova-lite-v1:0',
1459
1424
  });
1460
1425
  const messages = [
1461
- {
1462
- type: 'message',
1426
+ new Message({
1463
1427
  role: 'user',
1464
1428
  content: [
1465
- {
1466
- type: 'toolResultBlock',
1429
+ new ToolResultBlock({
1467
1430
  toolUseId: 'tool-123',
1468
1431
  status: 'success',
1469
- content: [{ type: 'textBlock', text: 'Result' }],
1470
- },
1432
+ content: [new TextBlock('Result')],
1433
+ }),
1471
1434
  ],
1472
- },
1435
+ }),
1473
1436
  ];
1474
1437
  collectIterator(provider.stream(messages));
1475
1438
  expect(mockConverseStreamCommand).toHaveBeenLastCalledWith({