Skip to content

6. Decisões de Arquitetura (ADRs)

Esta seção registra as decisões que fundamentam o CRP.AI. Cada ADR apresenta contexto, decisão, alternativas e consequências, incluindo benefícios e compromissos aceitos.


ADR-001: LiteLLM como AI Gateway

Contexto:

A CRP Tecnologia não possuía uma definição formal de uso de IA. O CRP.AI foi concebido para estabelecer um ponto único de acesso a modelos de IA, com governança, rastreabilidade e controle de custos — evitando um cenário onde cada squad contrataria seus próprios provedores sem visibilidade organizacional.

O ambiente é integralmente on-premises, o que eliminava soluções SaaS como gateways gerenciados. O gateway precisava oferecer compatibilidade com múltiplos provedores por meio de um protocolo unificado, aplicando autenticação, autorização, rate limiting e registro de uso.

Decisão:

Utilizar o LiteLLM Proxy auto-hospedado como implementação atual do AI Gateway corporativo. O AI Gateway é implantado em rede interna, acessível diretamente pelos colaboradores para consumo de IA por virtual keys e pelo Olimpo para operações de gestão por uma credencial de serviço. No fluxo suportado, o AI Gateway autentica cada requisição, aplica limites de uso e orçamento e encaminha chamadas aos provedores configurados.

Alternativas consideradas:

  1. API Management próprio: construir um proxy customizado para roteamento de requisições. Descartado por exigir desenvolvimento e manutenção de tradução de protocolos proprietários, rate limiting, budget e spend logging — funcionalidades que o LiteLLM oferece nativamente.

  2. Kong API Gateway com plugin de IA: utilizar Kong como proxy com plugins customizados. Descartado por não oferecer suporte nativo ao ecossistema de LLMs (streaming, tradução de protocolos proprietários, métricas de tokens).

  3. Nginx como proxy reverso simples: insuficiente para múltiplos provedores com protocolos diferentes, sem controle de chaves individuais, budgets ou rastreabilidade por colaborador.

  4. Portkey Gateway: funcionalidades similares ao LiteLLM, mas descartado por menor maturidade e dependência maior de componentes SaaS.

Consequências:

Positivas:

  • Suporte nativo a dezenas de provedores com tradução de protocolos para o formato OpenAI API
  • Virtual keys com controle granular por colaborador (budget, rate limits, modelos)
  • Spend logging, tracing e métricas integrados
  • Open-source, auto-hospedado, sem dependência de SaaS externo

Trade-offs:

  • Componente adicional no stack operacional (container, banco de dados dedicado)
  • Ponto único de falha no acesso a IA — exige monitoramento e estratégia de recuperação

ADR-002: Olimpo como camada de abstração do gateway

Contexto:

O LiteLLM Proxy foi escolhido como implementação atual do AI Gateway (ADR-001), mas acoplar diretamente a lógica de negócio do CRP.AI à sua API administrativa criaria um risco de dependência tecnológica: uma eventual substituição do gateway exigiria alterar a lógica de governança junto com a integração técnica.

O Olimpo é um sistema com seus próprios modelos de domínio (times, membros, permissões, budgets). A questão era como integrar o módulo CRP.AI ao AI Gateway sem tornar a governança dependente da API específica do LiteLLM Proxy.

Decisão:

Criar uma camada de abstração entre a lógica de negócio do CRP.AI e o AI Gateway. Esta camada define contratos (interfaces) agnósticos ao gateway — operações de gestão de times, chaves, modelos e consulta de uso — e uma implementação concreta para LiteLLM que traduz esses contratos para a API administrativa do gateway.

A lógica de governança do Olimpo consome contratos administrativos, sem depender da implementação concreta diretamente. Uma troca de gateway exige uma nova implementação dos contratos e a validação do endpoint exposto aos consumidores, mas reduz alterações na política e nas regras de negócio do módulo CRP.AI. O acoplamento é controlado por configuração, permitindo testes com implementações simuladas.

