InfraestruturaHabr AI→ original

Gateway de LLM open source KTMS 1.0 conecta GPUs próprias à nuvem e sobrevive a falhas

A equipe da Keystone lançou a versão 1.0 do KTMS, gateway escrito em Go sob licença Apache 2.0. Ele fica entre os aplicativos e os provedores de LLM. Agora é possível conectar máquinas próprias, como um Mac Studio ou um servidor Linux com placa de vídeo, como mais um "vendor". As requisições vão para lá em primeiro lugar, e a nuvem só é paga pelo excedente. A cada 5 segundos, o nó informa ao gateway a sua carga. Se, pela lei de Little, a espera na fila ultrapassar o limite do modelo, a requisição segue imediatamente para o próximo item da cadeia, em geral a nuvem. Para clientes interativos, o limite é mais rígido: 250 ms. • As chaves dos vendors no Postgres são criptografadas com AES-256-GCM, e a rotação ocorre em três etapas, sem perda de chaves. • As imagens são assinadas com cosign sem chave permanente e acompanham SBOM e SLSA-provenance. • As migrações apenas adicionam dados, então o deploy rolling acontece sem downtime. Não há rollback, apenas restauração a partir de backup.

Processado por IA de Habr AI; editado por Hamidun News
Gateway de LLM open source KTMS 1.0 conecta GPUs próprias à nuvem e sobrevive a falhas
Fonte: Habr AI. Colagem: Hamidun News.
Ouvir artigo
Ficha técnica e números-chave
ParâmetroDados
Fonte originalHabr AI ↗
Editor-chefe
Dado-chave #1As chaves dos vendors no Postgres são criptografadas com AES-256-GCM, e a rotação ocorre em três etapas, sem perda de chaves.
Dado-chave #2As imagens são assinadas com cosign sem chave permanente e acompanham SBOM e SLSA-provenance.
Dado-chave #3As migrações apenas adicionam dados, então o deploy rolling acontece sem downtime. Não há rollback, apenas restauração a partir de backup.

O KTMS (Keystone. The Model Switchboard) é um gateway de LLM open source escrito em Go: um ponto único pelo qual os aplicativos de uma empresa acessam modelos de diversos provedores. Os autores lançaram a versão 1.0 e explicaram como o gateway se comporta em produção. É possível conectar GPUs próprias e enviar requisições a elas antes de recorrer à nuvem paga. Para cada uma das três dependências (Postgres, Redis e o serviço de contabilização), o comportamento em caso de falha já está definido. As chaves de criptografia são trocadas sem perdas, e os releases são assinados e verificados. A atualização acontece sem parar o serviço.

GPUs próprias primeiro, nuvem como reserva

Muitas equipes têm um Mac Studio ou uma máquina Linux com uma boa placa que fica ociosa metade do tempo. Enquanto isso, a conta da nuvem cresce com requisições que um modelo local também resolveria. O KTMS transforma essas máquinas em um vendor à parte, chamado local.

O administrador emite, via gRPC, a chave do nó (exibida uma única vez) e registra o modelo. Na própria máquina, roda-se um único script. Ele instala o Ollama, o modelo e o agente do nó, configura os serviços em segundo plano e impede que o computador entre em suspensão. No macOS, não são necessários privilégios de administrador. Se algo der errado, o mesmo script com a flag --doctor aponta a causa: Ollama sem resposta, modelo não carregado, Ollama rodando na CPU via Rosetta, --tls incorreto. Há suporte a Ollama, vLLM, TGI e llama.cpp.

O gateway é quem se conecta ao nó, então ele precisa estar acessível. O agente consegue subir um túnel Cloudflare e um filtro na frente do engine. Só passam por ele POST /v1/chat/completions e GET /v1/models, de modo que não é possível baixar nem remover um modelo de fora.

A escolha do nó acontece em três etapas:

  • Filtro. Ficam os nós que têm o modelo necessário, um slot livre e janela de contexto suficiente. Os saudáveis vêm antes dos suspeitos, e os "quentes" (com o modelo já na memória) antes dos "frios".
  • Peso. O peso base é multiplicado por uma penalidade de carga, que cresce de forma quadrática com a ocupação dos slots, e por um fator de correção de velocidade. Esse fator é calculado a partir da velocidade de geração (tokens por segundo, peso 0,7) e do tempo até o primeiro token (peso 0,3), em relação à mediana de todos os nós com esse modelo.
  • Seleção. Aplica-se o smooth weighted round-robin, como no nginx.

A principal proteção contra lentidão é a estimativa de fila pela lei de Little: a profundidade da fila multiplicada pela duração esperada da requisição. Se o resultado passar de queue_timeout_ms do modelo (2000 ms no exemplo), a requisição vai imediatamente para o próximo modelo da cadeia. Para clientes interativos, o limite é de 250 ms. O slot é um lease no Redis, renovado enquanto a geração está em andamento.

Políticas de posicionamento: nodes_first (padrão), nodes_only (sem nó livre, retorna erro e a nuvem não é acionada), cloud_first e cloud_only. A escolha pode ser feita por cabeçalho, por campo da requisição ou por sufixo do modelo, por exemplo auto:nodes-only:high.

O que o gateway faz quando Redis e Postgres caem

