Skip to main content
O ChatCLI suporta o AWS Bedrock como provedor nativo (BEDROCK), com três paths de dispatch que cobrem o catálogo inteiro de modelos hospedados pela AWS:
  • Anthropic Messagesanthropic.* e inference profiles (global./us./eu./apac.anthropic.*). Preserva cache markers e extended-thinking.
  • OpenAI Chat Completionsopenai.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.
A listagem do /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

Usa credenciais AWS existentes (IAM role, ~/.aws/credentials, AWS_PROFILE). Uma única identidade pra todos os modelos.

Billing e compliance AWS

Custos aparecem na sua conta AWS. Logs via CloudTrail, guardrails nativos do Bedrock.

Catálogo completo

Anthropic, OpenAI, Llama, Nova, Mistral, Cohere, AI21, DeepSeek, Moonshot Kimi, MiniMax, Qwen, Z.AI/GLM, Gemma, Nemotron, TwelveLabs — tudo via uma conta.

VPC endpoints

Funciona em ambientes privados com BEDROCK_BASE_URL (ou a var nativa da AWS AWS_ENDPOINT_URL_BEDROCK_RUNTIME).

Auto-detecção de família

Anthropic e OpenAI vão pros paths dedicados (cache, thinking); o resto cai em Converse — uma chamada cobre tudo.

Embeddings nativos

Provider de embeddings reusa a mesma cadeia de credenciais AWS. Titan v1/v2 + Cohere v3. Veja RAG + HyDE.

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 .env file)
  • Arquivo ~/.aws/credentials com ao menos um aws_access_key_id preenchido
  • AWS SSO: perfil SSO em ~/.aws/config (detecta sso_session, sso_start_url, sso_account_id)
  • Assume-role / credential_process: perfis com role_arn ou credential_process em ~/.aws/config
  • Token cache SSO: presença de arquivos em ~/.aws/sso/cache/ (indicando aws sso login anterior)
  • Web Identity Token (EKS IRSA): AWS_WEB_IDENTITY_TOKEN_FILE
  • Container Credentials (ECS): AWS_CONTAINER_CREDENTIALS_RELATIVE_URI / _FULL_URI
A mera existência de ~/.aws/config com apenas region ou output não ativa o Bedrock. É necessário que o arquivo contenha configuração de credenciais (SSO, assume-role, credential_process) ou que credenciais estáticas existam em outra fonte.

Opção 1: ~/.aws/credentials (credenciais estáticas)

Se você já usa AWS CLI, basta ter um profile configurado:
Dentro do ChatCLI:
Você também pode definir AWS_PROFILE no seu arquivo .env em vez de exportar no shell:
O ChatCLI lê o .env via godotenv e resolve o profile corretamente.

Opção 2: AWS SSO (IAM Identity Center)

