@ai-sdk/amazon-bedrock
Version:
1,002 lines (975 loc) • 30 kB
text/typescript
import type {
ModelCapabilities,
ModelCapability,
ModelEntry,
ProviderOptionDefinition,
ProviderOptionDefinitions,
} from '@ai-sdk/provider';
import { getModelCapabilities } from '@ai-sdk/anthropic/internal';
import type { AmazonBedrockLanguageModelChatOptions } from './amazon-bedrock-chat-language-model-options';
import type { AmazonBedrockEmbeddingModelOptions } from './amazon-bedrock-embedding-model-options';
import type { AmazonBedrockImageModelOptions } from './amazon-bedrock-image-model-options';
import type { AmazonBedrockRerankingModelOptions } from './reranking/amazon-bedrock-reranking-model-options';
/** Options under amazonBedrock, with bedrock retained as a legacy alias. */
export const amazonBedrockProviderOptions = {
language: {
structuredOutputMode: {
description: 'Select native structured output or JSON tools.',
},
additionalModelRequestFields: {
description: 'Additional model-specific inference fields.',
},
reasoningConfig: {
description: 'Thinking mode, budget, effort, and display.',
},
anthropicBeta: { description: 'Anthropic beta features to enable.' },
serviceTier: { description: 'Request service tier.' },
requestMetadata: {
description: 'Invocation logging and cost attribution metadata.',
},
} satisfies Record<
keyof AmazonBedrockLanguageModelChatOptions,
ProviderOptionDefinition
>,
embedding: {
dimensions: { description: 'Titan v2 output dimensions.' },
normalize: { description: 'Normalize Titan v2 embeddings.' },
embeddingDimension: { description: 'Nova output dimensions.' },
embeddingPurpose: { description: 'Nova embedding purpose.' },
inputType: { description: 'Cohere embedding input type.' },
truncate: { description: 'Cohere or Nova truncation mode.' },
outputDimension: { description: 'Cohere v4 output dimensions.' },
} satisfies Record<
keyof AmazonBedrockEmbeddingModelOptions,
ProviderOptionDefinition
>,
image: {
quality: { description: 'Image quality.' },
negativeText: { description: 'Content to avoid.' },
cfgScale: { description: 'Prompt adherence scale.' },
style: { description: 'Image generation style.' },
taskType: {
description:
'Generation, variation, inpainting, outpainting, or background removal.',
},
maskPrompt: { description: 'Text describing the region to mask.' },
outPaintingMode: { description: 'Outpainting mode.' },
similarityStrength: { description: 'Similarity to reference images.' },
} satisfies Record<
keyof AmazonBedrockImageModelOptions,
ProviderOptionDefinition
>,
reranking: {
nextToken: { description: 'Pagination token.' },
additionalModelRequestFields: {
description: 'Additional model-specific reranking fields.',
},
} satisfies Record<
keyof AmazonBedrockRerankingModelOptions,
ProviderOptionDefinition
>,
} as const satisfies ProviderOptionDefinitions;
type BedrockStructuredOutputCapabilities = {
tools: { strict: boolean };
structuredOutput: { native: boolean };
};
const strictToolsAndNativeOutput = {
tools: { strict: true },
structuredOutput: { native: true },
} satisfies BedrockStructuredOutputCapabilities;
const strictToolsOnly = {
tools: { strict: true },
structuredOutput: { native: false },
} satisfies BedrockStructuredOutputCapabilities;
const noStrictToolsOrNativeOutput = {
tools: { strict: false },
structuredOutput: { native: false },
} satisfies BedrockStructuredOutputCapabilities;
// Bedrock's Messages schema differs from Anthropic's. Declare its support on
// each model instead of maintaining a separate regex support allowlist.
const claudeStructuredOutputCapabilities: Readonly<
Record<string, BedrockStructuredOutputCapabilities>
> = {
'claude-opus-4': strictToolsAndNativeOutput,
'claude-sonnet-4': strictToolsAndNativeOutput,
'claude-opus-4-1': strictToolsAndNativeOutput,
'claude-opus-4-5': strictToolsAndNativeOutput,
'claude-sonnet-4-5': strictToolsAndNativeOutput,
'claude-haiku-4-5': strictToolsOnly,
'claude-opus-4-6': strictToolsAndNativeOutput,
'claude-sonnet-4-6': strictToolsOnly,
'claude-opus-4-7': noStrictToolsOrNativeOutput,
'claude-opus-4-8': noStrictToolsOrNativeOutput,
'claude-opus-5': strictToolsAndNativeOutput,
'claude-sonnet-5': strictToolsAndNativeOutput,
'claude-opus-5-5': strictToolsAndNativeOutput,
'claude-sonnet-5-5': strictToolsAndNativeOutput,
'claude-haiku-5-5': strictToolsAndNativeOutput,
'claude-fable-5': noStrictToolsOrNativeOutput,
'claude-fable-5-1': noStrictToolsOrNativeOutput,
'claude-fable-5-2': noStrictToolsOrNativeOutput,
};
function resolveClaudeStructuredOutputCapabilities(
modelId: string,
): BedrockStructuredOutputCapabilities {
// Preserve the existing request fallback for non-Claude models, opaque
// inference profiles, and legacy Claude IDs.
if (
!modelId.includes('claude-') ||
/claude-(?:instant|v?2|3)(?=[-.:]|$)/.test(modelId)
) {
return strictToolsAndNativeOutput;
}
// Normalize regional/provider prefixes, release dates, and Bedrock revisions.
// Claude 4 minor-version IDs historically accept additional suffixes; other
// aliases must end at a version, release date, or Bedrock revision.
const canonicalModelId =
/claude-[a-z]+-4-\d{1,2}(?=[-.:]|$)/.exec(modelId)?.[0] ??
/(claude-[a-z]+-\d+(?:-\d{1,2})?)(?:-\d{8})?(?:-v\d+)?(?=[:.]|$)/.exec(
modelId,
)?.[1];
return canonicalModelId != null &&
Object.prototype.hasOwnProperty.call(
claudeStructuredOutputCapabilities,
canonicalModelId,
)
? claudeStructuredOutputCapabilities[canonicalModelId]
: noStrictToolsOrNativeOutput;
}
type LanguageEntry = ModelEntry<{
language: {
anthropic: boolean;
applicationInferenceProfile: boolean;
claude: boolean;
mistral: boolean;
openai: boolean;
openaiGptOss: boolean;
openaiGptOssReasoning: boolean;
nova2Reasoning: boolean;
mantleRoute: 'openai/v1' | 'v1';
};
}> & {
capabilities: {
language: NonNullable<ModelCapabilities['language']> & {
structuredOutput: { native: boolean };
tools: NonNullable<ModelCapabilities['language']>['tools'] & {
strict: boolean;
};
};
};
requestConfig: {
language: {
anthropic: boolean;
applicationInferenceProfile: boolean;
claude: boolean;
mistral: boolean;
openai: boolean;
openaiGptOss: boolean;
openaiGptOssReasoning: boolean;
nova2Reasoning: boolean;
mantleRoute: 'openai/v1' | 'v1';
};
};
};
const documentedLanguageModels: Record<
string,
{
image: boolean;
objectGeneration: boolean;
tools: boolean;
streaming: boolean;
}
> = {
'amazon.titan-tg1-large': {
image: false,
objectGeneration: false,
tools: false,
streaming: false,
},
'amazon.titan-text-express-v1': {
image: false,
objectGeneration: false,
tools: false,
streaming: false,
},
'amazon.titan-text-lite-v1': {
image: false,
objectGeneration: false,
tools: false,
streaming: false,
},
'us.amazon.nova-premier-v1:0': {
image: true,
objectGeneration: true,
tools: true,
streaming: true,
},
'us.amazon.nova-pro-v1:0': {
image: true,
objectGeneration: true,
tools: true,
streaming: true,
},
'us.amazon.nova-lite-v1:0': {
image: true,
objectGeneration: true,
tools: true,
streaming: true,
},
'us.amazon.nova-micro-v1:0': {
image: false,
objectGeneration: true,
tools: true,
streaming: true,
},
'anthropic.claude-haiku-4-5-20251001-v1:0': {
image: true,
objectGeneration: true,
tools: true,
streaming: true,
},
'anthropic.claude-sonnet-4-20250514-v1:0': {
image: true,
objectGeneration: true,
tools: true,
streaming: true,
},
'anthropic.claude-sonnet-4-5-20250929-v1:0': {
image: true,
objectGeneration: true,
tools: true,
streaming: true,
},
'anthropic.claude-opus-4-20250514-v1:0': {
image: true,
objectGeneration: true,
tools: true,
streaming: true,
},
'anthropic.claude-opus-4-1-20250805-v1:0': {
image: true,
objectGeneration: true,
tools: true,
streaming: true,
},
'anthropic.claude-3-5-sonnet-20241022-v2:0': {
image: true,
objectGeneration: true,
tools: true,
streaming: true,
},
'anthropic.claude-3-5-sonnet-20240620-v1:0': {
image: true,
objectGeneration: true,
tools: true,
streaming: true,
},
'anthropic.claude-3-opus-20240229-v1:0': {
image: true,
objectGeneration: true,
tools: true,
streaming: true,
},
'anthropic.claude-3-sonnet-20240229-v1:0': {
image: true,
objectGeneration: true,
tools: true,
streaming: true,
},
'anthropic.claude-3-haiku-20240307-v1:0': {
image: true,
objectGeneration: true,
tools: true,
streaming: true,
},
'us.anthropic.claude-sonnet-4-20250514-v1:0': {
image: true,
objectGeneration: true,
tools: true,
streaming: true,
},
'us.anthropic.claude-sonnet-4-5-20250929-v1:0': {
image: true,
objectGeneration: true,
tools: true,
streaming: true,
},
'us.anthropic.claude-opus-4-20250514-v1:0': {
image: true,
objectGeneration: true,
tools: true,
streaming: true,
},
'us.anthropic.claude-opus-4-1-20250805-v1:0': {
image: true,
objectGeneration: true,
tools: true,
streaming: true,
},
'us.anthropic.claude-3-5-sonnet-20241022-v2:0': {
image: true,
objectGeneration: true,
tools: true,
streaming: true,
},
'us.anthropic.claude-3-5-sonnet-20240620-v1:0': {
image: true,
objectGeneration: true,
tools: true,
streaming: true,
},
'us.anthropic.claude-3-sonnet-20240229-v1:0': {
image: true,
objectGeneration: true,
tools: true,
streaming: true,
},
'us.anthropic.claude-3-opus-20240229-v1:0': {
image: true,
objectGeneration: true,
tools: true,
streaming: true,
},
'us.anthropic.claude-3-haiku-20240307-v1:0': {
image: true,
objectGeneration: true,
tools: true,
streaming: true,
},
'anthropic.claude-v2': {
image: false,
objectGeneration: false,
tools: false,
streaming: false,
},
'anthropic.claude-v2:1': {
image: false,
objectGeneration: false,
tools: false,
streaming: false,
},
'anthropic.claude-instant-v1': {
image: false,
objectGeneration: false,
tools: false,
streaming: false,
},
'cohere.command-text-v14': {
image: false,
objectGeneration: false,
tools: false,
streaming: false,
},
'cohere.command-light-text-v14': {
image: false,
objectGeneration: false,
tools: false,
streaming: false,
},
'cohere.command-r-v1:0': {
image: false,
objectGeneration: false,
tools: true,
streaming: false,
},
'cohere.command-r-plus-v1:0': {
image: false,
objectGeneration: false,
tools: true,
streaming: false,
},
'us.deepseek.r1-v1:0': {
image: false,
objectGeneration: true,
tools: true,
streaming: true,
},
'meta.llama3-8b-instruct-v1:0': {
image: false,
objectGeneration: false,
tools: false,
streaming: false,
},
'meta.llama3-70b-instruct-v1:0': {
image: false,
objectGeneration: false,
tools: false,
streaming: false,
},
'meta.llama3-1-8b-instruct-v1:0': {
image: false,
objectGeneration: false,
tools: false,
streaming: false,
},
'meta.llama3-1-70b-instruct-v1:0': {
image: false,
objectGeneration: false,
tools: false,
streaming: false,
},
'meta.llama3-1-405b-instruct-v1:0': {
image: false,
objectGeneration: false,
tools: false,
streaming: false,
},
'meta.llama3-2-1b-instruct-v1:0': {
image: false,
objectGeneration: false,
tools: false,
streaming: false,
},
'meta.llama3-2-3b-instruct-v1:0': {
image: false,
objectGeneration: false,
tools: false,
streaming: false,
},
'meta.llama3-2-11b-instruct-v1:0': {
image: false,
objectGeneration: false,
tools: false,
streaming: false,
},
'meta.llama3-2-90b-instruct-v1:0': {
image: false,
objectGeneration: false,
tools: false,
streaming: false,
},
'us.meta.llama3-2-1b-instruct-v1:0': {
image: false,
objectGeneration: true,
tools: true,
streaming: true,
},
'us.meta.llama3-2-3b-instruct-v1:0': {
image: false,
objectGeneration: true,
tools: true,
streaming: true,
},
'us.meta.llama3-2-11b-instruct-v1:0': {
image: false,
objectGeneration: true,
tools: true,
streaming: true,
},
'us.meta.llama3-2-90b-instruct-v1:0': {
image: false,
objectGeneration: true,
tools: true,
streaming: true,
},
'us.meta.llama3-1-8b-instruct-v1:0': {
image: false,
objectGeneration: true,
tools: true,
streaming: true,
},
'us.meta.llama3-1-70b-instruct-v1:0': {
image: false,
objectGeneration: true,
tools: true,
streaming: true,
},
'us.meta.llama3-3-70b-instruct-v1:0': {
image: false,
objectGeneration: true,
tools: true,
streaming: true,
},
'us.meta.llama4-scout-17b-instruct-v1:0': {
image: false,
objectGeneration: true,
tools: true,
streaming: true,
},
'us.meta.llama4-maverick-17b-instruct-v1:0': {
image: false,
objectGeneration: true,
tools: true,
streaming: true,
},
'mistral.mistral-7b-instruct-v0:2': {
image: false,
objectGeneration: false,
tools: false,
streaming: false,
},
'mistral.mixtral-8x7b-instruct-v0:1': {
image: false,
objectGeneration: false,
tools: false,
streaming: false,
},
'mistral.mistral-large-2402-v1:0': {
image: false,
objectGeneration: false,
tools: false,
streaming: false,
},
'mistral.mistral-small-2402-v1:0': {
image: false,
objectGeneration: false,
tools: false,
streaming: false,
},
'us.mistral.pixtral-large-2502-v1:0': {
image: true,
objectGeneration: true,
tools: true,
streaming: true,
},
'openai.gpt-oss-120b-1:0': {
image: false,
objectGeneration: true,
tools: true,
streaming: true,
},
'openai.gpt-oss-20b-1:0': {
image: false,
objectGeneration: true,
tools: true,
streaming: true,
},
};
function createLanguageEntry(modelId: string): LanguageEntry {
const documented = documentedLanguageModels[modelId];
const anthropic = getModelCapabilities(modelId);
const claude = modelId.includes('claude-');
const structuredOutputCapabilities =
resolveClaudeStructuredOutputCapabilities(modelId);
const openaiModelId = /^(?:[^.]+\.)?(openai\..+)$/.exec(modelId)?.[1];
const nova2Reasoning = modelId.includes('amazon.nova-2-lite-v1:0');
const sampling: ModelCapability = anthropic.rejectsSamplingParameters
? false
: true;
return {
capabilities: {
language: {
inputs: { image: documented?.image ?? 'unknown', audio: 'unknown' },
objectGeneration: documented?.objectGeneration ?? 'unknown',
tools: {
usage: documented?.tools ?? 'unknown',
streaming: documented?.streaming ?? 'unknown',
strict: structuredOutputCapabilities.tools.strict,
},
reasoning: {
support: openaiModelId != null || nova2Reasoning ? true : 'unknown',
},
sampling: { temperature: sampling, topP: sampling, logprobs: false },
structuredOutput: structuredOutputCapabilities.structuredOutput,
},
},
providerOptions: {
language: {
structuredOutputMode: {
condition:
'Applies to Anthropic models; auto preserves each model’s native-output policy.',
},
additionalModelRequestFields: true,
reasoningConfig: {
condition:
'Supported reasoning configuration depends on the underlying model.',
},
anthropicBeta: {
condition: 'Requires an Anthropic model and a supported beta.',
},
serviceTier: {
condition:
'Requires a model and region supporting the selected tier.',
},
requestMetadata: true,
},
},
requestConfig: {
language: {
anthropic: modelId.includes('anthropic'),
applicationInferenceProfile: modelId.includes(
':application-inference-profile/',
),
claude,
mistral: modelId.includes('mistral.'),
openai: openaiModelId != null,
openaiGptOss: openaiModelId?.startsWith('openai.gpt-oss-') ?? false,
openaiGptOssReasoning: modelId.includes('openai.gpt-oss-'),
nova2Reasoning,
mantleRoute: /^(?:openai\.gpt-(?!oss-)|google\.gemma-4|xai\.)/.test(
modelId,
)
? 'openai/v1'
: 'v1',
},
},
};
}
export function getAmazonBedrockLanguageModelEntry(
modelId: string,
): LanguageEntry {
const entry = Object.prototype.hasOwnProperty.call(
amazonBedrockModelCatalog,
modelId,
)
? amazonBedrockModelCatalog[modelId]
: undefined;
return entry?.capabilities.language != null
? (entry as LanguageEntry)
: createLanguageEntry(modelId);
}
export function getAmazonBedrockEmbeddingModelFamily(
modelId: string,
): 'nova' | 'cohere' | 'titan' {
return modelId.includes('amazon.nova-') && modelId.includes('embed')
? 'nova'
: modelId.includes('cohere.embed-')
? 'cohere'
: 'titan';
}
function embeddingEntry(
modelId: string,
defaultDimensions: number,
customDimensions: boolean,
): ModelEntry {
const family = getAmazonBedrockEmbeddingModelFamily(modelId);
return {
capabilities: { embedding: { defaultDimensions, customDimensions } },
providerOptions: {
embedding: {
dimensions: family === 'titan' && customDimensions,
normalize: family === 'titan' && customDimensions,
embeddingDimension: family === 'nova',
embeddingPurpose: family === 'nova',
inputType: family === 'cohere',
truncate: family !== 'titan',
outputDimension: family === 'cohere' && customDimensions,
},
},
};
}
export const amazonBedrockImageModelCatalog = {
'amazon.nova-canvas-v1:0': {
capabilities: {
image: {
sizes: {
description:
'320–4096 pixels per side, divisible by 16; aspect ratio 1:4 to 4:1; fewer than 4,194,304 pixels.',
},
fileInput: true,
maskInput: true,
maxImagesPerCall: 5,
},
},
providerOptions: {
image: {
quality: true,
negativeText: true,
cfgScale: true,
style: true,
taskType: true,
maskPrompt: true,
outPaintingMode: true,
similarityStrength: true,
},
},
},
} satisfies Record<string, ModelEntry>;
export function getAmazonBedrockImageModelEntry(modelId: string): ModelEntry {
return Object.prototype.hasOwnProperty.call(
amazonBedrockImageModelCatalog,
modelId,
)
? amazonBedrockImageModelCatalog[
modelId as keyof typeof amazonBedrockImageModelCatalog
]
: {
capabilities: {
image: {
sizes: { description: 'Model-dependent.' },
fileInput: 'unknown',
maskInput: 'unknown',
maxImagesPerCall: undefined,
},
},
};
}
const rerankingEntry = {
capabilities: {
reranking: { documents: { text: true, object: true }, topN: true },
},
providerOptions: {
reranking: { nextToken: true, additionalModelRequestFields: true },
},
} satisfies ModelEntry;
const languageModelIds = [
'amazon.titan-tg1-large',
'amazon.titan-text-express-v1',
'anthropic.claude-v2',
'anthropic.claude-v2:1',
'anthropic.claude-instant-v1',
'anthropic.claude-sonnet-5',
'anthropic.claude-sonnet-5-5',
'anthropic.claude-haiku-5-5',
'anthropic.claude-fable-5',
'anthropic.claude-fable-5-1',
'anthropic.claude-fable-5-2',
'anthropic.claude-opus-5',
'anthropic.claude-opus-5-5',
'anthropic.claude-opus-4-8',
'anthropic.claude-opus-4-7',
'anthropic.claude-opus-4-6-v1',
'anthropic.claude-sonnet-4-6-v1',
'anthropic.claude-opus-4-5-20251101-v1:0',
'anthropic.claude-haiku-4-5-20251001-v1:0',
'anthropic.claude-sonnet-4-5-20250929-v1:0',
'anthropic.claude-sonnet-4-20250514-v1:0',
'anthropic.claude-opus-4-20250514-v1:0',
'anthropic.claude-opus-4-1-20250805-v1:0',
'anthropic.claude-3-7-sonnet-20250219-v1:0',
'anthropic.claude-3-5-sonnet-20240620-v1:0',
'anthropic.claude-3-5-sonnet-20241022-v2:0',
'anthropic.claude-3-5-haiku-20241022-v1:0',
'anthropic.claude-3-sonnet-20240229-v1:0',
'anthropic.claude-3-haiku-20240307-v1:0',
'anthropic.claude-3-opus-20240229-v1:0',
'cohere.command-text-v14',
'cohere.command-light-text-v14',
'cohere.command-r-v1:0',
'cohere.command-r-plus-v1:0',
'meta.llama3-70b-instruct-v1:0',
'meta.llama3-8b-instruct-v1:0',
'meta.llama3-1-405b-instruct-v1:0',
'meta.llama3-1-70b-instruct-v1:0',
'meta.llama3-1-8b-instruct-v1:0',
'meta.llama3-2-11b-instruct-v1:0',
'meta.llama3-2-1b-instruct-v1:0',
'meta.llama3-2-3b-instruct-v1:0',
'meta.llama3-2-90b-instruct-v1:0',
'mistral.mistral-7b-instruct-v0:2',
'mistral.mixtral-8x7b-instruct-v0:1',
'mistral.mistral-large-2402-v1:0',
'mistral.mistral-small-2402-v1:0',
'openai.gpt-oss-120b-1:0',
'openai.gpt-oss-20b-1:0',
'amazon.titan-text-lite-v1',
'us.amazon.nova-premier-v1:0',
'us.amazon.nova-pro-v1:0',
'us.amazon.nova-micro-v1:0',
'us.amazon.nova-lite-v1:0',
'us.anthropic.claude-3-sonnet-20240229-v1:0',
'us.anthropic.claude-3-opus-20240229-v1:0',
'us.anthropic.claude-3-haiku-20240307-v1:0',
'us.anthropic.claude-3-5-sonnet-20240620-v1:0',
'us.anthropic.claude-3-5-haiku-20241022-v1:0',
'us.anthropic.claude-3-5-sonnet-20241022-v2:0',
'us.anthropic.claude-3-7-sonnet-20250219-v1:0',
'us.anthropic.claude-sonnet-5',
'us.anthropic.claude-sonnet-5-5',
'us.anthropic.claude-haiku-5-5',
'us.anthropic.claude-fable-5',
'us.anthropic.claude-fable-5-1',
'us.anthropic.claude-fable-5-2',
'us.anthropic.claude-opus-5',
'us.anthropic.claude-opus-5-5',
'us.anthropic.claude-opus-4-8',
'us.anthropic.claude-opus-4-7',
'us.anthropic.claude-opus-4-6-v1',
'us.anthropic.claude-sonnet-4-6-v1',
'us.anthropic.claude-opus-4-5-20251101-v1:0',
'us.anthropic.claude-sonnet-4-5-20250929-v1:0',
'us.anthropic.claude-sonnet-4-20250514-v1:0',
'us.anthropic.claude-opus-4-20250514-v1:0',
'us.anthropic.claude-opus-4-1-20250805-v1:0',
'us.anthropic.claude-haiku-4-5-20251001-v1:0',
'global.anthropic.claude-fable-5-1',
'global.anthropic.claude-fable-5-2',
'us.meta.llama3-2-11b-instruct-v1:0',
'us.meta.llama3-2-3b-instruct-v1:0',
'us.meta.llama3-2-90b-instruct-v1:0',
'us.meta.llama3-2-1b-instruct-v1:0',
'us.meta.llama3-1-8b-instruct-v1:0',
'us.meta.llama3-1-70b-instruct-v1:0',
'us.meta.llama3-3-70b-instruct-v1:0',
'us.deepseek.r1-v1:0',
'us.mistral.pixtral-large-2502-v1:0',
'us.meta.llama4-scout-17b-instruct-v1:0',
'us.meta.llama4-maverick-17b-instruct-v1:0',
'amazon.nova-2-lite-v1:0',
] as const;
const amazonBedrockEmbeddingModelEntries = {
'amazon.titan-embed-text-v1': embeddingEntry(
'amazon.titan-embed-text-v1',
1536,
false,
),
'amazon.titan-embed-text-v2:0': embeddingEntry(
'amazon.titan-embed-text-v2:0',
1024,
true,
),
'amazon.nova-embed-text-v2:0': embeddingEntry(
'amazon.nova-embed-text-v2:0',
1024,
true,
),
'cohere.embed-english-v3': embeddingEntry(
'cohere.embed-english-v3',
1024,
false,
),
'cohere.embed-multilingual-v3': embeddingEntry(
'cohere.embed-multilingual-v3',
1024,
false,
),
'cohere.embed-v4:0': embeddingEntry('cohere.embed-v4:0', 1536, true),
};
const amazonBedrockRerankingModelEntries = {
'amazon.rerank-v1:0': rerankingEntry,
'cohere.rerank-v3-5:0': rerankingEntry,
};
export const amazonBedrockModelCatalog: Readonly<
Record<string, ModelEntry<LanguageEntry['requestConfig']>>
> = {
...Object.fromEntries(
languageModelIds.map(id => [id, createLanguageEntry(id)]),
),
...amazonBedrockEmbeddingModelEntries,
...amazonBedrockRerankingModelEntries,
...amazonBedrockImageModelCatalog,
};
/** Capabilities of the native Anthropic endpoint, distinct from Converse. */
const nativeAnthropicModels = {
'us.anthropic.claude-fable-5-1': { computerUse: true, reasoning: true },
'us.anthropic.claude-fable-5-2': { computerUse: true, reasoning: true },
'us.anthropic.claude-sonnet-5-5': { computerUse: true, reasoning: true },
'us.anthropic.claude-sonnet-5': { computerUse: true, reasoning: true },
'us.anthropic.claude-haiku-5-5': { computerUse: true, reasoning: true },
'us.anthropic.claude-fable-5': { computerUse: true, reasoning: true },
'us.anthropic.claude-opus-4-8': { computerUse: true, reasoning: true },
'us.anthropic.claude-opus-4-7': { computerUse: true, reasoning: true },
'us.anthropic.claude-opus-4-6-v1': { computerUse: true, reasoning: true },
'us.anthropic.claude-opus-4-5-20251101-v1:0': {
computerUse: true,
reasoning: true,
},
'us.anthropic.claude-sonnet-4-5-20250929-v1:0': {
computerUse: true,
reasoning: true,
},
'us.anthropic.claude-opus-4-20250514-v1:0': {
computerUse: true,
reasoning: true,
},
'us.anthropic.claude-sonnet-4-20250514-v1:0': {
computerUse: true,
reasoning: true,
},
'us.anthropic.claude-opus-4-1-20250805-v1:0': {
computerUse: true,
reasoning: true,
},
'us.anthropic.claude-haiku-4-5-20251001-v1:0': {
computerUse: true,
reasoning: true,
},
'us.anthropic.claude-3-5-sonnet-20241022-v2:0': {
computerUse: false,
reasoning: false,
},
// Known IDs without declared capabilities retain the custom-model fallback.
'anthropic.claude-3-5-haiku-20241022-v1:0': undefined,
'anthropic.claude-3-5-sonnet-20240620-v1:0': undefined,
'anthropic.claude-3-5-sonnet-20241022-v2:0': undefined,
'anthropic.claude-3-7-sonnet-20250219-v1:0': undefined,
'anthropic.claude-3-haiku-20240307-v1:0': undefined,
'anthropic.claude-3-opus-20240229-v1:0': undefined,
'anthropic.claude-3-sonnet-20240229-v1:0': undefined,
'anthropic.claude-fable-5': undefined,
'anthropic.claude-fable-5-1': undefined,
'anthropic.claude-fable-5-2': undefined,
'anthropic.claude-haiku-4-5-20251001-v1:0': undefined,
'anthropic.claude-haiku-5-5': undefined,
'anthropic.claude-opus-4-1-20250805-v1:0': undefined,
'anthropic.claude-opus-4-20250514-v1:0': undefined,
'anthropic.claude-opus-4-5-20251101-v1:0': undefined,
'anthropic.claude-opus-4-6-v1': undefined,
'anthropic.claude-opus-4-7': undefined,
'anthropic.claude-opus-4-8': undefined,
'anthropic.claude-opus-5': undefined,
'anthropic.claude-opus-5-5': undefined,
'anthropic.claude-sonnet-4-20250514-v1:0': undefined,
'anthropic.claude-sonnet-4-5-20250929-v1:0': undefined,
'anthropic.claude-sonnet-4-6-v1': undefined,
'anthropic.claude-sonnet-5': undefined,
'anthropic.claude-sonnet-5-5': undefined,
'global.anthropic.claude-fable-5-1': undefined,
'global.anthropic.claude-fable-5-2': undefined,
'us.anthropic.claude-3-5-haiku-20241022-v1:0': undefined,
'us.anthropic.claude-3-5-sonnet-20240620-v1:0': undefined,
'us.anthropic.claude-3-7-sonnet-20250219-v1:0': undefined,
'us.anthropic.claude-3-haiku-20240307-v1:0': undefined,
'us.anthropic.claude-3-opus-20240229-v1:0': undefined,
'us.anthropic.claude-3-sonnet-20240229-v1:0': undefined,
'us.anthropic.claude-opus-5': undefined,
'us.anthropic.claude-opus-5-5': undefined,
'us.anthropic.claude-sonnet-4-6-v1': undefined,
};
export const amazonBedrockAnthropicModelCatalog = Object.fromEntries(
Object.entries(nativeAnthropicModels).flatMap(([id, support]) => {
if (support == null) return [];
const base = getAmazonBedrockLanguageModelEntry(id).capabilities.language;
const entry = {
capabilities: {
language: {
...base,
inputs: { image: true, audio: false },
objectGeneration: true,
tools: {
...base.tools,
usage: true,
streaming: true,
computerUse: support.computerUse,
},
reasoning: { support: support.reasoning },
},
},
} as const;
return [[id, entry satisfies ModelEntry]];
}),
);
/** Endpoint availability documented for Mantle's known GPT-OSS models. */
const mantleModels = {
'openai.gpt-oss-20b': { chatCompletions: true, responses: true },
'openai.gpt-oss-120b': { chatCompletions: true, responses: true },
'openai.gpt-oss-safeguard-20b': { chatCompletions: true, responses: false },
'openai.gpt-oss-safeguard-120b': { chatCompletions: true, responses: false },
} as const;
export const amazonBedrockMantleModelCatalog = Object.fromEntries(
Object.entries(mantleModels).map(([id, endpoints]) => {
const entry = {
capabilities: {
language: {
...getAmazonBedrockLanguageModelEntry(id).capabilities.language,
endpoints,
},
},
} as const;
return [id, entry satisfies ModelEntry];
}),
);
/** Known model IDs, derived from the declarations used to build the catalog. */
export type AmazonBedrockModelIds = {
language: (typeof languageModelIds)[number];
embedding: keyof typeof amazonBedrockEmbeddingModelEntries;
reranking: keyof typeof amazonBedrockRerankingModelEntries;
image: keyof typeof amazonBedrockImageModelCatalog;
anthropic: keyof typeof nativeAnthropicModels;
mantleChat: keyof typeof mantleModels;
mantleResponses: {
[Id in keyof typeof mantleModels]: (typeof mantleModels)[Id]['responses'] extends true
? Id
: never;
}[keyof typeof mantleModels];
};