Todo tráfego de IA da empresa passando pelo seu gateway

As estações de trabalho deixam de falar com a Anthropic, a OpenAI ou o Google. Elas falam com um nome interno, e o gateway faz o resto: identidade, orçamento, DLP, trilha e roteamento, sem o desenvolvedor perceber.

O que você vai montar

Estação do desenvolvedor (Claude Code, Cursor, SDKs, scripts e agentes. Mandam uma chave virtual.) -> llm.empresa.com (Atlasberg Platform. Governança, custos, DLP, trilha, roteamento.) -> Provedores (api.anthropic.com, api.openai.com, generativelanguage. Recebem a chave real.). O firewall bloqueia o caminho pontilhado: as estações não alcançam os provedores diretamente. Só o gateway alcança.

  • A chave real vive só no gateway. A chave da Anthropic, da OpenAI e de qualquer outro provedor é cadastrada uma única vez, em Modelos > Provedores. Nenhuma pessoa tem chave de provedor. O que a pessoa recebe é uma chave virtual, que só vale contra o gateway.
  • O firewall bloqueia a saída direta. Os domínios dos provedores ficam bloqueados para toda a rede, com exceção do gateway. Sem essa regra, "todo tráfego passa por nós" é uma intenção. Com ela, é um fato, e qualquer ferramenta desconfigurada falha alto em vez de vazar.
  • Os clientes só mudam o endereço. Claude Code, Cursor e SDKs continuam falando o protocolo nativo deles. A única diferença é a base URL, que aponta para a rota drop-in correspondente no gateway.
  • Custo por pessoa, time e cliente, com orçamento e limite de uso que valem antes de a fatura chegar.
  • DLP, guardrails e trilha de auditoria em toda requisição, sem depender de o desenvolvedor lembrar de nada.
  • Modelo padrão e roteamento: uma regra global decide qual modelo atende quem não escolhe, e o roteador por complexidade manda tarefa simples para modelo barato.
  • Economômetro: um medidor passivo que aponta prompt gigante, contexto repetido, teto de tokens exagerado e modelo caro em tarefa trivial, com a economia estimada.

As três regras

O que a empresa ganha no mesmo movimento

Cinco conceitos que importam

  • Header: x-atlasberg-vk | Regra: Aceito verbatim | Quem manda assim: Integrações próprias, scripts
  • Header: Authorization: Bearer | Regra: Só com prefixo sk-atlas- | Quem manda assim: SDK OpenAI, Codex, Claude Code via ANTHROPIC_AUTH_TOKEN
  • Header: x-api-key | Regra: Só com prefixo sk-atlas- | Quem manda assim: SDK Anthropic, Claude Code via ANTHROPIC_API_KEY
  • Header: x-goog-api-key | Regra: Só com prefixo sk-atlas- | Quem manda assim: SDK Google GenAI, Gemini CLI
  • Header: api-key | Regra: Só com prefixo sk-atlas- | Quem manda assim: SDK Azure OpenAI
  • Rota: /anthropic | Fala o protocolo de: Anthropic Messages, count_tokens, models, batches, files | Usada por: Claude Code, SDK Anthropic
  • Rota: /openai | Fala o protocolo de: OpenAI chat, responses, embeddings, files, batches | Usada por: SDK OpenAI, Codex, Continue, Cline, Aider
  • Rota: /cursor | Fala o protocolo de: OpenAI, com o payload híbrido que o Cursor envia | Usada por: Cursor
  • Rota: /genai | Fala o protocolo de: Google GenAI | Usada por: SDK Google, Gemini CLI
  • Rota: /bedrock, /cohere | Fala o protocolo de: Bedrock e Cohere | Usada por: SDKs correspondentes
  • Rota: /litellm, /langchain, /pydanticai | Fala o protocolo de: Formatos desses frameworks | Usada por: Aplicações internas
  • Rota: /v1/chat/completions, /v1/messages | Fala o protocolo de: API unificada na raiz | Usada por: Qualquer cliente

Chave virtual