Alternativas consideradas:

  1. Acesso direto ao LiteLLM sem abstração: cada serviço consumiria diretamente a API administrativa do LiteLLM. Descartado por acoplar permanentemente o Olimpo à API do LiteLLM — qualquer mudança de gateway exigiria alterações em toda a base de código.

  2. Olimpo como proxy de tráfego de IA: o Olimpo atuaria como intermediário das chamadas de IA, repassando requisições ao gateway. Descartado por adicionar latência e complexidade desnecessárias ao fluxo de consumo, além de tornar o Olimpo um ponto único de falha para todo o tráfego de IA.

  3. Abstração sem separação física: implementar contratos e adaptadores no mesmo módulo da aplicação, sem isolamento. Descartado por não garantir enforcement — permitiria consumo acidental da implementação concreta, quebrando o isolamento.

Consequências:

Positivas:

  • Redução de acoplamento administrativo: substituir o LiteLLM concentra a mudança na integração de gateway e reduz impacto na lógica de governança
  • Testabilidade: lógica de negócio testável sem dependência de instância real do gateway
  • Proteção contra mudanças: isola o domínio da aplicação de alterações na API administrativa do LiteLLM

Trade-offs:

  • Camada adicional de indireção com transformação de modelos entre domínios
  • Manutenção dupla: alterações em contratos exigem atualização da implementação concreta
  • Overhead inicial de design que se paga na primeira troca de gateway ou breaking change

ADR-003: Padrão OpenAI API como interface de consumo

Contexto:

Cada provedor de IA expõe sua própria API nativa com convenções diferentes. Se o CRP.AI exigisse que os colaboradores se adaptassem à API nativa de cada provedor, o ecossistema de ferramentas compatíveis seria severamente limitado: cada ferramenta (OpenCode, Continue, Cursor) precisaria implementar suporte a múltiplos protocolos. Além disso, a troca de provedor implicaria alterações no código do consumidor.

O padrão OpenAI API consolidou-se como formato amplamente adotado pela indústria: a maioria dos provedores oferece compatibilidade total ou parcial, e muitas ferramentas do ecossistema de IA consomem o formato OpenAI.

Decisão:

Adotar o padrão OpenAI API como interface de consumo de modelos no CRP.AI. Colaboradores e suas ferramentas comunicam-se com o AI Gateway pelo formato exposto pelo gateway. Quando necessário e suportado, o AI Gateway traduz a requisição para o protocolo nativo do provedor de destino.

A seleção do modelo é feita por um identificador que o gateway interpreta para rotear ao provedor correto.

O CRP.AI Installer configura as ferramentas do colaborador apontando para o AI Gateway como endpoint OpenAI-compatible. A ferramenta comunica-se com o gateway corporativo, que aplica governança e então roteia ao provedor.

Alternativas consideradas:

  1. APIs nativas de cada provedor: expor aos colaboradores a API nativa de cada provedor. Descartado porque cada ferramenta teria de suportar múltiplos protocolos e a troca de provedor poderia exigir alterações no consumidor.

  2. Protocolo próprio do CRP.AI: definir um formato proprietário de requisição/resposta e exigir que ferramentas se adaptem a ele. Descartado por eliminar a compatibilidade imediata com o ecossistema de ferramentas existente — o CRP.AI se tornaria uma ilha que exigiria adaptadores para cada ferramenta.

  3. Suporte dual (OpenAI API + APIs nativas): oferecer tanto o formato OpenAI quanto as APIs nativas. Descartado por introduzir complexidade desnecessária de manutenção, documentação e suporte, além de abrir brechas de governança (um colaborador usando API nativa poderia contornar restrições aplicadas apenas no formato OpenAI).

Consequências:

