@ai-sdk/amazon-bedrock
Version:
61 lines (55 loc) • 1.95 kB
text/typescript
import { InvalidArgumentError } from '@ai-sdk/provider';
import {
isValidHostnamePart,
loadOptionalSetting,
withoutTrailingSlash,
} from '@ai-sdk/provider-utils';
const AWS_PARTITION_DNS_SUFFIXES = [
{ regionPrefix: 'cn-', dnsSuffix: 'amazonaws.com.cn' },
{ regionPrefix: 'us-iso-', dnsSuffix: 'c2s.ic.gov' },
{ regionPrefix: 'us-isob-', dnsSuffix: 'sc2s.sgov.gov' },
{ regionPrefix: 'eu-isoe-', dnsSuffix: 'cloud.adc-e.uk' },
{ regionPrefix: 'us-isof-', dnsSuffix: 'csp.hci.ic.gov' },
{ regionPrefix: 'eusc-', dnsSuffix: 'amazonaws.eu' },
] as const;
export function resolveAmazonBedrockBaseURL({
baseURL,
getRegion,
service,
serviceEndpointUrlEnvironmentVariableName,
}: {
baseURL: string | undefined;
getRegion: () => string;
service: 'bedrock-runtime' | 'bedrock-agent-runtime';
serviceEndpointUrlEnvironmentVariableName:
| 'AWS_ENDPOINT_URL_BEDROCK_RUNTIME'
| 'AWS_ENDPOINT_URL_BEDROCK_AGENT_RUNTIME';
}): string {
const resolvedBaseURL =
baseURL ??
loadOptionalSetting({
settingValue: undefined,
environmentVariableName: serviceEndpointUrlEnvironmentVariableName,
}) ??
loadOptionalSetting({
settingValue: undefined,
environmentVariableName: 'AWS_ENDPOINT_URL',
});
if (resolvedBaseURL != null) {
return withoutTrailingSlash(resolvedBaseURL) ?? resolvedBaseURL;
}
const region = getRegion();
if (!isValidHostnamePart(region)) {
throw new InvalidArgumentError({
argument: 'region',
message:
'Invalid AWS region. Expected a single DNS label (letters, digits, and hyphens). Use `baseURL` for custom endpoints.',
});
}
const dnsSuffix =
AWS_PARTITION_DNS_SUFFIXES.find(({ regionPrefix }) =>
region.startsWith(regionPrefix),
)?.dnsSuffix ?? 'amazonaws.com';
const generatedBaseURL = `https://${service}.${region}.${dnsSuffix}`;
return withoutTrailingSlash(generatedBaseURL) ?? generatedBaseURL;
}