É a credencial que a pessoa, o agente ou o pipeline usa contra o gateway. Sempre começa com o prefixo sk-atlas-. Cada chave carrega os provedores e modelos permitidos (lista vazia nega tudo; o padrão é negar), orçamento em dólar com período de reset, limite de uso em tokens e requisições por janela, expiração opcional, estado ativo ou inativo, e as ferramentas MCP que pode executar.

Cliente, time e chave

A hierarquia é cliente > time > chave virtual. Uma chave pertence a um time, e o time pode pertencer a um cliente. Cada nível tem orçamento e limite próprios, e a avaliação segue a ordem chave, cliente, time. Não existe uma entidade "usuário" dona de chave: para dar chave a uma pessoa, você cria uma chave com o nome dela dentro do time dela. A chave passa a ser o identificador da pessoa em custos, trilha, Economômetro e chargeback. O Tutorial 3 mostra como o login único substitui essa chave por pessoa por um token pessoal.

Onde o gateway lê a chave

O prefixo é obrigatório nos headers dos SDKs por decisão de projeto: uma chave de provedor nunca é confundida com uma chave virtual.

Rotas drop-in

Nome do modelo

O cliente pode mandar o modelo sem prefixo, como claude-sonnet-5. O catálogo de modelos resolve o provedor. Com prefixo, como anthropic/claude-sonnet-5, a escolha é explícita. Se o catálogo não conhece o modelo e não há prefixo, o gateway responde 400 pedindo o provedor.

Parte 1: prepare o gateway

Trabalho da infra, feito uma vez. Ao fim desta parte o gateway está publicado na rede, com as chaves reais dos provedores e um modelo padrão.

Sobre TLS interno: Se o certificado for da CA corporativa e o Claude Code reclamar de certificado, aponte a variável NODE_EXTRA_CA_CERTS para o bundle PEM da CA no arquivo gerenciado. Isso vale para qualquer ferramenta em Node.

1. Publique um nome interno com TLS válido

Escolha um nome como llm.empresa.com. O certificado pode ser da CA corporativa, desde que essa CA esteja instalada em todas as estações. Claude Code, Cursor e SDKs validam o certificado como qualquer cliente HTTPS. Se preferir, um certificado público resolve sem depender do MDM.

2. Cadastre as chaves dos provedores

No console, em Modelos > Provedores, adicione a chave da Anthropic, da OpenAI e de quem mais a empresa usa. Prefira credencial por variável de ambiente, que fica fora do arquivo de estado do appliance. Marque os modelos habilitados. Isso alimenta o catálogo que resolve nomes sem prefixo.

3. Libere a saída do gateway e bloqueie a das estações

No firewall, o gateway pode alcançar api.anthropic.com, api.openai.com, generativelanguage.googleapis.com e os demais. O resto da rede não. Faça essa regra antes de anunciar o gateway, para que ninguém dependa de um caminho que vai fechar.

4. Deixe a exigência de chave ligada

O gateway sai de fábrica exigindo chave virtual em toda inferência (enforce_auth_on_inference). Mantenha assim. A leitura é fail-closed: valor ausente é tratado como "exigir". Você pode conferir o valor efetivo em GET /api/config, no bloco enforcement.

5. Mantenha chaves diretas desligadas

O flag allow_direct_keys permite que um cliente traga a própria chave de provedor com o header x-atlasberg-direct-key: true e ignore o pool cadastrado. Isso derrota a regra número um. Deixe desligado.

6. Defina o modelo padrão com uma regra global

Em Modelos > Regras de roteamento, crie uma regra de escopo global com a expressão CEL true e um alvo com o provedor e o modelo desejados. Toda requisição passa a cair nesse modelo, independentemente do que o cliente pediu. Se quiser algo mais fino, use uma expressão que casa só requisições sem preferência, ou uma regra por time.

7. Opcional: ligue o roteador por complexidade

O gateway classifica cada prompt em um tier de complexidade. Uma regra que referencia complexity_tier manda tarefa simples para modelo barato e tarefa pesada para modelo forte. Combine com o modelo padrão: a regra por complexidade vem primeiro, o padrão fecha o resto.

