@strands-agents/sdk 0.2.2 → 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.
- package/README.md +43 -0
- package/dist/src/__fixtures__/mock-hook-provider.d.ts +3 -7
- package/dist/src/__fixtures__/mock-hook-provider.d.ts.map +1 -1
- package/dist/src/__fixtures__/mock-hook-provider.js +3 -9
- package/dist/src/__fixtures__/mock-hook-provider.js.map +1 -1
- package/dist/src/__fixtures__/mock-message-model.d.ts +8 -2
- package/dist/src/__fixtures__/mock-message-model.d.ts.map +1 -1
- package/dist/src/__fixtures__/mock-message-model.js +1 -0
- package/dist/src/__fixtures__/mock-message-model.js.map +1 -1
- package/dist/src/__fixtures__/mock-storage-provider.d.ts +37 -0
- package/dist/src/__fixtures__/mock-storage-provider.d.ts.map +1 -0
- package/dist/src/__fixtures__/mock-storage-provider.js +105 -0
- package/dist/src/__fixtures__/mock-storage-provider.js.map +1 -0
- package/dist/src/__fixtures__/slim-types.d.ts +50 -0
- package/dist/src/__fixtures__/slim-types.d.ts.map +1 -0
- package/dist/src/__fixtures__/slim-types.js +6 -0
- package/dist/src/__fixtures__/slim-types.js.map +1 -0
- package/dist/src/__fixtures__/tool-helpers.d.ts +8 -3
- package/dist/src/__fixtures__/tool-helpers.d.ts.map +1 -1
- package/dist/src/__fixtures__/tool-helpers.js +1 -1
- package/dist/src/__fixtures__/tool-helpers.js.map +1 -1
- package/dist/src/agent/__tests__/agent.hook.test.js +18 -18
- package/dist/src/agent/__tests__/agent.hook.test.js.map +1 -1
- package/dist/src/agent/__tests__/agent.test.js +124 -8
- package/dist/src/agent/__tests__/agent.test.js.map +1 -1
- package/dist/src/agent/__tests__/printer.test.js +5 -9
- package/dist/src/agent/__tests__/printer.test.js.map +1 -1
- package/dist/src/agent/__tests__/snapshot.test.d.ts +2 -0
- package/dist/src/agent/__tests__/snapshot.test.d.ts.map +1 -0
- package/dist/src/agent/__tests__/snapshot.test.js +249 -0
- package/dist/src/agent/__tests__/snapshot.test.js.map +1 -0
- package/dist/src/agent/__tests__/state.test.js +19 -0
- package/dist/src/agent/__tests__/state.test.js.map +1 -1
- package/dist/src/agent/agent.d.ts +19 -4
- package/dist/src/agent/agent.d.ts.map +1 -1
- package/dist/src/agent/agent.js +104 -34
- package/dist/src/agent/agent.js.map +1 -1
- package/dist/src/agent/printer.d.ts +4 -0
- package/dist/src/agent/printer.d.ts.map +1 -1
- package/dist/src/agent/printer.js +18 -6
- package/dist/src/agent/printer.js.map +1 -1
- package/dist/src/agent/snapshot.d.ts +132 -0
- package/dist/src/agent/snapshot.d.ts.map +1 -0
- package/dist/src/agent/snapshot.js +151 -0
- package/dist/src/agent/snapshot.js.map +1 -0
- package/dist/src/agent/state.d.ts +14 -1
- package/dist/src/agent/state.d.ts.map +1 -1
- package/dist/src/agent/state.js +21 -0
- package/dist/src/agent/state.js.map +1 -1
- package/dist/src/errors.d.ts +15 -0
- package/dist/src/errors.d.ts.map +1 -1
- package/dist/src/errors.js +18 -0
- package/dist/src/errors.js.map +1 -1
- package/dist/src/hooks/__tests__/events.test.js +102 -21
- package/dist/src/hooks/__tests__/events.test.js.map +1 -1
- package/dist/src/hooks/events.d.ts +156 -22
- package/dist/src/hooks/events.d.ts.map +1 -1
- package/dist/src/hooks/events.js +158 -18
- package/dist/src/hooks/events.js.map +1 -1
- package/dist/src/hooks/index.d.ts +12 -4
- package/dist/src/hooks/index.d.ts.map +1 -1
- package/dist/src/hooks/index.js +11 -3
- package/dist/src/hooks/index.js.map +1 -1
- package/dist/src/hooks/registry.d.ts +5 -5
- package/dist/src/hooks/registry.d.ts.map +1 -1
- package/dist/src/hooks/registry.js.map +1 -1
- package/dist/src/hooks/types.d.ts +5 -5
- package/dist/src/hooks/types.d.ts.map +1 -1
- package/dist/src/index.d.ts +4 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +4 -3
- package/dist/src/index.js.map +1 -1
- package/dist/src/models/__tests__/anthropic.test.js +31 -42
- package/dist/src/models/__tests__/anthropic.test.js.map +1 -1
- package/dist/src/models/__tests__/bedrock.test.js +70 -107
- package/dist/src/models/__tests__/bedrock.test.js.map +1 -1
- package/dist/src/models/__tests__/gemini.test.js +438 -141
- package/dist/src/models/__tests__/gemini.test.js.map +1 -1
- package/dist/src/models/__tests__/model.test.js +14 -13
- package/dist/src/models/__tests__/model.test.js.map +1 -1
- package/dist/src/models/__tests__/openai.test.js +73 -83
- package/dist/src/models/__tests__/openai.test.js.map +1 -1
- package/dist/src/models/gemini/adapters.d.ts +2 -1
- package/dist/src/models/gemini/adapters.d.ts.map +1 -1
- package/dist/src/models/gemini/adapters.js +97 -10
- package/dist/src/models/gemini/adapters.js.map +1 -1
- package/dist/src/models/gemini/model.d.ts.map +1 -1
- package/dist/src/models/gemini/model.js +37 -1
- package/dist/src/models/gemini/model.js.map +1 -1
- package/dist/src/models/gemini/types.d.ts +9 -1
- package/dist/src/models/gemini/types.d.ts.map +1 -1
- package/dist/src/models/model.d.ts.map +1 -1
- package/dist/src/models/model.js +4 -0
- package/dist/src/models/model.js.map +1 -1
- package/dist/src/models/streaming.d.ts +13 -0
- package/dist/src/models/streaming.d.ts.map +1 -1
- package/dist/src/models/streaming.js +17 -0
- package/dist/src/models/streaming.js.map +1 -1
- package/dist/src/multiagent/__tests__/nodes.test.d.ts +2 -0
- package/dist/src/multiagent/__tests__/nodes.test.d.ts.map +1 -0
- package/dist/src/multiagent/__tests__/nodes.test.js +98 -0
- package/dist/src/multiagent/__tests__/nodes.test.js.map +1 -0
- package/dist/src/multiagent/events.d.ts +24 -0
- package/dist/src/multiagent/events.d.ts.map +1 -0
- package/dist/src/multiagent/events.js +19 -0
- package/dist/src/multiagent/events.js.map +1 -0
- package/dist/src/multiagent/index.d.ts +11 -0
- package/dist/src/multiagent/index.d.ts.map +1 -0
- package/dist/src/multiagent/index.js +7 -0
- package/dist/src/multiagent/index.js.map +1 -0
- package/dist/src/multiagent/nodes.d.ts +75 -0
- package/dist/src/multiagent/nodes.d.ts.map +1 -0
- package/dist/src/multiagent/nodes.js +101 -0
- package/dist/src/multiagent/nodes.js.map +1 -0
- package/dist/src/multiagent/state.d.ts +55 -0
- package/dist/src/multiagent/state.d.ts.map +1 -0
- package/dist/src/multiagent/state.js +43 -0
- package/dist/src/multiagent/state.js.map +1 -0
- package/dist/src/multiagent/types.d.ts +5 -0
- package/dist/src/multiagent/types.d.ts.map +1 -0
- package/dist/src/multiagent/types.js +2 -0
- package/dist/src/multiagent/types.js.map +1 -0
- package/dist/src/registry/tool-registry.d.ts +2 -1
- package/dist/src/registry/tool-registry.d.ts.map +1 -1
- package/dist/src/registry/tool-registry.js +4 -2
- package/dist/src/registry/tool-registry.js.map +1 -1
- package/dist/src/session/__tests__/file-storage.test.node.d.ts +2 -0
- package/dist/src/session/__tests__/file-storage.test.node.d.ts.map +1 -0
- package/dist/src/session/__tests__/file-storage.test.node.js +218 -0
- package/dist/src/session/__tests__/file-storage.test.node.js.map +1 -0
- package/dist/src/session/__tests__/s3-storage.test.node.d.ts +2 -0
- package/dist/src/session/__tests__/s3-storage.test.node.d.ts.map +1 -0
- package/dist/src/session/__tests__/s3-storage.test.node.js +375 -0
- package/dist/src/session/__tests__/s3-storage.test.node.js.map +1 -0
- package/dist/src/session/__tests__/validation.test.d.ts +2 -0
- package/dist/src/session/__tests__/validation.test.d.ts.map +1 -0
- package/dist/src/session/__tests__/validation.test.js +20 -0
- package/dist/src/session/__tests__/validation.test.js.map +1 -0
- package/dist/src/session/file-storage.d.ts +79 -0
- package/dist/src/session/file-storage.d.ts.map +1 -0
- package/dist/src/session/file-storage.js +144 -0
- package/dist/src/session/file-storage.js.map +1 -0
- package/dist/src/session/index.d.ts +19 -0
- package/dist/src/session/index.d.ts.map +1 -0
- package/dist/src/session/index.js +18 -0
- package/dist/src/session/index.js.map +1 -0
- package/dist/src/session/s3-storage.d.ts +93 -0
- package/dist/src/session/s3-storage.d.ts.map +1 -0
- package/dist/src/session/s3-storage.js +150 -0
- package/dist/src/session/s3-storage.js.map +1 -0
- package/dist/src/session/storage.d.ts +91 -0
- package/dist/src/session/storage.d.ts.map +1 -0
- package/dist/src/session/storage.js +2 -0
- package/dist/src/session/storage.js.map +1 -0
- package/dist/src/session/types.d.ts +49 -0
- package/dist/src/session/types.d.ts.map +1 -0
- package/dist/src/session/types.js +2 -0
- package/dist/src/session/types.js.map +1 -0
- package/dist/src/session/validation.d.ts +10 -0
- package/dist/src/session/validation.d.ts.map +1 -0
- package/dist/src/session/validation.js +16 -0
- package/dist/src/session/validation.js.map +1 -0
- package/dist/src/structured-output/__tests__/context.test.d.ts +2 -0
- package/dist/src/structured-output/__tests__/context.test.d.ts.map +1 -0
- package/dist/src/structured-output/__tests__/context.test.js +201 -0
- package/dist/src/structured-output/__tests__/context.test.js.map +1 -0
- package/dist/src/structured-output/__tests__/exceptions.test.d.ts +2 -0
- package/dist/src/structured-output/__tests__/exceptions.test.d.ts.map +1 -0
- package/dist/src/structured-output/__tests__/exceptions.test.js +103 -0
- package/dist/src/structured-output/__tests__/exceptions.test.js.map +1 -0
- package/dist/src/structured-output/__tests__/tool.test.d.ts +2 -0
- package/dist/src/structured-output/__tests__/tool.test.d.ts.map +1 -0
- package/dist/src/structured-output/__tests__/tool.test.js +256 -0
- package/dist/src/structured-output/__tests__/tool.test.js.map +1 -0
- package/dist/src/structured-output/__tests__/utils.test.d.ts +2 -0
- package/dist/src/structured-output/__tests__/utils.test.d.ts.map +1 -0
- package/dist/src/structured-output/__tests__/utils.test.js +183 -0
- package/dist/src/structured-output/__tests__/utils.test.js.map +1 -0
- package/dist/src/structured-output/context.d.ts +91 -0
- package/dist/src/structured-output/context.d.ts.map +1 -0
- package/dist/src/structured-output/context.js +112 -0
- package/dist/src/structured-output/context.js.map +1 -0
- package/dist/src/structured-output/exceptions.d.ts +18 -0
- package/dist/src/structured-output/exceptions.d.ts.map +1 -0
- package/dist/src/structured-output/exceptions.js +28 -0
- package/dist/src/structured-output/exceptions.js.map +1 -0
- package/dist/src/structured-output/tool.d.ts +33 -0
- package/dist/src/structured-output/tool.d.ts.map +1 -0
- package/dist/src/structured-output/tool.js +73 -0
- package/dist/src/structured-output/tool.js.map +1 -0
- package/dist/src/structured-output/utils.d.ts +23 -0
- package/dist/src/structured-output/utils.d.ts.map +1 -0
- package/dist/src/structured-output/utils.js +104 -0
- package/dist/src/structured-output/utils.js.map +1 -0
- package/dist/src/tools/zod-tool.d.ts.map +1 -1
- package/dist/src/tools/zod-tool.js +2 -5
- package/dist/src/tools/zod-tool.js.map +1 -1
- package/dist/src/tsconfig.tsbuildinfo +1 -1
- package/dist/src/types/__tests__/media.test.js +216 -1
- package/dist/src/types/__tests__/media.test.js.map +1 -1
- package/dist/src/types/__tests__/messages.test.js +193 -4
- package/dist/src/types/__tests__/messages.test.js.map +1 -1
- package/dist/src/types/agent.d.ts +13 -7
- package/dist/src/types/agent.d.ts.map +1 -1
- package/dist/src/types/agent.js +8 -1
- package/dist/src/types/agent.js.map +1 -1
- package/dist/src/types/json.d.ts +61 -0
- package/dist/src/types/json.d.ts.map +1 -1
- package/dist/src/types/json.js +24 -0
- package/dist/src/types/json.js.map +1 -1
- package/dist/src/types/media.d.ts +84 -4
- package/dist/src/types/media.d.ts.map +1 -1
- package/dist/src/types/media.js +194 -0
- package/dist/src/types/media.js.map +1 -1
- package/dist/src/types/messages.d.ts +158 -9
- package/dist/src/types/messages.d.ts.map +1 -1
- package/dist/src/types/messages.js +242 -7
- package/dist/src/types/messages.js.map +1 -1
- package/dist/src/types/serializable.d.ts +31 -0
- package/dist/src/types/serializable.d.ts.map +1 -0
- package/dist/src/types/serializable.js +19 -0
- package/dist/src/types/serializable.js.map +1 -0
- package/dist/src/utils/zod.d.ts +11 -0
- package/dist/src/utils/zod.d.ts.map +1 -0
- package/dist/src/utils/zod.js +14 -0
- package/dist/src/utils/zod.js.map +1 -0
- package/dist/src/vended-tools/bash/__tests__/bash.test.node.d.ts +2 -0
- package/dist/src/vended-tools/bash/__tests__/bash.test.node.d.ts.map +1 -0
- package/dist/src/vended-tools/bash/__tests__/{bash.test.js → bash.test.node.js} +3 -4
- package/dist/src/vended-tools/bash/__tests__/bash.test.node.js.map +1 -0
- package/dist/src/vended-tools/file_editor/__tests__/file-editor.test.node.d.ts +2 -0
- package/dist/src/vended-tools/file_editor/__tests__/file-editor.test.node.d.ts.map +1 -0
- package/dist/src/vended-tools/file_editor/__tests__/{file-editor.test.js → file-editor.test.node.js} +1 -1
- package/dist/src/vended-tools/file_editor/__tests__/file-editor.test.node.js.map +1 -0
- package/package.json +7 -2
- package/dist/src/vended-tools/bash/__tests__/bash.test.d.ts +0 -2
- package/dist/src/vended-tools/bash/__tests__/bash.test.d.ts.map +0 -1
- package/dist/src/vended-tools/bash/__tests__/bash.test.js.map +0 -1
- package/dist/src/vended-tools/file_editor/__tests__/file-editor.test.d.ts +0 -2
- package/dist/src/vended-tools/file_editor/__tests__/file-editor.test.d.ts.map +0 -1
- package/dist/src/vended-tools/file_editor/__tests__/file-editor.test.js.map +0 -1
|
@@ -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 = [{
|
|
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
|
-
|
|
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
|
-
|
|
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 = [{
|
|
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 = [{
|
|
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 = [{
|
|
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 = [{
|
|
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 = [{
|
|
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 = [{
|
|
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 = [{
|
|
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 = [{
|
|
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 = [{
|
|
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 = [{
|
|
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 = [{
|
|
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 = [{
|
|
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 = [{
|
|
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 = [{
|
|
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 = [{
|
|
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 = [{
|
|
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 = [{
|
|
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 = [{
|
|
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 = [{
|
|
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 = [{
|
|
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 = [{
|
|
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: [
|
|
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: [
|
|
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: [
|
|
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: [
|
|
1470
|
-
},
|
|
1432
|
+
content: [new TextBlock('Result')],
|
|
1433
|
+
}),
|
|
1471
1434
|
],
|
|
1472
|
-
},
|
|
1435
|
+
}),
|
|
1473
1436
|
];
|
|
1474
1437
|
collectIterator(provider.stream(messages));
|
|
1475
1438
|
expect(mockConverseStreamCommand).toHaveBeenLastCalledWith({
|