@ai-sdk/amazon-bedrock 5.0.0-beta.44 → 5.0.0-beta.46
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/CHANGELOG.md +29 -0
- package/dist/anthropic/index.d.ts +10 -10
- package/dist/anthropic/index.js +58 -46
- package/dist/anthropic/index.js.map +1 -1
- package/dist/index.d.ts +25 -23
- package/dist/index.js +496 -436
- package/dist/index.js.map +1 -1
- package/docs/08-amazon-bedrock.mdx +80 -82
- package/package.json +5 -5
- package/src/amazon-bedrock-api-types.ts +224 -0
- package/src/{bedrock-chat-options.ts → amazon-bedrock-chat-language-model-options.ts} +7 -7
- package/src/{bedrock-chat-language-model.ts → amazon-bedrock-chat-language-model.ts} +217 -196
- package/src/{bedrock-embedding-options.ts → amazon-bedrock-embedding-model-options.ts} +1 -1
- package/src/{bedrock-embedding-model.ts → amazon-bedrock-embedding-model.ts} +34 -27
- package/src/{bedrock-error.ts → amazon-bedrock-error.ts} +1 -1
- package/src/{bedrock-event-stream-decoder.ts → amazon-bedrock-event-stream-decoder.ts} +1 -1
- package/src/{bedrock-event-stream-response-handler.ts → amazon-bedrock-event-stream-response-handler.ts} +6 -6
- package/src/{bedrock-image-model.ts → amazon-bedrock-image-model.ts} +43 -39
- package/src/amazon-bedrock-image-settings.ts +9 -0
- package/src/{bedrock-prepare-tools.ts → amazon-bedrock-prepare-tools.ts} +22 -18
- package/src/{bedrock-provider.ts → amazon-bedrock-provider.ts} +53 -46
- package/src/amazon-bedrock-reasoning-metadata.ts +10 -0
- package/src/{bedrock-sigv4-fetch.ts → amazon-bedrock-sigv4-fetch.ts} +5 -3
- package/src/anthropic/amazon-bedrock-anthropic-fetch.ts +104 -0
- package/src/anthropic/{bedrock-anthropic-options.ts → amazon-bedrock-anthropic-options.ts} +1 -1
- package/src/anthropic/{bedrock-anthropic-provider.ts → amazon-bedrock-anthropic-provider.ts} +22 -20
- package/src/anthropic/index.ts +19 -7
- package/src/{convert-bedrock-usage.ts → convert-amazon-bedrock-usage.ts} +4 -4
- package/src/{convert-to-bedrock-chat-messages.ts → convert-to-amazon-bedrock-chat-messages.ts} +146 -103
- package/src/index.ts +15 -8
- package/src/inject-fetch-headers.ts +1 -1
- package/src/{map-bedrock-finish-reason.ts → map-amazon-bedrock-finish-reason.ts} +4 -4
- package/src/reranking/{bedrock-reranking-api.ts → amazon-bedrock-reranking-api.ts} +3 -3
- package/src/reranking/{bedrock-reranking-options.ts → amazon-bedrock-reranking-model-options.ts} +1 -1
- package/src/reranking/{bedrock-reranking-model.ts → amazon-bedrock-reranking-model.ts} +32 -25
- package/src/anthropic/bedrock-anthropic-fetch.ts +0 -94
- package/src/bedrock-api-types.ts +0 -219
- package/src/bedrock-image-settings.ts +0 -6
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type {
|
|
2
2
|
JSONObject,
|
|
3
3
|
LanguageModelV4,
|
|
4
4
|
LanguageModelV4CallOptions,
|
|
@@ -13,9 +13,6 @@ import {
|
|
|
13
13
|
SharedV4Warning,
|
|
14
14
|
} from '@ai-sdk/provider';
|
|
15
15
|
import {
|
|
16
|
-
FetchFunction,
|
|
17
|
-
ParseResult,
|
|
18
|
-
Resolvable,
|
|
19
16
|
combineHeaders,
|
|
20
17
|
createJsonErrorResponseHandler,
|
|
21
18
|
createJsonResponseHandler,
|
|
@@ -28,39 +25,46 @@ import {
|
|
|
28
25
|
serializeModelOptions,
|
|
29
26
|
WORKFLOW_SERIALIZE,
|
|
30
27
|
WORKFLOW_DESERIALIZE,
|
|
28
|
+
type FetchFunction,
|
|
29
|
+
type ParseResult,
|
|
30
|
+
type Resolvable,
|
|
31
31
|
} from '@ai-sdk/provider-utils';
|
|
32
32
|
import { getModelCapabilities } from '@ai-sdk/anthropic/internal';
|
|
33
33
|
import { z } from 'zod/v4';
|
|
34
34
|
import {
|
|
35
35
|
BEDROCK_STOP_REASONS,
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
} from './bedrock-api-types';
|
|
36
|
+
type AmazonBedrockConverseInput,
|
|
37
|
+
type AmazonBedrockStopReason,
|
|
38
|
+
} from './amazon-bedrock-api-types';
|
|
39
|
+
import {
|
|
40
|
+
amazonBedrockLanguageModelChatOptions,
|
|
41
|
+
type AmazonBedrockLanguageModelChatOptions,
|
|
42
|
+
type AmazonBedrockChatModelId,
|
|
43
|
+
} from './amazon-bedrock-chat-language-model-options';
|
|
44
|
+
import { AmazonBedrockErrorSchema } from './amazon-bedrock-error';
|
|
45
|
+
import { createAmazonBedrockEventStreamResponseHandler } from './amazon-bedrock-event-stream-response-handler';
|
|
46
|
+
import { prepareTools } from './amazon-bedrock-prepare-tools';
|
|
39
47
|
import {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
} from './bedrock-chat-
|
|
44
|
-
import {
|
|
45
|
-
import { createBedrockEventStreamResponseHandler } from './bedrock-event-stream-response-handler';
|
|
46
|
-
import { prepareTools } from './bedrock-prepare-tools';
|
|
47
|
-
import { BedrockUsage, convertBedrockUsage } from './convert-bedrock-usage';
|
|
48
|
-
import { convertToBedrockChatMessages } from './convert-to-bedrock-chat-messages';
|
|
49
|
-
import { mapBedrockFinishReason } from './map-bedrock-finish-reason';
|
|
48
|
+
convertAmazonBedrockUsage,
|
|
49
|
+
type AmazonBedrockUsage,
|
|
50
|
+
} from './convert-amazon-bedrock-usage';
|
|
51
|
+
import { convertToAmazonBedrockChatMessages } from './convert-to-amazon-bedrock-chat-messages';
|
|
52
|
+
import { mapAmazonBedrockFinishReason } from './map-amazon-bedrock-finish-reason';
|
|
50
53
|
import { isMistralModel, normalizeToolCallId } from './normalize-tool-call-id';
|
|
54
|
+
import type { AmazonBedrockReasoningMetadata } from './amazon-bedrock-reasoning-metadata';
|
|
51
55
|
|
|
52
|
-
type
|
|
56
|
+
type AmazonBedrockChatConfig = {
|
|
53
57
|
baseUrl: () => string;
|
|
54
58
|
headers?: Resolvable<Record<string, string | undefined>>;
|
|
55
59
|
fetch?: FetchFunction;
|
|
56
60
|
generateId: () => string;
|
|
57
61
|
};
|
|
58
62
|
|
|
59
|
-
export class
|
|
63
|
+
export class AmazonBedrockChatLanguageModel implements LanguageModelV4 {
|
|
60
64
|
readonly specificationVersion = 'v4';
|
|
61
65
|
readonly provider = 'amazon-bedrock';
|
|
62
66
|
|
|
63
|
-
static [WORKFLOW_SERIALIZE](model:
|
|
67
|
+
static [WORKFLOW_SERIALIZE](model: AmazonBedrockChatLanguageModel) {
|
|
64
68
|
return serializeModelOptions({
|
|
65
69
|
modelId: model.modelId,
|
|
66
70
|
config: model.config,
|
|
@@ -69,14 +73,14 @@ export class BedrockChatLanguageModel implements LanguageModelV4 {
|
|
|
69
73
|
|
|
70
74
|
static [WORKFLOW_DESERIALIZE](options: {
|
|
71
75
|
modelId: string;
|
|
72
|
-
config:
|
|
76
|
+
config: AmazonBedrockChatConfig;
|
|
73
77
|
}) {
|
|
74
|
-
return new
|
|
78
|
+
return new AmazonBedrockChatLanguageModel(options.modelId, options.config);
|
|
75
79
|
}
|
|
76
80
|
|
|
77
81
|
constructor(
|
|
78
|
-
readonly modelId:
|
|
79
|
-
private readonly config:
|
|
82
|
+
readonly modelId: AmazonBedrockChatModelId,
|
|
83
|
+
private readonly config: AmazonBedrockChatConfig,
|
|
80
84
|
) {}
|
|
81
85
|
|
|
82
86
|
private async getArgs({
|
|
@@ -95,18 +99,25 @@ export class BedrockChatLanguageModel implements LanguageModelV4 {
|
|
|
95
99
|
reasoning,
|
|
96
100
|
providerOptions,
|
|
97
101
|
}: LanguageModelV4CallOptions): Promise<{
|
|
98
|
-
command:
|
|
102
|
+
command: AmazonBedrockConverseInput;
|
|
99
103
|
warnings: SharedV4Warning[];
|
|
100
104
|
usesJsonResponseTool: boolean;
|
|
101
105
|
betas: Set<string>;
|
|
102
106
|
}> {
|
|
103
|
-
// Parse provider options
|
|
104
|
-
|
|
107
|
+
// Parse provider options. Prefer `amazonBedrock`; fall back to legacy
|
|
108
|
+
// `bedrock` key for backward compatibility.
|
|
109
|
+
let amazonBedrockOptions =
|
|
110
|
+
(await parseProviderOptions({
|
|
111
|
+
provider: 'amazonBedrock',
|
|
112
|
+
providerOptions,
|
|
113
|
+
schema: amazonBedrockLanguageModelChatOptions,
|
|
114
|
+
})) ??
|
|
105
115
|
(await parseProviderOptions({
|
|
106
116
|
provider: 'bedrock',
|
|
107
117
|
providerOptions,
|
|
108
|
-
schema:
|
|
109
|
-
})) ??
|
|
118
|
+
schema: amazonBedrockLanguageModelChatOptions,
|
|
119
|
+
})) ??
|
|
120
|
+
{};
|
|
110
121
|
|
|
111
122
|
const warnings: SharedV4Warning[] = [];
|
|
112
123
|
|
|
@@ -162,17 +173,17 @@ export class BedrockChatLanguageModel implements LanguageModelV4 {
|
|
|
162
173
|
const isAnthropicModel = this.modelId.includes('anthropic');
|
|
163
174
|
const isOpenAIModel = this.modelId.startsWith('openai.');
|
|
164
175
|
|
|
165
|
-
|
|
176
|
+
amazonBedrockOptions = resolveAmazonBedrockReasoningConfig({
|
|
166
177
|
reasoning,
|
|
167
|
-
|
|
178
|
+
amazonBedrockOptions,
|
|
168
179
|
warnings,
|
|
169
180
|
isAnthropicModel,
|
|
170
181
|
modelId: this.modelId,
|
|
171
182
|
});
|
|
172
183
|
|
|
173
184
|
const isThinkingEnabled =
|
|
174
|
-
|
|
175
|
-
|
|
185
|
+
amazonBedrockOptions.reasoningConfig?.type === 'enabled' ||
|
|
186
|
+
amazonBedrockOptions.reasoningConfig?.type === 'adaptive';
|
|
176
187
|
|
|
177
188
|
const { supportsStructuredOutput: modelSupportsStructuredOutput } =
|
|
178
189
|
getModelCapabilities(this.modelId);
|
|
@@ -206,33 +217,33 @@ export class BedrockChatLanguageModel implements LanguageModelV4 {
|
|
|
206
217
|
warnings.push(...toolWarnings);
|
|
207
218
|
|
|
208
219
|
if (additionalTools) {
|
|
209
|
-
|
|
210
|
-
...
|
|
220
|
+
amazonBedrockOptions.additionalModelRequestFields = {
|
|
221
|
+
...amazonBedrockOptions.additionalModelRequestFields,
|
|
211
222
|
...additionalTools,
|
|
212
223
|
};
|
|
213
224
|
}
|
|
214
225
|
|
|
215
|
-
if (betas.size > 0 ||
|
|
216
|
-
const existingBetas =
|
|
226
|
+
if (betas.size > 0 || amazonBedrockOptions.anthropicBeta) {
|
|
227
|
+
const existingBetas = amazonBedrockOptions.anthropicBeta ?? [];
|
|
217
228
|
const mergedBetas =
|
|
218
229
|
betas.size > 0
|
|
219
230
|
? [...existingBetas, ...Array.from(betas)]
|
|
220
231
|
: existingBetas;
|
|
221
232
|
|
|
222
|
-
|
|
223
|
-
...
|
|
233
|
+
amazonBedrockOptions.additionalModelRequestFields = {
|
|
234
|
+
...amazonBedrockOptions.additionalModelRequestFields,
|
|
224
235
|
anthropic_beta: mergedBetas,
|
|
225
236
|
};
|
|
226
237
|
}
|
|
227
238
|
|
|
228
|
-
const thinkingType =
|
|
239
|
+
const thinkingType = amazonBedrockOptions.reasoningConfig?.type;
|
|
229
240
|
const thinkingBudget =
|
|
230
241
|
thinkingType === 'enabled'
|
|
231
|
-
?
|
|
242
|
+
? amazonBedrockOptions.reasoningConfig?.budgetTokens
|
|
232
243
|
: undefined;
|
|
233
244
|
const thinkingDisplay =
|
|
234
245
|
thinkingType === 'adaptive'
|
|
235
|
-
?
|
|
246
|
+
? amazonBedrockOptions.reasoningConfig?.display
|
|
236
247
|
: undefined;
|
|
237
248
|
const isAnthropicThinkingEnabled = isAnthropicModel && isThinkingEnabled;
|
|
238
249
|
|
|
@@ -251,16 +262,16 @@ export class BedrockChatLanguageModel implements LanguageModelV4 {
|
|
|
251
262
|
} else {
|
|
252
263
|
inferenceConfig.maxTokens = thinkingBudget + 4096; // Default + thinking budget maxTokens = 4096, TODO update default in v5
|
|
253
264
|
}
|
|
254
|
-
|
|
255
|
-
...
|
|
265
|
+
amazonBedrockOptions.additionalModelRequestFields = {
|
|
266
|
+
...amazonBedrockOptions.additionalModelRequestFields,
|
|
256
267
|
thinking: {
|
|
257
268
|
type: 'enabled',
|
|
258
269
|
budget_tokens: thinkingBudget,
|
|
259
270
|
},
|
|
260
271
|
};
|
|
261
272
|
} else if (thinkingType === 'adaptive') {
|
|
262
|
-
|
|
263
|
-
...
|
|
273
|
+
amazonBedrockOptions.additionalModelRequestFields = {
|
|
274
|
+
...amazonBedrockOptions.additionalModelRequestFields,
|
|
264
275
|
thinking: {
|
|
265
276
|
type: 'adaptive',
|
|
266
277
|
...(thinkingDisplay != null && { display: thinkingDisplay }),
|
|
@@ -268,7 +279,7 @@ export class BedrockChatLanguageModel implements LanguageModelV4 {
|
|
|
268
279
|
};
|
|
269
280
|
}
|
|
270
281
|
} else if (!isAnthropicModel) {
|
|
271
|
-
if (
|
|
282
|
+
if (amazonBedrockOptions.reasoningConfig?.budgetTokens != null) {
|
|
272
283
|
warnings.push({
|
|
273
284
|
type: 'unsupported',
|
|
274
285
|
feature: 'budgetTokens',
|
|
@@ -287,27 +298,27 @@ export class BedrockChatLanguageModel implements LanguageModelV4 {
|
|
|
287
298
|
}
|
|
288
299
|
|
|
289
300
|
const maxReasoningEffort =
|
|
290
|
-
|
|
301
|
+
amazonBedrockOptions.reasoningConfig?.maxReasoningEffort;
|
|
291
302
|
|
|
292
303
|
if (maxReasoningEffort != null) {
|
|
293
304
|
if (isAnthropicModel) {
|
|
294
|
-
|
|
295
|
-
...
|
|
305
|
+
amazonBedrockOptions.additionalModelRequestFields = {
|
|
306
|
+
...amazonBedrockOptions.additionalModelRequestFields,
|
|
296
307
|
output_config: {
|
|
297
|
-
...
|
|
308
|
+
...amazonBedrockOptions.additionalModelRequestFields?.output_config,
|
|
298
309
|
effort: maxReasoningEffort,
|
|
299
310
|
},
|
|
300
311
|
};
|
|
301
312
|
} else if (isOpenAIModel) {
|
|
302
313
|
// OpenAI models on Bedrock expect `reasoning_effort` as a flat value
|
|
303
|
-
|
|
304
|
-
...
|
|
314
|
+
amazonBedrockOptions.additionalModelRequestFields = {
|
|
315
|
+
...amazonBedrockOptions.additionalModelRequestFields,
|
|
305
316
|
reasoning_effort: maxReasoningEffort,
|
|
306
317
|
};
|
|
307
318
|
} else {
|
|
308
319
|
// other models (such as Nova 2) use reasoningConfig format
|
|
309
|
-
|
|
310
|
-
...
|
|
320
|
+
amazonBedrockOptions.additionalModelRequestFields = {
|
|
321
|
+
...amazonBedrockOptions.additionalModelRequestFields,
|
|
311
322
|
reasoningConfig: {
|
|
312
323
|
...(thinkingType != null &&
|
|
313
324
|
thinkingType !== 'adaptive' && { type: thinkingType }),
|
|
@@ -319,10 +330,10 @@ export class BedrockChatLanguageModel implements LanguageModelV4 {
|
|
|
319
330
|
}
|
|
320
331
|
|
|
321
332
|
if (useNativeStructuredOutput) {
|
|
322
|
-
|
|
323
|
-
...
|
|
333
|
+
amazonBedrockOptions.additionalModelRequestFields = {
|
|
334
|
+
...amazonBedrockOptions.additionalModelRequestFields,
|
|
324
335
|
output_config: {
|
|
325
|
-
...
|
|
336
|
+
...amazonBedrockOptions.additionalModelRequestFields?.output_config,
|
|
326
337
|
format: {
|
|
327
338
|
type: 'json_schema',
|
|
328
339
|
schema: responseFormat!.schema,
|
|
@@ -399,18 +410,18 @@ export class BedrockChatLanguageModel implements LanguageModelV4 {
|
|
|
399
410
|
}
|
|
400
411
|
|
|
401
412
|
const isMistral = isMistralModel(this.modelId);
|
|
402
|
-
const { system, messages } = await
|
|
413
|
+
const { system, messages } = await convertToAmazonBedrockChatMessages(
|
|
403
414
|
filteredPrompt,
|
|
404
415
|
isMistral,
|
|
405
416
|
);
|
|
406
417
|
|
|
407
|
-
// Filter out reasoningConfig from
|
|
418
|
+
// Filter out reasoningConfig from amazonBedrock provider options to prevent sending it to Bedrock API
|
|
408
419
|
const {
|
|
409
420
|
reasoningConfig: _,
|
|
410
421
|
additionalModelRequestFields: __,
|
|
411
422
|
serviceTier: ___,
|
|
412
|
-
...
|
|
413
|
-
} = providerOptions?.bedrock
|
|
423
|
+
...filteredAmazonBedrockOptions
|
|
424
|
+
} = providerOptions?.amazonBedrock ?? providerOptions?.bedrock ?? {};
|
|
414
425
|
|
|
415
426
|
const additionalModelResponseFieldPaths = isAnthropicModel
|
|
416
427
|
? ['/delta/stop_sequence']
|
|
@@ -421,19 +432,19 @@ export class BedrockChatLanguageModel implements LanguageModelV4 {
|
|
|
421
432
|
system,
|
|
422
433
|
messages,
|
|
423
434
|
additionalModelRequestFields:
|
|
424
|
-
|
|
435
|
+
amazonBedrockOptions.additionalModelRequestFields,
|
|
425
436
|
...(additionalModelResponseFieldPaths && {
|
|
426
437
|
additionalModelResponseFieldPaths,
|
|
427
438
|
}),
|
|
428
439
|
...(Object.keys(inferenceConfig).length > 0 && {
|
|
429
440
|
inferenceConfig,
|
|
430
441
|
}),
|
|
431
|
-
...(
|
|
442
|
+
...(amazonBedrockOptions.serviceTier != null && {
|
|
432
443
|
serviceTier: {
|
|
433
|
-
type:
|
|
444
|
+
type: amazonBedrockOptions.serviceTier,
|
|
434
445
|
},
|
|
435
446
|
}),
|
|
436
|
-
...
|
|
447
|
+
...filteredAmazonBedrockOptions,
|
|
437
448
|
...(toolConfig.tools !== undefined && toolConfig.tools.length > 0
|
|
438
449
|
? { toolConfig }
|
|
439
450
|
: {}),
|
|
@@ -474,11 +485,11 @@ export class BedrockChatLanguageModel implements LanguageModelV4 {
|
|
|
474
485
|
headers: await this.getHeaders({ headers: options.headers }),
|
|
475
486
|
body: args,
|
|
476
487
|
failedResponseHandler: createJsonErrorResponseHandler({
|
|
477
|
-
errorSchema:
|
|
488
|
+
errorSchema: AmazonBedrockErrorSchema,
|
|
478
489
|
errorToMessage: error => `${error.message ?? 'Unknown error'}`,
|
|
479
490
|
}),
|
|
480
491
|
successfulResponseHandler: createJsonResponseHandler(
|
|
481
|
-
|
|
492
|
+
AmazonBedrockResponseSchema,
|
|
482
493
|
),
|
|
483
494
|
abortSignal: options.abortSignal,
|
|
484
495
|
fetch: this.config.fetch,
|
|
@@ -503,23 +514,26 @@ export class BedrockChatLanguageModel implements LanguageModelV4 {
|
|
|
503
514
|
};
|
|
504
515
|
|
|
505
516
|
if (part.reasoningContent.reasoningText.signature) {
|
|
517
|
+
const reasoningPayload: AmazonBedrockReasoningMetadata = {
|
|
518
|
+
signature: part.reasoningContent.reasoningText.signature,
|
|
519
|
+
};
|
|
506
520
|
reasoning.providerMetadata = {
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
} satisfies BedrockReasoningMetadata,
|
|
521
|
+
amazonBedrock: reasoningPayload,
|
|
522
|
+
bedrock: reasoningPayload,
|
|
510
523
|
};
|
|
511
524
|
}
|
|
512
525
|
|
|
513
526
|
content.push(reasoning);
|
|
514
527
|
} else if ('redactedReasoning' in part.reasoningContent) {
|
|
528
|
+
const redactedPayload: AmazonBedrockReasoningMetadata = {
|
|
529
|
+
redactedData: part.reasoningContent.redactedReasoning.data ?? '',
|
|
530
|
+
};
|
|
515
531
|
content.push({
|
|
516
532
|
type: 'reasoning',
|
|
517
533
|
text: '',
|
|
518
534
|
providerMetadata: {
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
part.reasoningContent.redactedReasoning.data ?? '',
|
|
522
|
-
} satisfies BedrockReasoningMetadata,
|
|
535
|
+
amazonBedrock: redactedPayload,
|
|
536
|
+
bedrock: redactedPayload,
|
|
523
537
|
},
|
|
524
538
|
});
|
|
525
539
|
}
|
|
@@ -555,7 +569,7 @@ export class BedrockChatLanguageModel implements LanguageModelV4 {
|
|
|
555
569
|
const stopSequence =
|
|
556
570
|
response.additionalModelResponseFields?.delta?.stop_sequence ?? null;
|
|
557
571
|
|
|
558
|
-
const
|
|
572
|
+
const providerMetadataPayload =
|
|
559
573
|
response.trace ||
|
|
560
574
|
response.usage ||
|
|
561
575
|
response.performanceConfig ||
|
|
@@ -563,43 +577,48 @@ export class BedrockChatLanguageModel implements LanguageModelV4 {
|
|
|
563
577
|
isJsonResponseFromTool ||
|
|
564
578
|
stopSequence
|
|
565
579
|
? {
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
usage
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
stopSequence,
|
|
589
|
-
},
|
|
580
|
+
...(response.trace && typeof response.trace === 'object'
|
|
581
|
+
? { trace: response.trace as JSONObject }
|
|
582
|
+
: {}),
|
|
583
|
+
...(response.performanceConfig && {
|
|
584
|
+
performanceConfig: response.performanceConfig,
|
|
585
|
+
}),
|
|
586
|
+
...(response.serviceTier && {
|
|
587
|
+
serviceTier: response.serviceTier,
|
|
588
|
+
}),
|
|
589
|
+
...((response.usage?.cacheWriteInputTokens != null ||
|
|
590
|
+
response.usage?.cacheDetails != null) && {
|
|
591
|
+
usage: {
|
|
592
|
+
...(response.usage.cacheWriteInputTokens != null && {
|
|
593
|
+
cacheWriteInputTokens: response.usage.cacheWriteInputTokens,
|
|
594
|
+
}),
|
|
595
|
+
...(response.usage.cacheDetails != null && {
|
|
596
|
+
cacheDetails: response.usage.cacheDetails,
|
|
597
|
+
}),
|
|
598
|
+
},
|
|
599
|
+
}),
|
|
600
|
+
...(isJsonResponseFromTool && { isJsonResponseFromTool: true }),
|
|
601
|
+
stopSequence,
|
|
590
602
|
}
|
|
591
603
|
: undefined;
|
|
592
604
|
|
|
605
|
+
const providerMetadata = providerMetadataPayload
|
|
606
|
+
? {
|
|
607
|
+
amazonBedrock: providerMetadataPayload,
|
|
608
|
+
bedrock: providerMetadataPayload,
|
|
609
|
+
}
|
|
610
|
+
: undefined;
|
|
611
|
+
|
|
593
612
|
return {
|
|
594
613
|
content,
|
|
595
614
|
finishReason: {
|
|
596
|
-
unified:
|
|
597
|
-
response.stopReason as
|
|
615
|
+
unified: mapAmazonBedrockFinishReason(
|
|
616
|
+
response.stopReason as AmazonBedrockStopReason,
|
|
598
617
|
isJsonResponseFromTool,
|
|
599
618
|
),
|
|
600
619
|
raw: response.stopReason ?? undefined,
|
|
601
620
|
},
|
|
602
|
-
usage:
|
|
621
|
+
usage: convertAmazonBedrockUsage(response.usage),
|
|
603
622
|
response: {
|
|
604
623
|
id: responseHeaders?.['x-amzn-requestid'] ?? undefined,
|
|
605
624
|
timestamp:
|
|
@@ -631,11 +650,12 @@ export class BedrockChatLanguageModel implements LanguageModelV4 {
|
|
|
631
650
|
headers: await this.getHeaders({ headers: options.headers }),
|
|
632
651
|
body: args,
|
|
633
652
|
failedResponseHandler: createJsonErrorResponseHandler({
|
|
634
|
-
errorSchema:
|
|
653
|
+
errorSchema: AmazonBedrockErrorSchema,
|
|
635
654
|
errorToMessage: error => `${error.type}: ${error.message}`,
|
|
636
655
|
}),
|
|
637
|
-
successfulResponseHandler:
|
|
638
|
-
|
|
656
|
+
successfulResponseHandler: createAmazonBedrockEventStreamResponseHandler(
|
|
657
|
+
AmazonBedrockStreamSchema,
|
|
658
|
+
),
|
|
639
659
|
abortSignal: options.abortSignal,
|
|
640
660
|
fetch: this.config.fetch,
|
|
641
661
|
});
|
|
@@ -644,7 +664,7 @@ export class BedrockChatLanguageModel implements LanguageModelV4 {
|
|
|
644
664
|
unified: 'other',
|
|
645
665
|
raw: undefined,
|
|
646
666
|
};
|
|
647
|
-
let usage:
|
|
667
|
+
let usage: AmazonBedrockUsage | undefined = undefined;
|
|
648
668
|
let providerMetadata: SharedV4ProviderMetadata | undefined = undefined;
|
|
649
669
|
let isJsonResponseFromTool = false;
|
|
650
670
|
let stopSequence: string | null = null;
|
|
@@ -664,7 +684,7 @@ export class BedrockChatLanguageModel implements LanguageModelV4 {
|
|
|
664
684
|
return {
|
|
665
685
|
stream: response.pipeThrough(
|
|
666
686
|
new TransformStream<
|
|
667
|
-
ParseResult<z.infer<typeof
|
|
687
|
+
ParseResult<z.infer<typeof AmazonBedrockStreamSchema>>,
|
|
668
688
|
LanguageModelV4StreamPart
|
|
669
689
|
>({
|
|
670
690
|
start(controller) {
|
|
@@ -681,9 +701,9 @@ export class BedrockChatLanguageModel implements LanguageModelV4 {
|
|
|
681
701
|
},
|
|
682
702
|
|
|
683
703
|
transform(chunk, controller) {
|
|
684
|
-
function enqueueError(
|
|
704
|
+
function enqueueError(amazonBedrockError: Record<string, any>) {
|
|
685
705
|
finishReason = { unified: 'error', raw: undefined };
|
|
686
|
-
controller.enqueue({ type: 'error', error:
|
|
706
|
+
controller.enqueue({ type: 'error', error: amazonBedrockError });
|
|
687
707
|
}
|
|
688
708
|
|
|
689
709
|
// Emit raw chunk if requested (before anything else)
|
|
@@ -719,8 +739,8 @@ export class BedrockChatLanguageModel implements LanguageModelV4 {
|
|
|
719
739
|
|
|
720
740
|
if (value.messageStop) {
|
|
721
741
|
finishReason = {
|
|
722
|
-
unified:
|
|
723
|
-
value.messageStop.stopReason as
|
|
742
|
+
unified: mapAmazonBedrockFinishReason(
|
|
743
|
+
value.messageStop.stopReason as AmazonBedrockStopReason,
|
|
724
744
|
isJsonResponseFromTool,
|
|
725
745
|
),
|
|
726
746
|
raw: value.messageStop.stopReason ?? undefined,
|
|
@@ -764,17 +784,19 @@ export class BedrockChatLanguageModel implements LanguageModelV4 {
|
|
|
764
784
|
value.metadata.performanceConfig ||
|
|
765
785
|
value.metadata.serviceTier
|
|
766
786
|
) {
|
|
787
|
+
const metadataPayload = {
|
|
788
|
+
...cacheUsage,
|
|
789
|
+
...trace,
|
|
790
|
+
...(value.metadata.performanceConfig && {
|
|
791
|
+
performanceConfig: value.metadata.performanceConfig,
|
|
792
|
+
}),
|
|
793
|
+
...(value.metadata.serviceTier && {
|
|
794
|
+
serviceTier: value.metadata.serviceTier,
|
|
795
|
+
}),
|
|
796
|
+
};
|
|
767
797
|
providerMetadata = {
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
...trace,
|
|
771
|
-
...(value.metadata.performanceConfig && {
|
|
772
|
-
performanceConfig: value.metadata.performanceConfig,
|
|
773
|
-
}),
|
|
774
|
-
...(value.metadata.serviceTier && {
|
|
775
|
-
serviceTier: value.metadata.serviceTier,
|
|
776
|
-
}),
|
|
777
|
-
},
|
|
798
|
+
amazonBedrock: metadataPayload,
|
|
799
|
+
bedrock: metadataPayload,
|
|
778
800
|
};
|
|
779
801
|
}
|
|
780
802
|
}
|
|
@@ -901,16 +923,20 @@ export class BedrockChatLanguageModel implements LanguageModelV4 {
|
|
|
901
923
|
id: String(blockIndex),
|
|
902
924
|
});
|
|
903
925
|
}
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
926
|
+
{
|
|
927
|
+
const signaturePayload: AmazonBedrockReasoningMetadata = {
|
|
928
|
+
signature: reasoningContent.signature,
|
|
929
|
+
};
|
|
930
|
+
controller.enqueue({
|
|
931
|
+
type: 'reasoning-delta',
|
|
932
|
+
id: String(blockIndex),
|
|
933
|
+
delta: '',
|
|
934
|
+
providerMetadata: {
|
|
935
|
+
amazonBedrock: signaturePayload,
|
|
936
|
+
bedrock: signaturePayload,
|
|
937
|
+
},
|
|
938
|
+
});
|
|
939
|
+
}
|
|
914
940
|
} else if ('data' in reasoningContent && reasoningContent.data) {
|
|
915
941
|
if (contentBlocks[blockIndex] == null) {
|
|
916
942
|
contentBlocks[blockIndex] = { type: 'reasoning' };
|
|
@@ -919,16 +945,20 @@ export class BedrockChatLanguageModel implements LanguageModelV4 {
|
|
|
919
945
|
id: String(blockIndex),
|
|
920
946
|
});
|
|
921
947
|
}
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
948
|
+
{
|
|
949
|
+
const redactedPayload: AmazonBedrockReasoningMetadata = {
|
|
950
|
+
redactedData: reasoningContent.data,
|
|
951
|
+
};
|
|
952
|
+
controller.enqueue({
|
|
953
|
+
type: 'reasoning-delta',
|
|
954
|
+
id: String(blockIndex),
|
|
955
|
+
delta: '',
|
|
956
|
+
providerMetadata: {
|
|
957
|
+
amazonBedrock: redactedPayload,
|
|
958
|
+
bedrock: redactedPayload,
|
|
959
|
+
},
|
|
960
|
+
});
|
|
961
|
+
}
|
|
932
962
|
}
|
|
933
963
|
}
|
|
934
964
|
|
|
@@ -989,30 +1019,25 @@ export class BedrockChatLanguageModel implements LanguageModelV4 {
|
|
|
989
1019
|
flush(controller) {
|
|
990
1020
|
// Update provider metadata with isJsonResponseFromTool and stopSequence if needed
|
|
991
1021
|
if (isJsonResponseFromTool || stopSequence != null) {
|
|
992
|
-
|
|
993
|
-
providerMetadata
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
providerMetadata
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
}),
|
|
1006
|
-
stopSequence,
|
|
1007
|
-
},
|
|
1008
|
-
};
|
|
1009
|
-
}
|
|
1022
|
+
const updatePayload = {
|
|
1023
|
+
...(providerMetadata?.amazonBedrock ??
|
|
1024
|
+
providerMetadata?.bedrock),
|
|
1025
|
+
...(isJsonResponseFromTool && {
|
|
1026
|
+
isJsonResponseFromTool: true,
|
|
1027
|
+
}),
|
|
1028
|
+
stopSequence,
|
|
1029
|
+
};
|
|
1030
|
+
providerMetadata = {
|
|
1031
|
+
...providerMetadata,
|
|
1032
|
+
amazonBedrock: updatePayload,
|
|
1033
|
+
bedrock: updatePayload,
|
|
1034
|
+
};
|
|
1010
1035
|
}
|
|
1011
1036
|
|
|
1012
1037
|
controller.enqueue({
|
|
1013
1038
|
type: 'finish',
|
|
1014
1039
|
finishReason,
|
|
1015
|
-
usage:
|
|
1040
|
+
usage: convertAmazonBedrockUsage(usage),
|
|
1016
1041
|
...(providerMetadata && { providerMetadata }),
|
|
1017
1042
|
});
|
|
1018
1043
|
},
|
|
@@ -1029,12 +1054,12 @@ export class BedrockChatLanguageModel implements LanguageModelV4 {
|
|
|
1029
1054
|
}
|
|
1030
1055
|
}
|
|
1031
1056
|
|
|
1032
|
-
const
|
|
1057
|
+
const AmazonBedrockStopReasonSchema = z.union([
|
|
1033
1058
|
z.enum(BEDROCK_STOP_REASONS),
|
|
1034
1059
|
z.string(),
|
|
1035
1060
|
]);
|
|
1036
1061
|
|
|
1037
|
-
const
|
|
1062
|
+
const AmazonBedrockAdditionalModelResponseFieldsSchema = z
|
|
1038
1063
|
.object({
|
|
1039
1064
|
delta: z
|
|
1040
1065
|
.object({
|
|
@@ -1044,24 +1069,24 @@ const BedrockAdditionalModelResponseFieldsSchema = z
|
|
|
1044
1069
|
})
|
|
1045
1070
|
.catchall(z.unknown());
|
|
1046
1071
|
|
|
1047
|
-
const
|
|
1072
|
+
const AmazonBedrockToolUseSchema = z.object({
|
|
1048
1073
|
toolUseId: z.string(),
|
|
1049
1074
|
name: z.string(),
|
|
1050
1075
|
input: z.unknown(),
|
|
1051
1076
|
});
|
|
1052
1077
|
|
|
1053
|
-
const
|
|
1078
|
+
const AmazonBedrockReasoningTextSchema = z.object({
|
|
1054
1079
|
signature: z.string().nullish(),
|
|
1055
1080
|
text: z.string(),
|
|
1056
1081
|
});
|
|
1057
1082
|
|
|
1058
|
-
const
|
|
1083
|
+
const AmazonBedrockRedactedReasoningSchema = z.object({
|
|
1059
1084
|
data: z.string(),
|
|
1060
1085
|
});
|
|
1061
1086
|
|
|
1062
1087
|
// limited version of the schema, focused on what is needed for the implementation
|
|
1063
1088
|
// this approach limits breakages when the API changes and increases efficiency
|
|
1064
|
-
const
|
|
1089
|
+
const AmazonBedrockResponseSchema = z.object({
|
|
1065
1090
|
metrics: z
|
|
1066
1091
|
.object({
|
|
1067
1092
|
latencyMs: z.number(),
|
|
@@ -1072,14 +1097,14 @@ const BedrockResponseSchema = z.object({
|
|
|
1072
1097
|
content: z.array(
|
|
1073
1098
|
z.object({
|
|
1074
1099
|
text: z.string().nullish(),
|
|
1075
|
-
toolUse:
|
|
1100
|
+
toolUse: AmazonBedrockToolUseSchema.nullish(),
|
|
1076
1101
|
reasoningContent: z
|
|
1077
1102
|
.union([
|
|
1078
1103
|
z.object({
|
|
1079
|
-
reasoningText:
|
|
1104
|
+
reasoningText: AmazonBedrockReasoningTextSchema,
|
|
1080
1105
|
}),
|
|
1081
1106
|
z.object({
|
|
1082
|
-
redactedReasoning:
|
|
1107
|
+
redactedReasoning: AmazonBedrockRedactedReasoningSchema,
|
|
1083
1108
|
}),
|
|
1084
1109
|
])
|
|
1085
1110
|
.nullish(),
|
|
@@ -1088,9 +1113,9 @@ const BedrockResponseSchema = z.object({
|
|
|
1088
1113
|
role: z.string(),
|
|
1089
1114
|
}),
|
|
1090
1115
|
}),
|
|
1091
|
-
stopReason:
|
|
1116
|
+
stopReason: AmazonBedrockStopReasonSchema,
|
|
1092
1117
|
additionalModelResponseFields:
|
|
1093
|
-
|
|
1118
|
+
AmazonBedrockAdditionalModelResponseFieldsSchema.nullish(),
|
|
1094
1119
|
trace: z.unknown().nullish(),
|
|
1095
1120
|
performanceConfig: z.object({ latency: z.string() }).nullish(),
|
|
1096
1121
|
serviceTier: z.object({ type: z.string() }).nullish(),
|
|
@@ -1108,7 +1133,7 @@ const BedrockResponseSchema = z.object({
|
|
|
1108
1133
|
|
|
1109
1134
|
// limited version of the schema, focussed on what is needed for the implementation
|
|
1110
1135
|
// this approach limits breakages when the API changes and increases efficiency
|
|
1111
|
-
const
|
|
1136
|
+
const AmazonBedrockStreamSchema = z.object({
|
|
1112
1137
|
contentBlockDelta: z
|
|
1113
1138
|
.object({
|
|
1114
1139
|
contentBlockIndex: z.number(),
|
|
@@ -1136,7 +1161,7 @@ const BedrockStreamSchema = z.object({
|
|
|
1136
1161
|
contentBlockIndex: z.number(),
|
|
1137
1162
|
start: z
|
|
1138
1163
|
.object({
|
|
1139
|
-
toolUse:
|
|
1164
|
+
toolUse: AmazonBedrockToolUseSchema.nullish(),
|
|
1140
1165
|
})
|
|
1141
1166
|
.nullish(),
|
|
1142
1167
|
})
|
|
@@ -1150,8 +1175,8 @@ const BedrockStreamSchema = z.object({
|
|
|
1150
1175
|
messageStop: z
|
|
1151
1176
|
.object({
|
|
1152
1177
|
additionalModelResponseFields:
|
|
1153
|
-
|
|
1154
|
-
stopReason:
|
|
1178
|
+
AmazonBedrockAdditionalModelResponseFieldsSchema.nullish(),
|
|
1179
|
+
stopReason: AmazonBedrockStopReasonSchema,
|
|
1155
1180
|
})
|
|
1156
1181
|
.nullish(),
|
|
1157
1182
|
metadata: z
|
|
@@ -1177,16 +1202,12 @@ const BedrockStreamSchema = z.object({
|
|
|
1177
1202
|
validationException: z.record(z.string(), z.unknown()).nullish(),
|
|
1178
1203
|
});
|
|
1179
1204
|
|
|
1180
|
-
export
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
}
|
|
1184
|
-
|
|
1185
|
-
export type BedrockReasoningMetadata = z.infer<
|
|
1186
|
-
typeof bedrockReasoningMetadataSchema
|
|
1187
|
-
>;
|
|
1205
|
+
export {
|
|
1206
|
+
amazonBedrockReasoningMetadataSchema,
|
|
1207
|
+
type AmazonBedrockReasoningMetadata,
|
|
1208
|
+
} from './amazon-bedrock-reasoning-metadata';
|
|
1188
1209
|
|
|
1189
|
-
const
|
|
1210
|
+
const amazonBedrockReasoningEffortMap: Partial<
|
|
1190
1211
|
Record<string, 'low' | 'medium' | 'high' | 'max'>
|
|
1191
1212
|
> = {
|
|
1192
1213
|
minimal: 'low',
|
|
@@ -1196,24 +1217,24 @@ const bedrockReasoningEffortMap: Partial<
|
|
|
1196
1217
|
xhigh: 'max',
|
|
1197
1218
|
};
|
|
1198
1219
|
|
|
1199
|
-
function
|
|
1220
|
+
function resolveAmazonBedrockReasoningConfig({
|
|
1200
1221
|
reasoning,
|
|
1201
|
-
|
|
1222
|
+
amazonBedrockOptions,
|
|
1202
1223
|
warnings,
|
|
1203
1224
|
isAnthropicModel,
|
|
1204
1225
|
modelId,
|
|
1205
1226
|
}: {
|
|
1206
1227
|
reasoning: LanguageModelV4CallOptions['reasoning'];
|
|
1207
|
-
|
|
1228
|
+
amazonBedrockOptions: AmazonBedrockLanguageModelChatOptions;
|
|
1208
1229
|
warnings: SharedV4Warning[];
|
|
1209
1230
|
isAnthropicModel: boolean;
|
|
1210
1231
|
modelId: string;
|
|
1211
|
-
}):
|
|
1232
|
+
}): AmazonBedrockLanguageModelChatOptions {
|
|
1212
1233
|
if (!isCustomReasoning(reasoning)) {
|
|
1213
|
-
return
|
|
1234
|
+
return amazonBedrockOptions;
|
|
1214
1235
|
}
|
|
1215
1236
|
|
|
1216
|
-
const result = { ...
|
|
1237
|
+
const result = { ...amazonBedrockOptions };
|
|
1217
1238
|
|
|
1218
1239
|
if (isAnthropicModel) {
|
|
1219
1240
|
const capabilities = getModelCapabilities(modelId);
|
|
@@ -1223,13 +1244,13 @@ function resolveBedrockReasoningConfig({
|
|
|
1223
1244
|
} else if (capabilities.supportsAdaptiveThinking) {
|
|
1224
1245
|
const effort = mapReasoningToProviderEffort({
|
|
1225
1246
|
reasoning,
|
|
1226
|
-
effortMap:
|
|
1247
|
+
effortMap: amazonBedrockReasoningEffortMap,
|
|
1227
1248
|
warnings,
|
|
1228
1249
|
});
|
|
1229
1250
|
result.reasoningConfig = {
|
|
1230
1251
|
type: 'adaptive',
|
|
1231
1252
|
maxReasoningEffort: effort,
|
|
1232
|
-
...
|
|
1253
|
+
...amazonBedrockOptions.reasoningConfig,
|
|
1233
1254
|
};
|
|
1234
1255
|
} else {
|
|
1235
1256
|
const budgetTokens = mapReasoningToProviderBudget({
|
|
@@ -1242,19 +1263,19 @@ function resolveBedrockReasoningConfig({
|
|
|
1242
1263
|
result.reasoningConfig = {
|
|
1243
1264
|
type: 'enabled',
|
|
1244
1265
|
budgetTokens,
|
|
1245
|
-
...
|
|
1266
|
+
...amazonBedrockOptions.reasoningConfig,
|
|
1246
1267
|
};
|
|
1247
1268
|
}
|
|
1248
1269
|
}
|
|
1249
1270
|
} else if (reasoning !== 'none') {
|
|
1250
1271
|
const effort = mapReasoningToProviderEffort({
|
|
1251
1272
|
reasoning,
|
|
1252
|
-
effortMap:
|
|
1273
|
+
effortMap: amazonBedrockReasoningEffortMap,
|
|
1253
1274
|
warnings,
|
|
1254
1275
|
});
|
|
1255
1276
|
result.reasoningConfig = {
|
|
1256
1277
|
maxReasoningEffort: effort,
|
|
1257
|
-
...
|
|
1278
|
+
...amazonBedrockOptions.reasoningConfig,
|
|
1258
1279
|
};
|
|
1259
1280
|
}
|
|
1260
1281
|
|