@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.
Files changed (38) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/dist/anthropic/index.d.ts +10 -10
  3. package/dist/anthropic/index.js +58 -46
  4. package/dist/anthropic/index.js.map +1 -1
  5. package/dist/index.d.ts +25 -23
  6. package/dist/index.js +496 -436
  7. package/dist/index.js.map +1 -1
  8. package/docs/08-amazon-bedrock.mdx +80 -82
  9. package/package.json +5 -5
  10. package/src/amazon-bedrock-api-types.ts +224 -0
  11. package/src/{bedrock-chat-options.ts → amazon-bedrock-chat-language-model-options.ts} +7 -7
  12. package/src/{bedrock-chat-language-model.ts → amazon-bedrock-chat-language-model.ts} +217 -196
  13. package/src/{bedrock-embedding-options.ts → amazon-bedrock-embedding-model-options.ts} +1 -1
  14. package/src/{bedrock-embedding-model.ts → amazon-bedrock-embedding-model.ts} +34 -27
  15. package/src/{bedrock-error.ts → amazon-bedrock-error.ts} +1 -1
  16. package/src/{bedrock-event-stream-decoder.ts → amazon-bedrock-event-stream-decoder.ts} +1 -1
  17. package/src/{bedrock-event-stream-response-handler.ts → amazon-bedrock-event-stream-response-handler.ts} +6 -6
  18. package/src/{bedrock-image-model.ts → amazon-bedrock-image-model.ts} +43 -39
  19. package/src/amazon-bedrock-image-settings.ts +9 -0
  20. package/src/{bedrock-prepare-tools.ts → amazon-bedrock-prepare-tools.ts} +22 -18
  21. package/src/{bedrock-provider.ts → amazon-bedrock-provider.ts} +53 -46
  22. package/src/amazon-bedrock-reasoning-metadata.ts +10 -0
  23. package/src/{bedrock-sigv4-fetch.ts → amazon-bedrock-sigv4-fetch.ts} +5 -3
  24. package/src/anthropic/amazon-bedrock-anthropic-fetch.ts +104 -0
  25. package/src/anthropic/{bedrock-anthropic-options.ts → amazon-bedrock-anthropic-options.ts} +1 -1
  26. package/src/anthropic/{bedrock-anthropic-provider.ts → amazon-bedrock-anthropic-provider.ts} +22 -20
  27. package/src/anthropic/index.ts +19 -7
  28. package/src/{convert-bedrock-usage.ts → convert-amazon-bedrock-usage.ts} +4 -4
  29. package/src/{convert-to-bedrock-chat-messages.ts → convert-to-amazon-bedrock-chat-messages.ts} +146 -103
  30. package/src/index.ts +15 -8
  31. package/src/inject-fetch-headers.ts +1 -1
  32. package/src/{map-bedrock-finish-reason.ts → map-amazon-bedrock-finish-reason.ts} +4 -4
  33. package/src/reranking/{bedrock-reranking-api.ts → amazon-bedrock-reranking-api.ts} +3 -3
  34. package/src/reranking/{bedrock-reranking-options.ts → amazon-bedrock-reranking-model-options.ts} +1 -1
  35. package/src/reranking/{bedrock-reranking-model.ts → amazon-bedrock-reranking-model.ts} +32 -25
  36. package/src/anthropic/bedrock-anthropic-fetch.ts +0 -94
  37. package/src/bedrock-api-types.ts +0 -219
  38. 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