Se sua empresa usa AWS SSO, configure o profile no ~/.aws/config:
O ChatCLI detecta automaticamente profiles SSO em ~/.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.
O ChatCLI desabilita o probe IMDS (169.254.169.254) por padrão em máquinas que não são EC2/ECS/EKS, para evitar timeouts desnecessários. O IMDS é habilitado automaticamente quando env vars de container/EKS são detectadas (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 explicitamente
  • CHATCLI_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 action bedrock:InvokeModel cobre tanto InvokeModel (Anthropic/OpenAI) quanto Converse (todo o resto):
Se quiser restringir a providers específicos, troque os ARNs de Resource por lista (ex.: arn:aws:bedrock:*::foundation-model/anthropic.*, arn:aws:bedrock:*::foundation-model/moonshotai.*). Lembre-se de incluir os ARNs dos inference profiles correspondentes (*:inference-profile/*anthropic.* etc.), senão Claude 3.7+ e equivalentes de outros providers param de funcionar.
As ações ListFoundationModels e ListInferenceProfiles são usadas pelo /switch --model para descobrir dinamicamente o que sua conta pode invocar. Sem elas, o ChatCLI cai para o catálogo estático (ainda funcional, mas desatualizável).
Adicionalmente, no console Bedrock você precisa habilitar o model access pra cada modelo Anthropic que pretende usar (uma vez por conta + região): 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:
Valores aceitos: anthropic / claude, openai / gpt, converse / auto (case-insensitive). A env var tem precedência sobre a detecção por prefixo.
Por que Anthropic e OpenAI ficam fora do Converse? Anthropic mantém cache_control breakpoints e extended-thinking que mapeiam pro Converse com shape diferente — escolhemos não perturbar o cache planner que já está provado em produção. OpenAI gpt-oss roda estável no InvokeModel direto e a cobertura do Converse pra esses IDs varia por região. Se quiser experimentar, BEDROCK_PROVIDER=converse força tudo no Converse.
Sem allowlist hardcoded. O /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 datelessanthropic.claude-fable-5, anthropic.claude-opus-5, anthropic.claude-sonnet-5, anthropic.claude-opus-4-8, anthropic.claude-opus-4-7sem 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_only e o client roteia a request pro endpoint Messages automaticamente — /switch --model claude-opus-5 (ou claude-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.* — mandar us.anthropic.claude-sonnet-5 ou global.anthropic.claude-fable-5 verbatim retorna 404 not_found_error (“model does not exist”). Se você selecionar um profile desses no /switch (é o que o ListInferenceProfiles da 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-mantle usando a mesma credentials chain (IAM, profile, SSO), ou um bearer token de curta duração via AWS_BEARER_TOKEN_BEDROCK (header x-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 campo anthropic_version do body é exclusivo do InvokeModel). Os markers de cache_control chegam intactos no wire, como no path InvokeModel.
  • Fallback automático pro InvokeModel: no roteamento padrão (BEDROCK_ANTHROPIC_ENDPOINT vazio ou auto), se a chamada Mantle falhar depois dos retries — indisponibilidade regional, VPC sem interface endpoint bedrock-mantle, restrição da conta — o ChatCLI reenvia a mesma requisição pelo runtime InvokeModel legado sob o inference profile global. (anthropic.claude-sonnet-5global.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|invoke pina qualquer modelo Claude num único wire — mantle desativa o fallback (você pediu essa superfície explicitamente), invoke nunca toca o endpoint Messages. BEDROCK_MANTLE_BASE_URL aponta a superfície Mantle pra VPC endpoints ou proxies (é um host e serviço diferentes do BEDROCK_BASE_URL, que cobre só o runtime InvokeModel). TLS corporativo (CHATCLI_BEDROCK_CA_BUNDLE etc.) é honrado nos dois.
Opus 4.8 e Opus 4.7 continuam no 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:
A solução é usar um inference profile ID, que é um ARN lógico que roteia a chamada pra região com capacidade disponível. Ele vem com um prefixo de geografia: Exemplo:
O ChatCLI já usa um inference profile global como modelo padrão (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:
  1. bedrock:ListFoundationModels com ByOutputModality: TEXT — modelos de texto disponíveis na região.
  2. bedrock:ListInferenceProfiles — profiles regionais/global (paginado).
Dois filtros AWS-side garantem que só apareça o que realmente funciona:
  • Modality TEXT (server-side) — corta embedding-only e image-only.
  • InferenceTypesSupported contém ON_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 via ListInferenceProfiles com prefixo global./us./eu./apac..
Exemplo de saída (depende das permissões da sua conta):
Modelos com [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.
Ainda é necessário habilitar Model Access no console Bedrock pra cada provider que pretende usar. AWS faz isso por conta + região. Se um modelo aparece no ListFoundationModels mas dá AccessDeniedException no invoke, é porque falta o opt-in de model access — é quase sempre um clique no console.

Proxy Corporativo e TLS Privado

Em ambientes corporativos com proxy interceptando TLS com uma CA privada, você pode ver:
O ChatCLI oferece duas env vars específicas pro Bedrock:
Se o proxy intercepta TLS de todos os providers (não só o Bedrock), prefira as variáveis globais 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.
CHATCLI_BEDROCK_INSECURE_SKIP_VERIFY=true emite warning no log e aceita qualquer certificado. Use apenas em troubleshooting — nunca em produção.
Proxy HTTP(S) é respeitado automaticamente via env vars padrão do Go:

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) com BEDROCK_BASE_URL — o mesmo papel do ANTHROPIC_BEDROCK_BASE_URL no Claude Code:
Uma variável só cobre toda a superfície Bedrock — chat (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:
Precedência — data plane: 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

Default model: 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):
Em cada request (chat):
No init de embeddings:
A URL é derivada da região resolvida pelo SDK (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 do bedrockruntime.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

Se sua empresa já roda tudo em AWS com compliance gerenciado, BEDROCK é o melhor caminho. Se você é individual developer querendo as features mais novas do Claude (1M context, OAuth via Claude Code plan), use CLAUDEAI direto.

Troubleshooting

Mensagem do ChatCLI quando você seleciona um ID base que precisa de inference profile (Claude 3.7+, 4.x, 4.5, 4.6, 4.7 e equivalentes em outros providers). A mensagem já sugere o caminho:
Desde a versão atual, o /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.
Vá no console Bedrock da região e habilite Model Access pro provider. Demora alguns minutos. Também cheque se a role IAM tem bedrock:InvokeModel no ARN do modelo + do inference profile.
O SDK não achou credenciais. Verifique:
Se nenhum retornar credenciais, configure via aws configure, aws sso login, ou exporte as env vars.
Este erro ocorre quando o AWS SDK tenta alcançar o EC2 Instance Metadata Service (IMDS) em uma máquina que não é EC2 (ex.: seu laptop). O ChatCLI desabilita o probe IMDS por padrão em máquinas não-EC2, mas se o erro persistir:
Se você realmente está em EC2 e precisa do IMDS:
O token do SSO expirou (validade padrão ~8h). Faça login novamente:
Lembre-se de ter AWS_PROFILE definido (env, .env, ou o profile se chamar default).
Proxy corporativo fazendo TLS interception. Configure CHATCLI_BEDROCK_CA_BUNDLE com o PEM da CA corp. Para destravar rapidamente durante troubleshooting, use CHATCLI_BEDROCK_INSECURE_SKIP_VERIFY=true (inseguro, apenas temporário).
Você atingiu o quota on-demand da região. Opções:
  • 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:
Famílias suportadas: Reusa a mesma cadeia de credenciais do chat client — BEDROCK_REGION / AWS_REGION / AWS_PROFILE / ~/.aws/credentials etc. Veja RAG + HyDE para arquitetura completa do retrieval.
Titan e Cohere usam schemas diferentes mas o ChatCLI auto-detecta pelo prefixo do model id. Se precisa de batch grande com Titan (que aceita só 1 texto por chamada), o provider paraleliza com pool de 8 workers transparentemente.

Próximos Passos

Provider Fallback

Configure failover automático entre Bedrock e outros provedores

RAG + HyDE

Embeddings via Bedrock Titan/Cohere para retrieval semântico

Modelos Suportados

Lista completa de modelos por provedor

Variáveis de Ambiente

Referência completa de configuração