curl -s https://llm.empresa.com/api/config | jq .enforcement
# { "enforce_auth_on_inference": true, "allow_direct_keys": false }

Parte 2: monte a governança

Aqui nasce a atribuição. Sem ela o gateway ainda governa, mas não sabe dizer quem gastou.

Autoatendimento: Qualquer pessoa pode consultar a própria cota sem acesso administrativo, apresentando só a chave: GET /api/governance/virtual-keys/quota com o header x-atlasberg-vk. Vale para um script de status na barra do terminal.

1. Crie os clientes, se fizer sentido

Em Governança > Clientes, cadastre unidades de negócio, subsidiárias ou contas que precisam de fatura separada. Uma empresa pequena pode pular este passo.

2. Crie os times com orçamento

Em Governança > Times, crie um time por área (Engenharia, Produto, Marketing). Dê a cada time um orçamento mensal e, se quiser, um limite de tokens por dia. Os orçamentos dos times são o que a tela de Custos e o Painel executivo somam.

3. Crie uma chave por pessoa dentro do time

Em Governança > Chaves virtuais, crie a chave com o nome da pessoa (eng-maria), atribua ao time, marque os provedores e os modelos permitidos, defina orçamento e expiração. Copie o valor sk-atlas-...: ele aparece uma vez. Agentes, pipelines de CI e bots recebem chave própria, nunca a chave de uma pessoa. Se a lista de modelos permitidos ficar vazia, a chave nega tudo; marque pelo menos um modelo por provedor.

4. Ligue o corte suave nos orçamentos

Em Custos > Orçamentos, defina um orçamento mensal por unidade, time ou pessoa que, ao estourar, degrada para um modelo mais barato em vez de negar a requisição. A precedência é pessoa, depois time, depois unidade. Atenção: o modelo barato precisa estar na lista de permitidos da chave. Se não estiver, o gateway não reescreve, registra o evento budget.degrade_blocked e avisa no painel.

5. Entregue a chave pela infra, não pela pessoa

O jeito certo de a chave chegar à máquina é o provisionamento: MDM, script de onboarding ou secret do gerenciador de senhas corporativo. A pessoa não deve colar chave em lugar nenhum. O Tutorial 2 mostra como o Claude Code lê a chave sem que ninguém a veja, e o Tutorial 3 substitui a chave pelo login único.

Parte 3: verifique e resolva problemas

Quatro chamadas com curl provam a implantação de ponta a ponta. Depois, os erros que mais aparecem e o que cada um significa.

  • Resposta: 401 virtual_key_required | Significa: A requisição chegou sem chave e a exigência está ligada | O que fazer: Conferir a variável ou o apiKeyHelper; conferir se a chave tem o prefixo sk-atlas- no header usado
  • Resposta: 401 virtual_key_not_found | Significa: A chave existe na máquina mas não no gateway: revogada, expirada ou digitada errado | O que fazer: Ver a chave em Governança; reemitir se preciso
  • Resposta: 403 modelo ou provedor não permitido | Significa: A chave não tem esse modelo na lista de permitidos | O que fazer: Adicionar o modelo à chave ou ao time; lembrar que lista vazia nega tudo
  • Resposta: 400 "could not auto resolve a provider" | Significa: O modelo não está no catálogo e veio sem prefixo | O que fazer: Habilitar o modelo em Provedores ou usar provedor/modelo
  • Resposta: 429 orçamento ou limite | Significa: Chave, time ou cliente estourou o orçamento ou o rate limit | O que fazer: Ver a cota; ajustar o orçamento; ligar o corte suave para degradar em vez de negar
  • Resposta: Erro de certificado no cliente | Significa: A CA corporativa não está na estação ou não é vista pelo Node | O que fazer: Instalar a CA via MDM; definir NODE_EXTRA_CA_CERTS no arquivo gerenciado
  • Resposta: Claude Code lento para abrir ou com avisos de rede | Significa: Chamadas de telemetria e atualização batendo no firewall | O que fazer: Definir CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1
  • Resposta: Painel mostra custo zero com tráfego | Significa: O provedor não reportou preço, ou o modelo não tem preço no catálogo | O que fazer: Conferir o catálogo e o preço customizado; o gateway nunca inventa um valor