- BedrockConverseInput,
37
- BedrockStopReason,
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
- AmazonBedrockLanguageModelOptions,
41
- BedrockChatModelId,
42
- amazonBedrockLanguageModelOptions,
43
- } from './bedrock-chat-options';
44
- import { BedrockErrorSchema } from './bedrock-error';
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 BedrockChatConfig = {
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 BedrockChatLanguageModel implements LanguageModelV4 {
63
+ export class AmazonBedrockChatLanguageModel implements LanguageModelV4 {
60
64
  readonly specificationVersion = 'v4';
61
65
  readonly provider = 'amazon-bedrock';
62
66
 
63
- static [WORKFLOW_SERIALIZE](model: BedrockChatLanguageModel) {
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: BedrockChatConfig;
76
+ config: AmazonBedrockChatConfig;
73
77
  }) {
74
- return new BedrockChatLanguageModel(options.modelId, options.config);
78
+ return new AmazonBedrockChatLanguageModel(options.modelId, options.config);
75
79
  }
76
80
 
77
81
  constructor(
78
- readonly modelId: BedrockChatModelId,
79
- private readonly config: BedrockChatConfig,
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: BedrockConverseInput;
102
+ command: AmazonBedrockConverseInput;
99
103
  warnings: SharedV4Warning[];
100
104
  usesJsonResponseTool: boolean;
101
105
  betas: Set<string>;
102
106
  }> {
103
- // Parse provider options
104
- let bedrockOptions =
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: amazonBedrockLanguageModelOptions,
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
- bedrockOptions = resolveBedrockReasoningConfig({
176
+ amazonBedrockOptions = resolveAmazonBedrockReasoningConfig({
166
177
  reasoning,
167
- bedrockOptions,
178
+ amazonBedrockOptions,
168
179
  warnings,
169
180
  isAnthropicModel,
170
181
  modelId: this.modelId,
171
182
  });
172
183
 
173
184
  const isThinkingEnabled =
174
- bedrockOptions.reasoningConfig?.type === 'enabled' ||
175
- bedrockOptions.reasoningConfig?.type === 'adaptive';
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
- bedrockOptions.additionalModelRequestFields = {
210
- ...bedrockOptions.additionalModelRequestFields,
220
+ amazonBedrockOptions.additionalModelRequestFields = {
221
+ ...amazonBedrockOptions.additionalModelRequestFields,
211
222
  ...additionalTools,
212
223
  };
213
224
  }
214
225
 
215
- if (betas.size > 0 || bedrockOptions.anthropicBeta) {
216
- const existingBetas = bedrockOptions.anthropicBeta ?? [];
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
- bedrockOptions.additionalModelRequestFields = {
223
- ...bedrockOptions.additionalModelRequestFields,
233
+ amazonBedrockOptions.additionalModelRequestFields = {
234
+ ...amazonBedrockOptions.additionalModelRequestFields,
224
235
  anthropic_beta: mergedBetas,
225
236
  };
226
237
  }
227
238
 
228
- const thinkingType = bedrockOptions.reasoningConfig?.type;
239
+ const thinkingType = amazonBedrockOptions.reasoningConfig?.type;
229
240
  const thinkingBudget =
230
241
  thinkingType === 'enabled'
231
- ? bedrockOptions.reasoningConfig?.budgetTokens
242
+ ? amazonBedrockOptions.reasoningConfig?.budgetTokens
232
243
  : undefined;
233
244
  const thinkingDisplay =
234
245
  thinkingType === 'adaptive'
235
- ? bedrockOptions.reasoningConfig?.display
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
- bedrockOptions.additionalModelRequestFields = {
255
- ...bedrockOptions.additionalModelRequestFields,
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
- bedrockOptions.additionalModelRequestFields = {
263
- ...bedrockOptions.additionalModelRequestFields,
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 (bedrockOptions.reasoningConfig?.budgetTokens != null) {
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
- bedrockOptions.reasoningConfig?.maxReasoningEffort;
301
+ amazonBedrockOptions.reasoningConfig?.maxReasoningEffort;
291
302
 
292
303
  if (maxReasoningEffort != null) {
293
304
  if (isAnthropicModel) {
294
- bedrockOptions.additionalModelRequestFields = {
295
- ...bedrockOptions.additionalModelRequestFields,
305
+ amazonBedrockOptions.additionalModelRequestFields = {
306
+ ...amazonBedrockOptions.additionalModelRequestFields,
296
307
  output_config: {
297
- ...bedrockOptions.additionalModelRequestFields?.output_config,
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
- bedrockOptions.additionalModelRequestFields = {
304
- ...bedrockOptions.additionalModelRequestFields,
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
- bedrockOptions.additionalModelRequestFields = {
310
- ...bedrockOptions.additionalModelRequestFields,
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
- bedrockOptions.additionalModelRequestFields = {
323
- ...bedrockOptions.additionalModelRequestFields,
333
+ amazonBedrockOptions.additionalModelRequestFields = {
334
+ ...amazonBedrockOptions.additionalModelRequestFields,
324
335
  output_config: {
325
- ...bedrockOptions.additionalModelRequestFields?.output_config,
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 convertToBedrockChatMessages(
413
+ const { system, messages } = await convertToAmazonBedrockChatMessages(
403
414
  filteredPrompt,
404
415
  isMistral,
405
416
  );
406
417
 
407
- // Filter out reasoningConfig from providerOptions.bedrock to prevent sending it to Bedrock API
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
- ...filteredBedrockOptions
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
- bedrockOptions.additionalModelRequestFields,
435
+ amazonBedrockOptions.additionalModelRequestFields,
425
436
  ...(additionalModelResponseFieldPaths && {
426
437
  additionalModelResponseFieldPaths,
427
438
  }),
428
439
  ...(Object.keys(inferenceConfig).length > 0 && {
429
440
  inferenceConfig,
430
441
  }),
431
- ...(bedrockOptions.serviceTier != null && {
442
+ ...(amazonBedrockOptions.serviceTier != null && {
432
443
  serviceTier: {
433
- type: bedrockOptions.serviceTier,
444
+ type: amazonBedrockOptions.serviceTier,
434
445
  },
435
446
  }),
436
- ...filteredBedrockOptions,
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: BedrockErrorSchema,
488
+ errorSchema: AmazonBedrockErrorSchema,
478
489
  errorToMessage: error => `${error.message ?? 'Unknown error'}`,
479
490
  }),
480
491
  successfulResponseHandler: createJsonResponseHandler(
481
- BedrockResponseSchema,
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
- bedrock: {
508
- signature: part.reasoningContent.reasoningText.signature,
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
- bedrock: {
520
- redactedData:
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 providerMetadata =
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
- bedrock: {
567
- ...(response.trace && typeof response.trace === 'object'
568
- ? { trace: response.trace as JSONObject }
569
- : {}),
570
- ...(response.performanceConfig && {
571
- performanceConfig: response.performanceConfig,
572
- }),
573
- ...(response.serviceTier && {
574
- serviceTier: response.serviceTier,
575
- }),
576
- ...((response.usage?.cacheWriteInputTokens != null ||
577
- response.usage?.cacheDetails != null) && {
578
- usage: {
579
- ...(response.usage.cacheWriteInputTokens != null && {
580
- cacheWriteInputTokens: response.usage.cacheWriteInputTokens,
581
- }),
582
- ...(response.usage.cacheDetails != null && {
583
- cacheDetails: response.usage.cacheDetails,
584
- }),
585
- },
586
- }),
587
- ...(isJsonResponseFromTool && { isJsonResponseFromTool: true }),
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: mapBedrockFinishReason(
597
- response.stopReason as BedrockStopReason,
615
+ unified: mapAmazonBedrockFinishReason(
616
+ response.stopReason as AmazonBedrockStopReason,
598
617
  isJsonResponseFromTool,
599
618
  ),
600
619
  raw: response.stopReason ?? undefined,
601
620
  },
602
- usage: convertBedrockUsage(response.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: BedrockErrorSchema,
653
+ errorSchema: AmazonBedrockErrorSchema,
635
654
  errorToMessage: error => `${error.type}: ${error.message}`,
636
655
  }),
637
- successfulResponseHandler:
638
- createBedrockEventStreamResponseHandler(BedrockStreamSchema),
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: BedrockUsage | undefined = undefined;
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 BedrockStreamSchema>>,
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(bedrockError: Record<string, any>) {
704
+ function enqueueError(amazonBedrockError: Record<string, any>) {
685
705
  finishReason = { unified: 'error', raw: undefined };
686
- controller.enqueue({ type: 'error', error: bedrockError });
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: mapBedrockFinishReason(
723
- value.messageStop.stopReason as BedrockStopReason,
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
- bedrock: {
769
- ...cacheUsage,
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
- controller.enqueue({
905
- type: 'reasoning-delta',
906
- id: String(blockIndex),
907
- delta: '',
908
- providerMetadata: {
909
- bedrock: {
910
- signature: reasoningContent.signature,
911
- } satisfies BedrockReasoningMetadata,
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
- controller.enqueue({
923
- type: 'reasoning-delta',
924
- id: String(blockIndex),
925
- delta: '',
926
- providerMetadata: {
927
- bedrock: {
928
- redactedData: reasoningContent.data,
929
- } satisfies BedrockReasoningMetadata,
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
- if (providerMetadata) {
993
- providerMetadata.bedrock = {
994
- ...providerMetadata.bedrock,
995
- ...(isJsonResponseFromTool && {
996
- isJsonResponseFromTool: true,
997
- }),
998
- stopSequence,
999
- };
1000
- } else {
1001
- providerMetadata = {
1002
- bedrock: {
1003
- ...(isJsonResponseFromTool && {
1004
- isJsonResponseFromTool: true,
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: convertBedrockUsage(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 BedrockStopReasonSchema = z.union([
1057
+ const AmazonBedrockStopReasonSchema = z.union([
1033
1058
  z.enum(BEDROCK_STOP_REASONS),
1034
1059
  z.string(),
1035
1060
  ]);
1036
1061
 
1037
- const BedrockAdditionalModelResponseFieldsSchema = z
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 BedrockToolUseSchema = z.object({
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 BedrockReasoningTextSchema = z.object({
1078
+ const AmazonBedrockReasoningTextSchema = z.object({
1054
1079
  signature: z.string().nullish(),
1055
1080
  text: z.string(),
1056
1081
  });
1057
1082
 
1058
- const BedrockRedactedReasoningSchema = z.object({
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 BedrockResponseSchema = z.object({
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: BedrockToolUseSchema.nullish(),
1100
+ toolUse: AmazonBedrockToolUseSchema.nullish(),
1076
1101
  reasoningContent: z
1077
1102
  .union([
1078
1103
  z.object({
1079
- reasoningText: BedrockReasoningTextSchema,
1104
+ reasoningText: AmazonBedrockReasoningTextSchema,
1080
1105
  }),
1081
1106
  z.object({
1082
- redactedReasoning: BedrockRedactedReasoningSchema,
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: BedrockStopReasonSchema,
1116
+ stopReason: AmazonBedrockStopReasonSchema,
1092
1117
  additionalModelResponseFields:
1093
- BedrockAdditionalModelResponseFieldsSchema.nullish(),
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 BedrockStreamSchema = z.object({
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: BedrockToolUseSchema.nullish(),
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
- BedrockAdditionalModelResponseFieldsSchema.nullish(),
1154
- stopReason: BedrockStopReasonSchema,
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 const bedrockReasoningMetadataSchema = z.object({
1181
- signature: z.string().optional(),
1182
- redactedData: z.string().optional(),
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 bedrockReasoningEffortMap: Partial<
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 resolveBedrockReasoningConfig({
1220
+ function resolveAmazonBedrockReasoningConfig({
1200
1221
  reasoning,
1201
- bedrockOptions,
1222
+ amazonBedrockOptions,
1202
1223
  warnings,
1203
1224
  isAnthropicModel,
1204
1225
  modelId,
1205
1226
  }: {
1206
1227
  reasoning: LanguageModelV4CallOptions['reasoning'];
1207
- bedrockOptions: AmazonBedrockLanguageModelOptions;
1228
+ amazonBedrockOptions: AmazonBedrockLanguageModelChatOptions;
1208
1229
  warnings: SharedV4Warning[];
1209
1230
  isAnthropicModel: boolean;
1210
1231
  modelId: string;
1211
- }): AmazonBedrockLanguageModelOptions {
1232
+ }): AmazonBedrockLanguageModelChatOptions {
1212
1233
  if (!isCustomReasoning(reasoning)) {
1213
- return bedrockOptions;
1234
+ return amazonBedrockOptions;
1214
1235
  }
1215
1236
 
1216
- const result = { ...bedrockOptions };
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: bedrockReasoningEffortMap,
1247
+ effortMap: amazonBedrockReasoningEffortMap,
1227
1248
  warnings,
1228
1249
  });
1229
1250
  result.reasoningConfig = {
1230
1251
  type: 'adaptive',
1231
1252
  maxReasoningEffort: effort,
1232
- ...bedrockOptions.reasoningConfig,
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
- ...bedrockOptions.reasoningConfig,
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: bedrockReasoningEffortMap,
1273
+ effortMap: amazonBedrockReasoningEffortMap,
1253
1274
  warnings,
1254
1275
  });
1255
1276
  result.reasoningConfig = {
1256
1277
  maxReasoningEffort: effort,
1257
- ...bedrockOptions.reasoningConfig,
1278
+ ...amazonBedrockOptions.reasoningConfig,
1258
1279
  };
1259
1280
  }
1260
1281