@ai-sdk/amazon-bedrock 5.0.0-beta.45 → 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 +15 -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 +21 -21
- package/dist/index.js +328 -292
- package/dist/index.js.map +1 -1
- package/docs/08-amazon-bedrock.mdx +66 -66
- package/package.json +3 -3
- package/src/{bedrock-api-types.ts → amazon-bedrock-api-types.ts} +60 -55
- 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} +211 -190
- 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} +31 -24
- 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} +3 -3
- package/src/{bedrock-image-model.ts → amazon-bedrock-image-model.ts} +40 -36
- package/src/amazon-bedrock-image-settings.ts +9 -0
- package/src/{bedrock-prepare-tools.ts → amazon-bedrock-prepare-tools.ts} +18 -17
- package/src/{bedrock-provider.ts → amazon-bedrock-provider.ts} +40 -38
- package/src/amazon-bedrock-reasoning-metadata.ts +10 -0
- package/src/{bedrock-sigv4-fetch.ts → amazon-bedrock-sigv4-fetch.ts} +4 -2
- 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} +18 -16
- package/src/anthropic/index.ts +19 -7
- package/src/{convert-bedrock-usage.ts → convert-amazon-bedrock-usage.ts} +3 -3
- package/src/{convert-to-bedrock-chat-messages.ts → convert-to-amazon-bedrock-chat-messages.ts} +78 -56
- package/src/index.ts +15 -8
- package/src/{map-bedrock-finish-reason.ts → map-amazon-bedrock-finish-reason.ts} +3 -3
- 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} +29 -21
- package/src/anthropic/bedrock-anthropic-fetch.ts +0 -94
- package/src/bedrock-image-settings.ts +0 -6
- package/src/bedrock-reasoning-metadata.ts +0 -10
|
@@ -33,38 +33,38 @@ import { getModelCapabilities } from '@ai-sdk/anthropic/internal';
|
|
|
33
33
|
import { z } from 'zod/v4';
|
|
34
34
|
import {
|
|
35
35
|
BEDROCK_STOP_REASONS,
|
|
36
|
-
type
|
|
37
|
-
type
|
|
38
|
-
} from './bedrock-api-types';
|
|
36
|
+
type AmazonBedrockConverseInput,
|
|
37
|
+
type AmazonBedrockStopReason,
|
|
38
|
+
} from './amazon-bedrock-api-types';
|
|
39
39
|
import {
|
|
40
|
-
|
|
41
|
-
type
|
|
42
|
-
type
|
|
43
|
-
} from './bedrock-chat-options';
|
|
44
|
-
import {
|
|
45
|
-
import {
|
|
46
|
-
import { prepareTools } from './bedrock-prepare-tools';
|
|
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';
|
|
47
47
|
import {
|
|
48
|
-
|
|
49
|
-
type
|
|
50
|
-
} from './convert-bedrock-usage';
|
|
51
|
-
import {
|
|
52
|
-
import {
|
|
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';
|
|
53
53
|
import { isMistralModel, normalizeToolCallId } from './normalize-tool-call-id';
|
|
54
|
-
import type {
|
|
54
|
+
import type { AmazonBedrockReasoningMetadata } from './amazon-bedrock-reasoning-metadata';
|
|
55
55
|
|
|
56
|
-
type
|
|
56
|
+
type AmazonBedrockChatConfig = {
|
|
57
57
|
baseUrl: () => string;
|
|
58
58
|
headers?: Resolvable<Record<string, string | undefined>>;
|
|
59
59
|
fetch?: FetchFunction;
|
|
60
60
|
generateId: () => string;
|
|
61
61
|
};
|
|
62
62
|
|
|
63
|
-
export class
|
|
63
|
+
export class AmazonBedrockChatLanguageModel implements LanguageModelV4 {
|
|
64
64
|
readonly specificationVersion = 'v4';
|
|
65
65
|
readonly provider = 'amazon-bedrock';
|
|
66
66
|
|
|
67
|
-
static [WORKFLOW_SERIALIZE](model:
|
|
67
|
+
static [WORKFLOW_SERIALIZE](model: AmazonBedrockChatLanguageModel) {
|
|
68
68
|
return serializeModelOptions({
|
|
69
69
|
modelId: model.modelId,
|
|
70
70
|
config: model.config,
|
|
@@ -73,14 +73,14 @@ export class BedrockChatLanguageModel implements LanguageModelV4 {
|
|
|
73
73
|
|
|
74
74
|
static [WORKFLOW_DESERIALIZE](options: {
|
|
75
75
|
modelId: string;
|
|
76
|
-
config:
|
|
76
|
+
config: AmazonBedrockChatConfig;
|
|
77
77
|
}) {
|
|
78
|
-
return new
|
|
78
|
+
return new AmazonBedrockChatLanguageModel(options.modelId, options.config);
|
|
79
79
|
}
|
|
80
80
|
|
|
81
81
|
constructor(
|
|
82
|
-
readonly modelId:
|
|
83
|
-
private readonly config:
|
|
82
|
+
readonly modelId: AmazonBedrockChatModelId,
|
|
83
|
+
private readonly config: AmazonBedrockChatConfig,
|
|
84
84
|
) {}
|
|
85
85
|
|
|
86
86
|
private async getArgs({
|
|
@@ -99,18 +99,25 @@ export class BedrockChatLanguageModel implements LanguageModelV4 {
|
|
|
99
99
|
reasoning,
|
|
100
100
|
providerOptions,
|
|
101
101
|
}: LanguageModelV4CallOptions): Promise<{
|
|
102
|
-
command:
|
|
102
|
+
command: AmazonBedrockConverseInput;
|
|
103
103
|
warnings: SharedV4Warning[];
|
|
104
104
|
usesJsonResponseTool: boolean;
|
|
105
105
|
betas: Set<string>;
|
|
106
106
|
}> {
|
|
107
|
-
// Parse provider options
|
|
108
|
-
|
|
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
|
+
})) ??
|
|
109
115
|
(await parseProviderOptions({
|
|
110
116
|
provider: 'bedrock',
|
|
111
117
|
providerOptions,
|
|
112
|
-
schema:
|
|
113
|
-
})) ??
|
|
118
|
+
schema: amazonBedrockLanguageModelChatOptions,
|
|
119
|
+
})) ??
|
|
120
|
+
{};
|
|
114
121
|
|
|
115
122
|
const warnings: SharedV4Warning[] = [];
|
|
116
123
|
|
|
@@ -166,17 +173,17 @@ export class BedrockChatLanguageModel implements LanguageModelV4 {
|
|
|
166
173
|
const isAnthropicModel = this.modelId.includes('anthropic');
|
|
167
174
|
const isOpenAIModel = this.modelId.startsWith('openai.');
|
|
168
175
|
|
|
169
|
-
|
|
176
|
+
amazonBedrockOptions = resolveAmazonBedrockReasoningConfig({
|
|
170
177
|
reasoning,
|
|
171
|
-
|
|
178
|
+
amazonBedrockOptions,
|
|
172
179
|
warnings,
|
|
173
180
|
isAnthropicModel,
|
|
174
181
|
modelId: this.modelId,
|
|
175
182
|
});
|
|
176
183
|
|
|
177
184
|
const isThinkingEnabled =
|
|
178
|
-
|
|
179
|
-
|
|
185
|
+
amazonBedrockOptions.reasoningConfig?.type === 'enabled' ||
|
|
186
|
+
amazonBedrockOptions.reasoningConfig?.type === 'adaptive';
|
|
180
187
|
|
|
181
188
|
const { supportsStructuredOutput: modelSupportsStructuredOutput } =
|
|
182
189
|
getModelCapabilities(this.modelId);
|
|
@@ -210,33 +217,33 @@ export class BedrockChatLanguageModel implements LanguageModelV4 {
|
|
|
210
217
|
warnings.push(...toolWarnings);
|
|
211
218
|
|
|
212
219
|
if (additionalTools) {
|
|
213
|
-
|
|
214
|
-
...
|
|
220
|
+
amazonBedrockOptions.additionalModelRequestFields = {
|
|
221
|
+
...amazonBedrockOptions.additionalModelRequestFields,
|
|
215
222
|
...additionalTools,
|
|
216
223
|
};
|
|
217
224
|
}
|
|
218
225
|
|
|
219
|
-
if (betas.size > 0 ||
|
|
220
|
-
const existingBetas =
|
|
226
|
+
if (betas.size > 0 || amazonBedrockOptions.anthropicBeta) {
|
|
227
|
+
const existingBetas = amazonBedrockOptions.anthropicBeta ?? [];
|
|
221
228
|
const mergedBetas =
|
|
222
229
|
betas.size > 0
|
|
223
230
|
? [...existingBetas, ...Array.from(betas)]
|
|
224
231
|
: existingBetas;
|
|
225
232
|
|
|
226
|
-
|
|
227
|
-
...
|
|
233
|
+
amazonBedrockOptions.additionalModelRequestFields = {
|
|
234
|
+
...amazonBedrockOptions.additionalModelRequestFields,
|
|
228
235
|
anthropic_beta: mergedBetas,
|
|
229
236
|
};
|
|
230
237
|
}
|
|
231
238
|
|
|
232
|
-
const thinkingType =
|
|
239
|
+
const thinkingType = amazonBedrockOptions.reasoningConfig?.type;
|
|
233
240
|
const thinkingBudget =
|
|
234
241
|
thinkingType === 'enabled'
|
|
235
|
-
?
|
|
242
|
+
? amazonBedrockOptions.reasoningConfig?.budgetTokens
|
|
236
243
|
: undefined;
|
|
237
244
|
const thinkingDisplay =
|
|
238
245
|
thinkingType === 'adaptive'
|
|
239
|
-
?
|
|
246
|
+
? amazonBedrockOptions.reasoningConfig?.display
|
|
240
247
|
: undefined;
|
|
241
248
|
const isAnthropicThinkingEnabled = isAnthropicModel && isThinkingEnabled;
|
|
242
249
|
|
|
@@ -255,16 +262,16 @@ export class BedrockChatLanguageModel implements LanguageModelV4 {
|
|
|
255
262
|
} else {
|
|
256
263
|
inferenceConfig.maxTokens = thinkingBudget + 4096; // Default + thinking budget maxTokens = 4096, TODO update default in v5
|
|
257
264
|
}
|
|
258
|
-
|
|
259
|
-
...
|
|
265
|
+
amazonBedrockOptions.additionalModelRequestFields = {
|
|
266
|
+
...amazonBedrockOptions.additionalModelRequestFields,
|
|
260
267
|
thinking: {
|
|
261
268
|
type: 'enabled',
|
|
262
269
|
budget_tokens: thinkingBudget,
|
|
263
270
|
},
|
|
264
271
|
};
|
|
265
272
|
} else if (thinkingType === 'adaptive') {
|
|
266
|
-
|
|
267
|
-
...
|
|
273
|
+
amazonBedrockOptions.additionalModelRequestFields = {
|
|
274
|
+
...amazonBedrockOptions.additionalModelRequestFields,
|
|
268
275
|
thinking: {
|
|
269
276
|
type: 'adaptive',
|
|
270
277
|
...(thinkingDisplay != null && { display: thinkingDisplay }),
|
|
@@ -272,7 +279,7 @@ export class BedrockChatLanguageModel implements LanguageModelV4 {
|
|
|
272
279
|
};
|
|
273
280
|
}
|
|
274
281
|
} else if (!isAnthropicModel) {
|
|
275
|
-
if (
|
|
282
|
+
if (amazonBedrockOptions.reasoningConfig?.budgetTokens != null) {
|
|
276
283
|
warnings.push({
|
|
277
284
|
type: 'unsupported',
|
|
278
285
|
feature: 'budgetTokens',
|
|
@@ -291,27 +298,27 @@ export class BedrockChatLanguageModel implements LanguageModelV4 {
|
|
|
291
298
|
}
|
|
292
299
|
|
|
293
300
|
const maxReasoningEffort =
|
|
294
|
-
|
|
301
|
+
amazonBedrockOptions.reasoningConfig?.maxReasoningEffort;
|
|
295
302
|
|
|
296
303
|
if (maxReasoningEffort != null) {
|
|
297
304
|
if (isAnthropicModel) {
|
|
298
|
-
|
|
299
|
-
...
|
|
305
|
+
amazonBedrockOptions.additionalModelRequestFields = {
|
|
306
|
+
...amazonBedrockOptions.additionalModelRequestFields,
|
|
300
307
|
output_config: {
|
|
301
|
-
...
|
|
308
|
+
...amazonBedrockOptions.additionalModelRequestFields?.output_config,
|
|
302
309
|
effort: maxReasoningEffort,
|
|
303
310
|
},
|
|
304
311
|
};
|
|
305
312
|
} else if (isOpenAIModel) {
|
|
306
313
|
// OpenAI models on Bedrock expect `reasoning_effort` as a flat value
|
|
307
|
-
|
|
308
|
-
...
|
|
314
|
+
amazonBedrockOptions.additionalModelRequestFields = {
|
|
315
|
+
...amazonBedrockOptions.additionalModelRequestFields,
|
|
309
316
|
reasoning_effort: maxReasoningEffort,
|
|
310
317
|
};
|
|
311
318
|
} else {
|
|
312
319
|
// other models (such as Nova 2) use reasoningConfig format
|
|
313
|
-
|
|
314
|
-
...
|
|
320
|
+
amazonBedrockOptions.additionalModelRequestFields = {
|
|
321
|
+
...amazonBedrockOptions.additionalModelRequestFields,
|
|
315
322
|
reasoningConfig: {
|
|
316
323
|
...(thinkingType != null &&
|
|
317
324
|
thinkingType !== 'adaptive' && { type: thinkingType }),
|
|
@@ -323,10 +330,10 @@ export class BedrockChatLanguageModel implements LanguageModelV4 {
|
|
|
323
330
|
}
|
|
324
331
|
|
|
325
332
|
if (useNativeStructuredOutput) {
|
|
326
|
-
|
|
327
|
-
...
|
|
333
|
+
amazonBedrockOptions.additionalModelRequestFields = {
|
|
334
|
+
...amazonBedrockOptions.additionalModelRequestFields,
|
|
328
335
|
output_config: {
|
|
329
|
-
...
|
|
336
|
+
...amazonBedrockOptions.additionalModelRequestFields?.output_config,
|
|
330
337
|
format: {
|
|
331
338
|
type: 'json_schema',
|
|
332
339
|
schema: responseFormat!.schema,
|
|
@@ -403,18 +410,18 @@ export class BedrockChatLanguageModel implements LanguageModelV4 {
|
|
|
403
410
|
}
|
|
404
411
|
|
|
405
412
|
const isMistral = isMistralModel(this.modelId);
|
|
406
|
-
const { system, messages } = await
|
|
413
|
+
const { system, messages } = await convertToAmazonBedrockChatMessages(
|
|
407
414
|
filteredPrompt,
|
|
408
415
|
isMistral,
|
|
409
416
|
);
|
|
410
417
|
|
|
411
|
-
// Filter out reasoningConfig from
|
|
418
|
+
// Filter out reasoningConfig from amazonBedrock provider options to prevent sending it to Bedrock API
|
|
412
419
|
const {
|
|
413
420
|
reasoningConfig: _,
|
|
414
421
|
additionalModelRequestFields: __,
|
|
415
422
|
serviceTier: ___,
|
|
416
|
-
...
|
|
417
|
-
} = providerOptions?.bedrock
|
|
423
|
+
...filteredAmazonBedrockOptions
|
|
424
|
+
} = providerOptions?.amazonBedrock ?? providerOptions?.bedrock ?? {};
|
|
418
425
|
|
|
419
426
|
const additionalModelResponseFieldPaths = isAnthropicModel
|
|
420
427
|
? ['/delta/stop_sequence']
|
|
@@ -425,19 +432,19 @@ export class BedrockChatLanguageModel implements LanguageModelV4 {
|
|
|
425
432
|
system,
|
|
426
433
|
messages,
|
|
427
434
|
additionalModelRequestFields:
|
|
428
|
-
|
|
435
|
+
amazonBedrockOptions.additionalModelRequestFields,
|
|
429
436
|
...(additionalModelResponseFieldPaths && {
|
|
430
437
|
additionalModelResponseFieldPaths,
|
|
431
438
|
}),
|
|
432
439
|
...(Object.keys(inferenceConfig).length > 0 && {
|
|
433
440
|
inferenceConfig,
|
|
434
441
|
}),
|
|
435
|
-
...(
|
|
442
|
+
...(amazonBedrockOptions.serviceTier != null && {
|
|
436
443
|
serviceTier: {
|
|
437
|
-
type:
|
|
444
|
+
type: amazonBedrockOptions.serviceTier,
|
|
438
445
|
},
|
|
439
446
|
}),
|
|
440
|
-
...
|
|
447
|
+
...filteredAmazonBedrockOptions,
|
|
441
448
|
...(toolConfig.tools !== undefined && toolConfig.tools.length > 0
|
|
442
449
|
? { toolConfig }
|
|
443
450
|
: {}),
|
|
@@ -478,11 +485,11 @@ export class BedrockChatLanguageModel implements LanguageModelV4 {
|
|
|
478
485
|
headers: await this.getHeaders({ headers: options.headers }),
|
|
479
486
|
body: args,
|
|
480
487
|
failedResponseHandler: createJsonErrorResponseHandler({
|
|
481
|
-
errorSchema:
|
|
488
|
+
errorSchema: AmazonBedrockErrorSchema,
|
|
482
489
|
errorToMessage: error => `${error.message ?? 'Unknown error'}`,
|
|
483
490
|
}),
|
|
484
491
|
successfulResponseHandler: createJsonResponseHandler(
|
|
485
|
-
|
|
492
|
+
AmazonBedrockResponseSchema,
|
|
486
493
|
),
|
|
487
494
|
abortSignal: options.abortSignal,
|
|
488
495
|
fetch: this.config.fetch,
|
|
@@ -507,23 +514,26 @@ export class BedrockChatLanguageModel implements LanguageModelV4 {
|
|
|
507
514
|
};
|
|
508
515
|
|
|
509
516
|
if (part.reasoningContent.reasoningText.signature) {
|
|
517
|
+
const reasoningPayload: AmazonBedrockReasoningMetadata = {
|
|
518
|
+
signature: part.reasoningContent.reasoningText.signature,
|
|
519
|
+
};
|
|
510
520
|
reasoning.providerMetadata = {
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
} satisfies BedrockReasoningMetadata,
|
|
521
|
+
amazonBedrock: reasoningPayload,
|
|
522
|
+
bedrock: reasoningPayload,
|
|
514
523
|
};
|
|
515
524
|
}
|
|
516
525
|
|
|
517
526
|
content.push(reasoning);
|
|
518
527
|
} else if ('redactedReasoning' in part.reasoningContent) {
|
|
528
|
+
const redactedPayload: AmazonBedrockReasoningMetadata = {
|
|
529
|
+
redactedData: part.reasoningContent.redactedReasoning.data ?? '',
|
|
530
|
+
};
|
|
519
531
|
content.push({
|
|
520
532
|
type: 'reasoning',
|
|
521
533
|
text: '',
|
|
522
534
|
providerMetadata: {
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
part.reasoningContent.redactedReasoning.data ?? '',
|
|
526
|
-
} satisfies BedrockReasoningMetadata,
|
|
535
|
+
amazonBedrock: redactedPayload,
|
|
536
|
+
bedrock: redactedPayload,
|
|
527
537
|
},
|
|
528
538
|
});
|
|
529
539
|
}
|
|
@@ -559,7 +569,7 @@ export class BedrockChatLanguageModel implements LanguageModelV4 {
|
|
|
559
569
|
const stopSequence =
|
|
560
570
|
response.additionalModelResponseFields?.delta?.stop_sequence ?? null;
|
|
561
571
|
|
|
562
|
-
const
|
|
572
|
+
const providerMetadataPayload =
|
|
563
573
|
response.trace ||
|
|
564
574
|
response.usage ||
|
|
565
575
|
response.performanceConfig ||
|
|
@@ -567,43 +577,48 @@ export class BedrockChatLanguageModel implements LanguageModelV4 {
|
|
|
567
577
|
isJsonResponseFromTool ||
|
|
568
578
|
stopSequence
|
|
569
579
|
? {
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
usage
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
stopSequence,
|
|
593
|
-
},
|
|
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,
|
|
594
602
|
}
|
|
595
603
|
: undefined;
|
|
596
604
|
|
|
605
|
+
const providerMetadata = providerMetadataPayload
|
|
606
|
+
? {
|
|
607
|
+
amazonBedrock: providerMetadataPayload,
|
|
608
|
+
bedrock: providerMetadataPayload,
|
|
609
|
+
}
|
|
610
|
+
: undefined;
|
|
611
|
+
|
|
597
612
|
return {
|
|
598
613
|
content,
|
|
599
614
|
finishReason: {
|
|
600
|
-
unified:
|
|
601
|
-
response.stopReason as
|
|
615
|
+
unified: mapAmazonBedrockFinishReason(
|
|
616
|
+
response.stopReason as AmazonBedrockStopReason,
|
|
602
617
|
isJsonResponseFromTool,
|
|
603
618
|
),
|
|
604
619
|
raw: response.stopReason ?? undefined,
|
|
605
620
|
},
|
|
606
|
-
usage:
|
|
621
|
+
usage: convertAmazonBedrockUsage(response.usage),
|
|
607
622
|
response: {
|
|
608
623
|
id: responseHeaders?.['x-amzn-requestid'] ?? undefined,
|
|
609
624
|
timestamp:
|
|
@@ -635,11 +650,12 @@ export class BedrockChatLanguageModel implements LanguageModelV4 {
|
|
|
635
650
|
headers: await this.getHeaders({ headers: options.headers }),
|
|
636
651
|
body: args,
|
|
637
652
|
failedResponseHandler: createJsonErrorResponseHandler({
|
|
638
|
-
errorSchema:
|
|
653
|
+
errorSchema: AmazonBedrockErrorSchema,
|
|
639
654
|
errorToMessage: error => `${error.type}: ${error.message}`,
|
|
640
655
|
}),
|
|
641
|
-
successfulResponseHandler:
|
|
642
|
-
|
|
656
|
+
successfulResponseHandler: createAmazonBedrockEventStreamResponseHandler(
|
|
657
|
+
AmazonBedrockStreamSchema,
|
|
658
|
+
),
|
|
643
659
|
abortSignal: options.abortSignal,
|
|
644
660
|
fetch: this.config.fetch,
|
|
645
661
|
});
|
|
@@ -648,7 +664,7 @@ export class BedrockChatLanguageModel implements LanguageModelV4 {
|
|
|
648
664
|
unified: 'other',
|
|
649
665
|
raw: undefined,
|
|
650
666
|
};
|
|
651
|
-
let usage:
|
|
667
|
+
let usage: AmazonBedrockUsage | undefined = undefined;
|
|
652
668
|
let providerMetadata: SharedV4ProviderMetadata | undefined = undefined;
|
|
653
669
|
let isJsonResponseFromTool = false;
|
|
654
670
|
let stopSequence: string | null = null;
|
|
@@ -668,7 +684,7 @@ export class BedrockChatLanguageModel implements LanguageModelV4 {
|
|
|
668
684
|
return {
|
|
669
685
|
stream: response.pipeThrough(
|
|
670
686
|
new TransformStream<
|
|
671
|
-
ParseResult<z.infer<typeof
|
|
687
|
+
ParseResult<z.infer<typeof AmazonBedrockStreamSchema>>,
|
|
672
688
|
LanguageModelV4StreamPart
|
|
673
689
|
>({
|
|
674
690
|
start(controller) {
|
|
@@ -685,9 +701,9 @@ export class BedrockChatLanguageModel implements LanguageModelV4 {
|
|
|
685
701
|
},
|
|
686
702
|
|
|
687
703
|
transform(chunk, controller) {
|
|
688
|
-
function enqueueError(
|
|
704
|
+
function enqueueError(amazonBedrockError: Record<string, any>) {
|
|
689
705
|
finishReason = { unified: 'error', raw: undefined };
|
|
690
|
-
controller.enqueue({ type: 'error', error:
|
|
706
|
+
controller.enqueue({ type: 'error', error: amazonBedrockError });
|
|
691
707
|
}
|
|
692
708
|
|
|
693
709
|
// Emit raw chunk if requested (before anything else)
|
|
@@ -723,8 +739,8 @@ export class BedrockChatLanguageModel implements LanguageModelV4 {
|
|
|
723
739
|
|
|
724
740
|
if (value.messageStop) {
|
|
725
741
|
finishReason = {
|
|
726
|
-
unified:
|
|
727
|
-
value.messageStop.stopReason as
|
|
742
|
+
unified: mapAmazonBedrockFinishReason(
|
|
743
|
+
value.messageStop.stopReason as AmazonBedrockStopReason,
|
|
728
744
|
isJsonResponseFromTool,
|
|
729
745
|
),
|
|
730
746
|
raw: value.messageStop.stopReason ?? undefined,
|
|
@@ -768,17 +784,19 @@ export class BedrockChatLanguageModel implements LanguageModelV4 {
|
|
|
768
784
|
value.metadata.performanceConfig ||
|
|
769
785
|
value.metadata.serviceTier
|
|
770
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
|
+
};
|
|
771
797
|
providerMetadata = {
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
...trace,
|
|
775
|
-
...(value.metadata.performanceConfig && {
|
|
776
|
-
performanceConfig: value.metadata.performanceConfig,
|
|
777
|
-
}),
|
|
778
|
-
...(value.metadata.serviceTier && {
|
|
779
|
-
serviceTier: value.metadata.serviceTier,
|
|
780
|
-
}),
|
|
781
|
-
},
|
|
798
|
+
amazonBedrock: metadataPayload,
|
|
799
|
+
bedrock: metadataPayload,
|
|
782
800
|
};
|
|
783
801
|
}
|
|
784
802
|
}
|
|
@@ -905,16 +923,20 @@ export class BedrockChatLanguageModel implements LanguageModelV4 {
|
|
|
905
923
|
id: String(blockIndex),
|
|
906
924
|
});
|
|
907
925
|
}
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
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
|
+
}
|
|
918
940
|
} else if ('data' in reasoningContent && reasoningContent.data) {
|
|
919
941
|
if (contentBlocks[blockIndex] == null) {
|
|
920
942
|
contentBlocks[blockIndex] = { type: 'reasoning' };
|
|
@@ -923,16 +945,20 @@ export class BedrockChatLanguageModel implements LanguageModelV4 {
|
|
|
923
945
|
id: String(blockIndex),
|
|
924
946
|
});
|
|
925
947
|
}
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
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
|
+
}
|
|
936
962
|
}
|
|
937
963
|
}
|
|
938
964
|
|
|
@@ -993,30 +1019,25 @@ export class BedrockChatLanguageModel implements LanguageModelV4 {
|
|
|
993
1019
|
flush(controller) {
|
|
994
1020
|
// Update provider metadata with isJsonResponseFromTool and stopSequence if needed
|
|
995
1021
|
if (isJsonResponseFromTool || stopSequence != null) {
|
|
996
|
-
|
|
997
|
-
providerMetadata
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
providerMetadata
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
}),
|
|
1010
|
-
stopSequence,
|
|
1011
|
-
},
|
|
1012
|
-
};
|
|
1013
|
-
}
|
|
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
|
+
};
|
|
1014
1035
|
}
|
|
1015
1036
|
|
|
1016
1037
|
controller.enqueue({
|
|
1017
1038
|
type: 'finish',
|
|
1018
1039
|
finishReason,
|
|
1019
|
-
usage:
|
|
1040
|
+
usage: convertAmazonBedrockUsage(usage),
|
|
1020
1041
|
...(providerMetadata && { providerMetadata }),
|
|
1021
1042
|
});
|
|
1022
1043
|
},
|
|
@@ -1033,12 +1054,12 @@ export class BedrockChatLanguageModel implements LanguageModelV4 {
|
|
|
1033
1054
|
}
|
|
1034
1055
|
}
|
|
1035
1056
|
|
|
1036
|
-
const
|
|
1057
|
+
const AmazonBedrockStopReasonSchema = z.union([
|
|
1037
1058
|
z.enum(BEDROCK_STOP_REASONS),
|
|
1038
1059
|
z.string(),
|
|
1039
1060
|
]);
|
|
1040
1061
|
|
|
1041
|
-
const
|
|
1062
|
+
const AmazonBedrockAdditionalModelResponseFieldsSchema = z
|
|
1042
1063
|
.object({
|
|
1043
1064
|
delta: z
|
|
1044
1065
|
.object({
|
|
@@ -1048,24 +1069,24 @@ const BedrockAdditionalModelResponseFieldsSchema = z
|
|
|
1048
1069
|
})
|
|
1049
1070
|
.catchall(z.unknown());
|
|
1050
1071
|
|
|
1051
|
-
const
|
|
1072
|
+
const AmazonBedrockToolUseSchema = z.object({
|
|
1052
1073
|
toolUseId: z.string(),
|
|
1053
1074
|
name: z.string(),
|
|
1054
1075
|
input: z.unknown(),
|
|
1055
1076
|
});
|
|
1056
1077
|
|
|
1057
|
-
const
|
|
1078
|
+
const AmazonBedrockReasoningTextSchema = z.object({
|
|
1058
1079
|
signature: z.string().nullish(),
|
|
1059
1080
|
text: z.string(),
|
|
1060
1081
|
});
|
|
1061
1082
|
|
|
1062
|
-
const
|
|
1083
|
+
const AmazonBedrockRedactedReasoningSchema = z.object({
|
|
1063
1084
|
data: z.string(),
|
|
1064
1085
|
});
|
|
1065
1086
|
|
|
1066
1087
|
// limited version of the schema, focused on what is needed for the implementation
|
|
1067
1088
|
// this approach limits breakages when the API changes and increases efficiency
|
|
1068
|
-
const
|
|
1089
|
+
const AmazonBedrockResponseSchema = z.object({
|
|
1069
1090
|
metrics: z
|
|
1070
1091
|
.object({
|
|
1071
1092
|
latencyMs: z.number(),
|
|
@@ -1076,14 +1097,14 @@ const BedrockResponseSchema = z.object({
|
|
|
1076
1097
|
content: z.array(
|
|
1077
1098
|
z.object({
|
|
1078
1099
|
text: z.string().nullish(),
|
|
1079
|
-
toolUse:
|
|
1100
|
+
toolUse: AmazonBedrockToolUseSchema.nullish(),
|
|
1080
1101
|
reasoningContent: z
|
|
1081
1102
|
.union([
|
|
1082
1103
|
z.object({
|
|
1083
|
-
reasoningText:
|
|
1104
|
+
reasoningText: AmazonBedrockReasoningTextSchema,
|
|
1084
1105
|
}),
|
|
1085
1106
|
z.object({
|
|
1086
|
-
redactedReasoning:
|
|
1107
|
+
redactedReasoning: AmazonBedrockRedactedReasoningSchema,
|
|
1087
1108
|
}),
|
|
1088
1109
|
])
|
|
1089
1110
|
.nullish(),
|
|
@@ -1092,9 +1113,9 @@ const BedrockResponseSchema = z.object({
|
|
|
1092
1113
|
role: z.string(),
|
|
1093
1114
|
}),
|
|
1094
1115
|
}),
|
|
1095
|
-
stopReason:
|
|
1116
|
+
stopReason: AmazonBedrockStopReasonSchema,
|
|
1096
1117
|
additionalModelResponseFields:
|
|
1097
|
-
|
|
1118
|
+
AmazonBedrockAdditionalModelResponseFieldsSchema.nullish(),
|
|
1098
1119
|
trace: z.unknown().nullish(),
|
|
1099
1120
|
performanceConfig: z.object({ latency: z.string() }).nullish(),
|
|
1100
1121
|
serviceTier: z.object({ type: z.string() }).nullish(),
|
|
@@ -1112,7 +1133,7 @@ const BedrockResponseSchema = z.object({
|
|
|
1112
1133
|
|
|
1113
1134
|
// limited version of the schema, focussed on what is needed for the implementation
|
|
1114
1135
|
// this approach limits breakages when the API changes and increases efficiency
|
|
1115
|
-
const
|
|
1136
|
+
const AmazonBedrockStreamSchema = z.object({
|
|
1116
1137
|
contentBlockDelta: z
|
|
1117
1138
|
.object({
|
|
1118
1139
|
contentBlockIndex: z.number(),
|
|
@@ -1140,7 +1161,7 @@ const BedrockStreamSchema = z.object({
|
|
|
1140
1161
|
contentBlockIndex: z.number(),
|
|
1141
1162
|
start: z
|
|
1142
1163
|
.object({
|
|
1143
|
-
toolUse:
|
|
1164
|
+
toolUse: AmazonBedrockToolUseSchema.nullish(),
|
|
1144
1165
|
})
|
|
1145
1166
|
.nullish(),
|
|
1146
1167
|
})
|
|
@@ -1154,8 +1175,8 @@ const BedrockStreamSchema = z.object({
|
|
|
1154
1175
|
messageStop: z
|
|
1155
1176
|
.object({
|
|
1156
1177
|
additionalModelResponseFields:
|
|
1157
|
-
|
|
1158
|
-
stopReason:
|
|
1178
|
+
AmazonBedrockAdditionalModelResponseFieldsSchema.nullish(),
|
|
1179
|
+
stopReason: AmazonBedrockStopReasonSchema,
|
|
1159
1180
|
})
|
|
1160
1181
|
.nullish(),
|
|
1161
1182
|
metadata: z
|
|
@@ -1182,11 +1203,11 @@ const BedrockStreamSchema = z.object({
|
|
|
1182
1203
|
});
|
|
1183
1204
|
|
|
1184
1205
|
export {
|
|
1185
|
-
|
|
1186
|
-
type
|
|
1187
|
-
} from './bedrock-reasoning-metadata';
|
|
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
|
|