Erros comuns

curl -s https://llm.empresa.com/health
# {"status":"ok",...}
curl -s https://llm.empresa.com/anthropic/v1/messages \
  -H "x-api-key: sk-atlas-..." \
  -H "anthropic-version: 2023-06-01" \
  -H "content-type: application/json" \
  -d '{"model":"claude-sonnet-5","max_tokens":32,
       "messages":[{"role":"user","content":"responda apenas ok"}]}'
curl -s https://llm.empresa.com/api/governance/virtual-keys/quota \
  -H "x-atlasberg-vk: sk-atlas-..."
curl -s --max-time 5 https://api.anthropic.com/v1/models
# curl: (28) Connection timed out

Checklist de implantação

  • Nome interno publicado com TLS válido nas estações
  • Chaves dos provedores cadastradas por variável de ambiente
  • Modelos habilitados no catálogo, com preço
  • Firewall: gateway sai, estações não
  • enforce_auth_on_inference ligado e conferido em /api/config
  • allow_direct_keys desligado
  • Regra global de modelo padrão criada
  • Clientes e times criados com orçamento mensal
  • Uma chave por pessoa, uma por agente ou pipeline, todas dentro de um time
  • Modelos permitidos marcados em cada chave
  • Corte suave configurado, com o modelo barato na lista de permitidos
  • Os quatro testes acima passam de uma estação comum
  • A requisição de teste aparece em Custos com o nome da pessoa e do time
  • Uma requisição sem chave recebe 401
  • Uma chamada direta ao provedor falha por rede

Gateway

Governança

Validação

Faça tudo com um agente de IA

Se preferir delegar, cole o prompt abaixo no Claude Code ou em outro agente de IA com acesso ao terminal. Ele foi escrito para perguntar tudo o que precisa antes de mexer em qualquer coisa, mostrar um plano, esperar a sua confirmação e só então executar. Ele nunca pede o valor de uma chave de provedor e nunca grava segredo em arquivo do repositório.

Próximo: conecte o Claude Code, o Cursor e os SDKs

Duas variáveis, um arquivo gerenciado e o script de credencial que mantém a chave invisível.

Ou dispense a chave de vez

Configure o SSO e o login por dispositivo para as pessoas entrarem com a identidade corporativa, do terminal.

Você é meu engenheiro de infraestrutura e vai configurar a Atlasberg Platform como o gateway único de IA da empresa, seguindo o tutorial https://atlasberg.com/docs/tutoriais/gateway-da-empresa e a referência da API de gestão em https://atlasberg.com/docs/api/gestao. Trabalhe pela API do gateway com curl. Nunca invente valores: tudo o que não estiver abaixo, pergunte.

