@ai-sdk/amazon-bedrock 5.0.94 → 5.0.97
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +31 -0
- package/dist/anthropic/index.js +24 -29
- package/dist/anthropic/index.js.map +1 -1
- package/dist/index.js +223 -187
- package/dist/index.js.map +1 -1
- package/dist/mantle/index.cjs +23 -30
- package/dist/mantle/index.cjs.map +1 -1
- package/dist/mantle/index.js +23 -30
- package/dist/mantle/index.js.map +1 -1
- package/package.json +5 -5
- package/src/amazon-bedrock-chat-language-model.ts +29 -10
- package/src/amazon-bedrock-prepare-tools.ts +49 -12
- package/src/normalize-tool-call-id.ts +37 -4
package/dist/mantle/index.cjs
CHANGED
|
@@ -35,32 +35,31 @@ var import_provider_utils = require("@ai-sdk/provider-utils");
|
|
|
35
35
|
var import_aws4fetch = require("aws4fetch");
|
|
36
36
|
|
|
37
37
|
// src/version.ts
|
|
38
|
-
var VERSION = true ? "5.0.
|
|
38
|
+
var VERSION = true ? "5.0.97" : "0.0.0-test";
|
|
39
39
|
|
|
40
40
|
// src/amazon-bedrock-sigv4-fetch.ts
|
|
41
41
|
function createSigV4FetchFunction(getCredentials, fetch, service = "bedrock") {
|
|
42
42
|
return async (input, init) => {
|
|
43
|
-
|
|
44
|
-
const effectiveFetch = fetch != null ? fetch : globalThis.fetch;
|
|
43
|
+
const effectiveFetch = fetch ?? globalThis.fetch;
|
|
45
44
|
const request = input instanceof Request ? input : void 0;
|
|
46
45
|
const originalHeaders = (0, import_provider_utils.combineHeaders)(
|
|
47
|
-
(0, import_provider_utils.normalizeHeaders)(request
|
|
48
|
-
(0, import_provider_utils.normalizeHeaders)(init
|
|
46
|
+
(0, import_provider_utils.normalizeHeaders)(request?.headers),
|
|
47
|
+
(0, import_provider_utils.normalizeHeaders)(init?.headers)
|
|
49
48
|
);
|
|
50
49
|
const headersWithUserAgent = (0, import_provider_utils.withUserAgentSuffix)(
|
|
51
50
|
originalHeaders,
|
|
52
51
|
`ai-sdk/amazon-bedrock/${VERSION}`,
|
|
53
52
|
(0, import_provider_utils.getRuntimeEnvironmentUserAgent)()
|
|
54
53
|
);
|
|
55
|
-
let effectiveBody =
|
|
54
|
+
let effectiveBody = init?.body ?? void 0;
|
|
56
55
|
if (effectiveBody === void 0 && request && request.body !== null) {
|
|
57
56
|
try {
|
|
58
57
|
effectiveBody = await request.clone().text();
|
|
59
|
-
} catch
|
|
58
|
+
} catch {
|
|
60
59
|
}
|
|
61
60
|
}
|
|
62
|
-
const effectiveMethod =
|
|
63
|
-
if (
|
|
61
|
+
const effectiveMethod = init?.method ?? request?.method;
|
|
62
|
+
if (effectiveMethod?.toUpperCase() !== "POST" || !effectiveBody) {
|
|
64
63
|
return effectiveFetch(input, {
|
|
65
64
|
...init,
|
|
66
65
|
headers: headersWithUserAgent
|
|
@@ -103,8 +102,8 @@ function prepareBodyString(body) {
|
|
|
103
102
|
}
|
|
104
103
|
function createApiKeyFetchFunction(apiKey, fetch) {
|
|
105
104
|
return async (input, init) => {
|
|
106
|
-
const effectiveFetch = fetch
|
|
107
|
-
const originalHeaders = (0, import_provider_utils.normalizeHeaders)(init
|
|
105
|
+
const effectiveFetch = fetch ?? globalThis.fetch;
|
|
106
|
+
const originalHeaders = (0, import_provider_utils.normalizeHeaders)(init?.headers);
|
|
108
107
|
const headersWithUserAgent = (0, import_provider_utils.withUserAgentSuffix)(
|
|
109
108
|
originalHeaders,
|
|
110
109
|
`ai-sdk/amazon-bedrock/${VERSION}`,
|
|
@@ -192,25 +191,19 @@ Original error: ${errorMessage}`
|
|
|
192
191
|
options.fetch,
|
|
193
192
|
"bedrock-mantle"
|
|
194
193
|
);
|
|
195
|
-
const getBaseURL = (modelId) =>
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
var _a;
|
|
209
|
-
return (0, import_provider_utils2.withUserAgentSuffix)(
|
|
210
|
-
(_a = options.headers) != null ? _a : {},
|
|
211
|
-
`ai-sdk/amazon-bedrock/${VERSION}`
|
|
212
|
-
);
|
|
213
|
-
};
|
|
194
|
+
const getBaseURL = (modelId) => (0, import_provider_utils2.withoutTrailingSlash)(
|
|
195
|
+
options.baseURL ?? `https://bedrock-mantle.${(0, import_provider_utils2.loadSetting)({
|
|
196
|
+
settingValue: options.region,
|
|
197
|
+
settingName: "region",
|
|
198
|
+
environmentVariableName: "AWS_REGION",
|
|
199
|
+
description: "AWS region"
|
|
200
|
+
})}.api.aws/${// Mantle serves these models under its separate OpenAI route.
|
|
201
|
+
/^(?:openai\.gpt-(?!oss-)|google\.gemma-4|xai\.)/.test(modelId) ? "openai/v1" : "v1"}`
|
|
202
|
+
) ?? "https://bedrock-mantle.us-east-1.api.aws/v1";
|
|
203
|
+
const getHeaders = () => (0, import_provider_utils2.withUserAgentSuffix)(
|
|
204
|
+
options.headers ?? {},
|
|
205
|
+
`ai-sdk/amazon-bedrock/${VERSION}`
|
|
206
|
+
);
|
|
214
207
|
const url = ({ path, modelId }) => `${getBaseURL(modelId)}${path}`;
|
|
215
208
|
const createChatModel = (modelId) => new import_internal.OpenAIChatLanguageModel(modelId, {
|
|
216
209
|
provider: "bedrock-mantle.chat",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/mantle/index.ts","../../src/mantle/bedrock-mantle-provider.ts","../../src/amazon-bedrock-sigv4-fetch.ts","../../src/version.ts"],"sourcesContent":["export { bedrockMantle, createBedrockMantle } from './bedrock-mantle-provider';\nexport type {\n BedrockMantleProvider,\n BedrockMantleProviderSettings,\n} from './bedrock-mantle-provider';\nexport type { BedrockMantleModelId } from './bedrock-mantle-options';\n","import {\n OpenAIChatLanguageModel,\n OpenAIResponsesLanguageModel,\n} from '@ai-sdk/openai/internal';\nimport {\n NoSuchModelError,\n type LanguageModelV4,\n type ProviderV4,\n} from '@ai-sdk/provider';\nimport {\n loadOptionalSetting,\n loadSetting,\n withoutTrailingSlash,\n withUserAgentSuffix,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport {\n createApiKeyFetchFunction,\n createSigV4FetchFunction,\n type AmazonBedrockCredentials,\n} from '../amazon-bedrock-sigv4-fetch';\nimport type {\n BedrockMantleChatModelId,\n BedrockMantleResponsesModelId,\n} from './bedrock-mantle-options';\nimport { VERSION } from '../version';\n\nexport interface BedrockMantleProvider extends ProviderV4 {\n /**\n * Creates a model for text generation using the Chat Completions API.\n * Chat Completions has the broadest model support on Mantle.\n */\n (modelId: BedrockMantleChatModelId): LanguageModelV4;\n\n /**\n * Creates a model for text generation using the Chat Completions API.\n */\n languageModel(modelId: BedrockMantleChatModelId): LanguageModelV4;\n\n /**\n * Creates a model for text generation using the Chat Completions API.\n */\n chat(modelId: BedrockMantleChatModelId): LanguageModelV4;\n\n /**\n * Creates a model for text generation using the Responses API.\n * Not all Mantle models support this API. Notably, gpt-oss-safeguard models\n * are Chat-only.\n */\n responses(modelId: BedrockMantleResponsesModelId): LanguageModelV4;\n\n /**\n * @deprecated Mantle does not support embedding models.\n */\n textEmbeddingModel(modelId: string): never;\n}\n\nexport interface BedrockMantleProviderSettings {\n /**\n * The AWS region to use for the Bedrock Mantle endpoint. Defaults to the value of the\n * `AWS_REGION` environment variable.\n */\n region?: string;\n\n /**\n * API key for authenticating requests using Bearer token authentication.\n * When provided, this will be used instead of AWS SigV4 authentication.\n * Defaults to the value of the `AWS_BEARER_TOKEN_BEDROCK` environment variable.\n */\n apiKey?: string;\n\n /**\n * The AWS access key ID to use for SigV4 authentication. Defaults to the value of the\n * `AWS_ACCESS_KEY_ID` environment variable.\n */\n accessKeyId?: string;\n\n /**\n * The AWS secret access key to use for SigV4 authentication. Defaults to the value of the\n * `AWS_SECRET_ACCESS_KEY` environment variable.\n */\n secretAccessKey?: string;\n\n /**\n * The AWS session token to use for SigV4 authentication. Defaults to the value of the\n * `AWS_SESSION_TOKEN` environment variable.\n */\n sessionToken?: string;\n\n /**\n * Base URL for the Bedrock Mantle API calls.\n */\n baseURL?: string;\n\n /**\n * Custom headers to include in the requests.\n */\n headers?: Record<string, string | undefined>;\n\n /**\n * Custom fetch implementation. You can use it as a middleware to intercept requests,\n * or to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n\n /**\n * The AWS credential provider to use for SigV4 authentication to get dynamic\n * credentials similar to the AWS SDK. Setting a provider here will cause its\n * credential values to be used instead of the `accessKeyId`, `secretAccessKey`,\n * and `sessionToken` settings.\n */\n credentialProvider?: () => PromiseLike<\n Omit<AmazonBedrockCredentials, 'region'>\n >;\n}\n\n/**\n * Create an Amazon Bedrock Mantle provider instance.\n * This provider uses the OpenAI-compatible Mantle API for models that are\n * only available through the Mantle endpoint (e.g. openai.gpt-oss-20b).\n */\nexport function createBedrockMantle(\n options: BedrockMantleProviderSettings = {},\n): BedrockMantleProvider {\n // Check for API key authentication first\n const rawApiKey = loadOptionalSetting({\n settingValue: options.apiKey,\n environmentVariableName: 'AWS_BEARER_TOKEN_BEDROCK',\n });\n\n // Only use API key if it's a non-empty, non-whitespace string\n const apiKey =\n rawApiKey && rawApiKey.trim().length > 0 ? rawApiKey.trim() : undefined;\n\n // Use API key authentication if available, otherwise fall back to SigV4\n const fetchFunction = apiKey\n ? createApiKeyFetchFunction(apiKey, options.fetch)\n : createSigV4FetchFunction(\n async () => {\n const region = loadSetting({\n settingValue: options.region,\n settingName: 'region',\n environmentVariableName: 'AWS_REGION',\n description: 'AWS region',\n });\n\n // If a credential provider is provided, use it to get the credentials.\n if (options.credentialProvider) {\n try {\n return {\n ...(await options.credentialProvider()),\n region,\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n throw new Error(\n `AWS credential provider failed: ${errorMessage}. ` +\n 'Please ensure your credential provider returns valid AWS credentials ' +\n 'with accessKeyId and secretAccessKey properties.',\n );\n }\n }\n\n try {\n return {\n region,\n accessKeyId: loadSetting({\n settingValue: options.accessKeyId,\n settingName: 'accessKeyId',\n environmentVariableName: 'AWS_ACCESS_KEY_ID',\n description: 'AWS access key ID',\n }),\n secretAccessKey: loadSetting({\n settingValue: options.secretAccessKey,\n settingName: 'secretAccessKey',\n environmentVariableName: 'AWS_SECRET_ACCESS_KEY',\n description: 'AWS secret access key',\n }),\n sessionToken: loadOptionalSetting({\n settingValue: options.sessionToken,\n environmentVariableName: 'AWS_SESSION_TOKEN',\n }),\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n if (\n errorMessage.includes('AWS_ACCESS_KEY_ID') ||\n errorMessage.includes('accessKeyId')\n ) {\n throw new Error(\n 'AWS SigV4 authentication requires AWS credentials. Please provide either:\\n' +\n '1. Set AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY environment variables\\n' +\n '2. Provide accessKeyId and secretAccessKey in options\\n' +\n '3. Use a credentialProvider function\\n' +\n '4. Use API key authentication with AWS_BEARER_TOKEN_BEDROCK or apiKey option\\n' +\n `Original error: ${errorMessage}`,\n );\n }\n if (\n errorMessage.includes('AWS_SECRET_ACCESS_KEY') ||\n errorMessage.includes('secretAccessKey')\n ) {\n throw new Error(\n 'AWS SigV4 authentication requires both AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY. ' +\n 'Please ensure both credentials are provided.\\n' +\n `Original error: ${errorMessage}`,\n );\n }\n throw error;\n }\n },\n options.fetch,\n 'bedrock-mantle',\n );\n\n const getBaseURL = (modelId: string): string =>\n withoutTrailingSlash(\n options.baseURL ??\n `https://bedrock-mantle.${loadSetting({\n settingValue: options.region,\n settingName: 'region',\n environmentVariableName: 'AWS_REGION',\n description: 'AWS region',\n })}.api.aws/${\n // Mantle serves these models under its separate OpenAI route.\n /^(?:openai\\.gpt-(?!oss-)|google\\.gemma-4|xai\\.)/.test(modelId)\n ? 'openai/v1'\n : 'v1'\n }`,\n ) ?? 'https://bedrock-mantle.us-east-1.api.aws/v1';\n\n const getHeaders = (): Record<string, string | undefined> =>\n withUserAgentSuffix(\n options.headers ?? {},\n `ai-sdk/amazon-bedrock/${VERSION}`,\n );\n\n const url = ({ path, modelId }: { path: string; modelId: string }): string =>\n `${getBaseURL(modelId)}${path}`;\n\n const createChatModel = (modelId: BedrockMantleChatModelId) =>\n new OpenAIChatLanguageModel(modelId, {\n provider: 'bedrock-mantle.chat',\n url,\n headers: getHeaders,\n fetch: fetchFunction,\n });\n\n const createResponsesModel = (modelId: BedrockMantleResponsesModelId) =>\n new OpenAIResponsesLanguageModel(modelId, {\n provider: 'bedrock-mantle.responses',\n url,\n headers: getHeaders,\n fetch: fetchFunction,\n supportsWebSearchSourcesInclude: false,\n });\n\n const provider = function (modelId: BedrockMantleChatModelId) {\n if (new.target) {\n throw new Error(\n 'The Bedrock Mantle model function cannot be called with the new keyword.',\n );\n }\n\n return createChatModel(modelId);\n };\n\n provider.specificationVersion = 'v4' as const;\n provider.languageModel = createChatModel;\n provider.chat = createChatModel;\n provider.responses = createResponsesModel;\n\n provider.embeddingModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'embeddingModel' });\n };\n provider.textEmbeddingModel = provider.embeddingModel;\n provider.imageModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'imageModel' });\n };\n\n return provider as BedrockMantleProvider;\n}\n\n/**\n * Default Bedrock Mantle provider instance.\n */\nexport const bedrockMantle = createBedrockMantle();\n","import {\n combineHeaders,\n normalizeHeaders,\n withUserAgentSuffix,\n getRuntimeEnvironmentUserAgent,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { AwsV4Signer } from 'aws4fetch';\nimport { VERSION } from './version';\n\nexport interface AmazonBedrockCredentials {\n region: string;\n accessKeyId: string;\n secretAccessKey: string;\n sessionToken?: string;\n}\n\n/**\n * Creates a fetch function that applies AWS Signature Version 4 signing.\n *\n * @param getCredentials - Function that returns the AWS credentials to use when signing.\n * @param fetch - Optional original fetch implementation to wrap. Defaults to global fetch.\n * @param service - The AWS service name to use for SigV4 signing scope. Defaults to 'bedrock'.\n * @returns A FetchFunction that signs requests before passing them to the underlying fetch.\n */\nexport function createSigV4FetchFunction(\n getCredentials: () =>\n | AmazonBedrockCredentials\n | PromiseLike<AmazonBedrockCredentials>,\n fetch?: FetchFunction,\n service: string = 'bedrock',\n): FetchFunction {\n return async (\n input: RequestInfo | URL,\n init?: RequestInit,\n ): Promise<Response> => {\n // avoid caching globalThis.fetch in case it is patched by other libraries\n const effectiveFetch = fetch ?? globalThis.fetch;\n const request = input instanceof Request ? input : undefined;\n const originalHeaders = combineHeaders(\n normalizeHeaders(request?.headers),\n normalizeHeaders(init?.headers),\n );\n const headersWithUserAgent = withUserAgentSuffix(\n originalHeaders,\n `ai-sdk/amazon-bedrock/${VERSION}`,\n getRuntimeEnvironmentUserAgent(),\n );\n\n let effectiveBody: BodyInit | undefined = init?.body ?? undefined;\n if (effectiveBody === undefined && request && request.body !== null) {\n try {\n effectiveBody = await request.clone().text();\n } catch {}\n }\n\n const effectiveMethod = init?.method ?? request?.method;\n\n if (effectiveMethod?.toUpperCase() !== 'POST' || !effectiveBody) {\n return effectiveFetch(input, {\n ...init,\n headers: headersWithUserAgent as HeadersInit,\n });\n }\n\n const url =\n typeof input === 'string'\n ? input\n : input instanceof URL\n ? input.href\n : input.url;\n\n const body = prepareBodyString(effectiveBody);\n const credentials = await getCredentials();\n const signer = new AwsV4Signer({\n url,\n method: 'POST',\n headers: Object.entries(headersWithUserAgent),\n body,\n region: credentials.region,\n accessKeyId: credentials.accessKeyId,\n secretAccessKey: credentials.secretAccessKey,\n sessionToken: credentials.sessionToken,\n service,\n });\n\n const signingResult = await signer.sign();\n const signedHeaders = normalizeHeaders(signingResult.headers);\n\n // Use the combined headers directly as HeadersInit\n const combinedHeaders = combineHeaders(headersWithUserAgent, signedHeaders);\n\n return effectiveFetch(input, {\n ...init,\n body,\n headers: combinedHeaders as HeadersInit,\n });\n };\n}\n\nfunction prepareBodyString(body: BodyInit | undefined): string {\n if (typeof body === 'string') {\n return body;\n } else if (body instanceof Uint8Array) {\n return new TextDecoder().decode(body);\n } else if (body instanceof ArrayBuffer) {\n return new TextDecoder().decode(new Uint8Array(body));\n } else {\n return JSON.stringify(body);\n }\n}\n\n/**\n * Creates a fetch function that applies Bearer token authentication.\n *\n * @param apiKey - The API key to use for Bearer token authentication.\n * @param fetch - Optional original fetch implementation to wrap. Defaults to global fetch.\n * @returns A FetchFunction that adds Authorization header with Bearer token to requests.\n */\nexport function createApiKeyFetchFunction(\n apiKey: string,\n fetch?: FetchFunction,\n): FetchFunction {\n return async (\n input: RequestInfo | URL,\n init?: RequestInit,\n ): Promise<Response> => {\n // avoid caching globalThis.fetch in case it is patched by other libraries\n const effectiveFetch = fetch ?? globalThis.fetch;\n const originalHeaders = normalizeHeaders(init?.headers);\n const headersWithUserAgent = withUserAgentSuffix(\n originalHeaders,\n `ai-sdk/amazon-bedrock/${VERSION}`,\n getRuntimeEnvironmentUserAgent(),\n );\n\n const finalHeaders = combineHeaders(headersWithUserAgent, {\n Authorization: `Bearer ${apiKey}`,\n });\n\n return effectiveFetch(input, {\n ...init,\n headers: finalHeaders as HeadersInit,\n });\n };\n}\n","// Version string of this package injected at build time.\ndeclare const __PACKAGE_VERSION__: string | undefined;\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined'\n ? __PACKAGE_VERSION__\n : '0.0.0-test';\n"],"mappings":"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","names":["import_provider_utils"]}
|
|
1
|
+
{"version":3,"sources":["../../src/mantle/index.ts","../../src/mantle/bedrock-mantle-provider.ts","../../src/amazon-bedrock-sigv4-fetch.ts","../../src/version.ts"],"sourcesContent":["export { bedrockMantle, createBedrockMantle } from './bedrock-mantle-provider';\nexport type {\n BedrockMantleProvider,\n BedrockMantleProviderSettings,\n} from './bedrock-mantle-provider';\nexport type { BedrockMantleModelId } from './bedrock-mantle-options';\n","import {\n OpenAIChatLanguageModel,\n OpenAIResponsesLanguageModel,\n} from '@ai-sdk/openai/internal';\nimport {\n NoSuchModelError,\n type LanguageModelV4,\n type ProviderV4,\n} from '@ai-sdk/provider';\nimport {\n loadOptionalSetting,\n loadSetting,\n withoutTrailingSlash,\n withUserAgentSuffix,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport {\n createApiKeyFetchFunction,\n createSigV4FetchFunction,\n type AmazonBedrockCredentials,\n} from '../amazon-bedrock-sigv4-fetch';\nimport type {\n BedrockMantleChatModelId,\n BedrockMantleResponsesModelId,\n} from './bedrock-mantle-options';\nimport { VERSION } from '../version';\n\nexport interface BedrockMantleProvider extends ProviderV4 {\n /**\n * Creates a model for text generation using the Chat Completions API.\n * Chat Completions has the broadest model support on Mantle.\n */\n (modelId: BedrockMantleChatModelId): LanguageModelV4;\n\n /**\n * Creates a model for text generation using the Chat Completions API.\n */\n languageModel(modelId: BedrockMantleChatModelId): LanguageModelV4;\n\n /**\n * Creates a model for text generation using the Chat Completions API.\n */\n chat(modelId: BedrockMantleChatModelId): LanguageModelV4;\n\n /**\n * Creates a model for text generation using the Responses API.\n * Not all Mantle models support this API. Notably, gpt-oss-safeguard models\n * are Chat-only.\n */\n responses(modelId: BedrockMantleResponsesModelId): LanguageModelV4;\n\n /**\n * @deprecated Mantle does not support embedding models.\n */\n textEmbeddingModel(modelId: string): never;\n}\n\nexport interface BedrockMantleProviderSettings {\n /**\n * The AWS region to use for the Bedrock Mantle endpoint. Defaults to the value of the\n * `AWS_REGION` environment variable.\n */\n region?: string;\n\n /**\n * API key for authenticating requests using Bearer token authentication.\n * When provided, this will be used instead of AWS SigV4 authentication.\n * Defaults to the value of the `AWS_BEARER_TOKEN_BEDROCK` environment variable.\n */\n apiKey?: string;\n\n /**\n * The AWS access key ID to use for SigV4 authentication. Defaults to the value of the\n * `AWS_ACCESS_KEY_ID` environment variable.\n */\n accessKeyId?: string;\n\n /**\n * The AWS secret access key to use for SigV4 authentication. Defaults to the value of the\n * `AWS_SECRET_ACCESS_KEY` environment variable.\n */\n secretAccessKey?: string;\n\n /**\n * The AWS session token to use for SigV4 authentication. Defaults to the value of the\n * `AWS_SESSION_TOKEN` environment variable.\n */\n sessionToken?: string;\n\n /**\n * Base URL for the Bedrock Mantle API calls.\n */\n baseURL?: string;\n\n /**\n * Custom headers to include in the requests.\n */\n headers?: Record<string, string | undefined>;\n\n /**\n * Custom fetch implementation. You can use it as a middleware to intercept requests,\n * or to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n\n /**\n * The AWS credential provider to use for SigV4 authentication to get dynamic\n * credentials similar to the AWS SDK. Setting a provider here will cause its\n * credential values to be used instead of the `accessKeyId`, `secretAccessKey`,\n * and `sessionToken` settings.\n */\n credentialProvider?: () => PromiseLike<\n Omit<AmazonBedrockCredentials, 'region'>\n >;\n}\n\n/**\n * Create an Amazon Bedrock Mantle provider instance.\n * This provider uses the OpenAI-compatible Mantle API for models that are\n * only available through the Mantle endpoint (e.g. openai.gpt-oss-20b).\n */\nexport function createBedrockMantle(\n options: BedrockMantleProviderSettings = {},\n): BedrockMantleProvider {\n // Check for API key authentication first\n const rawApiKey = loadOptionalSetting({\n settingValue: options.apiKey,\n environmentVariableName: 'AWS_BEARER_TOKEN_BEDROCK',\n });\n\n // Only use API key if it's a non-empty, non-whitespace string\n const apiKey =\n rawApiKey && rawApiKey.trim().length > 0 ? rawApiKey.trim() : undefined;\n\n // Use API key authentication if available, otherwise fall back to SigV4\n const fetchFunction = apiKey\n ? createApiKeyFetchFunction(apiKey, options.fetch)\n : createSigV4FetchFunction(\n async () => {\n const region = loadSetting({\n settingValue: options.region,\n settingName: 'region',\n environmentVariableName: 'AWS_REGION',\n description: 'AWS region',\n });\n\n // If a credential provider is provided, use it to get the credentials.\n if (options.credentialProvider) {\n try {\n return {\n ...(await options.credentialProvider()),\n region,\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n throw new Error(\n `AWS credential provider failed: ${errorMessage}. ` +\n 'Please ensure your credential provider returns valid AWS credentials ' +\n 'with accessKeyId and secretAccessKey properties.',\n );\n }\n }\n\n try {\n return {\n region,\n accessKeyId: loadSetting({\n settingValue: options.accessKeyId,\n settingName: 'accessKeyId',\n environmentVariableName: 'AWS_ACCESS_KEY_ID',\n description: 'AWS access key ID',\n }),\n secretAccessKey: loadSetting({\n settingValue: options.secretAccessKey,\n settingName: 'secretAccessKey',\n environmentVariableName: 'AWS_SECRET_ACCESS_KEY',\n description: 'AWS secret access key',\n }),\n sessionToken: loadOptionalSetting({\n settingValue: options.sessionToken,\n environmentVariableName: 'AWS_SESSION_TOKEN',\n }),\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n if (\n errorMessage.includes('AWS_ACCESS_KEY_ID') ||\n errorMessage.includes('accessKeyId')\n ) {\n throw new Error(\n 'AWS SigV4 authentication requires AWS credentials. Please provide either:\\n' +\n '1. Set AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY environment variables\\n' +\n '2. Provide accessKeyId and secretAccessKey in options\\n' +\n '3. Use a credentialProvider function\\n' +\n '4. Use API key authentication with AWS_BEARER_TOKEN_BEDROCK or apiKey option\\n' +\n `Original error: ${errorMessage}`,\n );\n }\n if (\n errorMessage.includes('AWS_SECRET_ACCESS_KEY') ||\n errorMessage.includes('secretAccessKey')\n ) {\n throw new Error(\n 'AWS SigV4 authentication requires both AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY. ' +\n 'Please ensure both credentials are provided.\\n' +\n `Original error: ${errorMessage}`,\n );\n }\n throw error;\n }\n },\n options.fetch,\n 'bedrock-mantle',\n );\n\n const getBaseURL = (modelId: string): string =>\n withoutTrailingSlash(\n options.baseURL ??\n `https://bedrock-mantle.${loadSetting({\n settingValue: options.region,\n settingName: 'region',\n environmentVariableName: 'AWS_REGION',\n description: 'AWS region',\n })}.api.aws/${\n // Mantle serves these models under its separate OpenAI route.\n /^(?:openai\\.gpt-(?!oss-)|google\\.gemma-4|xai\\.)/.test(modelId)\n ? 'openai/v1'\n : 'v1'\n }`,\n ) ?? 'https://bedrock-mantle.us-east-1.api.aws/v1';\n\n const getHeaders = (): Record<string, string | undefined> =>\n withUserAgentSuffix(\n options.headers ?? {},\n `ai-sdk/amazon-bedrock/${VERSION}`,\n );\n\n const url = ({ path, modelId }: { path: string; modelId: string }): string =>\n `${getBaseURL(modelId)}${path}`;\n\n const createChatModel = (modelId: BedrockMantleChatModelId) =>\n new OpenAIChatLanguageModel(modelId, {\n provider: 'bedrock-mantle.chat',\n url,\n headers: getHeaders,\n fetch: fetchFunction,\n });\n\n const createResponsesModel = (modelId: BedrockMantleResponsesModelId) =>\n new OpenAIResponsesLanguageModel(modelId, {\n provider: 'bedrock-mantle.responses',\n url,\n headers: getHeaders,\n fetch: fetchFunction,\n supportsWebSearchSourcesInclude: false,\n });\n\n const provider = function (modelId: BedrockMantleChatModelId) {\n if (new.target) {\n throw new Error(\n 'The Bedrock Mantle model function cannot be called with the new keyword.',\n );\n }\n\n return createChatModel(modelId);\n };\n\n provider.specificationVersion = 'v4' as const;\n provider.languageModel = createChatModel;\n provider.chat = createChatModel;\n provider.responses = createResponsesModel;\n\n provider.embeddingModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'embeddingModel' });\n };\n provider.textEmbeddingModel = provider.embeddingModel;\n provider.imageModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'imageModel' });\n };\n\n return provider as BedrockMantleProvider;\n}\n\n/**\n * Default Bedrock Mantle provider instance.\n */\nexport const bedrockMantle = createBedrockMantle();\n","import {\n combineHeaders,\n normalizeHeaders,\n withUserAgentSuffix,\n getRuntimeEnvironmentUserAgent,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { AwsV4Signer } from 'aws4fetch';\nimport { VERSION } from './version';\n\nexport interface AmazonBedrockCredentials {\n region: string;\n accessKeyId: string;\n secretAccessKey: string;\n sessionToken?: string;\n}\n\n/**\n * Creates a fetch function that applies AWS Signature Version 4 signing.\n *\n * @param getCredentials - Function that returns the AWS credentials to use when signing.\n * @param fetch - Optional original fetch implementation to wrap. Defaults to global fetch.\n * @param service - The AWS service name to use for SigV4 signing scope. Defaults to 'bedrock'.\n * @returns A FetchFunction that signs requests before passing them to the underlying fetch.\n */\nexport function createSigV4FetchFunction(\n getCredentials: () =>\n | AmazonBedrockCredentials\n | PromiseLike<AmazonBedrockCredentials>,\n fetch?: FetchFunction,\n service: string = 'bedrock',\n): FetchFunction {\n return async (\n input: RequestInfo | URL,\n init?: RequestInit,\n ): Promise<Response> => {\n // avoid caching globalThis.fetch in case it is patched by other libraries\n const effectiveFetch = fetch ?? globalThis.fetch;\n const request = input instanceof Request ? input : undefined;\n const originalHeaders = combineHeaders(\n normalizeHeaders(request?.headers),\n normalizeHeaders(init?.headers),\n );\n const headersWithUserAgent = withUserAgentSuffix(\n originalHeaders,\n `ai-sdk/amazon-bedrock/${VERSION}`,\n getRuntimeEnvironmentUserAgent(),\n );\n\n let effectiveBody: BodyInit | undefined = init?.body ?? undefined;\n if (effectiveBody === undefined && request && request.body !== null) {\n try {\n effectiveBody = await request.clone().text();\n } catch {}\n }\n\n const effectiveMethod = init?.method ?? request?.method;\n\n if (effectiveMethod?.toUpperCase() !== 'POST' || !effectiveBody) {\n return effectiveFetch(input, {\n ...init,\n headers: headersWithUserAgent as HeadersInit,\n });\n }\n\n const url =\n typeof input === 'string'\n ? input\n : input instanceof URL\n ? input.href\n : input.url;\n\n const body = prepareBodyString(effectiveBody);\n const credentials = await getCredentials();\n const signer = new AwsV4Signer({\n url,\n method: 'POST',\n headers: Object.entries(headersWithUserAgent),\n body,\n region: credentials.region,\n accessKeyId: credentials.accessKeyId,\n secretAccessKey: credentials.secretAccessKey,\n sessionToken: credentials.sessionToken,\n service,\n });\n\n const signingResult = await signer.sign();\n const signedHeaders = normalizeHeaders(signingResult.headers);\n\n // Use the combined headers directly as HeadersInit\n const combinedHeaders = combineHeaders(headersWithUserAgent, signedHeaders);\n\n return effectiveFetch(input, {\n ...init,\n body,\n headers: combinedHeaders as HeadersInit,\n });\n };\n}\n\nfunction prepareBodyString(body: BodyInit | undefined): string {\n if (typeof body === 'string') {\n return body;\n } else if (body instanceof Uint8Array) {\n return new TextDecoder().decode(body);\n } else if (body instanceof ArrayBuffer) {\n return new TextDecoder().decode(new Uint8Array(body));\n } else {\n return JSON.stringify(body);\n }\n}\n\n/**\n * Creates a fetch function that applies Bearer token authentication.\n *\n * @param apiKey - The API key to use for Bearer token authentication.\n * @param fetch - Optional original fetch implementation to wrap. Defaults to global fetch.\n * @returns A FetchFunction that adds Authorization header with Bearer token to requests.\n */\nexport function createApiKeyFetchFunction(\n apiKey: string,\n fetch?: FetchFunction,\n): FetchFunction {\n return async (\n input: RequestInfo | URL,\n init?: RequestInit,\n ): Promise<Response> => {\n // avoid caching globalThis.fetch in case it is patched by other libraries\n const effectiveFetch = fetch ?? globalThis.fetch;\n const originalHeaders = normalizeHeaders(init?.headers);\n const headersWithUserAgent = withUserAgentSuffix(\n originalHeaders,\n `ai-sdk/amazon-bedrock/${VERSION}`,\n getRuntimeEnvironmentUserAgent(),\n );\n\n const finalHeaders = combineHeaders(headersWithUserAgent, {\n Authorization: `Bearer ${apiKey}`,\n });\n\n return effectiveFetch(input, {\n ...init,\n headers: finalHeaders as HeadersInit,\n });\n };\n}\n","// Version string of this package injected at build time.\ndeclare const __PACKAGE_VERSION__: string | undefined;\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined'\n ? __PACKAGE_VERSION__\n : '0.0.0-test';\n"],"mappings":"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","names":["import_provider_utils"]}
|
package/dist/mantle/index.js
CHANGED
|
@@ -23,32 +23,31 @@ import {
|
|
|
23
23
|
import { AwsV4Signer } from "aws4fetch";
|
|
24
24
|
|
|
25
25
|
// src/version.ts
|
|
26
|
-
var VERSION = true ? "5.0.
|
|
26
|
+
var VERSION = true ? "5.0.97" : "0.0.0-test";
|
|
27
27
|
|
|
28
28
|
// src/amazon-bedrock-sigv4-fetch.ts
|
|
29
29
|
function createSigV4FetchFunction(getCredentials, fetch, service = "bedrock") {
|
|
30
30
|
return async (input, init) => {
|
|
31
|
-
|
|
32
|
-
const effectiveFetch = fetch != null ? fetch : globalThis.fetch;
|
|
31
|
+
const effectiveFetch = fetch ?? globalThis.fetch;
|
|
33
32
|
const request = input instanceof Request ? input : void 0;
|
|
34
33
|
const originalHeaders = combineHeaders(
|
|
35
|
-
normalizeHeaders(request
|
|
36
|
-
normalizeHeaders(init
|
|
34
|
+
normalizeHeaders(request?.headers),
|
|
35
|
+
normalizeHeaders(init?.headers)
|
|
37
36
|
);
|
|
38
37
|
const headersWithUserAgent = withUserAgentSuffix(
|
|
39
38
|
originalHeaders,
|
|
40
39
|
`ai-sdk/amazon-bedrock/${VERSION}`,
|
|
41
40
|
getRuntimeEnvironmentUserAgent()
|
|
42
41
|
);
|
|
43
|
-
let effectiveBody =
|
|
42
|
+
let effectiveBody = init?.body ?? void 0;
|
|
44
43
|
if (effectiveBody === void 0 && request && request.body !== null) {
|
|
45
44
|
try {
|
|
46
45
|
effectiveBody = await request.clone().text();
|
|
47
|
-
} catch
|
|
46
|
+
} catch {
|
|
48
47
|
}
|
|
49
48
|
}
|
|
50
|
-
const effectiveMethod =
|
|
51
|
-
if (
|
|
49
|
+
const effectiveMethod = init?.method ?? request?.method;
|
|
50
|
+
if (effectiveMethod?.toUpperCase() !== "POST" || !effectiveBody) {
|
|
52
51
|
return effectiveFetch(input, {
|
|
53
52
|
...init,
|
|
54
53
|
headers: headersWithUserAgent
|
|
@@ -91,8 +90,8 @@ function prepareBodyString(body) {
|
|
|
91
90
|
}
|
|
92
91
|
function createApiKeyFetchFunction(apiKey, fetch) {
|
|
93
92
|
return async (input, init) => {
|
|
94
|
-
const effectiveFetch = fetch
|
|
95
|
-
const originalHeaders = normalizeHeaders(init
|
|
93
|
+
const effectiveFetch = fetch ?? globalThis.fetch;
|
|
94
|
+
const originalHeaders = normalizeHeaders(init?.headers);
|
|
96
95
|
const headersWithUserAgent = withUserAgentSuffix(
|
|
97
96
|
originalHeaders,
|
|
98
97
|
`ai-sdk/amazon-bedrock/${VERSION}`,
|
|
@@ -180,25 +179,19 @@ Original error: ${errorMessage}`
|
|
|
180
179
|
options.fetch,
|
|
181
180
|
"bedrock-mantle"
|
|
182
181
|
);
|
|
183
|
-
const getBaseURL = (modelId) =>
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
var _a;
|
|
197
|
-
return withUserAgentSuffix2(
|
|
198
|
-
(_a = options.headers) != null ? _a : {},
|
|
199
|
-
`ai-sdk/amazon-bedrock/${VERSION}`
|
|
200
|
-
);
|
|
201
|
-
};
|
|
182
|
+
const getBaseURL = (modelId) => withoutTrailingSlash(
|
|
183
|
+
options.baseURL ?? `https://bedrock-mantle.${loadSetting({
|
|
184
|
+
settingValue: options.region,
|
|
185
|
+
settingName: "region",
|
|
186
|
+
environmentVariableName: "AWS_REGION",
|
|
187
|
+
description: "AWS region"
|
|
188
|
+
})}.api.aws/${// Mantle serves these models under its separate OpenAI route.
|
|
189
|
+
/^(?:openai\.gpt-(?!oss-)|google\.gemma-4|xai\.)/.test(modelId) ? "openai/v1" : "v1"}`
|
|
190
|
+
) ?? "https://bedrock-mantle.us-east-1.api.aws/v1";
|
|
191
|
+
const getHeaders = () => withUserAgentSuffix2(
|
|
192
|
+
options.headers ?? {},
|
|
193
|
+
`ai-sdk/amazon-bedrock/${VERSION}`
|
|
194
|
+
);
|
|
202
195
|
const url = ({ path, modelId }) => `${getBaseURL(modelId)}${path}`;
|
|
203
196
|
const createChatModel = (modelId) => new OpenAIChatLanguageModel(modelId, {
|
|
204
197
|
provider: "bedrock-mantle.chat",
|
package/dist/mantle/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/mantle/bedrock-mantle-provider.ts","../../src/amazon-bedrock-sigv4-fetch.ts","../../src/version.ts"],"sourcesContent":["import {\n OpenAIChatLanguageModel,\n OpenAIResponsesLanguageModel,\n} from '@ai-sdk/openai/internal';\nimport {\n NoSuchModelError,\n type LanguageModelV4,\n type ProviderV4,\n} from '@ai-sdk/provider';\nimport {\n loadOptionalSetting,\n loadSetting,\n withoutTrailingSlash,\n withUserAgentSuffix,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport {\n createApiKeyFetchFunction,\n createSigV4FetchFunction,\n type AmazonBedrockCredentials,\n} from '../amazon-bedrock-sigv4-fetch';\nimport type {\n BedrockMantleChatModelId,\n BedrockMantleResponsesModelId,\n} from './bedrock-mantle-options';\nimport { VERSION } from '../version';\n\nexport interface BedrockMantleProvider extends ProviderV4 {\n /**\n * Creates a model for text generation using the Chat Completions API.\n * Chat Completions has the broadest model support on Mantle.\n */\n (modelId: BedrockMantleChatModelId): LanguageModelV4;\n\n /**\n * Creates a model for text generation using the Chat Completions API.\n */\n languageModel(modelId: BedrockMantleChatModelId): LanguageModelV4;\n\n /**\n * Creates a model for text generation using the Chat Completions API.\n */\n chat(modelId: BedrockMantleChatModelId): LanguageModelV4;\n\n /**\n * Creates a model for text generation using the Responses API.\n * Not all Mantle models support this API. Notably, gpt-oss-safeguard models\n * are Chat-only.\n */\n responses(modelId: BedrockMantleResponsesModelId): LanguageModelV4;\n\n /**\n * @deprecated Mantle does not support embedding models.\n */\n textEmbeddingModel(modelId: string): never;\n}\n\nexport interface BedrockMantleProviderSettings {\n /**\n * The AWS region to use for the Bedrock Mantle endpoint. Defaults to the value of the\n * `AWS_REGION` environment variable.\n */\n region?: string;\n\n /**\n * API key for authenticating requests using Bearer token authentication.\n * When provided, this will be used instead of AWS SigV4 authentication.\n * Defaults to the value of the `AWS_BEARER_TOKEN_BEDROCK` environment variable.\n */\n apiKey?: string;\n\n /**\n * The AWS access key ID to use for SigV4 authentication. Defaults to the value of the\n * `AWS_ACCESS_KEY_ID` environment variable.\n */\n accessKeyId?: string;\n\n /**\n * The AWS secret access key to use for SigV4 authentication. Defaults to the value of the\n * `AWS_SECRET_ACCESS_KEY` environment variable.\n */\n secretAccessKey?: string;\n\n /**\n * The AWS session token to use for SigV4 authentication. Defaults to the value of the\n * `AWS_SESSION_TOKEN` environment variable.\n */\n sessionToken?: string;\n\n /**\n * Base URL for the Bedrock Mantle API calls.\n */\n baseURL?: string;\n\n /**\n * Custom headers to include in the requests.\n */\n headers?: Record<string, string | undefined>;\n\n /**\n * Custom fetch implementation. You can use it as a middleware to intercept requests,\n * or to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n\n /**\n * The AWS credential provider to use for SigV4 authentication to get dynamic\n * credentials similar to the AWS SDK. Setting a provider here will cause its\n * credential values to be used instead of the `accessKeyId`, `secretAccessKey`,\n * and `sessionToken` settings.\n */\n credentialProvider?: () => PromiseLike<\n Omit<AmazonBedrockCredentials, 'region'>\n >;\n}\n\n/**\n * Create an Amazon Bedrock Mantle provider instance.\n * This provider uses the OpenAI-compatible Mantle API for models that are\n * only available through the Mantle endpoint (e.g. openai.gpt-oss-20b).\n */\nexport function createBedrockMantle(\n options: BedrockMantleProviderSettings = {},\n): BedrockMantleProvider {\n // Check for API key authentication first\n const rawApiKey = loadOptionalSetting({\n settingValue: options.apiKey,\n environmentVariableName: 'AWS_BEARER_TOKEN_BEDROCK',\n });\n\n // Only use API key if it's a non-empty, non-whitespace string\n const apiKey =\n rawApiKey && rawApiKey.trim().length > 0 ? rawApiKey.trim() : undefined;\n\n // Use API key authentication if available, otherwise fall back to SigV4\n const fetchFunction = apiKey\n ? createApiKeyFetchFunction(apiKey, options.fetch)\n : createSigV4FetchFunction(\n async () => {\n const region = loadSetting({\n settingValue: options.region,\n settingName: 'region',\n environmentVariableName: 'AWS_REGION',\n description: 'AWS region',\n });\n\n // If a credential provider is provided, use it to get the credentials.\n if (options.credentialProvider) {\n try {\n return {\n ...(await options.credentialProvider()),\n region,\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n throw new Error(\n `AWS credential provider failed: ${errorMessage}. ` +\n 'Please ensure your credential provider returns valid AWS credentials ' +\n 'with accessKeyId and secretAccessKey properties.',\n );\n }\n }\n\n try {\n return {\n region,\n accessKeyId: loadSetting({\n settingValue: options.accessKeyId,\n settingName: 'accessKeyId',\n environmentVariableName: 'AWS_ACCESS_KEY_ID',\n description: 'AWS access key ID',\n }),\n secretAccessKey: loadSetting({\n settingValue: options.secretAccessKey,\n settingName: 'secretAccessKey',\n environmentVariableName: 'AWS_SECRET_ACCESS_KEY',\n description: 'AWS secret access key',\n }),\n sessionToken: loadOptionalSetting({\n settingValue: options.sessionToken,\n environmentVariableName: 'AWS_SESSION_TOKEN',\n }),\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n if (\n errorMessage.includes('AWS_ACCESS_KEY_ID') ||\n errorMessage.includes('accessKeyId')\n ) {\n throw new Error(\n 'AWS SigV4 authentication requires AWS credentials. Please provide either:\\n' +\n '1. Set AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY environment variables\\n' +\n '2. Provide accessKeyId and secretAccessKey in options\\n' +\n '3. Use a credentialProvider function\\n' +\n '4. Use API key authentication with AWS_BEARER_TOKEN_BEDROCK or apiKey option\\n' +\n `Original error: ${errorMessage}`,\n );\n }\n if (\n errorMessage.includes('AWS_SECRET_ACCESS_KEY') ||\n errorMessage.includes('secretAccessKey')\n ) {\n throw new Error(\n 'AWS SigV4 authentication requires both AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY. ' +\n 'Please ensure both credentials are provided.\\n' +\n `Original error: ${errorMessage}`,\n );\n }\n throw error;\n }\n },\n options.fetch,\n 'bedrock-mantle',\n );\n\n const getBaseURL = (modelId: string): string =>\n withoutTrailingSlash(\n options.baseURL ??\n `https://bedrock-mantle.${loadSetting({\n settingValue: options.region,\n settingName: 'region',\n environmentVariableName: 'AWS_REGION',\n description: 'AWS region',\n })}.api.aws/${\n // Mantle serves these models under its separate OpenAI route.\n /^(?:openai\\.gpt-(?!oss-)|google\\.gemma-4|xai\\.)/.test(modelId)\n ? 'openai/v1'\n : 'v1'\n }`,\n ) ?? 'https://bedrock-mantle.us-east-1.api.aws/v1';\n\n const getHeaders = (): Record<string, string | undefined> =>\n withUserAgentSuffix(\n options.headers ?? {},\n `ai-sdk/amazon-bedrock/${VERSION}`,\n );\n\n const url = ({ path, modelId }: { path: string; modelId: string }): string =>\n `${getBaseURL(modelId)}${path}`;\n\n const createChatModel = (modelId: BedrockMantleChatModelId) =>\n new OpenAIChatLanguageModel(modelId, {\n provider: 'bedrock-mantle.chat',\n url,\n headers: getHeaders,\n fetch: fetchFunction,\n });\n\n const createResponsesModel = (modelId: BedrockMantleResponsesModelId) =>\n new OpenAIResponsesLanguageModel(modelId, {\n provider: 'bedrock-mantle.responses',\n url,\n headers: getHeaders,\n fetch: fetchFunction,\n supportsWebSearchSourcesInclude: false,\n });\n\n const provider = function (modelId: BedrockMantleChatModelId) {\n if (new.target) {\n throw new Error(\n 'The Bedrock Mantle model function cannot be called with the new keyword.',\n );\n }\n\n return createChatModel(modelId);\n };\n\n provider.specificationVersion = 'v4' as const;\n provider.languageModel = createChatModel;\n provider.chat = createChatModel;\n provider.responses = createResponsesModel;\n\n provider.embeddingModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'embeddingModel' });\n };\n provider.textEmbeddingModel = provider.embeddingModel;\n provider.imageModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'imageModel' });\n };\n\n return provider as BedrockMantleProvider;\n}\n\n/**\n * Default Bedrock Mantle provider instance.\n */\nexport const bedrockMantle = createBedrockMantle();\n","import {\n combineHeaders,\n normalizeHeaders,\n withUserAgentSuffix,\n getRuntimeEnvironmentUserAgent,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { AwsV4Signer } from 'aws4fetch';\nimport { VERSION } from './version';\n\nexport interface AmazonBedrockCredentials {\n region: string;\n accessKeyId: string;\n secretAccessKey: string;\n sessionToken?: string;\n}\n\n/**\n * Creates a fetch function that applies AWS Signature Version 4 signing.\n *\n * @param getCredentials - Function that returns the AWS credentials to use when signing.\n * @param fetch - Optional original fetch implementation to wrap. Defaults to global fetch.\n * @param service - The AWS service name to use for SigV4 signing scope. Defaults to 'bedrock'.\n * @returns A FetchFunction that signs requests before passing them to the underlying fetch.\n */\nexport function createSigV4FetchFunction(\n getCredentials: () =>\n | AmazonBedrockCredentials\n | PromiseLike<AmazonBedrockCredentials>,\n fetch?: FetchFunction,\n service: string = 'bedrock',\n): FetchFunction {\n return async (\n input: RequestInfo | URL,\n init?: RequestInit,\n ): Promise<Response> => {\n // avoid caching globalThis.fetch in case it is patched by other libraries\n const effectiveFetch = fetch ?? globalThis.fetch;\n const request = input instanceof Request ? input : undefined;\n const originalHeaders = combineHeaders(\n normalizeHeaders(request?.headers),\n normalizeHeaders(init?.headers),\n );\n const headersWithUserAgent = withUserAgentSuffix(\n originalHeaders,\n `ai-sdk/amazon-bedrock/${VERSION}`,\n getRuntimeEnvironmentUserAgent(),\n );\n\n let effectiveBody: BodyInit | undefined = init?.body ?? undefined;\n if (effectiveBody === undefined && request && request.body !== null) {\n try {\n effectiveBody = await request.clone().text();\n } catch {}\n }\n\n const effectiveMethod = init?.method ?? request?.method;\n\n if (effectiveMethod?.toUpperCase() !== 'POST' || !effectiveBody) {\n return effectiveFetch(input, {\n ...init,\n headers: headersWithUserAgent as HeadersInit,\n });\n }\n\n const url =\n typeof input === 'string'\n ? input\n : input instanceof URL\n ? input.href\n : input.url;\n\n const body = prepareBodyString(effectiveBody);\n const credentials = await getCredentials();\n const signer = new AwsV4Signer({\n url,\n method: 'POST',\n headers: Object.entries(headersWithUserAgent),\n body,\n region: credentials.region,\n accessKeyId: credentials.accessKeyId,\n secretAccessKey: credentials.secretAccessKey,\n sessionToken: credentials.sessionToken,\n service,\n });\n\n const signingResult = await signer.sign();\n const signedHeaders = normalizeHeaders(signingResult.headers);\n\n // Use the combined headers directly as HeadersInit\n const combinedHeaders = combineHeaders(headersWithUserAgent, signedHeaders);\n\n return effectiveFetch(input, {\n ...init,\n body,\n headers: combinedHeaders as HeadersInit,\n });\n };\n}\n\nfunction prepareBodyString(body: BodyInit | undefined): string {\n if (typeof body === 'string') {\n return body;\n } else if (body instanceof Uint8Array) {\n return new TextDecoder().decode(body);\n } else if (body instanceof ArrayBuffer) {\n return new TextDecoder().decode(new Uint8Array(body));\n } else {\n return JSON.stringify(body);\n }\n}\n\n/**\n * Creates a fetch function that applies Bearer token authentication.\n *\n * @param apiKey - The API key to use for Bearer token authentication.\n * @param fetch - Optional original fetch implementation to wrap. Defaults to global fetch.\n * @returns A FetchFunction that adds Authorization header with Bearer token to requests.\n */\nexport function createApiKeyFetchFunction(\n apiKey: string,\n fetch?: FetchFunction,\n): FetchFunction {\n return async (\n input: RequestInfo | URL,\n init?: RequestInit,\n ): Promise<Response> => {\n // avoid caching globalThis.fetch in case it is patched by other libraries\n const effectiveFetch = fetch ?? globalThis.fetch;\n const originalHeaders = normalizeHeaders(init?.headers);\n const headersWithUserAgent = withUserAgentSuffix(\n originalHeaders,\n `ai-sdk/amazon-bedrock/${VERSION}`,\n getRuntimeEnvironmentUserAgent(),\n );\n\n const finalHeaders = combineHeaders(headersWithUserAgent, {\n Authorization: `Bearer ${apiKey}`,\n });\n\n return effectiveFetch(input, {\n ...init,\n headers: finalHeaders as HeadersInit,\n });\n };\n}\n","// Version string of this package injected at build time.\ndeclare const __PACKAGE_VERSION__: string | undefined;\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined'\n ? __PACKAGE_VERSION__\n : '0.0.0-test';\n"],"mappings":"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","names":["withUserAgentSuffix","withUserAgentSuffix"]}
|
|
1
|
+
{"version":3,"sources":["../../src/mantle/bedrock-mantle-provider.ts","../../src/amazon-bedrock-sigv4-fetch.ts","../../src/version.ts"],"sourcesContent":["import {\n OpenAIChatLanguageModel,\n OpenAIResponsesLanguageModel,\n} from '@ai-sdk/openai/internal';\nimport {\n NoSuchModelError,\n type LanguageModelV4,\n type ProviderV4,\n} from '@ai-sdk/provider';\nimport {\n loadOptionalSetting,\n loadSetting,\n withoutTrailingSlash,\n withUserAgentSuffix,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport {\n createApiKeyFetchFunction,\n createSigV4FetchFunction,\n type AmazonBedrockCredentials,\n} from '../amazon-bedrock-sigv4-fetch';\nimport type {\n BedrockMantleChatModelId,\n BedrockMantleResponsesModelId,\n} from './bedrock-mantle-options';\nimport { VERSION } from '../version';\n\nexport interface BedrockMantleProvider extends ProviderV4 {\n /**\n * Creates a model for text generation using the Chat Completions API.\n * Chat Completions has the broadest model support on Mantle.\n */\n (modelId: BedrockMantleChatModelId): LanguageModelV4;\n\n /**\n * Creates a model for text generation using the Chat Completions API.\n */\n languageModel(modelId: BedrockMantleChatModelId): LanguageModelV4;\n\n /**\n * Creates a model for text generation using the Chat Completions API.\n */\n chat(modelId: BedrockMantleChatModelId): LanguageModelV4;\n\n /**\n * Creates a model for text generation using the Responses API.\n * Not all Mantle models support this API. Notably, gpt-oss-safeguard models\n * are Chat-only.\n */\n responses(modelId: BedrockMantleResponsesModelId): LanguageModelV4;\n\n /**\n * @deprecated Mantle does not support embedding models.\n */\n textEmbeddingModel(modelId: string): never;\n}\n\nexport interface BedrockMantleProviderSettings {\n /**\n * The AWS region to use for the Bedrock Mantle endpoint. Defaults to the value of the\n * `AWS_REGION` environment variable.\n */\n region?: string;\n\n /**\n * API key for authenticating requests using Bearer token authentication.\n * When provided, this will be used instead of AWS SigV4 authentication.\n * Defaults to the value of the `AWS_BEARER_TOKEN_BEDROCK` environment variable.\n */\n apiKey?: string;\n\n /**\n * The AWS access key ID to use for SigV4 authentication. Defaults to the value of the\n * `AWS_ACCESS_KEY_ID` environment variable.\n */\n accessKeyId?: string;\n\n /**\n * The AWS secret access key to use for SigV4 authentication. Defaults to the value of the\n * `AWS_SECRET_ACCESS_KEY` environment variable.\n */\n secretAccessKey?: string;\n\n /**\n * The AWS session token to use for SigV4 authentication. Defaults to the value of the\n * `AWS_SESSION_TOKEN` environment variable.\n */\n sessionToken?: string;\n\n /**\n * Base URL for the Bedrock Mantle API calls.\n */\n baseURL?: string;\n\n /**\n * Custom headers to include in the requests.\n */\n headers?: Record<string, string | undefined>;\n\n /**\n * Custom fetch implementation. You can use it as a middleware to intercept requests,\n * or to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n\n /**\n * The AWS credential provider to use for SigV4 authentication to get dynamic\n * credentials similar to the AWS SDK. Setting a provider here will cause its\n * credential values to be used instead of the `accessKeyId`, `secretAccessKey`,\n * and `sessionToken` settings.\n */\n credentialProvider?: () => PromiseLike<\n Omit<AmazonBedrockCredentials, 'region'>\n >;\n}\n\n/**\n * Create an Amazon Bedrock Mantle provider instance.\n * This provider uses the OpenAI-compatible Mantle API for models that are\n * only available through the Mantle endpoint (e.g. openai.gpt-oss-20b).\n */\nexport function createBedrockMantle(\n options: BedrockMantleProviderSettings = {},\n): BedrockMantleProvider {\n // Check for API key authentication first\n const rawApiKey = loadOptionalSetting({\n settingValue: options.apiKey,\n environmentVariableName: 'AWS_BEARER_TOKEN_BEDROCK',\n });\n\n // Only use API key if it's a non-empty, non-whitespace string\n const apiKey =\n rawApiKey && rawApiKey.trim().length > 0 ? rawApiKey.trim() : undefined;\n\n // Use API key authentication if available, otherwise fall back to SigV4\n const fetchFunction = apiKey\n ? createApiKeyFetchFunction(apiKey, options.fetch)\n : createSigV4FetchFunction(\n async () => {\n const region = loadSetting({\n settingValue: options.region,\n settingName: 'region',\n environmentVariableName: 'AWS_REGION',\n description: 'AWS region',\n });\n\n // If a credential provider is provided, use it to get the credentials.\n if (options.credentialProvider) {\n try {\n return {\n ...(await options.credentialProvider()),\n region,\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n throw new Error(\n `AWS credential provider failed: ${errorMessage}. ` +\n 'Please ensure your credential provider returns valid AWS credentials ' +\n 'with accessKeyId and secretAccessKey properties.',\n );\n }\n }\n\n try {\n return {\n region,\n accessKeyId: loadSetting({\n settingValue: options.accessKeyId,\n settingName: 'accessKeyId',\n environmentVariableName: 'AWS_ACCESS_KEY_ID',\n description: 'AWS access key ID',\n }),\n secretAccessKey: loadSetting({\n settingValue: options.secretAccessKey,\n settingName: 'secretAccessKey',\n environmentVariableName: 'AWS_SECRET_ACCESS_KEY',\n description: 'AWS secret access key',\n }),\n sessionToken: loadOptionalSetting({\n settingValue: options.sessionToken,\n environmentVariableName: 'AWS_SESSION_TOKEN',\n }),\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n if (\n errorMessage.includes('AWS_ACCESS_KEY_ID') ||\n errorMessage.includes('accessKeyId')\n ) {\n throw new Error(\n 'AWS SigV4 authentication requires AWS credentials. Please provide either:\\n' +\n '1. Set AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY environment variables\\n' +\n '2. Provide accessKeyId and secretAccessKey in options\\n' +\n '3. Use a credentialProvider function\\n' +\n '4. Use API key authentication with AWS_BEARER_TOKEN_BEDROCK or apiKey option\\n' +\n `Original error: ${errorMessage}`,\n );\n }\n if (\n errorMessage.includes('AWS_SECRET_ACCESS_KEY') ||\n errorMessage.includes('secretAccessKey')\n ) {\n throw new Error(\n 'AWS SigV4 authentication requires both AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY. ' +\n 'Please ensure both credentials are provided.\\n' +\n `Original error: ${errorMessage}`,\n );\n }\n throw error;\n }\n },\n options.fetch,\n 'bedrock-mantle',\n );\n\n const getBaseURL = (modelId: string): string =>\n withoutTrailingSlash(\n options.baseURL ??\n `https://bedrock-mantle.${loadSetting({\n settingValue: options.region,\n settingName: 'region',\n environmentVariableName: 'AWS_REGION',\n description: 'AWS region',\n })}.api.aws/${\n // Mantle serves these models under its separate OpenAI route.\n /^(?:openai\\.gpt-(?!oss-)|google\\.gemma-4|xai\\.)/.test(modelId)\n ? 'openai/v1'\n : 'v1'\n }`,\n ) ?? 'https://bedrock-mantle.us-east-1.api.aws/v1';\n\n const getHeaders = (): Record<string, string | undefined> =>\n withUserAgentSuffix(\n options.headers ?? {},\n `ai-sdk/amazon-bedrock/${VERSION}`,\n );\n\n const url = ({ path, modelId }: { path: string; modelId: string }): string =>\n `${getBaseURL(modelId)}${path}`;\n\n const createChatModel = (modelId: BedrockMantleChatModelId) =>\n new OpenAIChatLanguageModel(modelId, {\n provider: 'bedrock-mantle.chat',\n url,\n headers: getHeaders,\n fetch: fetchFunction,\n });\n\n const createResponsesModel = (modelId: BedrockMantleResponsesModelId) =>\n new OpenAIResponsesLanguageModel(modelId, {\n provider: 'bedrock-mantle.responses',\n url,\n headers: getHeaders,\n fetch: fetchFunction,\n supportsWebSearchSourcesInclude: false,\n });\n\n const provider = function (modelId: BedrockMantleChatModelId) {\n if (new.target) {\n throw new Error(\n 'The Bedrock Mantle model function cannot be called with the new keyword.',\n );\n }\n\n return createChatModel(modelId);\n };\n\n provider.specificationVersion = 'v4' as const;\n provider.languageModel = createChatModel;\n provider.chat = createChatModel;\n provider.responses = createResponsesModel;\n\n provider.embeddingModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'embeddingModel' });\n };\n provider.textEmbeddingModel = provider.embeddingModel;\n provider.imageModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'imageModel' });\n };\n\n return provider as BedrockMantleProvider;\n}\n\n/**\n * Default Bedrock Mantle provider instance.\n */\nexport const bedrockMantle = createBedrockMantle();\n","import {\n combineHeaders,\n normalizeHeaders,\n withUserAgentSuffix,\n getRuntimeEnvironmentUserAgent,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { AwsV4Signer } from 'aws4fetch';\nimport { VERSION } from './version';\n\nexport interface AmazonBedrockCredentials {\n region: string;\n accessKeyId: string;\n secretAccessKey: string;\n sessionToken?: string;\n}\n\n/**\n * Creates a fetch function that applies AWS Signature Version 4 signing.\n *\n * @param getCredentials - Function that returns the AWS credentials to use when signing.\n * @param fetch - Optional original fetch implementation to wrap. Defaults to global fetch.\n * @param service - The AWS service name to use for SigV4 signing scope. Defaults to 'bedrock'.\n * @returns A FetchFunction that signs requests before passing them to the underlying fetch.\n */\nexport function createSigV4FetchFunction(\n getCredentials: () =>\n | AmazonBedrockCredentials\n | PromiseLike<AmazonBedrockCredentials>,\n fetch?: FetchFunction,\n service: string = 'bedrock',\n): FetchFunction {\n return async (\n input: RequestInfo | URL,\n init?: RequestInit,\n ): Promise<Response> => {\n // avoid caching globalThis.fetch in case it is patched by other libraries\n const effectiveFetch = fetch ?? globalThis.fetch;\n const request = input instanceof Request ? input : undefined;\n const originalHeaders = combineHeaders(\n normalizeHeaders(request?.headers),\n normalizeHeaders(init?.headers),\n );\n const headersWithUserAgent = withUserAgentSuffix(\n originalHeaders,\n `ai-sdk/amazon-bedrock/${VERSION}`,\n getRuntimeEnvironmentUserAgent(),\n );\n\n let effectiveBody: BodyInit | undefined = init?.body ?? undefined;\n if (effectiveBody === undefined && request && request.body !== null) {\n try {\n effectiveBody = await request.clone().text();\n } catch {}\n }\n\n const effectiveMethod = init?.method ?? request?.method;\n\n if (effectiveMethod?.toUpperCase() !== 'POST' || !effectiveBody) {\n return effectiveFetch(input, {\n ...init,\n headers: headersWithUserAgent as HeadersInit,\n });\n }\n\n const url =\n typeof input === 'string'\n ? input\n : input instanceof URL\n ? input.href\n : input.url;\n\n const body = prepareBodyString(effectiveBody);\n const credentials = await getCredentials();\n const signer = new AwsV4Signer({\n url,\n method: 'POST',\n headers: Object.entries(headersWithUserAgent),\n body,\n region: credentials.region,\n accessKeyId: credentials.accessKeyId,\n secretAccessKey: credentials.secretAccessKey,\n sessionToken: credentials.sessionToken,\n service,\n });\n\n const signingResult = await signer.sign();\n const signedHeaders = normalizeHeaders(signingResult.headers);\n\n // Use the combined headers directly as HeadersInit\n const combinedHeaders = combineHeaders(headersWithUserAgent, signedHeaders);\n\n return effectiveFetch(input, {\n ...init,\n body,\n headers: combinedHeaders as HeadersInit,\n });\n };\n}\n\nfunction prepareBodyString(body: BodyInit | undefined): string {\n if (typeof body === 'string') {\n return body;\n } else if (body instanceof Uint8Array) {\n return new TextDecoder().decode(body);\n } else if (body instanceof ArrayBuffer) {\n return new TextDecoder().decode(new Uint8Array(body));\n } else {\n return JSON.stringify(body);\n }\n}\n\n/**\n * Creates a fetch function that applies Bearer token authentication.\n *\n * @param apiKey - The API key to use for Bearer token authentication.\n * @param fetch - Optional original fetch implementation to wrap. Defaults to global fetch.\n * @returns A FetchFunction that adds Authorization header with Bearer token to requests.\n */\nexport function createApiKeyFetchFunction(\n apiKey: string,\n fetch?: FetchFunction,\n): FetchFunction {\n return async (\n input: RequestInfo | URL,\n init?: RequestInit,\n ): Promise<Response> => {\n // avoid caching globalThis.fetch in case it is patched by other libraries\n const effectiveFetch = fetch ?? globalThis.fetch;\n const originalHeaders = normalizeHeaders(init?.headers);\n const headersWithUserAgent = withUserAgentSuffix(\n originalHeaders,\n `ai-sdk/amazon-bedrock/${VERSION}`,\n getRuntimeEnvironmentUserAgent(),\n );\n\n const finalHeaders = combineHeaders(headersWithUserAgent, {\n Authorization: `Bearer ${apiKey}`,\n });\n\n return effectiveFetch(input, {\n ...init,\n headers: finalHeaders as HeadersInit,\n });\n };\n}\n","// Version string of this package injected at build time.\ndeclare const __PACKAGE_VERSION__: string | undefined;\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined'\n ? __PACKAGE_VERSION__\n : '0.0.0-test';\n"],"mappings":"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","names":["withUserAgentSuffix","withUserAgentSuffix"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ai-sdk/amazon-bedrock",
|
|
3
|
-
"version": "5.0.
|
|
3
|
+
"version": "5.0.97",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -41,16 +41,16 @@
|
|
|
41
41
|
}
|
|
42
42
|
},
|
|
43
43
|
"dependencies": {
|
|
44
|
-
"@ai-sdk/anthropic": "4.0.
|
|
45
|
-
"@ai-sdk/openai": "4.0.
|
|
44
|
+
"@ai-sdk/anthropic": "4.0.65",
|
|
45
|
+
"@ai-sdk/openai": "4.0.78",
|
|
46
46
|
"@ai-sdk/provider": "4.0.18",
|
|
47
|
-
"@ai-sdk/provider-utils": "5.0.
|
|
47
|
+
"@ai-sdk/provider-utils": "5.0.49",
|
|
48
48
|
"@smithy/eventstream-codec": "^4.3.3",
|
|
49
49
|
"@smithy/util-utf8": "^4.3.3",
|
|
50
50
|
"aws4fetch": "^1.0.20"
|
|
51
51
|
},
|
|
52
52
|
"devDependencies": {
|
|
53
|
-
"@ai-sdk/test-server": "2.0.
|
|
53
|
+
"@ai-sdk/test-server": "2.0.2",
|
|
54
54
|
"@types/node": "22.19.19",
|
|
55
55
|
"@vercel/ai-tsconfig": "0.0.0",
|
|
56
56
|
"tsup": "^8.5.1",
|
|
@@ -279,6 +279,7 @@ export class AmazonBedrockChatLanguageModel implements LanguageModelV4 {
|
|
|
279
279
|
amazonBedrockOptions,
|
|
280
280
|
warnings,
|
|
281
281
|
isAnthropicModel,
|
|
282
|
+
isOpenAIModel,
|
|
282
283
|
modelId: this.modelId,
|
|
283
284
|
});
|
|
284
285
|
|
|
@@ -367,6 +368,7 @@ export class AmazonBedrockChatLanguageModel implements LanguageModelV4 {
|
|
|
367
368
|
reasoningBudgetTokens:
|
|
368
369
|
amazonBedrockOptions.reasoningConfig?.budgetTokens,
|
|
369
370
|
disableParallelToolUse: anthropicOptions?.disableParallelToolUse,
|
|
371
|
+
rejectsForcedToolUse,
|
|
370
372
|
});
|
|
371
373
|
|
|
372
374
|
warnings.push(...toolWarnings);
|
|
@@ -1606,12 +1608,14 @@ function resolveAmazonBedrockReasoningConfig({
|
|
|
1606
1608
|
amazonBedrockOptions,
|
|
1607
1609
|
warnings,
|
|
1608
1610
|
isAnthropicModel,
|
|
1611
|
+
isOpenAIModel,
|
|
1609
1612
|
modelId,
|
|
1610
1613
|
}: {
|
|
1611
1614
|
reasoning: LanguageModelV4CallOptions['reasoning'];
|
|
1612
1615
|
amazonBedrockOptions: AmazonBedrockLanguageModelChatOptions;
|
|
1613
1616
|
warnings: SharedV4Warning[];
|
|
1614
1617
|
isAnthropicModel: boolean;
|
|
1618
|
+
isOpenAIModel: boolean;
|
|
1615
1619
|
modelId: string;
|
|
1616
1620
|
}): AmazonBedrockLanguageModelChatOptions {
|
|
1617
1621
|
if (!isCustomReasoning(reasoning)) {
|
|
@@ -1619,6 +1623,11 @@ function resolveAmazonBedrockReasoningConfig({
|
|
|
1619
1623
|
}
|
|
1620
1624
|
|
|
1621
1625
|
const result = { ...amazonBedrockOptions };
|
|
1626
|
+
const hasPortableReasoning = reasoning !== 'none';
|
|
1627
|
+
const hasExplicitReasoningConfig =
|
|
1628
|
+
amazonBedrockOptions.reasoningConfig != null;
|
|
1629
|
+
const isNovaReasoningModel = modelId.includes('amazon.nova-2-lite-v1:0');
|
|
1630
|
+
const supportsPortableReasoning = isOpenAIModel || isNovaReasoningModel;
|
|
1622
1631
|
|
|
1623
1632
|
if (isAnthropicModel) {
|
|
1624
1633
|
const capabilities = getModelCapabilities(modelId);
|
|
@@ -1651,16 +1660,26 @@ function resolveAmazonBedrockReasoningConfig({
|
|
|
1651
1660
|
};
|
|
1652
1661
|
}
|
|
1653
1662
|
}
|
|
1654
|
-
} else if (
|
|
1655
|
-
|
|
1656
|
-
|
|
1657
|
-
|
|
1658
|
-
|
|
1659
|
-
|
|
1660
|
-
|
|
1661
|
-
|
|
1662
|
-
|
|
1663
|
-
|
|
1663
|
+
} else if (hasPortableReasoning) {
|
|
1664
|
+
if (supportsPortableReasoning || hasExplicitReasoningConfig) {
|
|
1665
|
+
const effort = mapReasoningToProviderEffort({
|
|
1666
|
+
reasoning,
|
|
1667
|
+
effortMap: amazonBedrockReasoningEffortMap,
|
|
1668
|
+
warnings,
|
|
1669
|
+
});
|
|
1670
|
+
result.reasoningConfig = {
|
|
1671
|
+
...(isNovaReasoningModel && { type: 'enabled' }),
|
|
1672
|
+
maxReasoningEffort: effort,
|
|
1673
|
+
...amazonBedrockOptions.reasoningConfig,
|
|
1674
|
+
};
|
|
1675
|
+
} else {
|
|
1676
|
+
warnings.push({
|
|
1677
|
+
type: 'unsupported',
|
|
1678
|
+
feature: 'reasoning',
|
|
1679
|
+
details:
|
|
1680
|
+
'Portable reasoning is not supported for this model and will be ignored. If the model supports a provider-specific reasoning configuration, use providerOptions.amazonBedrock.reasoningConfig.',
|
|
1681
|
+
});
|
|
1682
|
+
}
|
|
1664
1683
|
}
|
|
1665
1684
|
|
|
1666
1685
|
/*
|
|
@@ -27,6 +27,7 @@ export async function prepareTools({
|
|
|
27
27
|
modelFamily,
|
|
28
28
|
reasoningBudgetTokens,
|
|
29
29
|
disableParallelToolUse,
|
|
30
|
+
rejectsForcedToolUse = false,
|
|
30
31
|
}: {
|
|
31
32
|
tools: LanguageModelV4CallOptions['tools'];
|
|
32
33
|
toolChoice?: LanguageModelV4CallOptions['toolChoice'];
|
|
@@ -34,6 +35,7 @@ export async function prepareTools({
|
|
|
34
35
|
modelFamily?: AmazonBedrockChatModelSettings['modelFamily'];
|
|
35
36
|
reasoningBudgetTokens?: number;
|
|
36
37
|
disableParallelToolUse?: boolean;
|
|
38
|
+
rejectsForcedToolUse?: boolean;
|
|
37
39
|
}): Promise<{
|
|
38
40
|
toolConfig: AmazonBedrockToolConfiguration;
|
|
39
41
|
additionalTools: Record<string, unknown> | undefined;
|
|
@@ -84,13 +86,22 @@ export async function prepareTools({
|
|
|
84
86
|
modelFamily,
|
|
85
87
|
reasoningBudgetTokens,
|
|
86
88
|
});
|
|
87
|
-
const
|
|
89
|
+
const providerTools = supportedTools.filter(t => t.type === 'provider');
|
|
88
90
|
const functionTools = supportedTools.filter(t => t.type === 'function');
|
|
91
|
+
const rejectsForcedToolChoice =
|
|
92
|
+
isAnthropicModel &&
|
|
93
|
+
rejectsForcedToolUse &&
|
|
94
|
+
(toolChoice?.type === 'required' || toolChoice?.type === 'tool');
|
|
95
|
+
const providerToolsForRequest =
|
|
96
|
+
rejectsForcedToolChoice && toolChoice.type === 'tool'
|
|
97
|
+
? providerTools.filter(tool => tool.name === toolChoice.toolName)
|
|
98
|
+
: providerTools;
|
|
89
99
|
|
|
90
100
|
let additionalTools: Record<string, unknown> | undefined = undefined;
|
|
91
101
|
const amazonBedrockTools: AmazonBedrockTool[] = [];
|
|
92
102
|
|
|
93
|
-
const usingAnthropicTools =
|
|
103
|
+
const usingAnthropicTools =
|
|
104
|
+
isAnthropicModel && providerToolsForRequest.length > 0;
|
|
94
105
|
|
|
95
106
|
// Handle Anthropic provider-defined tools for Anthropic models on Bedrock
|
|
96
107
|
if (usingAnthropicTools) {
|
|
@@ -99,11 +110,12 @@ export async function prepareTools({
|
|
|
99
110
|
toolWarnings: anthropicToolWarnings,
|
|
100
111
|
betas: anthropicBetas,
|
|
101
112
|
} = await prepareAnthropicTools({
|
|
102
|
-
tools:
|
|
113
|
+
tools: providerTools,
|
|
103
114
|
toolChoice,
|
|
104
115
|
disableParallelToolUse,
|
|
105
116
|
supportsStructuredOutput: false,
|
|
106
117
|
supportsStrictTools: false,
|
|
118
|
+
rejectsForcedToolUse,
|
|
107
119
|
});
|
|
108
120
|
|
|
109
121
|
toolWarnings.push(...anthropicToolWarnings);
|
|
@@ -118,7 +130,7 @@ export async function prepareTools({
|
|
|
118
130
|
}
|
|
119
131
|
|
|
120
132
|
// Create a standard Bedrock tool representation for validation purposes
|
|
121
|
-
for (const tool of
|
|
133
|
+
for (const tool of providerToolsForRequest) {
|
|
122
134
|
const toolFactory = Object.values(anthropicTools).find(factory => {
|
|
123
135
|
const instance = (factory as (args: any) => any)({});
|
|
124
136
|
return instance.id === tool.id;
|
|
@@ -141,11 +153,34 @@ export async function prepareTools({
|
|
|
141
153
|
}
|
|
142
154
|
} else {
|
|
143
155
|
// Report unsupported provider-defined tools for non-anthropic models
|
|
144
|
-
for (const tool of
|
|
156
|
+
for (const tool of providerToolsForRequest) {
|
|
145
157
|
toolWarnings.push({ type: 'unsupported', feature: `tool ${tool.id}` });
|
|
146
158
|
}
|
|
147
159
|
}
|
|
148
160
|
|
|
161
|
+
let preparedToolChoice = toolChoice;
|
|
162
|
+
if (!usingAnthropicTools && rejectsForcedToolChoice) {
|
|
163
|
+
if (toolChoice.type === 'tool') {
|
|
164
|
+
toolWarnings.push({
|
|
165
|
+
type: 'unsupported',
|
|
166
|
+
feature: 'toolChoice',
|
|
167
|
+
details:
|
|
168
|
+
`toolChoice 'tool' is not supported by this model because it rejects forced tool use. ` +
|
|
169
|
+
`Only the '${toolChoice.toolName}' tool is sent with 'auto' tool choice. ` +
|
|
170
|
+
`Instruct the model to use the tool in the prompt and verify that a tool call was made.`,
|
|
171
|
+
});
|
|
172
|
+
} else {
|
|
173
|
+
toolWarnings.push({
|
|
174
|
+
type: 'unsupported',
|
|
175
|
+
feature: 'toolChoice',
|
|
176
|
+
details:
|
|
177
|
+
`toolChoice 'required' is not supported by this model because it rejects forced tool use. ` +
|
|
178
|
+
`Using 'auto' instead. Instruct the model to use a tool in the prompt and verify that a tool call was made.`,
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
preparedToolChoice = { type: 'auto' };
|
|
182
|
+
}
|
|
183
|
+
|
|
149
184
|
const filteredFunctionTools =
|
|
150
185
|
toolChoice?.type === 'tool'
|
|
151
186
|
? functionTools.filter(t => t.name === toolChoice.toolName)
|
|
@@ -193,16 +228,16 @@ export async function prepareTools({
|
|
|
193
228
|
!usingAnthropicTools &&
|
|
194
229
|
disableParallelToolUse &&
|
|
195
230
|
amazonBedrockTools.length > 0 &&
|
|
196
|
-
|
|
231
|
+
preparedToolChoice?.type !== 'none'
|
|
197
232
|
) {
|
|
198
233
|
additionalTools = {
|
|
199
234
|
tool_choice:
|
|
200
|
-
|
|
235
|
+
preparedToolChoice?.type === 'required'
|
|
201
236
|
? { type: 'any', disable_parallel_tool_use: true }
|
|
202
|
-
:
|
|
237
|
+
: preparedToolChoice?.type === 'tool'
|
|
203
238
|
? {
|
|
204
239
|
type: 'tool',
|
|
205
|
-
name:
|
|
240
|
+
name: preparedToolChoice.toolName,
|
|
206
241
|
disable_parallel_tool_use: true,
|
|
207
242
|
}
|
|
208
243
|
: { type: 'auto', disable_parallel_tool_use: true },
|
|
@@ -216,9 +251,9 @@ export async function prepareTools({
|
|
|
216
251
|
!usingAnthropicTools &&
|
|
217
252
|
additionalTools?.tool_choice == null &&
|
|
218
253
|
amazonBedrockTools.length > 0 &&
|
|
219
|
-
|
|
254
|
+
preparedToolChoice
|
|
220
255
|
) {
|
|
221
|
-
const type =
|
|
256
|
+
const type = preparedToolChoice.type;
|
|
222
257
|
switch (type) {
|
|
223
258
|
case 'auto':
|
|
224
259
|
amazonBedrockToolChoice = { auto: {} };
|
|
@@ -231,7 +266,9 @@ export async function prepareTools({
|
|
|
231
266
|
amazonBedrockToolChoice = undefined;
|
|
232
267
|
break;
|
|
233
268
|
case 'tool':
|
|
234
|
-
amazonBedrockToolChoice = {
|
|
269
|
+
amazonBedrockToolChoice = {
|
|
270
|
+
tool: { name: preparedToolChoice.toolName },
|
|
271
|
+
};
|
|
235
272
|
break;
|
|
236
273
|
default: {
|
|
237
274
|
const _exhaustiveCheck: never = type;
|