O princípio: uma falha na contabilização não deve virar uma falha do serviço.

  • Redis. Os limites de requisições e de tokens são ignorados, sem contabilização. Para limites em dólares, é possível escolher o modo: open deixa passar, closed rejeita. O cache é tratado como miss. O estado dos nós fica desconhecido, então eles são pulados e a nuvem responde. Após três erros de rede seguidos, o gateway deixa de consultar o Redis por 2 segundos, e um Redis travado custa à requisição apenas um timeout.
  • Postgres. As chaves verificadas nos últimos 5 minutos continuam funcionando, e as demais recebem auth_unavailable. A verificação é limitada a 3 segundos. A configuração vem do último snapshot bem-sucedido. Um batch cuja idempotência não pode ser verificada é rejeitado, para que não se pague por ele duas vezes.
  • Serviço de contabilização. Os eventos se acumulam na memória (até 10 000), e as requisições não esperam por eles.

Quando o Postgres falha, /readyz responde 200 com status degraded enquanto a janela de chaves conhecidas estiver ativa, e 503 depois dela. Assim, o Kubernetes não reinicia os pods antes da hora. Cinco falhas seguidas abrem o circuit breaker do vendor, e após 30 segundos passa uma tentativa de teste. Vale configurar o alerta em ktms_dependency_errors_total.

Chaves, assinatura de releases e atualização sem downtime

As chaves dos vendors ficam no Postgres, criptografadas com AES-256-GCM. O keyring com as chaves de criptografia é passado pela variável KTMS_ENCRYPTION_KEYS e não é armazenado no banco. A rotação tem três etapas. Primeiro, adicionar a nova versão do keyring em todas as réplicas e esperar o fim do rollout. Depois, chamar RotateEncryption: em uma única transação, são recriptografadas as chaves dos vendors e os tokens dos nós. Por fim, remover a versão antiga quando não restar nenhum backup que dependa dela. Um dump junto com o keyring revela todas as chaves em texto aberto, por isso os dois devem ser guardados separadamente.

Desde a versão 0.14.0, as imagens são assinadas com cosign em modo keyless: a assinatura fica vinculada à identidade do workflow no GitHub Actions, e não há chave para roubar. As imagens acompanham SBOM (lista de componentes) e SLSA-provenance (registro de onde e como foram compiladas). Cada pull request passa pelo govulncheck, e um release não sai sem buf breaking e sem o teste de atualização. Os autores fazem uma ressalva honesta: a assinatura atesta a origem, não a segurança. Quem obtiver permissões sobre o workflow de release também conseguirá assinar uma imagem maliciosa.

Dentro da série 1.x, a API pública não é quebrada. As migrações são aplicadas na inicialização sob advisory-lock e apenas adicionam schema, então as réplicas antigas funcionam no banco novo enquanto as novas sobem. Não há rollback: o caminho de volta é o backup feito antes da atualização. Em caso de SIGTERM, as requisições têm 30 segundos para terminar, e o agente do nó entra primeiro em drain.

Para equipes com GPUs ociosas, é uma forma pronta de reduzir a conta da nuvem sem o risco de ficar sem resposta em caso de sobrecarga. Antes de colocar em produção, vale verificar o TLS (o próprio gateway fala gRPC em texto plano), remover o BOOTSTRAP_ADMIN_KEY, criar uma chave separada por cliente e acompanhar as conexões do Postgres (até 25 por réplica).

História

Perguntas frequentes sobre a notícia

O que se sabe sobre GPUs próprias primeiro, nuvem como reserva?

Muitas equipes têm um Mac Studio ou uma máquina Linux com uma boa placa que fica ociosa metade do tempo. Enquanto isso, a conta da nuvem cresce com requisições que um modelo local também resolveria. O KTMS transforma essas máquinas em um vendor à parte, chamado local. O administrador emite, via gRPC, a chave do nó (exibida uma única vez) e registra o modelo. Na própria máquina, roda-se um único script. Ele instala o Ollama, o modelo e o agente do nó, configura os serviços em segundo plano e impede que o computador entre em suspensão. No macOS, não são necessários privilégio

O que o gateway faz quando Redis e Postgres caem?

O princípio: uma falha na contabilização não deve virar uma falha do serviço. Redis. Os limites de requisições e de tokens são ignorados, sem contabilização. Para limites em dólares, é possível escolher o modo: open deixa passar, closed rejeita. O cache é tratado como miss. O estado dos nós fica desconhecido, então eles são pulados e a nuvem responde. Após três erros de rede seguidos, o gateway deixa de consultar o Redis por 2 segundos, e um Redis travado custa à requisição apenas um timeout. Postgres. As chaves verificadas nos últimos 5 minutos continuam funcionando, e as

O que se sabe sobre Chaves, assinatura de releases e atualização sem downtime?

As chaves dos vendors ficam no Postgres, criptografadas com AES-256-GCM. O keyring com as chaves de criptografia é passado pela variável KTMS_ENCRYPTION_KEYS e não é armazenado no banco. A rotação tem três etapas. Primeiro, adicionar a nova versão do keyring em todas as réplicas e esperar o fim do rollout. Depois, chamar RotateEncryption: em uma única transação, são recriptografadas as chaves dos vendors e os tokens dos nós. Por fim, remover a versão antiga quando não restar nenhum backup que dependa dela. Um dump junto com o keyring revela todas as chaves em texto aberto,

ZK
Zhemal Khamidun — CPO da Alpina Digital, gerente de produto do AlpinaGPT. Cria produtos de IA desde 2019. O Hamidun News é um projeto pessoal que virou um agregador em produção com mais de 6.000 leitores.
✦ Unified AI Workspace · Nomad

Test Frontier LLMs & Autonomous Agents in One Workspace

Run Claude Opus 5.5, GPT-6, Gemini 3.1, and DeepSeek side-by-side in Nomad AI (nomadnet.ai) — unified model routing, deep research, and multimodal workflows under one subscription.

Try Nomad AI →Launch Nomad Agent
O que você acha?
Carregando comentários…