Antes de fazer qualquer coisa, me pergunte, uma pergunta por vez, e espere a resposta:
1. A URL do gateway (exemplo: https://llm.empresa.com) e como autenticar na API de gestão (usuário e senha de administrador, ou um token). Nunca repita a senha de volta na conversa nem a grave em arquivo.
2. Quais provedores a empresa usa (Anthropic, OpenAI, Google, outros) e, para cada um, o NOME da variável de ambiente do appliance onde a chave real está. Não me peça o valor da chave. Se eu colar uma chave por engano, avise e peça para eu rotacioná-la.
3. Os modelos que devem ficar habilitados em cada provedor e qual deve ser o modelo padrão da empresa.
4. Se existem unidades de negócio ou clientes que precisam de fatura separada, com nome e orçamento mensal em dólar. Se não existirem, pule.
5. Os times: nome, orçamento mensal em dólar, limite de tokens por hora (opcional) e a que unidade pertencem.
6. As pessoas, agentes e pipelines de cada time que precisam de chave própria, e os modelos permitidos para cada um. Uma chave por pessoa, uma por agente ou pipeline, nunca compartilhada.
7. Se quero corte suave (ao estourar o orçamento, degradar para um modelo mais barato em vez de negar) e qual é o modelo barato. Ele precisa estar na lista de permitidos de cada chave.
8. Se o gateway usa certificado de uma CA corporativa.

Quando tiver tudo, mostre um plano resumido em tabela (provedores, unidades, times, chaves, regra de modelo padrão) e peça a minha confirmação. Só então execute, nesta ordem, conferindo o código de status de cada resposta e parando no primeiro erro:
a) GET /api/config: confira que enforcement.enforce_auth_on_inference é true e allow_direct_keys é false. Se não for, me avise antes de mudar qualquer coisa.
b) Provedores: GET /api/providers para ver o que já existe; POST /api/providers com {"provider":"<nome>"} para os que faltam. Para a chave, leia primeiro a resposta de GET /api/providers/<nome> e a referência da API para saber o formato exato do campo value, e cadastre a chave por referência à variável de ambiente, nunca pelo valor, em POST /api/providers/<nome>/keys, com os modelos habilitados e weight 1.
c) Unidades: POST /api/governance/customers com {"name":"...","budgets":[{"max_limit":<usd>,"reset_duration":"1M"}],"calendar_aligned":true}.
d) Times: POST /api/governance/teams com {"name":"...","customer_id":"<id da unidade>","budgets":[{"max_limit":<usd>,"reset_duration":"1M"}],"calendar_aligned":true} e, se houver limite, "rate_limit":{"token_max_limit":<n>,"token_reset_duration":"1h"}.
e) Chaves virtuais: POST /api/governance/virtual-keys com {"name":"eng-maria","description":"...","team_id":"<id do time>","provider_configs":[{"provider":"anthropic","allowed_models":["claude-sonnet-5"],"key_ids":["*"]}],"is_active":true} e, se houver, "budgets":[...]. Guarde o campo value de cada resposta e me entregue todas as chaves UMA única vez, num bloco separado no fim, avisando que elas não aparecem de novo. Não grave as chaves em arquivo nenhum.
f) Modelo padrão: POST /api/governance/routing-rules com {"name":"Modelo padrão da empresa","description":"Quem não escolhe modelo cai aqui","cel_expression":"true","targets":[{"provider":"<provedor>","model":"<modelo>","weight":1}],"scope":"global","priority":100,"enabled":true,"chain_rule":false}.
g) Corte suave, se eu tiver pedido: configure em Custos > Orçamentos no console, ou pela API correspondente da referência; confirme que o modelo barato está permitido em todas as chaves.
h) Testes: GET /health; POST /anthropic/v1/messages com uma das chaves no header x-api-key e um pedido de 32 tokens; GET /api/governance/virtual-keys/quota com o header x-atlasberg-vk. Mostre as respostas resumidas.
i) Entregue o checklist de implantação do tutorial preenchido, marcando o que ficou pendente fora do gateway: nome interno com TLS, regra de firewall que bloqueia a saída direta das estações para os provedores, distribuição das chaves pelo MDM ou script de onboarding, e a variável NODE_EXTRA_CA_CERTS se a CA for corporativa.

Regras: se um endpoint responder diferente do esperado, mostre a resposta e pergunte antes de contornar. Não crie chave sem time. Não habilite chaves diretas de provedor. Não desligue a exigência de chave virtual.

Sobre a Atlasberg Platform

A Atlasberg Platform é a camada de controle entre uma empresa e todos os modelos de IA: cada requisição é autenticada com uma chave virtual, filtrada por política e DLP, roteada para o provedor certo e gravada numa trilha de auditoria encadeada por hash. Expõe uma API compatível com a OpenAI, então as aplicações só trocam a URL base.

O mesmo artefato roda na Atlasberg Cloud, na sua VPC, on-premises ou totalmente air-gapped, e é cobrado por capacidade e módulos, nunca por assento.

Esta página faz parte da documentação oficial. Para falar com o time de engenharia, escreva para [email protected] ou use https://atlasberg.com/pt-br/contato. A resposta vem em até um dia útil.

Agentes: esta página também está disponível em Markdown em /pt-br/docs/tutoriais/gateway-da-empresa.md, ou pedindo esta URL com o cabeçalho Accept: text/markdown. Índice de tudo: /llms.txt.