Positivas:

  • Menor acoplamento ao provedor: a troca de provedor de um modelo pode preservar a configuração do consumidor quando o modelo ou alias e os recursos necessários forem mantidos pelo gateway.
  • Compatibilidade ampliada: ferramentas compatíveis com a interface exposta pelo gateway podem ser configuradas sem integração direta com cada provedor.
  • Menos variações de protocolo: colaboradores familiarizados com OpenAI API usam um formato já conhecido, embora continuem sujeitos às configurações e limites do gateway.
  • Streaming quando suportado: recursos de streaming dependem da compatibilidade entre a ferramenta, o gateway e o provedor selecionado.
  • Isolamento parcial de mudanças: alterações em APIs nativas tendem a ser tratadas no gateway, mas podem exigir validação de modelos, parâmetros e ferramentas consumidoras.

Trade-offs:

  • Menor denominador comum: o formato OpenAI API não expõe funcionalidades exclusivas de provedores específicos (ex: computer use da Anthropic, grounding do Google Gemini, features experimentais do Bedrock). Para acessar essas funcionalidades, seria necessário suporte adicional no CRP.AI
  • Dependência da tradução do LiteLLM: se o LiteLLM não oferecer tradução para um provedor ou modelo específico, o CRP.AI não conseguirá expô-lo pela interface adotada.
  • Latência adicional: a camada de tradução introduz processamento extra que deve ser considerado na avaliação de desempenho.
  • Funcionalidades não mapeáveis: parâmetros muito específicos de um provedor podem não ter equivalente no formato OpenAI e, portanto, não serem acessíveis através do CRP.AI

ADR-004: Virtual keys como mecanismo de controle de acesso

Contexto:

O CRP.AI precisava de um mecanismo que permitisse:

  • Cada colaborador ter sua própria chave de acesso, com identidade rastreável
  • Limites configuráveis por chave (orçamento, taxa de uso, modelos permitidos)
  • Revogação individual sem afetar outros colaboradores do mesmo time
  • As credenciais reais dos provedores nunca serem expostas fora do AI Gateway

O ambiente corporativo já utilizava Keycloak para SSO — o mecanismo deveria integrar-se com essa identidade federada.

Decisão:

Utilizar o modelo de virtual keys do AI Gateway: chaves individuais por colaborador, vinculadas ao seu time, com escopo limitado. Cada chave é configurada com parâmetros de limite de consumo, período de validade, modelos permitidos e limites de taxa de uso.

O módulo CRP.AI no Olimpo autoriza e solicita operações do ciclo de vida dessas chaves pela API administrativa do gateway. A chave real é gerada, mantida e validada pelo AI Gateway; o Olimpo mantém apenas metadados de aplicação e auditoria.

A identidade do colaborador é vinculada à chave através do identificador corporativo, permitindo rastreabilidade completa: cada chamada de IA é associada ao colaborador que a originou.

Alternativas consideradas:

  1. Credenciais próprias de usuário no Olimpo: o Olimpo emitiria credenciais e faria a tradução para chaves de provedor. Descartado por duplicar funcionalidades nativas do AI Gateway e por exigir o armazenamento de credenciais de provedores na plataforma.

  2. OAuth2 Client Credentials como chave de acesso: usar tokens OAuth2 de curta duração. Descartado por não ser suportado nativamente pelo ecossistema de ferramentas de IA (que esperam uma API key simples) e por adicionar latência de renovação de token.

  3. Chave única compartilhada por time: uma chave para todos os colaboradores. Descartado por impossibilitar rastreabilidade individual e revogação seletiva.

Consequências:

Positivas:

  • Rastreabilidade individual: cada chamada é vinculada ao colaborador
  • Controle granular: limite de consumo, limites de taxa e modelos por chave
  • Revogação independente sem afetar o time
  • Credenciais de provedores isoladas no gateway
  • Regeneração segura com preservação de histórico
  • Compatível com ferramentas que atendam à interface exposta pelo gateway

Trade-offs:

  • Dependência do gateway para geração e validação de chaves
  • Sincronização de estado entre Olimpo e gateway necessária em cenários de falha