BEDROCK), com três paths de dispatch que cobrem o catálogo inteiro de modelos hospedados pela AWS:
- Anthropic Messages —
anthropic.*e inference profiles (global./us./eu./apac.anthropic.*). Preserva cache markers e extended-thinking. - OpenAI Chat Completions —
openai.gpt-oss-*(open-weights da OpenAI no Bedrock). - Converse API (default) — schema unificado da AWS que cobre tudo o mais: Llama, Amazon Nova, Mistral, Cohere, AI21 Jamba, DeepSeek, Stability, Writer Palmyra, Moonshot Kimi, MiniMax, Qwen, Z.AI/GLM, Google Gemma, NVIDIA Nemotron, TwelveLabs Pegasus, e qualquer provider que a AWS adicionar no futuro.
/switch --model confia 100% no que sua conta AWS retorna via ListFoundationModels + ListInferenceProfiles — sem allowlist hardcoded. Modelo novo na AWS aparece no próximo /switch --model sem precisar de release do ChatCLI.
Ideal para ambientes corporativos que já têm billing, compliance e controle de acesso via AWS — sem precisar de API keys das provedoras originais.
Por que AWS Bedrock?
Sem API key por provider
~/.aws/credentials, AWS_PROFILE). Uma única identidade pra todos os modelos.Billing e compliance AWS
Catálogo completo
VPC endpoints
BEDROCK_BASE_URL (ou a var nativa da AWS AWS_ENDPOINT_URL_BEDROCK_RUNTIME).Auto-detecção de família
Embeddings nativos
Configuração
O provedor é detectado automaticamente quando o ChatCLI encontra credenciais AWS válidas (não apenas a existência de arquivos):- Credenciais estáticas em env:
AWS_ACCESS_KEY_ID - Profile selecionado:
AWS_PROFILE(via env var ou.envfile) - Arquivo
~/.aws/credentialscom ao menos umaws_access_key_idpreenchido - AWS SSO: perfil SSO em
~/.aws/config(detectasso_session,sso_start_url,sso_account_id) - Assume-role / credential_process: perfis com
role_arnoucredential_processem~/.aws/config - Token cache SSO: presença de arquivos em
~/.aws/sso/cache/(indicandoaws sso loginanterior) - Web Identity Token (EKS IRSA):
AWS_WEB_IDENTITY_TOKEN_FILE - Container Credentials (ECS):
AWS_CONTAINER_CREDENTIALS_RELATIVE_URI/_FULL_URI
Opção 1: ~/.aws/credentials (credenciais estáticas)
Se você já usa AWS CLI, basta ter um profile configurado:
Opção 2: AWS SSO (IAM Identity Center)
Se sua empresa usa AWS SSO, configure o profile no~/.aws/config:
~/.aws/config (pelas chaves sso_session, sso_start_url, sso_account_id). Se o token SSO expirar, o erro será claro (SSOTokenProviderError) — basta executar aws sso login novamente.Importante: o AWS SDK não sabe qual profile está “logado”. Você precisa indicar o profile via AWS_PROFILE (env, .env, ou flag). Se seu profile SSO se chama default, ele é usado automaticamente sem AWS_PROFILE.Opção 3: Environment variables (credenciais estáticas)
Opção 4: IAM Role (EC2/ECS/EKS)
Em ambientes AWS nativos, não precisa configurar nada — o SDK pega a role automaticamente pelo IMDSv2 / webidentity. Só precisa garantir que a role tem as permissões IAM abaixo.AWS_CONTAINER_CREDENTIALS_*, AWS_WEB_IDENTITY_TOKEN_FILE, ECS_CONTAINER_METADATA_URI*).Para forçar o comportamento, use:AWS_EC2_METADATA_DISABLED=true— desabilita IMDS explicitamenteCHATCLI_BEDROCK_ENABLE_IMDS=1— força habilitar IMDS (útil em EC2 sem as env vars padrão)
Permissões IAM
Permissões mínimas para invocar e listar modelos. A actionbedrock:InvokeModel cobre tanto InvokeModel (Anthropic/OpenAI) quanto Converse (todo o resto):
Bedrock Console → Model access → Request access.
Famílias de modelos e seleção de schema
O Bedrock usa schemas diferentes dependendo do modelo. O ChatCLI tem três paths e detecta automaticamente qual usar pelo prefixo do model id:Override manual
Se quiser forçar uma família independente do prefixo (ex.: testar Converse num modelo Anthropic), use a env var:anthropic / claude, openai / gpt, converse / auto (case-insensitive). A env var tem precedência sobre a detecção por prefixo.
/switch --model lista qualquer text-output model com inference on-demand que sua conta tem acesso — Kimi K2.6, GLM 4.7, Qwen3 Coder Next, Nemotron Nano 3, qualquer modelo novo que a AWS adicionar — sem precisar de release nosso. Se um ID raro não casar com Converse, o ChatCLI retorna mensagem amigável apontando o caminho.Claude nova geração e o endpoint Messages (bedrock-mantle)
A geração mais nova de modelos Claude no Bedrock (Fable 5, Opus 5, Sonnet 5, Opus 4.8, Opus 4.7) usa IDs dateless —anthropic.claude-fable-5, anthropic.claude-opus-5, anthropic.claude-sonnet-5, anthropic.claude-opus-4-8, anthropic.claude-opus-4-7 — sem IDs ARN-versionados (...-v1:0). No caminho InvokeModel (Opus 4.8/4.7) o ID dateless puro não é invocável on-demand — a AWS responde “retry with the ID or ARN of an inference profile” — então o ChatCLI os invoca pelo inference profile global. (global.anthropic.claude-opus-4-8); os modelos do endpoint Messages (Opus 5, Sonnet 5, Fable 5) usam o ID dateless puro.
Claude Opus 5, Claude Sonnet 5 e Claude Fable 5 têm uma particularidade: são servidos exclusivamente pelo endpoint Claude in Amazon Bedrock — a Messages API em https://bedrock-mantle.{região}.api.aws/anthropic/v1/messages. O Opus 5 e o Sonnet 5 não existem no InvokeModel legado, e o Fable 5 o rejeita com 400 ValidationException: data retention mode 'default' is not available for this model (ele exige retenção de dados de 30 dias, disponível só sob o acordo Claude in Amazon Bedrock). O ChatCLI cuida disso sozinho:
- O catálogo marca esses modelos com a capability
bedrock_mantle_onlye o client roteia a request pro endpoint Messages automaticamente —/switch --model claude-opus-5(ouclaude-sonnet-5/claude-fable-5) simplesmente funciona. - IDs de inference profile são canonicalizados no wire: o endpoint Messages só conhece os IDs dateless
anthropic.*— mandarus.anthropic.claude-sonnet-5ouglobal.anthropic.claude-fable-5verbatim retorna404 not_found_error(“model does not exist”). Se você selecionar um profile desses no/switch(é o que oListInferenceProfilesda sua conta lista), o ChatCLI converte pro ID canônico (anthropic.claude-sonnet-5) antes de montar a request. - Auth: SigV4 com o service name
bedrock-mantleusando a mesma credentials chain (IAM, profile, SSO), ou um bearer token de curta duração viaAWS_BEARER_TOKEN_BEDROCK(headerx-api-key), útil em ambientes corporativos sem IAM. - Body: mesmo shape da Messages API first-party — a versão vai no header
anthropic-version(o campoanthropic_versiondo body é exclusivo do InvokeModel). Os markers decache_controlchegam intactos no wire, como no path InvokeModel. - Fallback automático pro InvokeModel: no roteamento padrão (
BEDROCK_ANTHROPIC_ENDPOINTvazio ouauto), se a chamada Mantle falhar depois dos retries — indisponibilidade regional, VPC sem interface endpointbedrock-mantle, restrição da conta — o ChatCLI reenvia a mesma requisição pelo runtimeInvokeModellegado sob o inference profileglobal.(anthropic.claude-sonnet-5→global.anthropic.claude-sonnet-5; IDs que já carregam prefixo de profile ou ARNs passam intactos). O modelo configurado nunca é alterado: a próxima chamada tenta o Mantle primeiro de novo. Um warning no log nomeia os dois endpoints quando o fallback dispara. - Overrides de operação:
BEDROCK_ANTHROPIC_ENDPOINT=mantle|invokepina qualquer modelo Claude num único wire —mantledesativa o fallback (você pediu essa superfície explicitamente),invokenunca toca o endpoint Messages.BEDROCK_MANTLE_BASE_URLaponta a superfície Mantle pra VPC endpoints ou proxies (é um host e serviço diferentes doBEDROCK_BASE_URL, que cobre só o runtime InvokeModel). TLS corporativo (CHATCLI_BEDROCK_CA_BUNDLEetc.) é honrado nos dois.
InvokeModel por padrão (servidos pela mesma infraestrutura do endpoint Messages); use BEDROCK_ANTHROPIC_ENDPOINT=mantle se quiser movê-los pro endpoint novo também. Pré-requisito pra Opus 5/Sonnet 5/Fable 5: habilite o modelo em Model access no console do Bedrock com um data retention mode selecionado.Inference Profiles vs. Model IDs
Esse é o detalhe mais importante do Bedrock com Claude. Modelos Anthropic da era 3.7–4.6 (3.7, 4.x, 4.5, 4.6) NÃO aceitam invocação on-demand direto pelo ID base (a nova geração dateless — Fable 5, Opus 5, Sonnet 5, Opus 4.8/4.7 — não precisa de profile; veja a seção acima). Se você tentar com um modelo da era antiga, recebe:global.anthropic.claude-sonnet-4-6). Os modelos Claude 3 e 3.5 ainda aceitam invocação direta pelo ID base e também estão no catálogo.Listagem de Modelos
O/switch --model consulta duas fontes ao vivo e as mescla com o catálogo estático:
bedrock:ListFoundationModelscomByOutputModality: TEXT— modelos de texto disponíveis na região.bedrock:ListInferenceProfiles— profiles regionais/global (paginado).
- Modality TEXT (server-side) — corta embedding-only e image-only.
InferenceTypesSupportedcontémON_DEMAND— corta IDs base que só são invocáveis via inference profile (Claude 3.7+/4.x e cross-region-only de outros providers). Esses modelos aparecem normalmente viaListInferenceProfilescom prefixoglobal./us./eu./apac..
[api] são os que sua conta realmente pode invocar naquela região. Os [catalog] são registros estáticos que podem ou não estar habilitados.
Proxy Corporativo e TLS Privado
Em ambientes corporativos com proxy interceptando TLS com uma CA privada, você pode ver:CHATCLI_CA_BUNDLE / CHATCLI_TLS_INSECURE_SKIP_VERIFY — valem para todas as conexões de saída (LLM providers, web tools, gateway, MCP), e o Bedrock as herda como fallback. As específicas do Bedrock têm precedência quando ambas estão definidas. Veja Confiança TLS Global.VPC Endpoints / endpoints privados / DNS personalizado
Se a empresa roteia o Bedrock por VPC interface endpoint, API gateway ou DNS personalizado, aponte o runtime (data plane) comBEDROCK_BASE_URL — o mesmo papel do ANTHROPIC_BEDROCK_BASE_URL no Claude Code:
InvokeModel/Converse), embeddings, geração de imagem e listagem de modelos no /switch. Se o control plane realmente vive em outro host — VPC interface endpoints da AWS são criados por serviço (bedrock vs bedrock-runtime), cada um com DNS próprio — a opcional BEDROCK_CONTROL_BASE_URL sobrescreve só o control plane (ListFoundationModels/ListInferenceProfiles). As URLs precisam ser http(s) absolutas (validadas no startup, fail-fast). As variáveis padrão da AWS também funcionam, lidas nativamente pelo SDK v2:
BEDROCK_BASE_URL > AWS_ENDPOINT_URL_BEDROCK_RUNTIME > AWS_ENDPOINT_URL > default regional; control plane: BEDROCK_CONTROL_BASE_URL > BEDROCK_BASE_URL > AWS_ENDPOINT_URL_BEDROCK. AWS_IGNORE_CONFIGURED_ENDPOINT_URLS=true desliga as vars padrão da AWS, mas nunca o par BEDROCK_*_BASE_URL. Para o endpoint Messages dos Claude de nova geração (bedrock-mantle), use BEDROCK_MANTLE_BASE_URL — é outro host e outro serviço.
Variáveis de Ambiente
global.anthropic.claude-sonnet-4-6
Default region: us-east-1
Todas essas vars aparecem no /config providers (chat) e /config quality (embeddings). Veja Variáveis de Ambiente pra referência completa.
Observabilidade — endpoint URL nos logs
A partir desta versão, o ChatCLI loga o endpoint URL do Bedrock em todas as requests — paridade com Anthropic, OpenAI e Copilot. Útil pra debugar problemas de credencial, região, VPC endpoint ou proxy. No init (uma vez por sessão):https://bedrock-runtime.<region>.amazonaws.com). Se você definiu AWS_ENDPOINT_URL_BEDROCK_RUNTIME (VPC endpoint), o SDK usa o override — o log mostra a URL canônica, mas a request real vai pro endpoint customizado.
Arquitetura
A construção dobedrockruntime.Client está num helper exportado (bedrock.LoadBedrockRuntime) compartilhado entre o chat client e o provider de embeddings — single source of truth pra config AWS. A autenticação é SigV4, feita transparentemente pelo SDK. O HTTP client pode ser sobrescrito pelo ChatCLI quando CHATCLI_BEDROCK_CA_BUNDLE ou CHATCLI_BEDROCK_INSECURE_SKIP_VERIFY estão definidos (via awshttp.BuildableClient).
Diferença entre Bedrock e Anthropic Direto
Troubleshooting
bedrock: model X requires an inference profile
bedrock: model X requires an inference profile
/switch --model filtra automaticamente IDs base que exigem profile — então isso só aparece se você digitar um ID manualmente. O filtro usa o campo InferenceTypesSupported do ListFoundationModels: modelo sem ON_DEMAND é suprimido da listagem.AccessDeniedException: You don't have access to the model
AccessDeniedException: You don't have access to the model
bedrock:InvokeModel no ARN do modelo + do inference profile.NoCredentialProviders / unable to load SDK config
NoCredentialProviders / unable to load SDK config
aws configure, aws sso login, ou exporte as env vars.no EC2 IMDS role found / dial tcp 169.254.169.254:80: connect: host is down
no EC2 IMDS role found / dial tcp 169.254.169.254:80: connect: host is down
SSOTokenProviderError / expired token (SSO)
SSOTokenProviderError / expired token (SSO)
AWS_PROFILE definido (env, .env, ou o profile se chamar default).ThrottlingException / ServiceQuotaExceededException
ThrottlingException / ServiceQuotaExceededException
- Use um inference profile
global.*(roteia pra qualquer região disponível) - Use Provisioned Throughput (precisa ser configurado no console Bedrock)
- Aumente os limites via Service Quotas na AWS
Embeddings via Bedrock
O ChatCLI também usa Bedrock como provider de embeddings (HyDE phase 3b, vector retrieval). Ativação:BEDROCK_REGION / AWS_REGION / AWS_PROFILE / ~/.aws/credentials etc. Veja RAG + HyDE para arquitetura completa do retrieval.