UNPKG

@ai-sdk/amazon-bedrock

Version:

The **[Amazon Bedrock provider](https://ai-sdk.dev/providers/ai-sdk-providers/amazon-bedrock)** for the [AI SDK](https://ai-sdk.dev/docs) contains language model support for the Amazon Bedrock [converse API](https://docs.aws.amazon.com/bedrock/latest/APIR

1,359 lines (1,345 loc) 61.3 kB
"use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // src/index.ts var src_exports = {}; __export(src_exports, { bedrock: () => bedrock, createAmazonBedrock: () => createAmazonBedrock }); module.exports = __toCommonJS(src_exports); // src/bedrock-provider.ts var import_provider_utils8 = require("@ai-sdk/provider-utils"); var import_internal2 = require("@ai-sdk/anthropic/internal"); // src/bedrock-chat-language-model.ts var import_provider_utils4 = require("@ai-sdk/provider-utils"); var import_v43 = require("zod/v4"); // src/bedrock-api-types.ts var BEDROCK_CACHE_POINT = { cachePoint: { type: "default" } }; var BEDROCK_STOP_REASONS = [ "stop", "stop_sequence", "end_turn", "length", "max_tokens", "content-filter", "content_filtered", "guardrail_intervened", "tool-calls", "tool_use" ]; var BEDROCK_IMAGE_MIME_TYPES = { "image/jpeg": "jpeg", "image/png": "png", "image/gif": "gif", "image/webp": "webp" }; var BEDROCK_DOCUMENT_MIME_TYPES = { "application/pdf": "pdf", "text/csv": "csv", "application/msword": "doc", "application/vnd.openxmlformats-officedocument.wordprocessingml.document": "docx", "application/vnd.ms-excel": "xls", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": "xlsx", "text/html": "html", "text/plain": "txt", "text/markdown": "md" }; // src/bedrock-chat-options.ts var import_v4 = require("zod/v4"); var bedrockProviderOptions = import_v4.z.object({ /** * Additional inference parameters that the model supports, * beyond the base set of inference parameters that Converse * supports in the inferenceConfig field */ additionalModelRequestFields: import_v4.z.record(import_v4.z.string(), import_v4.z.any()).optional(), reasoningConfig: import_v4.z.object({ type: import_v4.z.union([import_v4.z.literal("enabled"), import_v4.z.literal("disabled")]).optional(), budgetTokens: import_v4.z.number().optional() }).optional() }); // src/bedrock-error.ts var import_v42 = require("zod/v4"); var BedrockErrorSchema = import_v42.z.object({ message: import_v42.z.string(), type: import_v42.z.string().nullish() }); // src/bedrock-event-stream-response-handler.ts var import_provider = require("@ai-sdk/provider"); var import_provider_utils = require("@ai-sdk/provider-utils"); var import_eventstream_codec = require("@smithy/eventstream-codec"); var import_util_utf8 = require("@smithy/util-utf8"); var createBedrockEventStreamResponseHandler = (chunkSchema) => async ({ response }) => { const responseHeaders = (0, import_provider_utils.extractResponseHeaders)(response); if (response.body == null) { throw new import_provider.EmptyResponseBodyError({}); } const codec = new import_eventstream_codec.EventStreamCodec(import_util_utf8.toUtf8, import_util_utf8.fromUtf8); let buffer = new Uint8Array(0); const textDecoder = new TextDecoder(); return { responseHeaders, value: response.body.pipeThrough( new TransformStream({ async transform(chunk, controller) { var _a, _b; const newBuffer = new Uint8Array(buffer.length + chunk.length); newBuffer.set(buffer); newBuffer.set(chunk, buffer.length); buffer = newBuffer; while (buffer.length >= 4) { const totalLength = new DataView( buffer.buffer, buffer.byteOffset, buffer.byteLength ).getUint32(0, false); if (buffer.length < totalLength) { break; } try { const subView = buffer.subarray(0, totalLength); const decoded = codec.decode(subView); buffer = buffer.slice(totalLength); if (((_a = decoded.headers[":message-type"]) == null ? void 0 : _a.value) === "event") { const data = textDecoder.decode(decoded.body); const parsedDataResult = await (0, import_provider_utils.safeParseJSON)({ text: data }); if (!parsedDataResult.success) { controller.enqueue(parsedDataResult); break; } delete parsedDataResult.value.p; let wrappedData = { [(_b = decoded.headers[":event-type"]) == null ? void 0 : _b.value]: parsedDataResult.value }; const validatedWrappedData = await (0, import_provider_utils.safeValidateTypes)({ value: wrappedData, schema: chunkSchema }); if (!validatedWrappedData.success) { controller.enqueue(validatedWrappedData); } else { controller.enqueue({ success: true, value: validatedWrappedData.value, rawValue: wrappedData }); } } } catch (e) { break; } } } }) ) }; }; // src/bedrock-prepare-tools.ts var import_provider2 = require("@ai-sdk/provider"); var import_provider_utils2 = require("@ai-sdk/provider-utils"); var import_internal = require("@ai-sdk/anthropic/internal"); function prepareTools({ tools, toolChoice, modelId }) { const toolWarnings = []; const betas = /* @__PURE__ */ new Set(); if (tools == null || tools.length === 0) { return { toolConfig: {}, additionalTools: void 0, betas, toolWarnings }; } const supportedTools = tools.filter((tool) => { if (tool.type === "provider-defined" && tool.id === "anthropic.web_search_20250305") { toolWarnings.push({ type: "unsupported-tool", tool, details: "The web_search_20250305 tool is not supported on Amazon Bedrock." }); return false; } return true; }); if (supportedTools.length === 0) { return { toolConfig: {}, additionalTools: void 0, betas, toolWarnings }; } const isAnthropicModel = modelId.includes("anthropic."); const providerDefinedTools = supportedTools.filter( (t) => t.type === "provider-defined" ); const functionTools = supportedTools.filter((t) => t.type === "function"); let additionalTools = void 0; const bedrockTools = []; const usingAnthropicTools = isAnthropicModel && providerDefinedTools.length > 0; if (usingAnthropicTools) { if (functionTools.length > 0) { toolWarnings.push({ type: "unsupported-setting", setting: "tools", 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." }); } const { toolChoice: preparedAnthropicToolChoice, toolWarnings: anthropicToolWarnings, betas: anthropicBetas } = (0, import_internal.prepareTools)({ tools: providerDefinedTools, toolChoice }); toolWarnings.push(...anthropicToolWarnings); anthropicBetas.forEach((beta) => betas.add(beta)); if (preparedAnthropicToolChoice) { additionalTools = { tool_choice: preparedAnthropicToolChoice }; } for (const tool of providerDefinedTools) { const toolFactory = Object.values(import_internal.anthropicTools).find((factory) => { const instance = factory({}); return instance.id === tool.id; }); if (toolFactory != null) { const fullToolDefinition = toolFactory({}); bedrockTools.push({ toolSpec: { name: tool.name, inputSchema: { json: (0, import_provider_utils2.asSchema)(fullToolDefinition.inputSchema).jsonSchema } } }); } else { toolWarnings.push({ type: "unsupported-tool", tool }); } } } else { for (const tool of providerDefinedTools) { toolWarnings.push({ type: "unsupported-tool", tool }); } } for (const tool of functionTools) { bedrockTools.push({ toolSpec: { name: tool.name, description: tool.description, inputSchema: { json: tool.inputSchema } } }); } let bedrockToolChoice = void 0; if (!usingAnthropicTools && bedrockTools.length > 0 && toolChoice) { const type = toolChoice.type; switch (type) { case "auto": bedrockToolChoice = { auto: {} }; break; case "required": bedrockToolChoice = { any: {} }; break; case "none": bedrockTools.length = 0; bedrockToolChoice = void 0; break; case "tool": bedrockToolChoice = { tool: { name: toolChoice.toolName } }; break; default: { const _exhaustiveCheck = type; throw new import_provider2.UnsupportedFunctionalityError({ functionality: `tool choice type: ${_exhaustiveCheck}` }); } } } const toolConfig = bedrockTools.length > 0 ? { tools: bedrockTools, toolChoice: bedrockToolChoice } : {}; return { toolConfig, additionalTools, betas, toolWarnings }; } // src/convert-to-bedrock-chat-messages.ts var import_provider3 = require("@ai-sdk/provider"); var import_provider_utils3 = require("@ai-sdk/provider-utils"); function getCachePoint(providerMetadata) { var _a; return (_a = providerMetadata == null ? void 0 : providerMetadata.bedrock) == null ? void 0 : _a.cachePoint; } async function convertToBedrockChatMessages(prompt) { const blocks = groupIntoBlocks(prompt); let system = []; const messages = []; let documentCounter = 0; const generateDocumentName = () => `document-${++documentCounter}`; for (let i = 0; i < blocks.length; i++) { const block = blocks[i]; const isLastBlock = i === blocks.length - 1; const type = block.type; switch (type) { case "system": { if (messages.length > 0) { throw new import_provider3.UnsupportedFunctionalityError({ functionality: "Multiple system messages that are separated by user/assistant messages" }); } for (const message of block.messages) { system.push({ text: message.content }); if (getCachePoint(message.providerOptions)) { system.push(BEDROCK_CACHE_POINT); } } break; } case "user": { const bedrockContent = []; for (const message of block.messages) { const { role, content, providerOptions } = message; switch (role) { case "user": { for (let j = 0; j < content.length; j++) { const part = content[j]; switch (part.type) { case "text": { bedrockContent.push({ text: part.text }); break; } case "file": { if (part.data instanceof URL) { throw new import_provider3.UnsupportedFunctionalityError({ functionality: "File URL data" }); } if (part.mediaType.startsWith("image/")) { bedrockContent.push({ image: { format: getBedrockImageFormat(part.mediaType), source: { bytes: (0, import_provider_utils3.convertToBase64)(part.data) } } }); } else { if (!part.mediaType) { throw new import_provider3.UnsupportedFunctionalityError({ functionality: "file without mime type", message: "File mime type is required in user message part content" }); } bedrockContent.push({ document: { format: getBedrockDocumentFormat(part.mediaType), name: generateDocumentName(), source: { bytes: (0, import_provider_utils3.convertToBase64)(part.data) } } }); } break; } } } break; } case "tool": { for (const part of content) { let toolResultContent; const output = part.output; switch (output.type) { case "content": { toolResultContent = output.value.map((contentPart) => { switch (contentPart.type) { case "text": return { text: contentPart.text }; case "media": if (!contentPart.mediaType.startsWith("image/")) { throw new import_provider3.UnsupportedFunctionalityError({ functionality: `media type: ${contentPart.mediaType}` }); } const format = getBedrockImageFormat( contentPart.mediaType ); return { image: { format, source: { bytes: contentPart.data } } }; } }); break; } case "text": case "error-text": toolResultContent = [{ text: output.value }]; break; case "json": case "error-json": default: toolResultContent = [ { text: JSON.stringify(output.value) } ]; break; } bedrockContent.push({ toolResult: { toolUseId: part.toolCallId, content: toolResultContent } }); } break; } default: { const _exhaustiveCheck = role; throw new Error(`Unsupported role: ${_exhaustiveCheck}`); } } if (getCachePoint(providerOptions)) { bedrockContent.push(BEDROCK_CACHE_POINT); } } messages.push({ role: "user", content: bedrockContent }); break; } case "assistant": { const bedrockContent = []; for (let j = 0; j < block.messages.length; j++) { const message = block.messages[j]; const isLastMessage = j === block.messages.length - 1; const { content } = message; for (let k = 0; k < content.length; k++) { const part = content[k]; const isLastContentPart = k === content.length - 1; switch (part.type) { case "text": { bedrockContent.push({ text: ( // trim the last text part if it's the last message in the block // because Bedrock does not allow trailing whitespace // in pre-filled assistant responses trimIfLast( isLastBlock, isLastMessage, isLastContentPart, part.text ) ) }); break; } case "reasoning": { const reasoningMetadata = await (0, import_provider_utils3.parseProviderOptions)({ provider: "bedrock", providerOptions: part.providerOptions, schema: bedrockReasoningMetadataSchema }); if (reasoningMetadata != null) { if (reasoningMetadata.signature != null) { bedrockContent.push({ reasoningContent: { reasoningText: { // trim the last text part if it's the last message in the block // because Bedrock does not allow trailing whitespace // in pre-filled assistant responses text: trimIfLast( isLastBlock, isLastMessage, isLastContentPart, part.text ), signature: reasoningMetadata.signature } } }); } else if (reasoningMetadata.redactedData != null) { bedrockContent.push({ reasoningContent: { redactedReasoning: { data: reasoningMetadata.redactedData } } }); } } break; } case "tool-call": { bedrockContent.push({ toolUse: { toolUseId: part.toolCallId, name: part.toolName, input: part.input } }); break; } } } if (getCachePoint(message.providerOptions)) { bedrockContent.push(BEDROCK_CACHE_POINT); } } messages.push({ role: "assistant", content: bedrockContent }); break; } default: { const _exhaustiveCheck = type; throw new Error(`Unsupported type: ${_exhaustiveCheck}`); } } } return { system, messages }; } function getBedrockImageFormat(mimeType) { if (!mimeType) { throw new import_provider3.UnsupportedFunctionalityError({ functionality: "image without mime type", message: "Image mime type is required in user message part content" }); } const format = BEDROCK_IMAGE_MIME_TYPES[mimeType]; if (!format) { throw new import_provider3.UnsupportedFunctionalityError({ functionality: `image mime type: ${mimeType}`, message: `Unsupported image mime type: ${mimeType}, expected one of: ${Object.keys(BEDROCK_IMAGE_MIME_TYPES).join(", ")}` }); } return format; } function getBedrockDocumentFormat(mimeType) { const format = BEDROCK_DOCUMENT_MIME_TYPES[mimeType]; if (!format) { throw new import_provider3.UnsupportedFunctionalityError({ functionality: `file mime type: ${mimeType}`, message: `Unsupported file mime type: ${mimeType}, expected one of: ${Object.keys(BEDROCK_DOCUMENT_MIME_TYPES).join(", ")}` }); } return format; } function trimIfLast(isLastBlock, isLastMessage, isLastContentPart, text) { return isLastBlock && isLastMessage && isLastContentPart ? text.trim() : text; } function groupIntoBlocks(prompt) { const blocks = []; let currentBlock = void 0; for (const message of prompt) { const { role } = message; switch (role) { case "system": { if ((currentBlock == null ? void 0 : currentBlock.type) !== "system") { currentBlock = { type: "system", messages: [] }; blocks.push(currentBlock); } currentBlock.messages.push(message); break; } case "assistant": { if ((currentBlock == null ? void 0 : currentBlock.type) !== "assistant") { currentBlock = { type: "assistant", messages: [] }; blocks.push(currentBlock); } currentBlock.messages.push(message); break; } case "user": { if ((currentBlock == null ? void 0 : currentBlock.type) !== "user") { currentBlock = { type: "user", messages: [] }; blocks.push(currentBlock); } currentBlock.messages.push(message); break; } case "tool": { if ((currentBlock == null ? void 0 : currentBlock.type) !== "user") { currentBlock = { type: "user", messages: [] }; blocks.push(currentBlock); } currentBlock.messages.push(message); break; } default: { const _exhaustiveCheck = role; throw new Error(`Unsupported role: ${_exhaustiveCheck}`); } } } return blocks; } // src/map-bedrock-finish-reason.ts function mapBedrockFinishReason(finishReason) { switch (finishReason) { case "stop_sequence": case "end_turn": return "stop"; case "max_tokens": return "length"; case "content_filtered": case "guardrail_intervened": return "content-filter"; case "tool_use": return "tool-calls"; default: return "unknown"; } } // src/bedrock-chat-language-model.ts var BedrockChatLanguageModel = class { constructor(modelId, config) { this.modelId = modelId; this.config = config; this.specificationVersion = "v2"; this.provider = "amazon-bedrock"; this.supportedUrls = { // no supported urls for bedrock }; } async getArgs({ prompt, maxOutputTokens, temperature, topP, topK, frequencyPenalty, presencePenalty, stopSequences, responseFormat, seed, tools, toolChoice, providerOptions }) { var _a, _b, _c, _d, _e, _f; const bedrockOptions = (_a = await (0, import_provider_utils4.parseProviderOptions)({ provider: "bedrock", providerOptions, schema: bedrockProviderOptions })) != null ? _a : {}; const warnings = []; if (frequencyPenalty != null) { warnings.push({ type: "unsupported-setting", setting: "frequencyPenalty" }); } if (presencePenalty != null) { warnings.push({ type: "unsupported-setting", setting: "presencePenalty" }); } if (seed != null) { warnings.push({ type: "unsupported-setting", setting: "seed" }); } if (responseFormat != null && responseFormat.type !== "text" && responseFormat.type !== "json") { warnings.push({ type: "unsupported-setting", setting: "responseFormat", details: "Only text and json response formats are supported." }); } if (tools != null && (responseFormat == null ? void 0 : responseFormat.type) === "json") { if (tools.length > 0) { warnings.push({ type: "other", message: "JSON response format does not support tools. The provided tools are ignored." }); } } const jsonResponseTool = (responseFormat == null ? void 0 : responseFormat.type) === "json" && responseFormat.schema != null ? { type: "function", name: "json", description: "Respond with a JSON object.", inputSchema: responseFormat.schema } : void 0; const { toolConfig, additionalTools, toolWarnings, betas } = prepareTools({ tools: jsonResponseTool ? [jsonResponseTool, ...tools != null ? tools : []] : tools, toolChoice: jsonResponseTool != null ? { type: "tool", toolName: jsonResponseTool.name } : toolChoice, modelId: this.modelId }); warnings.push(...toolWarnings); if (additionalTools) { bedrockOptions.additionalModelRequestFields = { ...bedrockOptions.additionalModelRequestFields, ...additionalTools }; } const isThinking = ((_b = bedrockOptions.reasoningConfig) == null ? void 0 : _b.type) === "enabled"; const thinkingBudget = (_c = bedrockOptions.reasoningConfig) == null ? void 0 : _c.budgetTokens; const inferenceConfig = { ...maxOutputTokens != null && { maxOutputTokens }, ...temperature != null && { temperature }, ...topP != null && { topP }, ...topK != null && { topK }, ...stopSequences != null && { stopSequences } }; if (isThinking && thinkingBudget != null) { if (inferenceConfig.maxOutputTokens != null) { inferenceConfig.maxOutputTokens += thinkingBudget; } else { inferenceConfig.maxOutputTokens = thinkingBudget + 4096; } bedrockOptions.additionalModelRequestFields = { ...bedrockOptions.additionalModelRequestFields, thinking: { type: (_d = bedrockOptions.reasoningConfig) == null ? void 0 : _d.type, budget_tokens: thinkingBudget } }; } if (isThinking && inferenceConfig.temperature != null) { delete inferenceConfig.temperature; warnings.push({ type: "unsupported-setting", setting: "temperature", details: "temperature is not supported when thinking is enabled" }); } if (isThinking && inferenceConfig.topP != null) { delete inferenceConfig.topP; warnings.push({ type: "unsupported-setting", setting: "topP", details: "topP is not supported when thinking is enabled" }); } if (isThinking && inferenceConfig.topK != null) { delete inferenceConfig.topK; warnings.push({ type: "unsupported-setting", setting: "topK", details: "topK is not supported when thinking is enabled" }); } const hasAnyTools = ((_f = (_e = toolConfig.tools) == null ? void 0 : _e.length) != null ? _f : 0) > 0 || additionalTools; let filteredPrompt = prompt; if (!hasAnyTools) { const hasToolContent = prompt.some( (message) => "content" in message && Array.isArray(message.content) && message.content.some( (part) => part.type === "tool-call" || part.type === "tool-result" ) ); if (hasToolContent) { filteredPrompt = prompt.map( (message) => message.role === "system" ? message : { ...message, content: message.content.filter( (part) => part.type !== "tool-call" && part.type !== "tool-result" ) } ).filter( (message) => message.role === "system" || message.content.length > 0 ); warnings.push({ type: "unsupported-setting", setting: "toolContent", details: "Tool calls and results removed from conversation because Bedrock does not support tool content without active tools." }); } } const { system, messages } = await convertToBedrockChatMessages(filteredPrompt); const { reasoningConfig: _, ...filteredBedrockOptions } = (providerOptions == null ? void 0 : providerOptions.bedrock) || {}; return { command: { system, messages, additionalModelRequestFields: bedrockOptions.additionalModelRequestFields, ...Object.keys(inferenceConfig).length > 0 && { inferenceConfig }, ...filteredBedrockOptions, ...toolConfig.tools !== void 0 && toolConfig.tools.length > 0 ? { toolConfig } : {} }, warnings, usesJsonResponseTool: jsonResponseTool != null, betas }; } async getHeaders({ betas, headers }) { return (0, import_provider_utils4.combineHeaders)( await (0, import_provider_utils4.resolve)(this.config.headers), betas.size > 0 ? { "anthropic-beta": Array.from(betas).join(",") } : {}, headers ); } async doGenerate(options) { var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n; const { command: args, warnings, usesJsonResponseTool, betas } = await this.getArgs(options); const url = `${this.getUrl(this.modelId)}/converse`; const { value: response, responseHeaders } = await (0, import_provider_utils4.postJsonToApi)({ url, headers: await this.getHeaders({ betas, headers: options.headers }), body: args, failedResponseHandler: (0, import_provider_utils4.createJsonErrorResponseHandler)({ errorSchema: BedrockErrorSchema, errorToMessage: (error) => { var _a2; return `${(_a2 = error.message) != null ? _a2 : "Unknown error"}`; } }), successfulResponseHandler: (0, import_provider_utils4.createJsonResponseHandler)( BedrockResponseSchema ), abortSignal: options.abortSignal, fetch: this.config.fetch }); const content = []; for (const part of response.output.message.content) { if (part.text) { if (!usesJsonResponseTool) { content.push({ type: "text", text: part.text }); } } if (part.reasoningContent) { if ("reasoningText" in part.reasoningContent) { const reasoning = { type: "reasoning", text: part.reasoningContent.reasoningText.text }; if (part.reasoningContent.reasoningText.signature) { reasoning.providerMetadata = { bedrock: { signature: part.reasoningContent.reasoningText.signature } }; } content.push(reasoning); } else if ("redactedReasoning" in part.reasoningContent) { content.push({ type: "reasoning", text: "", providerMetadata: { bedrock: { redactedData: (_a = part.reasoningContent.redactedReasoning.data) != null ? _a : "" } } }); } } if (part.toolUse) { content.push( // when a json response tool is used, the tool call becomes the text: usesJsonResponseTool ? { type: "text", text: JSON.stringify(part.toolUse.input) } : { type: "tool-call", toolCallId: (_c = (_b = part.toolUse) == null ? void 0 : _b.toolUseId) != null ? _c : this.config.generateId(), toolName: (_e = (_d = part.toolUse) == null ? void 0 : _d.name) != null ? _e : `tool-${this.config.generateId()}`, input: JSON.stringify((_g = (_f = part.toolUse) == null ? void 0 : _f.input) != null ? _g : "") } ); } } const providerMetadata = response.trace || response.usage || usesJsonResponseTool ? { bedrock: { ...response.trace && typeof response.trace === "object" ? { trace: response.trace } : {}, ...((_h = response.usage) == null ? void 0 : _h.cacheWriteInputTokens) != null && { usage: { cacheWriteInputTokens: response.usage.cacheWriteInputTokens } }, ...usesJsonResponseTool && { isJsonResponseFromTool: true } } } : void 0; return { content, finishReason: mapBedrockFinishReason( response.stopReason ), usage: { inputTokens: (_i = response.usage) == null ? void 0 : _i.inputTokens, outputTokens: (_j = response.usage) == null ? void 0 : _j.outputTokens, totalTokens: ((_k = response.usage) == null ? void 0 : _k.inputTokens) + ((_l = response.usage) == null ? void 0 : _l.outputTokens), cachedInputTokens: (_n = (_m = response.usage) == null ? void 0 : _m.cacheReadInputTokens) != null ? _n : void 0 }, response: { // TODO add id, timestamp, etc headers: responseHeaders }, warnings, ...providerMetadata && { providerMetadata } }; } async doStream(options) { const { command: args, warnings, usesJsonResponseTool, betas } = await this.getArgs(options); const url = `${this.getUrl(this.modelId)}/converse-stream`; const { value: response, responseHeaders } = await (0, import_provider_utils4.postJsonToApi)({ url, headers: await this.getHeaders({ betas, headers: options.headers }), body: args, failedResponseHandler: (0, import_provider_utils4.createJsonErrorResponseHandler)({ errorSchema: BedrockErrorSchema, errorToMessage: (error) => `${error.type}: ${error.message}` }), successfulResponseHandler: createBedrockEventStreamResponseHandler(BedrockStreamSchema), abortSignal: options.abortSignal, fetch: this.config.fetch }); let finishReason = "unknown"; const usage = { inputTokens: void 0, outputTokens: void 0, totalTokens: void 0 }; let providerMetadata = void 0; const contentBlocks = {}; return { stream: response.pipeThrough( new TransformStream({ start(controller) { controller.enqueue({ type: "stream-start", warnings }); }, transform(chunk, controller) { var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q; function enqueueError(bedrockError) { finishReason = "error"; controller.enqueue({ type: "error", error: bedrockError }); } if (options.includeRawChunks) { controller.enqueue({ type: "raw", rawValue: chunk.rawValue }); } if (!chunk.success) { enqueueError(chunk.error); return; } const value = chunk.value; if (value.internalServerException) { enqueueError(value.internalServerException); return; } if (value.modelStreamErrorException) { enqueueError(value.modelStreamErrorException); return; } if (value.throttlingException) { enqueueError(value.throttlingException); return; } if (value.validationException) { enqueueError(value.validationException); return; } if (value.messageStop) { finishReason = mapBedrockFinishReason( value.messageStop.stopReason ); } if (value.metadata) { usage.inputTokens = (_b = (_a = value.metadata.usage) == null ? void 0 : _a.inputTokens) != null ? _b : usage.inputTokens; usage.outputTokens = (_d = (_c = value.metadata.usage) == null ? void 0 : _c.outputTokens) != null ? _d : usage.outputTokens; usage.totalTokens = ((_e = usage.inputTokens) != null ? _e : 0) + ((_f = usage.outputTokens) != null ? _f : 0); usage.cachedInputTokens = (_h = (_g = value.metadata.usage) == null ? void 0 : _g.cacheReadInputTokens) != null ? _h : usage.cachedInputTokens; const cacheUsage = ((_i = value.metadata.usage) == null ? void 0 : _i.cacheWriteInputTokens) != null ? { usage: { cacheWriteInputTokens: value.metadata.usage.cacheWriteInputTokens } } : void 0; const trace = value.metadata.trace ? { trace: value.metadata.trace } : void 0; if (cacheUsage || trace || usesJsonResponseTool) { providerMetadata = { bedrock: { ...cacheUsage, ...trace, ...usesJsonResponseTool && { isJsonResponseFromTool: true } } }; } } if (((_j = value.contentBlockStart) == null ? void 0 : _j.contentBlockIndex) != null && !((_l = (_k = value.contentBlockStart) == null ? void 0 : _k.start) == null ? void 0 : _l.toolUse)) { const blockIndex = value.contentBlockStart.contentBlockIndex; contentBlocks[blockIndex] = { type: "text" }; controller.enqueue({ type: "text-start", id: String(blockIndex) }); } if (((_m = value.contentBlockDelta) == null ? void 0 : _m.delta) && "text" in value.contentBlockDelta.delta && value.contentBlockDelta.delta.text) { const blockIndex = value.contentBlockDelta.contentBlockIndex || 0; if (contentBlocks[blockIndex] == null) { contentBlocks[blockIndex] = { type: "text" }; if (!usesJsonResponseTool) { controller.enqueue({ type: "text-start", id: String(blockIndex) }); } } if (!usesJsonResponseTool) { controller.enqueue({ type: "text-delta", id: String(blockIndex), delta: value.contentBlockDelta.delta.text }); } } if (((_n = value.contentBlockStop) == null ? void 0 : _n.contentBlockIndex) != null) { const blockIndex = value.contentBlockStop.contentBlockIndex; const contentBlock = contentBlocks[blockIndex]; if (contentBlock != null) { if (contentBlock.type === "reasoning") { controller.enqueue({ type: "reasoning-end", id: String(blockIndex) }); } else if (contentBlock.type === "text") { if (!usesJsonResponseTool) { controller.enqueue({ type: "text-end", id: String(blockIndex) }); } } else if (contentBlock.type === "tool-call") { if (usesJsonResponseTool) { controller.enqueue({ type: "text-start", id: String(blockIndex) }); controller.enqueue({ type: "text-delta", id: String(blockIndex), delta: contentBlock.jsonText }); controller.enqueue({ type: "text-end", id: String(blockIndex) }); } else { controller.enqueue({ type: "tool-input-end", id: contentBlock.toolCallId }); controller.enqueue({ type: "tool-call", toolCallId: contentBlock.toolCallId, toolName: contentBlock.toolName, input: contentBlock.jsonText }); } } delete contentBlocks[blockIndex]; } } if (((_o = value.contentBlockDelta) == null ? void 0 : _o.delta) && "reasoningContent" in value.contentBlockDelta.delta && value.contentBlockDelta.delta.reasoningContent) { const blockIndex = value.contentBlockDelta.contentBlockIndex || 0; const reasoningContent = value.contentBlockDelta.delta.reasoningContent; if ("text" in reasoningContent && reasoningContent.text) { if (contentBlocks[blockIndex] == null) { contentBlocks[blockIndex] = { type: "reasoning" }; controller.enqueue({ type: "reasoning-start", id: String(blockIndex) }); } controller.enqueue({ type: "reasoning-delta", id: String(blockIndex), delta: reasoningContent.text }); } else if ("signature" in reasoningContent && reasoningContent.signature) { controller.enqueue({ type: "reasoning-delta", id: String(blockIndex), delta: "", providerMetadata: { bedrock: { signature: reasoningContent.signature } } }); } else if ("data" in reasoningContent && reasoningContent.data) { controller.enqueue({ type: "reasoning-delta", id: String(blockIndex), delta: "", providerMetadata: { bedrock: { redactedData: reasoningContent.data } } }); } } const contentBlockStart = value.contentBlockStart; if (((_p = contentBlockStart == null ? void 0 : contentBlockStart.start) == null ? void 0 : _p.toolUse) != null) { const toolUse = contentBlockStart.start.toolUse; const blockIndex = contentBlockStart.contentBlockIndex; contentBlocks[blockIndex] = { type: "tool-call", toolCallId: toolUse.toolUseId, toolName: toolUse.name, jsonText: "" }; if (!usesJsonResponseTool) { controller.enqueue({ type: "tool-input-start", id: toolUse.toolUseId, toolName: toolUse.name }); } } const contentBlockDelta = value.contentBlockDelta; if ((contentBlockDelta == null ? void 0 : contentBlockDelta.delta) && "toolUse" in contentBlockDelta.delta && contentBlockDelta.delta.toolUse) { const blockIndex = contentBlockDelta.contentBlockIndex; const contentBlock = contentBlocks[blockIndex]; if ((contentBlock == null ? void 0 : contentBlock.type) === "tool-call") { const delta = (_q = contentBlockDelta.delta.toolUse.input) != null ? _q : ""; if (!usesJsonResponseTool) { controller.enqueue({ type: "tool-input-delta", id: contentBlock.toolCallId, delta }); } contentBlock.jsonText += delta; } } }, flush(controller) { controller.enqueue({ type: "finish", finishReason, usage, ...providerMetadata && { providerMetadata } }); } }) ), // TODO request? response: { headers: responseHeaders } }; } getUrl(modelId) { const encodedModelId = encodeURIComponent(modelId); return `${this.config.baseUrl()}/model/${encodedModelId}`; } }; var BedrockStopReasonSchema = import_v43.z.union([ import_v43.z.enum(BEDROCK_STOP_REASONS), import_v43.z.string() ]); var BedrockToolUseSchema = import_v43.z.object({ toolUseId: import_v43.z.string(), name: import_v43.z.string(), input: import_v43.z.unknown() }); var BedrockReasoningTextSchema = import_v43.z.object({ signature: import_v43.z.string().nullish(), text: import_v43.z.string() }); var BedrockRedactedReasoningSchema = import_v43.z.object({ data: import_v43.z.string() }); var BedrockResponseSchema = import_v43.z.object({ metrics: import_v43.z.object({ latencyMs: import_v43.z.number() }).nullish(), output: import_v43.z.object({ message: import_v43.z.object({ content: import_v43.z.array( import_v43.z.object({ text: import_v43.z.string().nullish(), toolUse: BedrockToolUseSchema.nullish(), reasoningContent: import_v43.z.union([ import_v43.z.object({ reasoningText: BedrockReasoningTextSchema }), import_v43.z.object({ redactedReasoning: BedrockRedactedReasoningSchema }) ]).nullish() }) ), role: import_v43.z.string() }) }), stopReason: BedrockStopReasonSchema, trace: import_v43.z.unknown().nullish(), usage: import_v43.z.object({ inputTokens: import_v43.z.number(), outputTokens: import_v43.z.number(), totalTokens: import_v43.z.number(), cacheReadInputTokens: import_v43.z.number().nullish(), cacheWriteInputTokens: import_v43.z.number().nullish() }) }); var BedrockStreamSchema = import_v43.z.object({ contentBlockDelta: import_v43.z.object({ contentBlockIndex: import_v43.z.number(), delta: import_v43.z.union([ import_v43.z.object({ text: import_v43.z.string() }), import_v43.z.object({ toolUse: import_v43.z.object({ input: import_v43.z.string() }) }), import_v43.z.object({ reasoningContent: import_v43.z.object({ text: import_v43.z.string() }) }), import_v43.z.object({ reasoningContent: import_v43.z.object({ signature: import_v43.z.string() }) }), import_v43.z.object({ reasoningContent: import_v43.z.object({ data: import_v43.z.string() }) }) ]).nullish() }).nullish(), contentBlockStart: import_v43.z.object({ contentBlockIndex: import_v43.z.number(), start: import_v43.z.object({ toolUse: BedrockToolUseSchema.nullish() }).nullish() }).nullish(), contentBlockStop: import_v43.z.object({ contentBlockIndex: import_v43.z.number() }).nullish(), internalServerException: import_v43.z.record(import_v43.z.string(), import_v43.z.unknown()).nullish(), messageStop: import_v43.z.object({ additionalModelResponseFields: import_v43.z.record(import_v43.z.string(), import_v43.z.unknown()).nullish(), stopReason: BedrockStopReasonSchema }).nullish(), metadata: import_v43.z.object({ trace: import_v43.z.unknown().nullish(), usage: import_v43.z.object({ cacheReadInputTokens: import_v43.z.number().nullish(), cacheWriteInputTokens: import_v43.z.number().nullish(), inputTokens: import_v43.z.number(), outputTokens: import_v43.z.number() }).nullish() }).nullish(), modelStreamErrorException: import_v43.z.record(import_v43.z.string(), import_v43.z.unknown()).nullish(), throttlingException: import_v43.z.record(import_v43.z.string(), import_v43.z.unknown()).nullish(), validationException: import_v43.z.record(import_v43.z.string(), import_v43.z.unknown()).nullish() }); var bedrockReasoningMetadataSchema = import_v43.z.object({ signature: import_v43.z.string().optional(), redactedData: import_v43.z.string().optional() }); // src/bedrock-embedding-model.ts var import_provider4 = require("@ai-sdk/provider"); var import_provider_utils5 = require("@ai-sdk/provider-utils"); // src/bedrock-embedding-options.ts var import_v44 = require("zod/v4"); var bedrockEmbeddingProviderOptions = import_v44.z.object({ /** The number of dimensions the resulting output embeddings should have (defaults to 1024). Only supported in amazon.titan-embed-text-v2:0. */ dimensions: import_v44.z.union([import_v44.z.literal(1024), import_v44.z.literal(512), import_v44.z.literal(256)]).optional(), /** Flag indicating whether or not to normalize the output embeddings. Defaults to true Only supported in amazon.titan-embed-text-v2:0. */ normalize: import_v44.z.boolean().optional() }); // src/bedrock-embedding-model.ts var import_v45 = require("zod/v4"); var BedrockEmbeddingModel = class { constructor(modelId, config) { this.modelId = modelId; this.config = config; this.specificationVersion = "v2"; this.provider = "amazon-bedrock"; this.maxEmbeddingsPerCall = 1; this.supportsParallelCalls = true; } getUrl(modelId) { const encodedModelId = encodeURIComponent(modelId); return `${this.config.baseUrl()}/model/${encodedModelId}/invoke`; } async doEmbed({ values, headers, abortSignal, providerOptions }) { var _a; if (values.length > this.maxEmbeddingsPerCall) { throw new import_provider4.TooManyEmbeddingValuesForCallError({ provider: this.provider, modelId: this.modelId, maxEmbeddingsPerCall: this.maxEmbeddingsPerCall, values }); } const bedrockOptions = (_a = await (0, import_provider_utils5.parseProviderOptions)({ provider: "bedrock", providerOptions, schema: bedrockEmbeddingProviderOptions })) != null ? _a : {}; const args = { inputText: values[0], dimensions: bedrockOptions.dimensions, normalize: bedrockOptions.normalize }; const url = this.getUrl(this.modelId); const { value: response } = await (0, import_provider_utils5.postJsonToApi)({ url, headers: await (0, import_provider_utils5.resolve)( (0, import_provider_utils5.combineHeaders)(await (0, import_provider_utils5.resolve)(this.config.headers), headers) ), body: args, failedResponseHandler: (0, import_provider_utils5.createJsonErrorResponseHandler)({ errorSchema: BedrockErrorSchema, errorToMessage: (error) => `${error.type}: ${error.message}` }), successfulResponseHandler: (0, import_provider_utils5.createJsonResponseHandler)( BedrockEmbeddingResponseSchema ), fetch: this.config.fetch, abortSignal }); return { embeddings: [response.embedding], usage: { tokens: response.inputTextTokenCount } }; } }