@ai-sdk/amazon-bedrock 3.0.0-beta.13 → 3.0.0-beta.14

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/dist/index.mjs CHANGED
@@ -5,6 +5,7 @@ import {
5
5
  loadSetting,
6
6
  withoutTrailingSlash
7
7
  } from "@ai-sdk/provider-utils";
8
+ import { anthropicTools as anthropicTools2 } from "@ai-sdk/anthropic/internal";
8
9
 
9
10
  // src/bedrock-chat-language-model.ts
10
11
  import {
@@ -152,90 +153,143 @@ var createBedrockEventStreamResponseHandler = (chunkSchema) => async ({ response
152
153
  import {
153
154
  UnsupportedFunctionalityError
154
155
  } from "@ai-sdk/provider";
155
- function promptContainsToolContent(prompt) {
156
- return prompt.some((message) => {
157
- if ("content" in message && Array.isArray(message.content)) {
158
- return message.content.some(
159
- (part) => part.type === "tool-call" || part.type === "tool-result"
160
- );
161
- }
162
- return false;
163
- });
164
- }
156
+ import { asSchema } from "@ai-sdk/provider-utils";
157
+ import {
158
+ anthropicTools,
159
+ prepareTools as prepareAnthropicTools
160
+ } from "@ai-sdk/anthropic/internal";
165
161
  function prepareTools({
166
162
  tools,
167
163
  toolChoice,
168
- prompt
164
+ modelId
169
165
  }) {
170
- tools = (tools == null ? void 0 : tools.length) ? tools : void 0;
171
- const hasToolContent = promptContainsToolContent(prompt);
172
- if (tools == null) {
166
+ const toolWarnings = [];
167
+ const betas = /* @__PURE__ */ new Set();
168
+ if (tools == null || tools.length === 0) {
173
169
  return {
174
- toolConfig: {
175
- tools: void 0,
176
- toolChoice: void 0
177
- },
178
- toolWarnings: []
170
+ toolConfig: {},
171
+ additionalTools: void 0,
172
+ betas,
173
+ toolWarnings
179
174
  };
180
175
  }
181
- const toolWarnings = [];
182
- const bedrockTools = [];
183
- for (const tool of tools) {
184
- if (tool.type === "provider-defined") {
185
- toolWarnings.push({ type: "unsupported-tool", tool });
186
- } else {
187
- bedrockTools.push({
188
- toolSpec: {
189
- name: tool.name,
190
- description: tool.description,
191
- inputSchema: {
192
- json: tool.inputSchema
193
- }
194
- }
176
+ const supportedTools = tools.filter((tool) => {
177
+ if (tool.type === "provider-defined" && tool.id === "anthropic.web_search_20250305") {
178
+ toolWarnings.push({
179
+ type: "unsupported-tool",
180
+ tool,
181
+ details: "The web_search_20250305 tool is not supported on Amazon Bedrock."
195
182
  });
183
+ return false;
196
184
  }
197
- }
198
- if (toolChoice == null) {
185
+ return true;
186
+ });
187
+ if (supportedTools.length === 0) {
199
188
  return {
200
- toolConfig: { tools: bedrockTools, toolChoice: void 0 },
189
+ toolConfig: {},
190
+ additionalTools: void 0,
191
+ betas,
201
192
  toolWarnings
202
193
  };
203
194
  }
204
- const type = toolChoice.type;
205
- switch (type) {
206
- case "auto":
207
- return {
208
- toolConfig: { tools: bedrockTools, toolChoice: { auto: {} } },
209
- toolWarnings
210
- };
211
- case "required":
212
- return {
213
- toolConfig: { tools: bedrockTools, toolChoice: { any: {} } },
214
- toolWarnings
215
- };
216
- case "none":
217
- return {
218
- toolConfig: {
219
- tools: void 0,
220
- toolChoice: void 0
221
- },
222
- toolWarnings
223
- };
224
- case "tool":
225
- return {
226
- toolConfig: {
227
- tools: bedrockTools,
228
- toolChoice: { tool: { name: toolChoice.toolName } }
229
- },
230
- toolWarnings
195
+ const isAnthropicModel = modelId.includes("anthropic.");
196
+ const providerDefinedTools = supportedTools.filter(
197
+ (t) => t.type === "provider-defined"
198
+ );
199
+ const functionTools = supportedTools.filter((t) => t.type === "function");
200
+ let additionalTools = void 0;
201
+ const bedrockTools = [];
202
+ const usingAnthropicTools = isAnthropicModel && providerDefinedTools.length > 0;
203
+ if (usingAnthropicTools) {
204
+ if (functionTools.length > 0) {
205
+ toolWarnings.push({
206
+ type: "unsupported-setting",
207
+ setting: "tools",
208
+ details: "Mixed Anthropic provider-defined tools and standard function tools are not supported in a single call to Bedrock. Only Anthropic tools will be used."
209
+ });
210
+ }
211
+ const {
212
+ toolChoice: preparedAnthropicToolChoice,
213
+ toolWarnings: anthropicToolWarnings,
214
+ betas: anthropicBetas
215
+ } = prepareAnthropicTools({
216
+ tools: providerDefinedTools,
217
+ toolChoice
218
+ });
219
+ toolWarnings.push(...anthropicToolWarnings);
220
+ anthropicBetas.forEach((beta) => betas.add(beta));
221
+ if (preparedAnthropicToolChoice) {
222
+ additionalTools = {
223
+ tool_choice: preparedAnthropicToolChoice
231
224
  };
232
- default: {
233
- const _exhaustiveCheck = type;
234
- throw new UnsupportedFunctionalityError({
235
- functionality: `tool choice type: ${_exhaustiveCheck}`
225
+ }
226
+ for (const tool of providerDefinedTools) {
227
+ const toolFactory = Object.values(anthropicTools).find((factory) => {
228
+ const instance = factory({});
229
+ return instance.id === tool.id;
236
230
  });
231
+ if (toolFactory != null) {
232
+ const fullToolDefinition = toolFactory({});
233
+ bedrockTools.push({
234
+ toolSpec: {
235
+ name: tool.name,
236
+ inputSchema: {
237
+ json: asSchema(fullToolDefinition.inputSchema).jsonSchema
238
+ }
239
+ }
240
+ });
241
+ } else {
242
+ toolWarnings.push({ type: "unsupported-tool", tool });
243
+ }
244
+ }
245
+ } else {
246
+ for (const tool of providerDefinedTools) {
247
+ toolWarnings.push({ type: "unsupported-tool", tool });
237
248
  }
238
249
  }
250
+ for (const tool of functionTools) {
251
+ bedrockTools.push({
252
+ toolSpec: {
253
+ name: tool.name,
254
+ description: tool.description,
255
+ inputSchema: {
256
+ json: tool.inputSchema
257
+ }
258
+ }
259
+ });
260
+ }
261
+ let bedrockToolChoice = void 0;
262
+ if (!usingAnthropicTools && bedrockTools.length > 0 && toolChoice) {
263
+ const type = toolChoice.type;
264
+ switch (type) {
265
+ case "auto":
266
+ bedrockToolChoice = { auto: {} };
267
+ break;
268
+ case "required":
269
+ bedrockToolChoice = { any: {} };
270
+ break;
271
+ case "none":
272
+ bedrockTools.length = 0;
273
+ bedrockToolChoice = void 0;
274
+ break;
275
+ case "tool":
276
+ bedrockToolChoice = { tool: { name: toolChoice.toolName } };
277
+ break;
278
+ default: {
279
+ const _exhaustiveCheck = type;
280
+ throw new UnsupportedFunctionalityError({
281
+ functionality: `tool choice type: ${_exhaustiveCheck}`
282
+ });
283
+ }
284
+ }
285
+ }
286
+ const toolConfig = bedrockTools.length > 0 ? { tools: bedrockTools, toolChoice: bedrockToolChoice } : {};
287
+ return {
288
+ toolConfig,
289
+ additionalTools,
290
+ betas,
291
+ toolWarnings
292
+ };
239
293
  }
240
294
 
241
295
  // src/convert-to-bedrock-chat-messages.ts
@@ -592,7 +646,7 @@ var BedrockChatLanguageModel = class {
592
646
  toolChoice,
593
647
  providerOptions
594
648
  }) {
595
- var _a, _b, _c, _d;
649
+ var _a, _b, _c, _d, _e, _f;
596
650
  const bedrockOptions = (_a = await parseProviderOptions2({
597
651
  provider: "bedrock",
598
652
  providerOptions,
@@ -644,6 +698,18 @@ var BedrockChatLanguageModel = class {
644
698
  description: "Respond with a JSON object.",
645
699
  inputSchema: responseFormat.schema
646
700
  } : void 0;
701
+ const { toolConfig, additionalTools, toolWarnings, betas } = prepareTools({
702
+ tools: jsonResponseTool ? [jsonResponseTool, ...tools != null ? tools : []] : tools,
703
+ toolChoice: jsonResponseTool != null ? { type: "tool", toolName: jsonResponseTool.name } : toolChoice,
704
+ modelId: this.modelId
705
+ });
706
+ warnings.push(...toolWarnings);
707
+ if (additionalTools) {
708
+ bedrockOptions.additionalModelRequestFields = {
709
+ ...bedrockOptions.additionalModelRequestFields,
710
+ ...additionalTools
711
+ };
712
+ }
647
713
  const isThinking = ((_b = bedrockOptions.reasoningConfig) == null ? void 0 : _b.type) === "enabled";
648
714
  const thinkingBudget = (_c = bedrockOptions.reasoningConfig) == null ? void 0 : _c.budgetTokens;
649
715
  const inferenceConfig = {
@@ -682,9 +748,9 @@ var BedrockChatLanguageModel = class {
682
748
  details: "topP is not supported when thinking is enabled"
683
749
  });
684
750
  }
685
- const activeTools = jsonResponseTool != null ? [jsonResponseTool] : tools != null ? tools : [];
751
+ const hasAnyTools = ((_f = (_e = toolConfig.tools) == null ? void 0 : _e.length) != null ? _f : 0) > 0 || additionalTools;
686
752
  let filteredPrompt = prompt;
687
- if (activeTools.length === 0) {
753
+ if (!hasAnyTools) {
688
754
  const hasToolContent = prompt.some(
689
755
  (message) => "content" in message && Array.isArray(message.content) && message.content.some(
690
756
  (part) => part.type === "tool-call" || part.type === "tool-result"
@@ -709,11 +775,6 @@ var BedrockChatLanguageModel = class {
709
775
  }
710
776
  }
711
777
  const { system, messages } = await convertToBedrockChatMessages(filteredPrompt);
712
- const { toolConfig, toolWarnings } = prepareTools({
713
- tools: activeTools,
714
- toolChoice: jsonResponseTool != null ? { type: "tool", toolName: jsonResponseTool.name } : toolChoice,
715
- prompt: filteredPrompt
716
- });
717
778
  const { reasoningConfig: _, ...filteredBedrockOptions } = (providerOptions == null ? void 0 : providerOptions.bedrock) || {};
718
779
  return {
719
780
  command: {
@@ -724,26 +785,35 @@ var BedrockChatLanguageModel = class {
724
785
  inferenceConfig
725
786
  },
726
787
  ...filteredBedrockOptions,
727
- ...toolConfig.tools !== void 0 ? { toolConfig } : {}
788
+ ...toolConfig.tools !== void 0 && toolConfig.tools.length > 0 ? { toolConfig } : {}
728
789
  },
729
- warnings: [...warnings, ...toolWarnings],
730
- usesJsonResponseTool: jsonResponseTool != null
790
+ warnings,
791
+ usesJsonResponseTool: jsonResponseTool != null,
792
+ betas
731
793
  };
732
794
  }
795
+ async getHeaders({
796
+ betas,
797
+ headers
798
+ }) {
799
+ return combineHeaders(
800
+ await resolve(this.config.headers),
801
+ betas.size > 0 ? { "anthropic-beta": Array.from(betas).join(",") } : {},
802
+ headers
803
+ );
804
+ }
733
805
  async doGenerate(options) {
734
806
  var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n;
735
807
  const {
736
808
  command: args,
737
809
  warnings,
738
- usesJsonResponseTool
810
+ usesJsonResponseTool,
811
+ betas
739
812
  } = await this.getArgs(options);
740
813
  const url = `${this.getUrl(this.modelId)}/converse`;
741
814
  const { value: response, responseHeaders } = await postJsonToApi({
742
815
  url,
743
- headers: combineHeaders(
744
- await resolve(this.config.headers),
745
- options.headers
746
- ),
816
+ headers: await this.getHeaders({ betas, headers: options.headers }),
747
817
  body: args,
748
818
  failedResponseHandler: createJsonErrorResponseHandler({
749
819
  errorSchema: BedrockErrorSchema,
@@ -840,15 +910,13 @@ var BedrockChatLanguageModel = class {
840
910
  const {
841
911
  command: args,
842
912
  warnings,
843
- usesJsonResponseTool
913
+ usesJsonResponseTool,
914
+ betas
844
915
  } = await this.getArgs(options);
845
916
  const url = `${this.getUrl(this.modelId)}/converse-stream`;
846
917
  const { value: response, responseHeaders } = await postJsonToApi({
847
918
  url,
848
- headers: combineHeaders(
849
- await resolve(this.config.headers),
850
- options.headers
851
- ),
919
+ headers: await this.getHeaders({ betas, headers: options.headers }),
852
920
  body: args,
853
921
  failedResponseHandler: createJsonErrorResponseHandler({
854
922
  errorSchema: BedrockErrorSchema,
@@ -1602,6 +1670,7 @@ Original error: ${errorMessage}`
1602
1670
  provider.textEmbeddingModel = createEmbeddingModel;
1603
1671
  provider.image = createImageModel;
1604
1672
  provider.imageModel = createImageModel;
1673
+ provider.tools = anthropicTools2;
1605
1674
  return provider;
1606
1675
  }
1607
1676
  var bedrock = createAmazonBedrock();