gateway.yaml. O arquivo define tudo o que o gateway faz: onde ele escuta, como os desenvolvedores fazem login, para onde a inferência vai e quais políticas e telemetria se aplicam. Esta página é a referência para cada opção nesse arquivo.
Para escrever o seu primeiro, comece pelo quickstart, que constrói uma configuração mínima funcional e a executa. Uma vez que você tenha uma configuração com a qual esteja satisfeito, o guia de implantação cobre a containerização e hospedagem no Kubernetes, Cloud Run ou sua própria plataforma.
O gateway lê o arquivo uma vez, na inicialização, com claude gateway --config /path/to/gateway.yaml. Cada opção é validada contra um esquema na inicialização, portanto uma configuração malformada falha no início com um erro no nível do campo em vez de no primeiro uso.
O exemplo completo no final desta página exercita cada seção.
Estrutura do arquivo
Cinco seções são obrigatórias. Todas as outras seções são opcionais, e uma seção omitida assume seus padrões. Chaves desconhecidas falham na inicialização, portanto um erro de digitação aparece como um erro nomeado em vez de uma configuração silenciosamente ignorada. Seções obrigatórias:listen: endereço de vinculação, URL pública, terminação TLSoidc: seu provedor de identidade (IdP), incluindo emissor, cliente, mapeamento de declarações e quem pode fazer loginsession: os tokens de portador que o gateway emite, com segredo e tempo de vidastore: PostgreSQL, para concessões de dispositivo e contadores de limite de taxaupstreams: para onde a inferência vai, seja Anthropic, Amazon Bedrock, Claude Platform na AWS, Agent Platform do Google Cloud ou Microsoft Foundry
login_notice: um aviso que os desenvolvedores veem ao fazer loginadmin: autenticação da API de administração e retenção para limites de gastosenforcement: comportamento de falha aberta ou fechada do limite de gastospricing: taxas contratadas e um multiplicador para o medidor de gastos e para os valores de custo que os desenvolvedores veemmodelseauto_include_builtin_models: lista de modelos curada pelo administrador e IDs por upstreammanaged: políticas de configurações gerenciadas por grupo IdPtelemetry: encaminhamento OTLP para sua pilha de observabilidadeaccess_control,limits,timeouts,rate_limits: permitir/negar IP, limites de tamanho de solicitação, tempo até o primeiro byte upstream e limites de login por IPload_test_mode: teste de carga do gateway sem chamar um provedor de modelo
Expansão de segredos
Não escreva segredos comoclient_secret, jwt_secret ou postgres_url diretamente em gateway.yaml. Faça referência a eles com um dos formulários abaixo, e o gateway resolve o valor na inicialização a partir de uma variável de ambiente ou um arquivo:
Seções obrigatórias
listen
O bloco listen controla onde o gateway atende: o endereço e a porta de bind, a origem visível externamente e a terminação TLS opcional.
Liste um frontend em
trusted_proxies somente se a última entrada de X-Forwarded-For que ele repassa for uma que nenhum desenvolvedor escreveu. Não liste nenhum endereço ou intervalo a partir do qual os desenvolvedores se conectam. Um frontend que acrescenta o endereço de cada conexão que recebe se qualifica. Um que repassa o cabeçalho como os desenvolvedores o enviam não se qualifica.
Entradas de X-Forwarded-For escritas como ipv4:port ou [ipv6]:port, como alguns balanceadores de carga fazem, são lidas com a porta descartada. Um endereço IPv6 com uma porta acrescentada e sem colchetes pode ser lido como um endereço diferente ou não ser lido. Desative a opção de porta em qualquer proxy que escreva essa forma.
oidc
O bloco oidc conecta o gateway ao seu provedor de identidade e decide quem pode fazer login. Ele nomeia o emissor e o cliente OAuth, mapeia as claims que carregam e-mail e grupos e restringe o login por domínio de e-mail ou grupo.
OpenID Connect (OIDC) é o protocolo de SSO que o gateway usa com seu provedor de identidade; consulte Configuração do provedor de identidade para saber o que registrar no lado do IdP.
Autenticação de cliente por certificado
Se o seu provedor de identidade autentica clientes OAuth com um certificado em vez de um client secret, como o Microsoft Entra faz com credenciais de certificado, definatoken_endpoint_auth_method: private_key_jwt. Requer Claude Code v2.1.284 ou posterior no servidor do gateway.
Com essa configuração, o gateway não envia nenhum segredo. Ele se autentica no endpoint de token do IdP com um JWT de curta duração assinado com a chave privada do certificado quando um desenvolvedor faz login e sempre que o gateway renova a sessão dele. O JWT é assinado com RS256 e identifica o certificado pelos cabeçalhos de thumbprint x5t e x5t#S256, em vez de um kid. Seu IdP deve ser capaz de encontrar o certificado registrado pelo thumbprint.
1
Crie a chave e o certificado
Crie uma chave privada RSA não criptografada de pelo menos 2048 bits, no formato PEM PKCS#8 ou PKCS#1, e um certificado para ela. O gateway se recusa a iniciar com qualquer chave que não atenda a essas condições. Este comando Ele grava
openssl cria uma chave assim com um certificado autoassinado válido por um ano:idp-client.key e idp-client.crt no diretório atual. Copie ou monte os dois arquivos em um local onde o gateway possa lê-los. O exemplo da etapa 3 usa /etc/gateway/.2
Envie o certificado ao IdP
Envie o certificado, não a chave privada, para o registro de aplicativo do gateway no IdP.
3
Adicione a chave e o certificado ao gateway.yaml
Forneça ao gateway a chave privada e o certificado em um bloco Ambos os valores são o conteúdo PEM, não caminhos de arquivo, então carregue os arquivos montados com
client_assertion. Omita client_secret, porque o gateway se recusa a iniciar quando ele é definido junto com private_key_jwt. Este bloco oidc autentica o gateway em um tenant do Microsoft Entra com um certificado:${file:/path}, como o exemplo faz. O gateway se recusa a iniciar a menos que certificate_pem seja um único certificado PEM, sem o restante de sua cadeia, cuja chave pública corresponda a private_key_pem.4
Reinicie o gateway e verifique o log de inicialização
Reinicie o gateway e encontre esta linha no log de inicialização:Compare o thumbprint SHA-1 com o que o IdP mostra para o certificado que você enviou. Se o certificado tiver expirado ou ainda não for válido, o gateway ainda inicia, mas registra um aviso de que logins e refreshes falharão até que você o substitua. Para confirmar que o IdP aceita o certificado, peça a um desenvolvedor que faça login pelo gateway.
Rotacionar o certificado do cliente
O gateway lê a chave e o certificado uma vez na inicialização, então um arquivo alterado só entra em vigor após uma reinicialização. Faça a rotação nesta ordem para que nenhuma requisição de token apresente um certificado que o IdP não tenha:- Envie o novo certificado ao IdP junto com o antigo.
- Substitua os arquivos de chave e certificado que o
gateway.yamlcarrega e reinicie o gateway. Se você executa várias réplicas, uma reinicialização gradual funciona, porque o IdP tem os dois certificados até que você remova o antigo. - Depois que todas as réplicas tiverem reiniciado, remova o certificado antigo do IdP.
Requisições ao IdP por um proxy de encaminhamento
Os upstreams de inferência respeitamHTTPS_PROXY e HTTP_PROXY em todas as versões. As próprias requisições do gateway ao IdP, de descoberta, JWKS, token e userinfo, vão diretamente, a menos que você defina oidc.use_proxy: true, o que requer v2.1.227 ou posterior. Quando uma variável de proxy está definida, use_proxy não está definido e o emissor não está coberto por NO_PROXY, o gateway mantém essas requisições diretas e registra um aviso na inicialização pedindo que você escolha; use_proxy: false as mantém diretas e silencia o aviso.
Com use_proxy: true, o pod resolve ele mesmo o hostname de cada endpoint do IdP e pede ao proxy que faça CONNECT ao endereço IP resolvido, então o proxy deve aceitar CONNECT ao endereço IP de todos os hosts que o documento de descoberta nomeia, não apenas ao do emissor. Use uma URL de proxy http://. ca_cert_pem e a proteção contra SSRF também se aplicam ao caminho via proxy.
A saída somente por proxy muda ambos os pontos: enquanto ela está ativa, as requisições ao IdP seguem o proxy, a menos que você defina use_proxy: false, e o gateway entrega ao proxy cada hostname do IdP sem resolvê-lo antes.
Saída somente por proxy
DefinaCLAUDE_GATEWAY_PROXY_IS_EGRESS_BOUNDARY=1 no ambiente do gateway, ao lado de HTTPS_PROXY, quando o pod alcança outros hosts somente por esse proxy de encaminhamento e não consegue resolver nomes DNS públicos por conta própria, ou quando o proxy recusa CONNECT a um endereço IP. Requer v2.1.277 ou posterior. É uma variável de ambiente em vez de uma chave do gateway.yaml para que nada no arquivo de configuração possa relaxar a verificação de endereços do gateway.
network: na inicialização enquanto a saída somente por proxy está ativa.
Cada linha abaixo é uma classe de requisição de saída em um gateway com HTTPS_PROXY definido, por padrão e enquanto a saída somente por proxy está ativa.
A saída somente por proxy permanece desativada, a menos que o ambiente do gateway atenda a todas estas três condições:
HTTPS_PROXYouHTTP_PROXYestá definido.NO_PROXYeno_proxyestão vazios. Se sua plataforma injeta qualquer um deles nos pods, defina ambos com um valor vazio no contêiner do gateway. Listar um coletor de telemetria emNO_PROXYmantém a saída somente por proxy desativada.CLAUDE_GATEWAY_ALLOW_LOOPBACKnão está ativado. Um coletor ou IdP no próprio loopback do pod não pode ser combinado com a saída somente por proxy, porque um endereço de loopback entregue ao proxy seria o do próprio host do proxy; então dê a esses serviços um endereço que o proxy consiga alcançar. Pelo mesmo motivo, o gateway recusa de imediato nomes no estilolocalhostenquanto a saída somente por proxy está ativa.
oidc.use_proxy: false.
session
O bloco session define os bearer tokens que o gateway emite após o login: o segredo que os assina e por quanto tempo eles duram.
store
O bloco store aponta o gateway para seu banco de dados PostgreSQL, que armazena os device grants e os contadores de rate limit.
Para desenvolvimento local, aponte
postgres_url para um contêiner Postgres descartável, por exemplo docker run --rm -p 5432:5432 -e POSTGRES_HOST_AUTH_METHOD=trust postgres.
upstreams
upstreams é uma lista ordenada. O gateway encaminha a inferência para o primeiro upstream que resolve o modelo solicitado, ignorando qualquer upstream cuja lista groups deixe o desenvolvedor de fora.
Em 5xx, 429, 401, 403, 404 ou timeout, o gateway faz failover para o próximo upstream; outros 4xx não, porque esses erros são atribuíveis à requisição e não ao upstream. Um 401 ou 403 significa que o upstream rejeitou a credencial que o gateway usou ou negou acesso a ela, por exemplo ao modelo solicitado. Um 404 significa que esse upstream não serve o modelo solicitado, então um upstream posterior na lista ainda pode servi-lo.
Se você definir forward_user_identity: true em um upstream, um 429 que ele retorna para uma requisição que carregava o e-mail do desenvolvedor não faz failover. Consulte como uma negação de limite por usuário chega ao desenvolvedor.
O failover em 404 requer gateway v2.1.198 ou posterior. Versões anteriores retornavam o primeiro 404 ao cliente mesmo quando um upstream posterior na lista servia o modelo.
Vários upstreams do mesmo provedor devem definir um name: distinto.
Os clientes de Amazon Bedrock, Claude Platform on AWS, Agent Platform do Google Cloud e Microsoft Foundry são criados uma vez na inicialização, e seus SDKs renovam as credenciais internamente, então rotacionar credenciais de nuvem não exige reinicialização. Chaves de API e bearers estáticos da Anthropic são lidos na inicialização; consulte Anthropic API.
Mensagens de erro do upstream
O gateway retorna a resposta de erro de um upstream, ou seu próprio502, dependendo de como os upstreams responderam:
- Um upstream retornou um status no qual o gateway não faz failover: a resposta desse upstream. O gateway não tenta mais nenhum upstream.
- Todos os upstreams que o gateway tentou falharam de uma forma em que ele faz failover: o último
429. Quando nenhum retornou um429, o gateway prefere, nesta ordem, o último401ou403, o último404e o último501. Quando nenhum retornou nenhum desses, o próprio502do gateway,all upstreams failed (N attempted). N conta suas entradas deupstreams, incluindo as ignoradas, menos aquelas cuja listagroupsdeixa o desenvolvedor de fora.
400ou413no envelope de erro padrão da Anthropic: a própria mensagem do upstream, comoprompt is too long. Claude Platform on AWS, Agent Platform e Microsoft Foundry retornam esse envelope para rejeições da API do modelo.400ou413no formato próprio do provedor: um tokencapability_rejected:. Quando o gateway não consegue classificar a rejeição,upstream rejected the requestem um400ourequest too large for this upstreamem um413.- Qualquer outro status: texto genérico por status, como
upstream rate limit exceededem um429.
Input is too long for requested model. do Amazon Bedrock por capability_rejected: prompt_too_long. O Claude Code compacta automaticamente com esse token, como faz com prompt is too long.
Manter a mensagem 400 ou 413 de um upstream de nuvem, ou substituí-la por um token capability_rejected:, requer gateway v2.1.233 ou posterior.
Anthropic API
O upstream mínimo da Anthropic é uma chave de API do Claude Console:api_key: enviax-api-key. Rotacione-a no Claude Console e atualize a variável de ambiente.oauth_token: enviaAuthorization: Bearer. Use a forma bearer quando sua organização emite tokens de curta duração em vez de chaves de API de longa duração. O bearer é lido uma vez na inicialização, então renove-o remontando o segredo e reiniciando.
Cabeçalhos de identidade por usuário para um proxy que você executa
Você pode apontar obase_url de um upstream provider: anthropic para um proxy que você executa em vez da Anthropic API. Para informar a esse proxy qual desenvolvedor enviou cada requisição, defina forward_user_identity: true nesse upstream. O proxy pode então atribuir o gasto por desenvolvedor. Requer um gateway executando Claude Code v2.1.233 ou posterior.
Por exemplo, para um proxy em upstream-gateway.internal.example.com:
Quando o token do IdP não carrega e-mail, o gateway envia apenas
x-claude-gateway-user-id e omite os dois cabeçalhos de e-mail. Se seu IdP coloca o e-mail em uma claim diferente, defina oidc.email_claim como essa claim.
Seu proxy não recebe os cabeçalhos x-claude-code-* que o Claude Code envia, como x-claude-code-session-id. O gateway não os repassa a nenhum upstream, então agrupe as requisições por desenvolvedor com os cabeçalhos da tabela acima.
Quando seu proxy responde 429 a uma requisição que carregava o e-mail do desenvolvedor, o gateway retorna essa resposta ao desenvolvedor como está, em vez de fazer failover para o próximo upstream, para que o orçamento ou rate limit por usuário do seu proxy seja mantido. As outras respostas do proxy seguem as regras de failover comuns. Se o token do IdP de um desenvolvedor não carrega e-mail, o gateway encaminha as requisições dele sem os cabeçalhos de e-mail, então um 429 para uma dessas requisições conta como capacidade do upstream e faz failover. Antes da v2.1.267 no servidor do gateway, todo 429 fazia failover.
Defina forward_user_identity somente em um upstream cujo base_url seja um proxy que você opera. O gateway envia os e-mails dos desenvolvedores para qualquer servidor que esse base_url nomeie. Se o base_url for a Anthropic API, que é o padrão, o gateway se recusa a iniciar.
Se você definir
forward_user_identity em um upstream Amazon Bedrock, o gateway encerra na inicialização com Unrecognized key(s) in object: 'forward_user_identity'. Se seu proxy fica à frente do Bedrock, liste-o como um upstream provider: anthropic. O gateway envia a esse upstream o formato Anthropic Messages, então seu proxy precisa traduzir as requisições para o Bedrock. Para identificar cada desenvolvedor para a AWS, consulte Atribuição de custos da AWS por desenvolvedor.Amazon Bedrock
Para a implantação do Amazon Bedrock do lado do cliente que o gateway substitui ou intermedeia, consulte Claude Code no Amazon Bedrock. O upstream do lado do gateway:auth vazio usa a cadeia de credenciais padrão do AWS SDK: variáveis de ambiente, ~/.aws/credentials, task role do ECS, metadados de instância do EC2 ou IRSA no EKS. Em produção, dê ao pod do gateway uma role do IAM em vez de embutir chaves estáticas em uma imagem de contêiner.
Credenciais explícitas devem estar completas: o gateway falha na inicialização quando aws_access_key_id e aws_secret_access_key não são definidos juntos, ou quando aws_session_token é definido sem eles. Antes da v2.1.207, um bloco auth: parcial passava na validação.
Aplicar um guardrail do Amazon Bedrock
Para aplicar um guardrail do Amazon Bedrock a toda requisição de inferência que o gateway envia por um upstream Bedrock, adicione um blocoguardrail a esse upstream. Requer Claude Code v2.1.281 ou posterior no servidor do gateway.
bedrock:ApplyGuardrail no guardrail ao principal que assina as requisições desse upstream: o principal da AWS do gateway ou, com assume_role, a role nomeada em role_arn.
Defina guardrail em todos os upstreams bedrock ou em nenhum. O gateway se recusa a iniciar com uma mistura, porque o failover poderia, de outra forma, enviar uma requisição a um upstream Bedrock sem guardrail.
O guardrail cobre apenas upstreams Bedrock. Se você listar outro provedor em upstreams, o gateway envia requisições a esse provedor sem o guardrail, ou se recusa a iniciar se esse provedor for mantle.
Quando uma requisição /v1/messages cujo corpo carrega um campo amazon-bedrock-*, como amazon-bedrock-guardrailConfig, chega a um upstream Bedrock com guardrail definido, o gateway responde 400 em vez de encaminhá-la.
Adicionar tags de entrada do guardrail
Para que o gateway adicione as tags de entrada de que o filtro de ataques de prompt de um guardrail do Amazon Bedrock precisa, definainput_tagging no bloco guardrail e reinicie o gateway. Defina o mesmo valor em todos os upstreams bedrock, ou o gateway se recusa a iniciar. Requer Claude Code v2.1.316 ou posterior no servidor do gateway. Um gateway em uma versão que não tem a chave encerra na inicialização com Unrecognized key(s) in object: 'input_tagging'.
input_tagging aceita um destes valores:
Com
last_message, se as mensagens user desde a última resposta do Claude não contiverem texto a marcar, o gateway marca as mensagens de sistema no meio da conversa desde essa resposta. Uma chamada de ferramenta conta como resposta.
A orientação do Amazon Bedrock para o filtro de ataques de prompt é marcar a entrada do usuário de modo que o system prompt fique excluído. Se você definir all_messages_and_system, um filtro que sinalize o próprio system prompt do Claude Code pode bloquear requisições.
O exemplo abaixo marca o texto em todas as mensagens user:
user também podem conter texto que o Claude Code adiciona, como lembretes do sistema, então verifique no gateway de teste se requisições comuns não são bloqueadas.
Nos testes da Anthropic, uma sessão com tags manteve suas leituras do cache de prompt de um prompt para o seguinte, e as tags não adicionaram tokens de entrada.
O que as tags de entrada não cobrem
Nenhum valor deinput_tagging impede um desenvolvedor que deliberadamente coloca texto onde nenhuma tag vai. Não conte com o guardrail para avaliar estas partes de uma requisição:
- Conteúdo que o gateway não marca: mensagens que seu valor de
input_taggingdeixa de fora, definições de ferramentas, entradas de chamadas de ferramenta, imagens e PDFs, entre outros. A menos que você definaall_messages_and_system, o system prompt também fica sem tags. - Resultados de ferramentas: contêm o que as ferramentas do Claude retornam, como conteúdo de arquivos e páginas da web. Nos testes da Anthropic, um filtro de palavras não os avaliou, com ou sem tags.
Registrar qual filtro do guardrail foi acionado
Para descobrir qual filtro do guardrail do Amazon Bedrock bloqueou a requisição de um desenvolvedor, definaguardrail_trace: true no upstream Bedrock, reinicie o gateway e peça ao desenvolvedor que envie a requisição novamente. Em seguida, encontre o evento guardrail.trace da requisição no log de auditoria. Requer Claude Code v2.1.314 ou posterior no servidor do gateway. Um gateway anterior se recusa a iniciar quando encontra guardrail_trace.
guardrail.trace, sem o texto correspondente, quando um filtro é acionado ou a ação do guardrail é INTERVENED. Encontre os eventos do desenvolvedor por email ou sub. Uma requisição com streaming pode produzir vários eventos, e um deles pode ter uma lista filters vazia, então leia todos os eventos que têm o mesmo request_id:
O evento omite o texto que um filtro encontrou, incluindo o campo
match do trace do Bedrock. Os desenvolvedores não recebem os dados de trace do Bedrock, porque o gateway os remove de cada resposta, com ou sem streaming.
Se um cliente enviar um campo amazon-bedrock-* no corpo de uma requisição /v1/messages, o gateway responde 400 em um upstream que define guardrail_trace.
Bedrock em outra conta da AWS
Definaassume_role em um upstream Bedrock e o gateway usa sua própria identidade da AWS apenas para chamar sts:AssumeRole em uma role que você nomeia, que pode estar em uma conta da AWS diferente da do gateway. Toda requisição ao Bedrock desse upstream é assinada com as credenciais de uma hora que o STS retorna, então nenhuma chave de acesso de longa duração atravessa contas.
Requer um gateway executando Claude Code v2.1.281 ou posterior. Um gateway anterior se recusa a iniciar quando encontra a chave.
assume_role aceita três chaves:
A política de confiança da role nomeia o próprio principal do gateway, como sua role IRSA ou task role do ECS. Esse principal precisa de
sts:AssumeRole na role e de nenhuma permissão própria do Bedrock. Remova a Condition se você não definir external_id.
- Se o STS recusar ou estiver inacessível, o gateway não envia a requisição com as credenciais próprias do upstream. Ele registra o erro do STS com o que verificar e então tenta o próximo upstream que você listou. Mensagens de erro do upstream explica o que o cliente recebe quando nenhum upstream tem sucesso. Um upstream posterior sem
assume_roleserviria a requisição com suas próprias credenciais, então liste um somente se for isso o que você deseja. - O gateway chama o endpoint regional do STS
sts.<region>.amazonaws.com, que sua rede deve alcançar. Para o endpoint FIPS, definaAWS_USE_FIPS_ENDPOINT=trueno ambiente do gateway, em vez deuse_fips_endpointem um arquivo de configuração da AWS. assume_roleprecisa de credenciais de origem SigV4: o gateway se recusa a iniciar quando ele é definido junto comaws_bearer_token.- Sem uma lista
groups, todo desenvolvedor que o gateway admite pode usar este upstream. Para limitar quais modelos um desenvolvedor pode usar, definaavailableModelsem uma políticamanaged. - Para evitar que um modelo servido pelo papel também seja servido por outra conta, dê a ele um id personalizado cujo mapa
upstream_modeltenha apenas o nome deste upstream. Para esse id, o gateway ignora todos os outros upstreams, então nem a requisição nem a contagem de tokens de uma requisição abortada podem fazer failover para outra conta. - Uma requisição para um nome de modelo integrado ainda pode chegar a este upstream, e o gateway a assina com o mesmo papel. Liste este upstream por último, a menos que a conta dele também deva servir esses modelos.
Atribuição de custos da AWS por desenvolvedor
Por padrão, o gateway assina toda requisição ao Bedrock com uma única credencial, então a AWS vê as requisições de todos os desenvolvedores sob um único principal do IAM. Adicionesession_name: email a assume_role e o gateway chama sts:AssumeRole uma vez por desenvolvedor por hora, com o nome da sessão definido como o e-mail desse desenvolvedor, e assina as requisições dele com as credenciais retornadas, de modo que as requisições de cada desenvolvedor chegam à AWS sob sua própria sessão de role assumida. A role pode estar na própria conta do gateway.
Requer um gateway executando Claude Code v2.1.281 ou posterior. Atribuição de custos na AWS aborda a role do IAM e onde o faturamento da AWS mostra as sessões.
session_name seleciona qual claim verificada se torna o RoleSessionName da AWS: email ou sub. O gateway escreve qualquer caractere que não seja letra ASCII, dígito ou _+,.@- como =XX em hexadecimal por byte UTF-8, e encurta um resultado com mais de 64 caracteres para um prefixo mais um hash, de modo que o nome de sessão de cada desenvolvedor permaneça válido e único. Uma requisição de um desenvolvedor cujo token não tem a claim não é enviada por este upstream, e o log do operador diz para mudar para sub ou definir oidc.email_claim.
Um desenvolvedor ativo custa uma chamada ao STS por hora por réplica do gateway, e primeiras requisições simultâneas compartilham uma chamada.
O gateway também faz uma chamada própria nesta role: a contagem de tokens de uma requisição que o cliente abandonou, para que os limites de gasto permaneçam precisos. Essa contagem e sua requisição de fallback de um token são assinadas pela sessão compartilhada claude-apps-gateway, então a AWS atribui o fallback a claude-apps-gateway em vez de ao desenvolvedor.
Para uma atribuição estrita por desenvolvedor, defina assume_role com session_name em todos os upstreams Bedrock que você listar. Um upstream sem isso assina as requisições que serve com suas próprias credenciais.
Endpoint Mantle do Amazon Bedrock
O provedormantle envia a inferência ao endpoint Mantle do Amazon Bedrock. Ele requer Claude Code v2.1.283 ou posterior no servidor do gateway. Versões anteriores do gateway o rejeitam na inicialização, então atualize todas as réplicas antes de adicioná-lo.
O exemplo abaixo coloca o Mantle primeiro, com um upstream Amazon Bedrock atrás dele para servir todos os modelos que o campo models deixa de fora:
mantle.
Conceda à identidade da AWS do upstream as próprias ações do IAM do Mantle para inferência e contagem de tokens, listadas em Usar o endpoint Mantle.
Para um ID de modelo do Mantle que o gateway não conhece, adicione uma entrada ao bloco
models: de nível superior cujo upstream_model mapeie o nome deste upstream para esse ID. Depois, coloque o id dessa entrada também no campo models deste upstream.
As configurações guardrail e assume_role de um upstream bedrock não se estendem às requisições que o Mantle serve:
guardrail: o gateway não aplica nenhum guardrail do Bedrock às requisições que envia ao Mantle, então se recusa a iniciar quando um upstreammantleestá listado enquanto algum upstreambedrockdefineguardrail.assume_role: defina-o no próprio upstreammantle. Sem ele, as requisições que o Mantle serve são enviadas com as credenciaisauthpróprias do upstreammantle.
Claude Platform on AWS
O Claude Platform on AWS serve a Anthropic API first-party na infraestrutura da AWS emaws-external-anthropic.<region>.api.aws. Ele usa IDs de modelo first-party, respeita os cabeçalhos anthropic-beta como enviados e serve count_tokens, então nenhuma das traduções específicas do Bedrock se aplica. O provedor anthropicAws requer Claude Code v2.1.198 ou posterior; versões anteriores do gateway o rejeitam na inicialização.
Para a implantação do lado do cliente da mesma plataforma, consulte Claude Code no Claude Platform on AWS. O upstream do lado do gateway:
aws-external-anthropic, então uma role do IAM com escopo do Bedrock não a autoriza. Uma chave de API em auth.api_key tem precedência quando credenciais SigV4 também estão definidas. Um bloco auth vazio usa a cadeia de credenciais padrão do AWS SDK, a mesma cadeia que o upstream Amazon Bedrock usa.
Como a plataforma resolve IDs de modelo first-party, o catálogo integrado roteia para ela sem nenhum bloco
models:. Ao montar uma lista models: própria, use a chave anthropicAws: na entrada com o ID first-party.
Google Cloud Agent Platform
Para a configuração equivalente do lado do cliente, consulte Claude Code no Google Cloud. O upstream do lado do gateway:auth vazio usa o Application Default Credentials: GOOGLE_APPLICATION_CREDENTIALS, metadados do GCE ou GKE Workload Identity. Arquivos de chave JSON de conta de serviço são compatíveis, mas desaconselhados; use o Workload Identity ou anexe uma conta de serviço à instância do GCE ou do Cloud Run.
Defina region: global para usar o endpoint global da Agent Platform do Google Cloud em vez de um regional. O Google então roteia cada requisição para uma região disponível, então você não precisa acompanhar a disponibilidade de modelos por região. Definir uma região específica fixa todas as requisições nela.
Microsoft Foundry
Para a implantação do Microsoft Foundry do lado do cliente, consulte Claude Code no Microsoft Foundry. O upstream do lado do gateway:use_azure_ad: true resolve por meio de DefaultAzureCredential: Managed Identity no AKS, ACI ou App Service; a Azure CLI; ou credenciais de ambiente. Chaves de API funcionam, mas valem para o projeto inteiro e não são rotacionadas automaticamente. O endpoint do Microsoft Foundry é derivado de resource:; defina o base_url opcional para sobrescrevê-lo em nuvens soberanas como o Azure Government.
Cabeçalhos estáticos nas requisições ao upstream
Para adicionar cabeçalhos fixos às requisições que o gateway envia a um upstream, definaheaders: nesse upstream. Use isso quando um proxy que você executa à frente do provedor roteia ou atribui tráfego por um cabeçalho.
headers: requer Claude Code v2.1.277 ou posterior no servidor do gateway. Um gateway anterior se recusa a iniciar quando encontra a chave. Atualize todas as réplicas antes de adicionar a chave e remova a chave antes de reverter para uma versão anterior.
Os cabeçalhos vão para o servidor que base_url nomeia, ou para o próprio endpoint do provedor quando base_url não está definido. O provedor também os recebe, a menos que seu proxy os remova.
Este exemplo alcança um upstream provider: vertex por meio de um proxy em upstream-proxy.internal.example.com. Ele define o cabeçalho x-source que o proxy lê e envia um token da variável de ambiente PROXY_TOKEN como x-proxy-token:
true ou false para que o YAML o leia como texto.
Para manter um segredo fora do arquivo de configuração, use a expansão de segredos para carregar o valor de uma variável de ambiente com ${VAR} ou de um arquivo com ${file:/path}. Um ${VAR} que resolve para um valor vazio impede o gateway de iniciar.
headers: funciona em todos os provedores, e cada upstream envia apenas os seus.
Nem toda requisição que o gateway envia a um upstream os carrega:
Em um upstream Amazon Bedrock ou Claude Platform on AWS que assina requisições com AWS SigV4, esses cabeçalhos fazem parte da assinatura, então seu proxy deve repassá-los inalterados.
Se você usar um nome que o gateway reserva, ele se recusa a iniciar, e o erro de inicialização nomeia o cabeçalho. Os nomes reservados incluem:
authorizationex-api-keyhost,content-typeeuser-agent- Qualquer nome que comece com
anthropic-,x-goog-,x-amz-oux-amzn-
Vários upstreams
O mesmo provedor pode aparecer mais de uma vez com umname: distinto. Isso cobre regiões diferentes, contas diferentes por meio de cadeias de credenciais diferentes, provisioned throughput versus sob demanda e fallback entre provedores.
O gateway tenta os upstreams em ordem. 5xx, 429, 401, 403, 404, timeouts e endpoint ausente (501) fazem failover; outros 4xx não.
429 é capacidade por upstream, então o esgotamento do provisioned throughput (PT) faz failover para o sob demanda. Se você definir forward_user_identity: true em um upstream, um 429 para uma requisição que carregava o e-mail do desenvolvedor é, em vez disso, uma negação por usuário e não faz failover.
Uma requisição passa de um upstream para o próximo apenas nestes casos:
- O upstream falhou
- O upstream não atende o modelo solicitado
- O upstream tem uma lista
groupsque deixa o desenvolvedor de fora
- Upstreams
provider: anthropic:timeouts.upstream_ttfb_ms, 120 segundos por padrão - Outros provedores: até uma hora. Para encurtar essa espera em requisições com streaming, defina
timeouts.upstream_ttfb_msno gateway v2.1.295 ou posterior. Requisições de modelo sem streaming esperam até uma hora de qualquer forma
404 é disponibilidade de modelo por upstream, então um upstream que não ativou um modelo não bloqueia um upstream posterior que o serve. Um upstream que não consegue resolver o modelo solicitado é pulado sem uma ida e volta pela rede.
Este exemplo roteia primeiro uma cota de provisioned throughput do Amazon Bedrock, transborda para o sob demanda e para uma segunda conta e recorre à Anthropic API por último:
Fazer failover entre provedores de nuvem, ou para a API direta da Anthropic, altera qual contrato, geografia e outros termos regem a requisição.
A CLI aplica o mesmo controle de recursos aos gateways independentemente de qual upstream atende a uma determinada requisição, portanto, por padrão, o failover não envia um campo do corpo que um upstream rejeitaria. Se você definir o TTL de cache de uma hora em uma política, ele será enviado para todos os upstreams da lista, então defina-o somente se todos eles o aceitarem.
Enviar cada equipe para seu próprio upstream
Para enviar as requisições de cada equipe para sua própria conta AWS ou projeto do Google Cloud, liste um upstream por equipe e dê a cada um uma listagroups. Apenas desenvolvedores em um grupo do IdP listado alcançam esse upstream, na primeira tentativa e no failover. Todo provedor aceita groups. Requer Claude Code v2.1.314 ou posterior no servidor do gateway.
Este exemplo dá aos grupos payments-eng e search-eng uma conta AWS cada, e adiciona um upstream sem lista groups que todo desenvolvedor pode usar:
Quando o upstream de uma equipe nega o modelo solicitado com um
403, o gateway tenta o próximo upstream na linha dessa equipe que atende o modelo. Para manter a equipe em um único upstream, dê a todos os upstreams uma lista groups e certifique-se de que nenhum outro upstream liste um grupo em que os desenvolvedores da equipe estejam. Essa equipe então não tem failover, e requisições de desenvolvedores que não estão em nenhum grupo listado falham com um 400.
Para levar cada desenvolvedor ao upstream que você pretende, escreva entradas que correspondam exatamente e coloque os upstreams abertos por último:
- Entradas: escreva cada grupo exatamente como seu IdP o envia na claim de grupos, que
match.groupstambém lê. O gateway se recusa a iniciar quando encontra uma lista vazia ou uma entrada vazia. Ele não verifica uma entrada em relação ao seu IdP, então uma entrada que não corresponde a ninguém não gera nenhum aviso. - Ordem: coloque um upstream que não tenha lista
groupspor último. Ele atende a todos, então, se listado antes, ele captura as requisições de uma equipe antes do próprio upstream dessa equipe.
O que acontece quando um desenvolvedor não está em nenhum grupo listado
Se todos os upstreams tiverem uma listagroups, um desenvolvedor que não esteja em nenhum desses grupos vê este erro, e o gateway não contata nenhum provedor:
groups.
O gateway lê novamente os grupos de um desenvolvedor a cada atualização de token. Se o seu IdP deixar os grupos de fora de uma atualização, o desenvolvedor passa a não ter nenhum:
oidc.allowed_groupsestá definido: o gateway recusa a atualização, e a sessão termina- Caso contrário, um upstream não tem lista
groups: as requisições do desenvolvedor passam para ele - Caso contrário, todos os upstreams têm uma lista
groups: as requisições do desenvolvedor falham com esse erro
oidc.google_groups não estiver definido, defina oidc.userinfo_fallback como true para preencher os grupos a partir dele.
Seções opcionais
login_notice
Para mostrar aos desenvolvedores um aviso quando eles fizerem login, defina a chave de nível superior login_notice com o texto do aviso, de até 500 caracteres. Este exemplo informa a quem o gateway se destina e onde solicitar acesso:
Notice from <gateway hostname> na página de verificação do gateway no navegador e na tela interativa de login no terminal. Quebras de linha no texto se tornam espaços. O aviso aparece antes do login, então qualquer pessoa que consiga acessar o gateway pode lê-lo.
Requer Claude Code v2.1.319 ou posterior no servidor do gateway e também na máquina do desenvolvedor para a tela do terminal. Um gateway anterior se recusa a iniciar quando encontra a chave. Atualize todas as réplicas antes de adicionar a chave e remova a chave antes de reverter para uma versão anterior.
admin
Opcional. Habilita /v1/organizations/spend_limits, que espelha a Admin API pública da Anthropic, e a aplicação de limites de gastos por desenvolvedor em /v1/messages. Consulte Limites de gastos para saber como os limites são definidos e aplicados; esta seção aborda as chaves do gateway.yaml que ativam o recurso e o ajustam.
Ordem dos orçamentos compartilhados
Um orçamento compartilhado é um limite mensal contra o qual um grupo inteiro gasta. Para definir um, adicionepooled_budget à requisição que define o limite mensal do grupo, como em "pooled_budget": {"amount": "500000"} para $5.000. A requisição também recebe o scope do grupo, "period": "monthly" e amount, que continua sendo o limite individual de cada membro.
Para um desenvolvedor em vários desses grupos, cada requisição é contabilizada no primeiro orçamento cujo gasto esteja abaixo do limite, e é recusada quando todos os orçamentos estão esgotados. pooled_conflict_rule define a ordem em que o gateway tenta os orçamentos:
default_order: o maior limite primeiro, e limites iguais em ordem crescente de nome de grupopriority_list: os orçamentos dos grupos empooled_priority_order, na ordem da lista, depois os orçamentos dos outros grupos por nome de grupo
pooled_conflict_rule: priority_list, o gateway ignora a lista e registra um aviso em log na inicialização.
Um servidor do gateway anterior à v2.1.319 se recusa a iniciar quando encontra pooled_conflict_rule ou pooled_priority_order. Atualize todas as réplicas antes de adicionar qualquer uma das chaves e remova ambas as chaves antes de reverter para uma versão anterior.
enforcement
O bloco enforcement controla como as verificações de limites de gastos se comportam quando o armazenamento não está disponível.
pricing
O bloco pricing informa ao medidor de gastos o que cobrar em vez do preço de tabela em USD, para que os limites e /effective reflitam suas tarifas contratadas. Os valores permanecem em USD e continuam sendo uma estimativa, não uma fatura. Dois pré-requisitos:
- Claude Code v2.1.227 ou posterior no servidor do gateway. Versões anteriores rejeitam a chave desconhecida na inicialização.
- Um bloco
admin:ou, na v2.1.268 ou posterior, um blocomanaged:com pelo menos uma política. O gateway se recusa a iniciar compricingdefinido e nenhum dos dois blocos, porque nada o leria.
Como o medidor corresponde a uma linha de override:
- Uma linha substitui o preço de tabela para requisições que
upstream, umupstreams[].name, atende paramodel. Isso inclui a tarifa mais alta do modo rápido, de modo que requisições rápidas e padrão são medidas com as mesmas quatro tarifas. - Um ID integrado como
claude-sonnet-4-6, correspondido comomodels[].id, cobre toda forma datada, forma regional do Amazon Bedrock ou forma do Agent Platform do Google Cloud que o medidor precifica como esse modelo. Qualquer outra string, como um alias ou um ARN de perfil de inferência, corresponde ao ID que o cliente enviou ou à string enviada ao upstream, sem diferenciar maiúsculas de minúsculas. - Onde as linhas se sobrepõem, o medidor escolhe a linha mais específica, e não a primeira: uma linha cujo
modelé a string exata do modelo enviada ao upstream, depois uma linha que corresponde ao ID exato que o cliente enviou e, em seguida, uma linha que nomeia o modelo integrado. - Um nome de upstream desconhecido faz a inicialização falhar, assim como duas linhas para um mesmo upstream que nomeiam o mesmo modelo, incluindo duas grafias de um mesmo modelo integrado. O gateway emite um aviso na inicialização sobre uma linha que nenhum modelo solicitável pode usar.
- Requisições de pesquisa na web permanecem no preço de tabela de $0.01; o multiplicador ainda se aplica a elas.
Aplicar acréscimo aos preços
Com a v2.1.271 ou posterior no servidor do gateway, você pode definirmultiplier acima de 1, até 10, para medir mais do que o provedor cobra, por exemplo, uma tarifa interna de chargeback. Este exemplo mede cada requisição a 120% do preço:
admin:, o acréscimo também se aplica aos limites de gastos. O medidor conta 120% do preço, então os desenvolvedores atingem seus limites mais cedo. O gateway registra um aviso na inicialização informando isso.
O multiplicador não altera o que o provedor upstream cobra pelas requisições.
Se o gateway também enviar as tarifas para clientes conectados, os desenvolvedores precisam do Claude Code v2.1.271 ou posterior para ver o acréscimo. Clientes anteriores ignoram um multiplier acima de 1 e mostram os custos sem ele.
Um servidor do gateway anterior à v2.1.271 se recusa a iniciar se você definir um multiplier acima de 1.
Enviar as tarifas para clientes conectados
Com a v2.1.268 ou posterior no servidor do gateway, o gateway também coloca as tarifas depricing nas políticas managed que ele serve, como a configuração gerenciada modelPricing.
Os desenvolvedores correspondidos por uma política passam a ver as tarifas de pricing em /usage, na linha de status e no OpenTelemetry. Um desenvolvedor que não corresponde a nenhuma política não recebe configurações gerenciadas, então seus números permanecem no preço de tabela. Os clientes aplicam a configuração no Claude Code v2.1.242 ou posterior.
- O que o gateway adiciona: a menos que o bloco
clide uma política já definamodelPricing, o gateway adiciona omultipliere, para cada ID de modelo que um cliente pode solicitar, a linha de override do primeiro upstream que atende esse ID. Uma tarifa que apenas um upstream de failover cobra permanece no gateway. - Upstreams com uma lista
groups: quando um deles é o primeiro upstream que atende um ID de modelo, o gateway não adiciona nenhuma linha para esse ID. Os desenvolvedores então veem a tarifa do próprio Claude Code para esse ID, que é a tarifa padrão do modelo quando o Claude Code reconhece o ID, vezes omultiplier. - Excluir uma política: defina
modelPricingcomo{}no blococlidessa política, e seus desenvolvedores permanecem no preço de tabela. - Manter as tarifas próprias de uma política: uma política cujo bloco
clidefinemodelPricingcom seu própriomultiplierouoverridesmantém essemodelPricinginteiro, e o gateway não adiciona nenhuma tarifa própria a ele.
models
O bloco models é uma lista opcional de modelos selecionada pelo administrador, servida em /v1/models e usada para traduzir IDs de modelo por upstream. Ele é obrigatório para regiões do Amazon Bedrock fora dos EUA, ARNs de throughput provisionado do Amazon Bedrock e nomes de implantação do Microsoft Foundry.
upstream_model deve corresponder ao name de um upstream configurado, que por padrão é o nome do provedor. Uma chave que não corresponde a nenhum upstream faz a inicialização falhar, então omita as linhas dos provedores que você não usa.
Para permitir que os desenvolvedores usem o alias fable com auto_include_builtin_models: false, adicione uma entrada claude-fable-5 a models. Esse é o ID para o qual o alias fable é resolvido para desenvolvedores conectados ao gateway. Sem ela, suas mensagens falham com um erro que começa com API Error: 400 model claude-fable-5 is not in the operator's model allowlist.
managed
O bloco managed define políticas de acesso baseadas em funções, indexadas por grupos do IdP ou domínio de email. As políticas são avaliadas em ordem; por padrão, a primeira correspondência é selecionada e depois mesclada sobre a base genérica match: {}. Um usuário que corresponde a duas políticas de função recebe apenas a primeira, então as regras de negação da segunda política não se aplicam, a menos que você aplique todas as políticas correspondentes. As políticas são servidas por usuário em GET /managed/settings com cache ETag/304.
match: {}, por convenção listado por último, é tratado como uma camada base. Todas as outras políticas herdam do catch-all qualquer chave que não definam, então as entradas por função só precisam listar o que difere do padrão da organização. As regras de mesclagem dependem do tipo de chave:
- Allowlists:
availableModelsepermissions.allow. A lista de uma política específica substitui totalmente a da base. - Listas de negação e arrays de hooks: estes recebem a união da base e da política:
permissions.denyepermissions.askdisabledMcpjsonServersedeniedMcpServersblockedMarketplacesedeniedModels- Os arrays de tipos de evento de
hooks
- Chaves do tipo registro:
env,modelOverrideseskillOverrides. Estas são mescladas superficialmente, então um blocoenvpor função sobrescreve as chaves que define e herda o restante da base.
availableModels também é aplicado no lado do servidor em /v1/messages, então um modelo negado retorna 400 independentemente do que o cliente envia. Uma lista vazia nega todos os modelos. A verificação também cobre o modelo com que uma sessão inicia antes de o desenvolvedor escolher um, então inicie as sessões em um modelo que a política permite.
O próprio gateway valida o valor de model antes de repassar uma requisição, para que um valor malformado nunca chegue a um upstream. Ele rejeita a requisição com um 400 em dois casos:
- Quando o valor está ausente ou vazio, o gateway rejeita a requisição com a mensagem
model is required. Essa verificação requer um gateway executando o Claude Code v2.1.228 ou posterior. - Quando o valor está presente, mas não é uma string, o gateway rejeita a requisição com a mensagem
model must be a string. Requer um gateway executando o Claude Code v2.1.221 ou posterior.
Um usuário autenticado que não corresponde a nenhuma política recebe os padrões do gateway, o que significa todos os modelos do catálogo e nenhuma configuração gerenciada. Adicione um catch-all
match: {} por último se quiser uma política padrão garantida.
Coloque as regras de negação de toda a organização na política match: {}, porque as regras de uma política de grupo só se aplicam enquanto o token do usuário contiver esse grupo.
O gateway não mantém um diretório de usuários próprio. Ele autoriza cada requisição a partir do token do IdP do usuário, lendo a associação a grupos da claim
groups do token e avaliando as políticas com base nela. Não há lista de usuários para enumerar nem contas para pré-criar e, portanto, não há endpoint SCIM, porque não há nada para o SCIM sincronizar.Execute o gerenciamento do ciclo de vida de usuários e grupos na fonte da verdade, que é o provisionamento SCIM nativo do seu IdP ou uma plataforma dedicada de governança de identidade. A associação e o desprovisionamento governados ali chegam ao gateway automaticamente por meio do token. Se você quiser provisionamento SCIM das próprias contas do Claude, esse é um recurso do Claude for Enterprise.Dois relógios de propagação se aplicam:- Conteúdo das políticas: editar uma política e reimplantar chega aos clientes Claude Code conectados na próxima consulta de configurações gerenciadas, em até uma hora, exceto pelas alterações que se aplicam apenas na próxima inicialização
- Associação a grupos: alterar a associação de um usuário a grupos muda qual política corresponde a ele. Isso entra em vigor na próxima reemissão da sessão, ou seja, na próxima atualização silenciosa, limitada por
session.ttl_hours.
Aplicar todas as políticas correspondentes
Um usuário que corresponde a várias políticas de função recebe apenas a primeira, a menos que você definapolicy_mode: layered ao lado de policies. Com layered, todas as políticas que correspondem ao usuário se aplicam, até a primeira política match: {}.
policy_mode requer o Claude Code v2.1.316 ou posterior no servidor do gateway. Um gateway em uma versão que não o suporta se recusa a iniciar quando encontra a chave. Atualize todas as réplicas antes de adicionar a chave e remova a chave antes de reverter para uma versão anterior. Este exemplo tem um grupo que perde WebFetch e um que ganha o Opus:
no-web e opus-users recebe com o padrão, first_match, e com layered.
O gateway mescla cada política correspondente sobre as listadas abaixo dela, pelas mesmas regras de mesclagem da camada base:
- Allowlists, valores únicos e blocos como
sandbox: cada um vem inteiro da primeira política correspondente listada que o define, então as listasavailableModelsde dois grupos não se somam. - Listas de negação e arrays de hooks: estes se somam entre todas as políticas correspondentes, então um usuário em dois grupos recebe as regras de negação de ambos os grupos.
env,modelOverrideseskillOverrides: as entradas são mescladas por nome, e a primeira política correspondente listada que define um nome fornece seu valor.- Chaves de
desktop: estas são mescladas pelas regras do blocodesktopbase.
layered, o gateway se recusa a iniciar com algumas configurações, incluindo estas:
- Um padrão
!: uma negação!em uma regraReadouEditna listapermissions.denyoupermissions.askde qualquer política, incluindo a da políticamatch: {} - Um limite sobre hooks fora da genérica:
disableAllHooks,allowedHttpHookUrlsouhttpHookAllowedEnvVarsem qualquer política que não sejamatch: {}
Iniciar sessões em um modelo que a política permite
SeavailableModels deixar de fora o modelo padrão do Claude Code, as sessões recebem respostas 400 até que o desenvolvedor escolha um modelo listado, por exemplo com /model. Em sessões do gateway, o padrão é o modelo Opus para o qual o alias opus é resolvido, e availableModels sozinho não o altera.
Para corrigir isso, defina enforceAvailableModels: true no mesmo bloco cli e, em seguida, verifique que tipo de entrada a lista tem:
- Um alias como
sonnet, ou um ID integrado comoclaude-sonnet-4-6: as sessões iniciam em um desses modelos, e a opção Default em/modelé resolvida para ele - Nenhum alias ou ID integrado na lista: as sessões podem continuar iniciando no padrão integrado, então defina também
modelcomo um dos IDs listados no blococlidessa política
models define e inicia as sessões nesse ID:
Valores de matcher que interrompem o gateway na inicialização
Na inicialização, o gateway verifica o blocomatch de todas as políticas e a lista admin_groups. Qualquer um destes valores interrompe o gateway com um erro que nomeia o campo:
- Uma lista
groupsvazia - Uma entrada vazia em
groupsou emadmin_groups - Um
email_domainvazio - Um
email_domainque contém@, espaço em branco ou vírgula. O gateway apara o valor e remove um@inicial antes desta verificação. Escreva um único domínio simples, comoexample.com.
- Um
email_domainvazio: o gateway ignorava a verificação de domínio, então uma política com umemail_domainvazio e sem listagroupscorrespondia a todos os usuários autenticados - Uma lista
groupsvazia: a política não correspondia a ninguém - Um
email_domaincontendo@, espaço em branco ou vírgula: a política não correspondia a ninguém - Uma entrada vazia em
groupsou emadmin_groups: a entrada correspondia a um usuário somente quando a claimgroupsdo IdP desse usuário também continha uma entrada vazia. Emadmin_groups, essa correspondência concedia acesso de administrador. Se sua listaadmin_groupsnunca conteve uma entrada vazia, ninguém obteve acesso de administrador dessa forma.
Escolher cli ou code
As configurações do Claude Code de uma política, como uma regra que nega a leitura de arquivos .env, ficam em um bloco sob a chave cli ou code. code é a chave recomendada, e cli é a chave legada. Ambas as chaves aceitam o mesmo conteúdo. A chave decide onde as configurações são aplicadas:
cli: o terminal, as extensões do VS Code e do JetBrains e o Agent SDK. Sobcli, a aba Code do Claude Desktop recebe as configurações derivadas, então uma regra com escopo comoRead(./.env)não impede um usuário ali.code: os mesmos lugares, e a aba Code do Claude Desktop também pode ser coberta.
cli funciona como antes, e um gateway que encontra cli em uma política com uma chave desktop emite um aviso na inicialização e inicia mesmo assim. Mude para code para que as configurações também possam cobrir a aba Code.
Antes de mudar, leia Aplicar configurações code na aba Code. A política precisa de uma chave desktop e as máquinas dos usuários precisam de configuração antes que as configurações se apliquem ali, e a pesquisa na web é desativada no Claude Desktop.
Esta política coloca a regra de negação sob code, com uma chave desktop vazia:
serve_to_desktop na mesma edição que renomeia os blocos. Onde uma instrução mencionar o bloco cli, use seu bloco code.
serve_to_desktop: true é uma forma legada de oferecer as configurações cli de uma política à guia Code. Não tem efeito quando o Claude Desktop se conecta por meio de bootstrapUrl. Enquanto suas políticas usarem cli, um aviso de inicialização que nomeia essa chave significa que essas configurações não estão chegando à guia Code:
- Para cobrir a guia Code: mude para
code, assim que as máquinas dos usuários atenderem às condições em Aplicar configurações decodena guia Code - Para permanecer em
cli: definaserve_to_desktop: falseao lado decliem uma política para silenciar o aviso
O que vai em cli
Cada valor de code ou cli é um documento managed-settings.json completo do Claude Code, o mesmo esquema que você implantaria via MDM ou /etc/claude-code/managed-settings.json, expresso aqui como YAML. A CLI aplica o documento entregue no nível gerenciado, acima das configurações de usuário e de projeto, no lugar das configurações gerenciadas pelo servidor. Portanto, ela ignora as configurações restritas a fontes de política no nível do sistema operacional, como policyHelper e wslInheritsWindowsSettings.
O gateway valida cada documento em relação ao esquema de configurações da CLI na inicialização, então uma chave de nível superior não reconhecida faz a inicialização falhar com um erro que nomeia cada chave problemática. Partes deliberadamente abertas do esquema ainda aceitam valores arbitrários, porque clientes mais novos podem reconhecer entradas que o esquema do gateway não reconhece. Essas chaves abertas incluem env, pluginConfigs e chaves aninhadas em permissions.
Como a validação usa o esquema empacotado com a versão instalada do gateway, colocar na configuração gerenciada uma chave de configuração de nível superior introduzida por uma versão mais nova do Claude Code exige atualizar o gateway primeiro. Faça um teste rápido de uma nova política em um cliente antes de distribuí-la.
A referência completa de chaves está em Configurações do Claude Code. As chaves que a maioria dos operadores usa primeiro:
Como essas configurações chegam pela rede, a CLI mostra a cada desenvolvedor uma caixa de diálogo de aprovação de segurança antes de aplicar as configurações listadas abaixo:
hooks- variáveis de
envque exigem a aprovação do desenvolvedor, como variáveis de proxy e de URL base - configurações de execução de shell, como
apiKeyHelperestatusLine - as configurações de binários do sandbox
sandbox.bwrapPath,sandbox.socatPathesandbox.ripgrep - Configurações do sandbox que interceptam tráfego, injetam credenciais ou enfraquecem o isolamento, como
sandbox.network.tlsTerminatee as configurações de porta do proxy. Caixas de diálogo de aprovação de segurança lista todas elas.
env entregues sem mostrar ao desenvolvedor a caixa de diálogo de aprovação, como configurações de seleção de modelo e limites numéricos. Outras variáveis entregues podem exigir a aprovação do desenvolvedor; um valor não vazio de proxy, URL base ou OTEL_EXPORTER_OTLP_ENDPOINT sempre exige. Quando uma variável entregue precisa de aprovação, a caixa de diálogo a nomeia. Variáveis de ambiente e a caixa de diálogo de aprovação tem os detalhes, incluindo quatro opções de privacidade cujo valor entregue decide se precisam de aprovação.
A configuração de telemetria do gateway envia OTEL_EXPORTER_OTLP_ENDPOINT, então definir telemetry.forward_to aciona a caixa de diálogo em cada cliente interativo. A caixa de diálogo protege a máquina do desenvolvedor contra um gateway comprometido ou hostil, não a organização contra o desenvolvedor.
Uma execução não interativa, como claude -p, uma sessão do Agent SDK ou uma sessão na aba Code do Claude Desktop, não pode mostrar a caixa de diálogo. Ela aplica as configurações enviadas somente para essa execução e não as registra como aprovadas, então a próxima sessão interativa do desenvolvedor ainda mostra a caixa de diálogo.
Se um desenvolvedor recusar, o Claude Code encerra essa sessão em vez de aplicar a política. Quando você envia um novo hook, ou qualquer variável de ambiente que aciona a caixa de diálogo, para uma política ampla, todos os desenvolvedores correspondentes veem, portanto, a caixa de diálogo em suas sessões interativas. Uma sessão interativa em execução a mostra na próxima consulta horária; caso contrário, ela aparece na próxima inicialização interativa do desenvolvedor.
A chave cli se chamava settings em versões anteriores, e o gateway ainda aceita essa grafia como alias. Para novas implantações, use code.
Testar uma política antes da implantação
Para testar uma alteração de política, inicie o gateway com um banco de dados Postgres descartável. O gateway se conecta ao Postgres e aplica suas migrações de esquema antes de verificar o conteúdo dos blocoscli, code e desktop. Quando não consegue acessar o banco de dados, a inicialização para em could not connect to Postgres e não informa nada sobre o conteúdo deles.
Janela de contexto em sessões de terminal
Sessões de terminal conectadas por meio de/login usam a janela de contexto de 1M para Opus 4.7 e posteriores, Sonnet 5 e posteriores e os modelos Fable. O ID do modelo não precisa do sufixo [1m], e as sessões compactam em cerca de 967K tokens. Antes do Claude Code v2.1.287 na máquina do desenvolvedor, o Claude Code tratava os modelos Opus e Fable como tendo uma janela de 200K, a menos que o ID do modelo terminasse em [1m].
Para que as sessões de terminal compactem no limite de 200K, defina a janela de compactação automática no env da política:
[1m].
Para desativar o contexto de 1M, defina CLAUDE_CODE_DISABLE_1M_CONTEXT: "1" no mesmo bloco env. O Claude Code então trata todos os modelos como tendo uma janela de 200K. Em sessões interativas, cada desenvolvedor aprova esta variável na caixa de diálogo de aprovação antes que ela entre em vigor.
Cache de prompt de uma hora
Para solicitar o TTL do cache de prompt de uma hora em vez dos cinco minutos padrão, adicione estas chaves ao blococode, cli ou settings existente de uma política e reinicie o gateway. As chaves precisam do Claude Code v2.1.242 ou posterior no servidor do gateway e nos clientes.
promptCacheTtl cobre a conversa principal. subagentPromptCacheTtl é opcional e cobre subagentes, fluxos de trabalho e requisições em segundo plano. Este exemplo adiciona ambas a uma política match: {} com a chave cli:
promptCacheTtl, conecte-se ao gateway como um usuário que a política corresponde e verifique qual TTL suas gravações em cache usaram. Passe --model para repetir a verificação para cada modelo que o gateway serve.
Gravações em cache de uma hora custam mais do que gravações de cinco minutos. Para que os limites de gastos contabilizem essa tarifa mais alta, você precisa da v2.1.286 ou posterior no servidor do gateway.
Servidores MCP em uma política
Para fornecer servidores MCP aos clientes Claude Code que uma política corresponde, definamanagedMcpServers no bloco cli dessa política. Você precisa do Claude Code v2.1.259 ou posterior no servidor do gateway e nos clientes.
O gateway verifica cada entrada na inicialização com as mesmas regras que o Claude Code aplica no cliente e, se uma entrada falhar em uma verificação, o gateway se recusa a iniciar e nomeia a entrada.
Se você escrever uma referência ${VAR} no gateway.yaml, o gateway a resolve a partir de seu ambiente na inicialização por meio da expansão de segredos antes de executar as verificações das entradas, então todo cliente correspondente recebe o valor literal e pode lê-lo. As orientações sobre cabeçalhos para servidores fornecidos se aplicam ao valor expandido.
O gateway rejeita a grafia mcpServers do .mcp.json em um bloco cli, e seu erro de inicialização indica managedMcpServers como a chave a ser usada. Antes da v2.1.259, o gateway rejeitava qualquer definição de servidor MCP em um bloco cli.
Sobreposição do Claude Desktop
Se sua organização também implanta o Claude Desktop, o mesmo gateway serve ambos os clientes. ApontebootstrapUrl, na configuração gerenciada do Claude Desktop, para <listen.public_url>/user/bootstrap. O Claude Desktop deriva o emissor OAuth dessa URL, executa o mesmo login por código de dispositivo contra este gateway e busca sua configuração na resposta.
Requer o Claude Code v2.1.203 ou posterior no servidor do gateway e uma adesão explícita:
/user/bootstrap retorna 404, a menos que a política correspondente ao usuário tenha uma chave desktop. Um desktop: {} vazio faz uma política aderir, e uma chave desktop na camada base match: {} faz aderir todas as políticas que a herdam. O log de auditoria registra cada requisição como desktop_bootstrap.serve ou desktop_bootstrap.denied.desktop totalmente fora de suas políticas; o gateway então retorna 404 de /user/bootstrap para todos os usuários.
Configurações que o gateway deriva para o Claude Desktop
O gateway deriva grande parte da resposta de bootstrap do blococli ou code da política correspondida e da configuração de nível superior do gateway:
-
A lista de modelos, de
availableModels. A lista deixa de fora os modelos que a política bloqueia comdeniedModelsouavailableModelsMatch: exact. Este filtro requer o Claude Code v2.1.299 ou posterior no servidor do gateway. Contexto estendido no Claude Desktop aborda a opção de contexto de 1M de cada modelo -
Ferramentas desativadas, de entradas
permissions.denycom apenas o nome da ferramenta. Se você definirdisabledBuiltinToolsno blocodesktopda política, o gateway serve a união do seu valor com a lista derivada, então você pode desativar mais ferramentas dessa forma, mas não pode reativar uma que desativou por meio depermissions.deny -
A allowlist de saída, de
sandbox.network.allowedDomains. Se você definircoworkEgressAllowedHostsno blocodesktopda política, o gateway usa esse valor em vez da lista derivada. Se a allowlist que o gateway serve incluir*e o gateway não servir também oallowedWorkspaceFoldersdo Claude Desktop, o Claude Desktop não ativa o sandbox do Bash na aba Code -
Um endpoint OTLP que aponta para o próprio gateway e os atributos de identidade do usuário conectado. O gateway repassa as exportações que recebe nesse endpoint para seus destinos
forward_to. Ele inclui o endpoint e os atributos quando você define tantotelemetry.forward_toquantolisten.public_url. O Claude Desktop exporta todos os sinais com uma única codificação:http/protobuf, ouhttp/jsonquando você defineOTEL_EXPORTER_OTLP_PROTOCOLou uma de suas variantes por sinal comohttp/jsonnoenvda política. Antes do Claude Code v2.1.261 no servidor do gateway, a resposta definiahttp/jsonde qualquer forma, então um coletor que aceita apenas protobuf rejeitava as exportações do Claude Desktop
disabledBuiltinTools, coworkEgressAllowedHosts ou a própria configuração managedMcpServers do Claude Desktop no bloco desktop de uma política, você precisa do Claude Code v2.1.232 ou posterior no servidor do gateway. O managedMcpServers do Claude Desktop aceita um valor de array em vez de um objeto.
O gateway omite da resposta de bootstrap as chaves sem equivalente no Claude Desktop, como hooks e regras de permissão com escopo como Bash(npm *).
Aplicar configurações code na aba Code
As configurações do Claude Code que uma política mantém sob sua chave code se aplicam na aba Code do Claude Desktop quando todas estas condições são atendidas:
- A política também tem uma chave
desktop, e umdesktop: {}vazio conta - O Claude Desktop é a versão 2.9939.2 ou posterior
- As configurações gerenciadas do Claude Code na máquina nomeiam este gateway
- Essa máquina acessa o gateway por HTTPS em uma rede privada
cli para code. Quando as duas primeiras condições são atendidas e qualquer uma das duas últimas falha, um usuário que a política corresponde obtém um destes resultados:
- Por HTTPS, onde o Claude Desktop inclui o Claude Code v2.1.296 ou posterior: a aba Code não inicia, e a resposta ao prompt do usuário explica o motivo
- Por HTTPS, onde o Claude Desktop inclui uma versão anterior: a aba Code inicia sem suas configurações
code, e nada na sessão informa isso - Por HTTP simples: a aba Code inicia sem suas configurações
code, qualquer que seja a versão que o Claude Desktop inclui
/managed/settings com seu próprio 404, a aba Code também inicia sem suas configurações code, inclusive em uma máquina que atende às quatro condições.
Em uma política que tem uma chave desktop, um bloco code que contém configurações desativa a ferramenta WebSearch no Cowork, no Chat e na aba Code. Para servidores MCP, consulte Onde managedMcpServers se aplica.
Definir configurações do Claude Desktop diretamente
Adicione o bloco opcionaldesktop junto com cli para definir configurações do Claude Desktop diretamente. Escreva as configurações da referência de configuração gerenciada do Claude Desktop como nomes de chave simples. Deixe de fora as chaves que o Claude Desktop lê apenas de MDM ou de arquivos locais, como bootstrapUrl; o gateway as rejeita na inicialização.
Este exemplo define três chaves do Claude Desktop para o grupo eng-contractors junto com suas configurações cli:
O que o gateway rejeita na inicialização
O gateway valida cada blocodesktop na inicialização em relação ao esquema de configuração que o próprio Claude Desktop usa, para que um erro apareça na inicialização do gateway como uma mensagem que nomeia a chave, em vez de chegar a todos os desktops conectados. O gateway falha na inicialização quando um bloco contém:
- Uma chave desconhecida
- Uma chave reconhecida cujo valor o Claude Desktop rejeitaria ou descartaria silenciosamente, como um valor vazio ou uma subchave com erro de digitação dentro de uma entrada aninhada. Antes da v2.1.260, o gateway descartava silenciosamente um campo com erro de digitação dentro de um objeto aninhado de uma entrada de
managedMcpServersouorgPluginSettings, em vez de falhar na inicialização. - Uma chave que o próprio gateway calcula: a conexão de inferência, a lista de modelos e o relay OTLP. Configure-as por meio de
upstreams,modelse doforward_toda seçãotelemetry. - Um alias legado de uma chave atual. No erro de inicialização, o gateway nomeia a chave canônica a ser escrita.
managedMcpServers sem transport, o gateway inicia e registra um aviso que nomeia a substituição.
Antes da v2.1.232, o gateway aceitava uma lista fixa de 11 chaves de controle de recursos, como chatTabEnabled e disableAutoUpdates, e rejeitava todas as outras chaves na inicialização. Antes da v2.1.227, o gateway também rejeitava chatTabEnabled e chatAdvancedFileAnalysisEnabled na inicialização.
Chaves que precisam de uma versão mais recente do gateway ou do Claude Desktop
O gateway valida um blocodesktop em relação ao esquema empacotado com sua versão instalada, assim como faz com o bloco cli. Para entregar uma configuração introduzida por uma versão mais nova do Claude Desktop, atualize o gateway primeiro. Por exemplo, userPluginMarketplacesEnabled e userPluginUploadsEnabled precisam do Claude Code v2.1.260 ou posterior no servidor do gateway e do Claude Desktop 1.37937.0 ou posterior nas máquinas dos membros.
blockReadsOutsideWorkingDirectories, disableBypassPermissionsMode, configRecheckIntervalMinutes e sshClientPath precisam do Claude Code v2.1.281 ou posterior no servidor do gateway. O mesmo vale para o valor required de microsoftAuthBroker e o campo continuousAccessEvaluation de uma entrada managedMcpServers do Microsoft 365. Versões do Claude Desktop anteriores ao valor required o leem como disabled, então defina required somente depois que o Claude Desktop de todos os membros o suportar. A referência de configuração gerenciada do Claude Desktop lista a versão que primeiro lê cada chave.
sshTransport precisa do Claude Code v2.1.293 ou posterior no servidor do gateway.orgPluginSettings no bloco desktop de uma política, o gateway o serve na forma de array que o Claude Desktop 1.15200.0 e posteriores leem. Desktops mais antigos ignoram o array e não aplicam nenhuma política de ferramentas de plugin, então atualize os membros para 1.15200.0 ou posterior antes de depender disso.
Como uma política de função herda o bloco desktop base
O gateway preenche as chaves que o bloco desktop de uma política não define a partir do bloco desktop do catch-all match: {}, da mesma forma que preenche o bloco cli de uma política a partir da base. Se você definir disabledBuiltinTools ou builtinToolPolicy tanto na base quanto em uma política de função, o gateway mantém a restrição da base:
disabledBuiltinTools: o gateway usa a união da lista da base com a lista da políticabuiltinToolPolicy: se você definir uma ferramenta com um valor diferente deallowna base, o gateway mantém esse valor mesmo que você definaallowpara a mesma ferramenta em uma política de função
banner por inteiro, então, se você definir banner.text em uma política de função, o gateway descarta o banner.backgroundColor da base.
Quando uma alteração de política chega ao Claude Desktop
Depois que você reimplanta o gateway com uma política alterada, o Claude Desktop aplica a maioria das configurações somente na próxima vez que inicia:- Fechado: o Claude Desktop busca a resposta de bootstrap ao iniciar, então a alteração se aplica a partir da próxima inicialização
- Aberto: o Claude Desktop verifica se há uma resposta alterada a cada 10 minutos por padrão e aplica algumas configurações sem reiniciar. Para as demais, como
skillCreationEnabled, o usuário vê um cartão Relaunch Claude Desktop na barra lateral e mantém a configuração anterior até reiniciar o aplicativo. Após 24 horas por padrão, o Claude Desktop mostra uma caixa de diálogo de reinicialização e reinicia sozinho após 2 minutos de inatividade
relaunchEnforcementHours no bloco desktop da política. Você precisa do Claude Code v2.1.260 ou posterior no servidor do gateway e do Claude Desktop 1.40609.0 ou posterior nas máquinas dos membros. Com 0, a caixa de diálogo aparece assim que o Claude Desktop encontra a alteração.
Contexto estendido no Claude Desktop
Se você serve o Claude Desktop a partir do gateway, seu seletor de modelos oferece uma opção de contexto de 1M para cada modelo listado que pode ser executado com uma janela de contexto de 1M. Isso inclui o Claude Opus 4.6 e posteriores, o Claude Sonnet 4.6 e posteriores e os modelos Fable. A opção é a variante[1m] do modelo, descrita em Contexto estendido. Você precisa do Claude Code v2.1.284 ou posterior no servidor do gateway.
Uma entrada de models não recebe a opção de 1M quando:
- Um upstream que pode servir a entrada a mapeia para um modelo sem suporte a 1M, incluindo um upstream que o gateway alcança apenas em failover
- Nem seu
idnem qualquer um de seus valores deupstream_modelnomeia um modelo Claude, como um alias personalizado roteado para um ARN de perfil de inferência de aplicação
- Iniciar os usuários na opção de 1M: defina
modelPrefer1mContext: trueno blocodesktopda política. Usuários que ainda não escolheram um modelo começam na opção de 1M quando o primeiro modelo listado tem uma. Usuários que já escolheram um modelo mantêm sua escolha. - Oferecer a opção manualmente: faça isso se o servidor do seu gateway executa uma versão anterior à v2.1.284 ou se uma entrada não nomeia nenhum modelo Claude. Liste o modelo duas vezes em
models, uma com seu ID simples e outra com[1m]anexado, ambas com o mesmo mapaupstream_model. O Claude Desktop mostra o par como um único modelo com uma opção de 1M. O gateway serve uma entrada[1m]sem verificá-la, então adicione uma somente para um modelo que seus upstreams servem com 1M.
Remover a opção de 1M
Para remover a opção do seletor, definaCLAUDE_CODE_DISABLE_1M_CONTEXT: "1" no bloco env sob a chave cli da política. Se você também listou uma entrada cujo id termina em [1m], o gateway ainda a serve, então exclua essa entrada também.
A variável também chega às sessões de terminal dos desenvolvedores que a política corresponde. Para saber o que ela altera ali, consulte Contexto estendido.
Precedência com outras fontes gerenciadas
Se um dispositivo também tiver uma política entregue por MDM ou ummanaged-settings.json local, as configurações entregues pelo gateway têm a maior prioridade. Precedência dentro do nível gerenciado, na página de configurações gerenciadas, explica quando as fontes locais se aplicam e traz as chaves que o Claude Code lê de todas as fontes de administrador, independentemente da fonte selecionada, como as chaves de bloqueio do sandbox, forceRemoteSettingsRefresh e a mesclagem de env por variável. Um policyHelper configurado em um perfil MDM ou no arquivo de configurações gerenciadas só é executado quando o gateway não entrega nenhuma configuração; a entrada informa o que sua saída substitui.
Hosts incorporadores como o Claude Desktop podem fornecer políticas por meio da opção managedSettings do SDK. Configurações pai de hosts incorporadores explica quando o Claude Code as aplica, e Restringir configurações pai lista quais configurações na direção de permissão ainda se aplicam sem os bloqueios allowManaged*Only.
As políticas do gateway se aplicam a toda invocação do Claude Code na máquina, incluindo execuções não interativas de claude -p e sessões geradas pelo Agent SDK. Se o gateway estiver inacessível na inicialização, as sessões conectadas são encerradas com um erro em vez de serem executadas sem sua política.
telemetry
A CLI envia métricas, logs e, quando habilitados, traces para o gateway, que os repassa literalmente para cada destino configurado. As exportações usam o OpenTelemetry Protocol (OTLP) sobre HTTP. Para ignorar o relay e fazer as sessões exportarem diretamente para seu coletor, nomeie o coletor em uma política. Consulte Monitorar o uso para ver as métricas e os eventos que a CLI emite.
Em sessões conectadas por meio de /login, a CLI marca cada exportação com a identidade do usuário autenticado, lida do JWT emitido pelo gateway: os atributos user.id, user.email e user.groups. A atribuição de custo e uso por desenvolvedor, portanto, funciona sem nenhuma configuração por parte do desenvolvedor. Os eventos que o Claude Code registra antes de o desenvolvedor se conectar não carregam essa identidade. Para ver qual atributo acompanha uma alteração nos grupos de um desenvolvedor, consulte Alterações de grupo durante uma sessão aberta.
Sessões do Claude Desktop e do Cowork conectadas por meio do gateway marcam sua telemetria com user.email e user.groups junto com enduser.id, então você pode cobrir o uso do terminal, do Desktop e do Cowork com uma única consulta em user.email ou user.groups. user.groups é a lista de grupos do IdP separada por vírgulas.
A telemetria do Desktop e do Cowork também carrega enduser.sub, a claim sub que seu provedor de identidade emite para o usuário, que permanece a mesma quando o e-mail de um usuário muda. As sessões de terminal marcam o mesmo valor em user.id, então uma consulta que compara enduser.sub com o user.id do terminal cobre juntos o uso de um usuário no terminal, no Desktop e no Cowork. Nas exportações do Desktop e do Cowork, user.id é um identificador anônimo, não o sujeito.
Como todos os dados do OpenTelemetry do Claude Code, esses atributos vão apenas para destinos que sua organização configura, nunca para a Anthropic.
Se a lista de grupos de um usuário tiver mais de 255 caracteres após a codificação percentual, ou se um nome de grupo contiver uma vírgula ou um sinal de igual, o gateway deixa user.groups de fora da telemetria do Desktop e do Cowork desse usuário em vez de truncá-la. As sessões de terminal desse usuário ainda carregam a lista completa.
O gateway deixa enduser.sub de fora quando o sujeito tem mais de 255 caracteres após a codificação percentual, ou contém um espaço, um caractere fora do ASCII imprimível ou um destes: , ; = \ " %. A telemetria do Desktop e do Cowork desse usuário mantém seus outros atributos.
Você precisa do Claude Code v2.1.265 ou posterior no servidor do gateway para user.email e user.groups na telemetria do Desktop e do Cowork, e do Claude Desktop 1.24012 ou posterior na máquina de cada desenvolvedor para user.groups.
Você precisa do Claude Code v2.1.274 ou posterior no servidor do gateway para enduser.sub.
forward_to deve usar https://, com uma exceção para um coletor na própria interface de loopback do gateway:
http://localhost:<port>passa na validação da configuração, mas a proteção contra SSRF bloqueia todas as exportações comECONNREFUSED_SSRF, a menos que você definaCLAUDE_GATEWAY_ALLOW_LOOPBACK=1no ambiente do gatewayhttp://127.0.0.1:<port>ouhttp://[::1]:<port>faz a inicialização falhar, a menos que essa variável esteja definida
HTTPS_PROXY está definido, o gateway envia as exportações por meio desse proxy.
Para acessar um coletor interno diretamente, adicione-o a NO_PROXY pelo nome de host ou por um domínio com ponto inicial, como .internal.example.com, o que requer o Claude Code v2.1.277 ou posterior no servidor do gateway. Certifique-se de que o gateway consegue acessar o coletor sem o proxy. Uma entrada sem ponto inicial corresponde apenas a esse nome exato, não a nomes abaixo dele. Intervalos CIDR não correspondem.
Com a saída somente por proxy ativada, permita o coletor no proxy, já que qualquer entrada em NO_PROXY mantém a saída somente por proxy desativada.
A telemetria fica desativada na CLI por padrão. Quando você define tanto telemetry.forward_to quanto listen.public_url, o gateway a ativa para os clientes conectados enviando seis variáveis de ambiente por meio de /managed/settings:
CLAUDE_CODE_ENABLE_TELEMETRY=1OTEL_METRICS_EXPORTER,OTEL_LOGS_EXPORTEReOTEL_TRACES_EXPORTER, cada uma definida comootlpse pelo menos um destinoforward_tohabilitar esse sinal, e comononecaso contrárioOTEL_EXPORTER_OTLP_ENDPOINT=<public_url>OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf
OTEL_RESOURCE_ATTRIBUTES.
Antes do Claude Code v2.1.265 no servidor do gateway, o gateway enviava os três seletores de exportador como otlp, inclusive para sinais aos quais nenhum destino havia aderido.
O endpoint enviado é construído a partir da URL pública, então métricas e logs não precisam de nenhuma configuração OTEL por parte dos desenvolvedores ou das políticas.
Desenvolvedores conectados por meio de /login não podem redirecionar as exportações com sua própria configuração OTEL:
- Variáveis definidas localmente: o Claude Code aplica as variáveis enviadas no nível gerenciado, então cada uma sobrescreve o valor que um desenvolvedor define para ela localmente.
- Endpoints configurados localmente: com a exportação OTLP/HTTP habilitada, a CLI ignora qualquer endpoint configurado localmente, independentemente de o gateway ter enviado as variáveis de telemetria. Suas exportações vão para o gateway, a menos que uma política nomeie seu coletor como o endpoint.
forward_to para um sinal, o gateway o aceita e o descarta. Se os desenvolvedores já exportam a telemetria do Claude Code para um de seus coletores, adicione-o como destino forward_to, com logs ou traces habilitados se eles os exportarem, para que ele continue recebendo os dados depois que se conectarem. Para ignorar o relay, nomeie o coletor em uma política.
Os traces também exigem CLAUDE_CODE_ENHANCED_TELEMETRY_BETA=1 em cada cliente. Defina-a no bloco env de uma política gerenciada, já que o gateway não a envia. Os desenvolvedores a aprovam na mesma caixa de diálogo de aprovação de segurança que o endpoint enviado já aciona.
Defina-a como 1 somente nas políticas cujos grupos você deseja rastrear. Uma política que não a define herda o valor da sua política catch-all match: {}, se essa política definir um, conforme as regras de mesclagem. Para impedir que os clientes de um grupo enviem traces mesmo quando um desenvolvedor define a variável localmente, defina-a como 0 na política desse grupo.
As codificações OTLP protobuf e JSON são repassadas, e qualquer backend compatível com OpenTelemetry funciona como destino.
Enviar métricas cumulativas
Se seu coletor aceita apenas métricas cumulativas, definaOTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE como cumulative. O Claude Code envia métricas delta por padrão, e o gateway as repassa sem convertê-las. Defina a variável onde cada tipo de sessão a lê:
- Sessões de terminal: no bloco
envsob a chaveclioucodede uma política - Sessões do Cowork que são executadas na máquina do usuário: no bloco
envdas configurações gerenciadas do lado do cliente nessa máquina - Sessões da aba Code sob uma política
code: no blocoenvda política, depois que você atender às condições para que as configuraçõescodese apliquem - Sessões da aba Code sob uma política
cli: no blocoenvdas configurações gerenciadas do lado do cliente na máquina que executa a sessão. Via SSH, esse é o host remoto.
parentSettingsBehavior: "merge" na fonte de maior prioridade nessa máquina. Sem isso, as sessões do Cowork e as sessões da aba Code sob uma política cli são executadas sem a allowlist de saída e as demais políticas que o Claude Desktop lhes passa como configurações pai.
Adicionar seus próprios rótulos
Para colocar rótulos fixos, comoservice.namespace ou deployment.environment.name, na telemetria das sessões conectadas por meio do gateway, defina telemetry.resource_attributes. Cada rótulo é um atributo de recurso do OpenTelemetry, e todos os destinos recebem os mesmos rótulos.
As sessões recebem os rótulos somente quando você também define telemetry.forward_to e listen.public_url. Este exemplo adiciona dois rótulos:
- Os nomes usam apenas letras, dígitos,
.,_e- - Os nomes não são reservados. Comparados em qualquer combinação de maiúsculas e minúsculas, os nomes reservados são tudo o que começa com
user.,enduser.ouidentity., além deservice.name,service.version,claude.deployment_mode,host.arch,os.type,os.versionewsl.version - Os valores são ASCII imprimível não vazio, sem espaço e sem nenhum destes:
, ; = \ " % - Os valores têm no máximo 255 caracteres conforme o gateway os conta após a codificação percentual, então
/,:e@contam como três cada - Os valores são texto, então coloque entre aspas um número,
trueoufalse
telemetry.resource_attributes. Um gateway anterior se recusa a iniciar quando encontra a chave. Atualize todas as réplicas antes de adicionar a chave e remova a chave antes de reverter para uma versão anterior.
Sessões de terminal conectadas por meio de /login recebem os rótulos como OTEL_RESOURCE_ATTRIBUTES, enviados com as outras variáveis de telemetria. Se você definir OTEL_RESOURCE_ATTRIBUTES no bloco env de uma política, as sessões de terminal que essa política corresponde recebem esse valor em vez dos rótulos. O Claude Desktop recebe os rótulos do gateway junto com user.email e os outros atributos de identidade.
O Claude Code também copia cada rótulo para cada ponto de dados de métrica, para que você possa filtrar as métricas por ele em um backend que não indexa atributos de recurso. Para desativar essa cópia, consulte Controle de cardinalidade de métricas.
Alterações de grupo durante uma sessão aberta
As sessões de terminal colocamuser.groups no recurso OTLP e novamente em cada ponto de dados de métrica e evento. Se os grupos de um desenvolvedor mudarem enquanto uma sessão está aberta, os pontos de dados e eventos do uso posterior à próxima atualização silenciosa carregam os novos grupos. O recurso mantém os grupos antigos até que o desenvolvedor reinicie o Claude Code, então agrupe pelo atributo no ponto de dados ou no evento.
Se você ativar resource_to_telemetry_conversion no exportador Prometheus remote write do OpenTelemetry Collector, o exportador substitui o user.groups de cada ponto de dados pelo do recurso, então todos os pontos de dados mostram os grupos antigos. Para manter o valor do ponto de dados, exclua user.groups do recurso antes desse exportador.
Este processador resource do OpenTelemetry Collector exclui o atributo nos pipelines que o listam:
resource/drop-user-groups aos processors do pipeline de métricas, cada série carrega o rótulo user_groups de seu próprio ponto de dados.
Exportar diretamente para o seu coletor
Para que as sessões conectadas por meio de/login enviem telemetria diretamente para o seu coletor em vez de passar pelo relay, defina OTEL_EXPORTER_OTLP_ENDPOINT como a URL base https:// do coletor no bloco env de uma política gerenciada. O Claude Code acrescenta /v1/metrics, /v1/logs ou /v1/traces à URL que você definir, como https://otel-collector.example.com:4318, e exporta cada sinal para lá via OTLP/HTTP. Requer o Claude Code v2.1.265 ou posterior na máquina de cada desenvolvedor. Clientes anteriores exportam por meio do relay.
Para autenticar no coletor, defina OTEL_EXPORTER_OTLP_HEADERS no mesmo bloco env. As sessões nunca enviam o token de sessão do gateway do desenvolvedor para um coletor especificado dessa forma.
Quando você adiciona ou altera esse endpoint em uma política, o Claude Code pede a cada desenvolvedor que o aprove na caixa de diálogo de aprovação de segurança antes de aplicá-lo em uma sessão interativa.
O Claude Code verifica o endpoint antes de exportar um sinal diretamente e mantém esse sinal no relay quando uma verificação falha. As verificações incluem:
- O endpoint vem do próprio gateway. Se você definir a mesma variável em um perfil MDM ou em um
managed-settings.jsonlocal, as exportações permanecem no relay. - A URL usa
https://, ouhttp://para um endereço de loopback - A URL resolve para um caminho que termina em
/v1/<signal>, sem query nem fragmento. O Claude Code constrói esse caminho por conta própria a partir da variável genérica. Ele usa uma variável por sinal, comoOTEL_EXPORTER_OTLP_METRICS_ENDPOINT, exatamente como escrita, portanto inclua o caminho completo nela. - A URL não é o próprio host do gateway. Um endpoint endereçado ao gateway mantém o caminho do relay e seu token de sessão.
- Nem você nem o desenvolvedor configuraram
otelHeadersHelperem nenhuma fonte de configurações. Com um helper configurado, todos os sinais permanecem no relay.
OTEL_*_EXPORTER.
O endpoint sozinho não ativa a exportação, então defina também as variáveis que fazem isso, a menos que o gateway já as envie:
- Se o gateway já envia as variáveis de telemetria, elas cobrem a ativação, os seletores e o protocolo, e o seu endpoint explícito sobrescreve o valor
<public_url>enviado. Defina você mesmo um seletorOTEL_*_EXPORTERcomootlpsomente para um sinal que nenhum destinoforward_toativa. - Caso contrário, defina também
CLAUDE_CODE_ENABLE_TELEMETRY=1, os seletoresOTEL_*_EXPORTEReOTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf.
Quando um destino falha
O gateway não armazena em buffer, não tenta novamente nem armazena telemetria, portanto descarta uma exportação que não chega a um destino em vez de entregá-la com atraso. Cada destino tem sucesso ou falha de forma independente, e o cliente que exporta recebe uma resposta de sucesso em qualquer caso, então uma entrega com falha aparece apenas no log do gateway. Após cinco entregas consecutivas com falha para um destino, o gateway pausa o encaminhamento para ele em intervalos de 30 segundos, registrando cada pausa em log, até que uma entrega seja bem-sucedida. Qualquer resposta de erro, timeout ou erro de conexão conta como uma entrega com falha, exceto400, 413, 415, 422 e 431, que significam que o coletor recusou o payload dessa exportação por estar malformado ou grande demais.
Um payload recusado não avança nem redefine a contagem de falhas: o gateway continua encaminhando para o destino e registra em log um aviso indicando o destino e o status, na primeira recusa do destino e a cada centésima depois disso.
Ajuste de HTTP
Quatro blocos opcionais de nível superior,access_control, limits, timeouts e rate_limits, ajustam a superfície HTTP. Os padrões atendem à maioria das implantações.
Se você deixar ambas as listas de
access_control vazias, que é o padrão, o gateway atende qualquer endereço de cliente, então apenas a sua rede restringe quem pode alcançá-lo. Isso importa porque um gateway pode enviar configurações gerenciadas que executam comandos nas máquinas dos desenvolvedores.
Enquanto allow_cidrs estiver vazio, o gateway emite avisos em dois lugares, sem alterar a forma como responde a qualquer requisição:
- Na inicialização: um aviso no log operacional recomenda permitir apenas os intervalos privados
10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,100.64.0.0/10,127.0.0.0/8,::1/128efc00::/7, além de quaisquer outros intervalos internos a partir dos quais seus desenvolvedores se conectam. Se você vincular o gateway a um endereço de loopback e não definir nemtrusted_proxiesnempublic_url, como no desenvolvimento local, o aviso não aparece. - Em tempo de execução: na primeira vez que uma requisição chega de um endereço fora desses intervalos privados, o gateway registra um aviso em log e emite um evento de auditoria
access.public_clientcontendo o IP do cliente. Ambos ocorrem uma vez por processo. Endereços link-local,169.254.0.0/16efe80::/10, não contam como públicos. O gateway responde a/healthze/readyzantes que essa verificação seja executada, então sondagens de integridade de intervalos públicos não a acionam.
listen.trusted_proxies, o gateway vê o endereço do intermediário, que geralmente é privado, então nem o aviso em tempo de execução nem uma lista de permissões privada capturam o tráfego retransmitido por ele.
Se o intermediário pertence a listen.trusted_proxies, liste-o ali. De qualquer forma, mantenha o gateway e tudo o que está à frente dele inacessíveis pela internet pública.
load_test_mode
O bloco load_test_mode permite fazer teste de carga em um gateway sem chamar um provedor de modelo. Enquanto está ativado, o gateway monta e assina cada requisição ao provedor normalmente, descarta-a em vez de enviá-la e transmite uma resposta pré-definida de volta pelo seu caminho normal de resposta. A resposta é um texto de preenchimento que começa com uma frase informando que ela é pré-definida.
Requer o Claude Code v2.1.282 ou posterior no servidor do gateway. Um gateway anterior se recusa a iniciar quando encontra a chave. Atualize todas as réplicas antes de adicionar o bloco e remova o bloco antes de reverter a versão.
O exemplo abaixo ativa o modo com os padrões, uma resposta de aproximadamente 750 tokens de texto transmitida ao longo de cerca de 10 segundos:
Um teste de carga neste modo abrange o gateway, seu Postgres e tudo o que estiver na frente do gateway. Ele não abrange os limites, a velocidade e o caminho de rede do provedor, nem a espera no limite de requisições upstream simultâneas de cada réplica. Uma réplica ainda registra em log o aviso
client requests are open quando há mais requisições abertas do que esse limite, o ponto em que as requisições de produção começam a esperar.
Nenhuma requisição de modelo é enviada ao provedor, portanto a CPU por requisição de uma réplica é uma estimativa e aparece menor do que em produção, que também criptografa seu tráfego para o provedor. Confirme a quantidade de réplicas com um pequeno piloto contra o provedor real. Antes da v2.1.283, a estimativa aparece muito menor.
Enquanto o modo está ativado, uma requisição pode carregar um cabeçalho x-load-test-user contendo um número inteiro de até sete dígitos. O gateway conta cada número como um desenvolvedor separado, com o e-mail e os grupos do desenvolvedor cujo token acompanhou a requisição.
Dê à implantação de teste de carga seu próprio banco de dados vazio, pois o gateway se recusa a iniciar com o modo ativado em um banco de dados no qual qualquer desenvolvedor já tenha gasto algo.
Exemplo completo
Esta configuração de referência completa exercita cada seção principal; os blocos de ajuste HTTP mantêm seus padrões. Copie-a, delete o que você não precisa e preencha seus valores. A configuração no Quickstart é uma versão mínima desta.gateway.yaml
Configurações gerenciadas no lado do cliente
Tudo acima configura o servidor gateway. Você aponta máquinas de desenvolvedores para o gateway separadamente, em cada dispositivo, através das configurações gerenciadas do Claude Code. O gateway não pode enviar as chaves de login por si só, porque são elas que dizem ao cliente onde o gateway está. Para a CLI, defina essas chaves nomanaged-settings.json por SO. As duas chaves de login encaminham cada /login do desenvolvedor para seu gateway:
parentSettingsBehavior: "merge" mantém a entrega da allowlist de saída do Claude Desktop para suas sessões incorporadas do Claude Code funcionando; Entregar política para sessões Claude Desktop explica o mecanismo e onde a aceitação deve estar.
Para impedir que os desenvolvedores contornem o gateway com uma variável de provedor de nuvem ou um ANTHROPIC_BASE_URL próprio, adicione "allowedProviders": ["gateway"] ao mesmo arquivo. O Claude Code então recusa toda sessão na máquina que não esteja configurada para um Cloud gateway, e admite um gateway apenas quando ele é aquele que forceLoginGatewayUrl nomeia ou um cuja URL o bloco env do arquivo define como ANTHROPIC_BASE_URL. claude gateway se recusa a ser executado em uma máquina que define a lista, portanto mantenha a chave fora do host do gateway. Veja a entrada allowedProviders na referência de configurações. Requer Claude Code v2.1.285 ou posterior.
Implante o arquivo managed-settings.json em cada dispositivo, normalmente através de sua plataforma MDM. O caminho do arquivo difere por plataforma. Veja onde cada mecanismo armazena a política.
Por padrão, uma política de registro no Windows ou um plist de preferências gerenciadas no macOS substitui o arquivo managed-settings.json em vez de mesclar com ele, exceto pelas chaves de exceção e verificações entre fontes acima. Todas as três chaves neste trecho seguem a regra de fonte de prioridade mais alta, portanto frotas que entregam política através de Group Policy ou perfis de configuração devem colocar todas as três nesse mecanismo.
Para Claude Desktop, defina a chave bootstrapUrl na própria configuração gerenciada do Claude Desktop como <listen.public_url>/user/bootstrap. O fluxo de entrada e a política por grupo correspondem aos da CLI uma vez que uma política aceita no servidor com uma chave desktop; sem a aceitação, /user/bootstrap retorna 404. Veja Claude Desktop overlay para a metade do servidor.
Claude Code honra forceLoginGatewayUrl, gatewayInternalNetworks e o valor "gateway" de forceLoginMethod de uma fonte gerenciada na máquina: managed-settings.json, o plist do macOS ou registro HKLM do Windows, ou um auxiliar de política. Defini-los no payload do gateway não configura o login no gateway. Para o próprio ~/.claude/settings.json de um desenvolvedor, veja Definir a URL do gateway nas configurações do usuário.
Deixe forceLoginMethod e forceLoginOrgUUID fora do payload. O Claude Code ainda lê ambas as chaves do payload para sua verificação de credenciais na inicialização, portanto um desenvolvedor que mantém uma credencial emitida pela Anthropic na máquina recebe a saída na inicialização descrita em Administrator policy requires a Cloud gateway sign-in mesmo depois de fazer login.
Relacionado
- Visão geral do gateway de aplicativos Claude: quickstart e conexão de desenvolvedor
- Guia de implantação: configuração de IdP, imagem de contêiner, Kubernetes e Cloud Run e operações
- Limites de gastos: limites por desenvolvedor e a API de Administração