Which Bedrock models the framework knows, how it shapes requests for each provider, and how to describe a model it does not know. For which models to enable before a first run, see the User Guide §1 Required models; for the two model tiers and per-role overrides, see §2 Model selection notes.
Model-id keys accept any Bedrock model id, or an inference-profile id such as
us.anthropic.claude-sonnet-5-5 (used as-is). The models below have a curated
capability record (as do the older Claude 3.x/4.x ids). Any other id still
works: anthropic.claude-* ids get the request shape of their generation,
openai.gpt-* ids the GPT shape, and other providers a conservative Converse
request (no reasoning or sampling parameters, 32K window, 4K output), each with
one WARNING. Describe or correct a model with aws.bedrock.model_overrides
(keys are capability-record fields such as context_window_size and
max_output_tokens; an unknown key fails fast):
aws:
bedrock:
model_overrides:
"amazon.nova-pro-v1:0":
context_window_size: 300000
max_output_tokens: 10000Embedding and rerank model ids work differently: with the Bedrock providers
(the default providers.embedding.kind / providers.rerank.kind) they are a
closed list, and model_overrides does not apply to them. With a local
provider any model name is accepted (see the user guide's
Local mode). models.embedding.model_id accepts
amazon.titan-embed-text-v2:0, amazon.titan-embed-text-v1,
cohere.embed-v4:0, cohere.embed-english-v3 or
cohere.embed-multilingual-v3; models.rerank accepts
cohere.rerank-v3-5:0 or amazon.rerank-v1:0. Any other id fails config
validation. The embedding dimension is written into the OpenSearch vector
mappings and checked against the model's record, so an unknown model has no
safe default; models.embedding.dimension picks among the
dimensions a listed model supports (Titan Embed V2: 256, 512 or 1024; unset
uses the largest). Adding a model is a code change: a member in
EmbeddingModelId/RerankModelId (domain/models/config.py) and a record in
adapters/aws/bedrock_models.py.
An embedding model is invoked on demand by the id in
models.embedding.model_id wherever it has on-demand throughput. Only in a
region without it does the factory resolve a cross-region inference profile,
the way language models do: the global. profile (with
enable_global_profile) or the geography profile. This applies to
cohere.embed-v4:0, which has on-demand throughput only in us-east-1,
eu-west-1 and ap-northeast-1: there it keeps the bare id, in us-west-2
it runs through us./global., and in ap-northeast-2 only through
global.. When no profile resolves where one is needed (global profile off,
or no bedrock:ListInferenceProfiles grant) the factory fails at model
creation with the remedy instead of on the first embed call. The index
metadata keeps the bare id, so switching between profile and on-demand
invocation needs no reindex.
| Model id | Provider | Context / max output | Reasoning control |
|---|---|---|---|
anthropic.claude-sonnet-5-5 (default) |
Anthropic | 1M / 128K | adaptive, always on; effort low–max |
anthropic.claude-opus-5-5 |
Anthropic | 1M / 128K | adaptive, always on; effort low–max |
anthropic.claude-haiku-5-5 |
Anthropic | 1M / 128K | adaptive, on by default; effort low–max |
anthropic.claude-sonnet-5, anthropic.claude-opus-5 |
Anthropic | 1M / 128K | adaptive, always on; effort |
anthropic.claude-opus-4-8, anthropic.claude-opus-4-7 |
Anthropic | 1M / 128K | adaptive, always on; effort low–max |
anthropic.claude-opus-4-6-v1 |
Anthropic | 1M / 128K | opt-in (--enable-thinking), adaptive; effort low/medium/high/max |
anthropic.claude-sonnet-4-6 |
Anthropic | 1M / 64K | opt-in, adaptive; effort low/medium/high/max |
openai.gpt-6.1-sol |
OpenAI | 1M / 131K | reasoning.effort low–max, always on |
openai.gpt-6-astra, openai.gpt-6-sol, openai.gpt-6-luna |
OpenAI | 1.05M / 128K | reasoning.effort low–max, always on |
openai.gpt-5.6-sol, openai.gpt-5.6-terra, openai.gpt-5.6-luna |
OpenAI | 1.05M / 128K | reasoning.effort low–max, always on |
openai.gpt-5.5, openai.gpt-5.4 |
OpenAI | 1.05M / 128K | reasoning.effort low–max, always on |
All of these are inference-profile-only. Only OpenAI's proprietary GPT models
are offered; the open-weight gpt-oss models are not.
Four things differ for Claude 4.7-and-later models:
- Inference profiles are mandatory. They ship without
ON_DEMANDthroughput, so the bare model id is not invocable — a cross-region profile must resolve. Keepenable_global_profile: trueand grantbedrock:ListInferenceProfiles; the adapter fails fast with the remedy if no profile resolves. Note that inap-northeast-2onlyglobal.profiles exist for Claude 5 (noapac.), so disabling the global profile leaves no path. effortreplaces the thinking token budget.thinking_budget_tokensis ignored for these models (the oldbudget_tokensrequest shape is rejected with a 400); setbedrock.default_effort/bedrock.fast_effortinstead. A call usesfast_effortwhen its model is the fast tier's (models.fast, when that differs frommodels.default), otherwisedefault_effort; the shipped fast model, Claude Haiku 5.5, thinks adaptively, sofast_effort(defaultlow) sets how much it reasons on fast-tier calls. A default-tier ingestion call usesingestion_effortinstead when it is set. Claude Sonnet 5.5 always thinks, so--enable-thinkingis a no-op for it — depth iseffortonly. A level the model does not accept (e.g.xhighon Opus 4.6 or Sonnet 4.6) fails fast.- Sampling parameters are dropped.
temperature/top_kare not accepted and are omitted from requests automatically; steer behaviour by prompting. - Token estimates are scaled. Their tokenizer counts roughly 1x-1.35x the
tokens of older Claude models for the same text and CountTokens rejects
them, so the local estimate (~4 characters per token for Latin text) is
multiplied by the record's
token_estimate_multiplier(1.3) when sizing context budgets. Override it per model withaws.bedrock.model_overrides.
OpenAI GPT models differ from Claude in these ways:
- They always go through the Converse API on a
us./global.inference profile (noapac./eu.geo profiles; keepenable_global_profile: trueoutside the US). The tier's effort (bedrock.default_effort/fast_effort) is sent asreasoning: {effort: ...}(the flatreasoning_effortfield is rejected). GPT-5.6 and GPT-6.x answered a trivial prompt in roughly 10-25 s even ateffort: low, so size timeouts and concurrency accordingly. - No Anthropic-only fields are sent (
thinking,output_config,anthropic_beta), and sampling parameters are omitted. - Explicit prompt-cache markers are not sent: Converse supports only implicit caching for these models. Bedrock CountTokens does not support them, so the retrieval context budget uses the local token estimate.
Claude Fable 5 / 5.1 are not offered: they need a non-default account
data-retention mode (Data Retention API only), and accounts on the default mode
get data retention mode 'default' is not available for this model on every
call.
On Claude models that support explicit prompt caching, the
end of each system prompt is marked as a cache checkpoint: a cachePoint block
on the Converse API (every inference profile) and cache_control on
InvokeModel. A system prompt shorter than the model's minimum checkpoint size
(512 tokens on Claude Sonnet/Opus/Haiku 5.5 and Opus 5, 1024 on most others,
2048 on Claude 3.5 Haiku, 4096 on Claude Haiku 4.5 and Opus 4.5-4.7) gets no marker, because Bedrock would accept
it but cache nothing. Cache reads show up as cache_read in the response's
usage_metadata.input_token_details, and cached input tokens do not count
against the tokens-per-minute quota.
aws.bedrock.query_prompt_cache_ttl: 1h (default 5m) keeps the checkpoint
of query-time chains for an hour. Only a chain whose system prompt reaches the
minimum size above has a checkpoint: with the shipped prompts, answer
generation, query entity extraction and the global-search reduce step on the
models with a 512-token minimum; on a 1,024- or 4,096-token model no shipped
query prompt is long enough. Answers that run-eval generates are query
chains too. Ingestion chains and evaluation judges reuse each prompt within
seconds and always use 5 minutes. A 1-hour cache write is billed at 2x the
input-token price (5 minutes: 1.25x) and a read costs the same, so it pays off
only at low query rates, where the gap between queries often exceeds 5
minutes.
The 1-hour TTL is sent only on Converse requests to Claude 4.5 and later
(supports_1h_cache_ttl in the capability record); an InvokeModel request
keeps the 5-minute checkpoint, because langchain-aws rewrites its
cache_control to {"type": "ephemeral"} and drops the TTL.