@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
JavaScript
"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 }
};
}
}