LLM Gateway Design: Rate Limiting, Caching e Fallback para Múltiplos Providers | Lemon.dev
LLM Gateway Design: Como Construir um App de IA Resiliente com Rate Limiting, Caching e Fallback
A Ilusão da Dependência Única
Em 2025, o aplicativo de IA Fable 5 foi repentinamente banido de um grande provedor de modelos de linguagem. O motivo? Uma cláusula de export control que mudou da noite para o dia. O resultado? Milhões de usuários no escuro, uma equipe de engenharia em pânico e uma lição dura: depender de um único provedor de LLM é um risco existencial.
A cena é familiar para desenvolvedores que trabalham com APIs de grandes modelos:
// ❌ Código frágil, acoplado a um único fornecedor
import OpenAI from 'openai';
const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });
const response = await openai.chat.completions.create({ model: 'gpt-4', messages: [...] });
Se amanhã a OpenAI quebrar, aumentar o preço em 10x ou alterar seus termos de serviço, todo o seu sistema quebra junto. A solução? Um LLM Gateway – uma camada de abstração que isola sua aplicação dos provedores e adiciona funcionalidades críticas como rate limiting, caching e fallback automático.
Neste artigo, você vai aprender os princípios de design de um gateway multi-LLM, com exemplos práticos e estratégias para garantir que seu app sobreviva a falhas, picos de uso e mudanças de mercado.
1. O Problema Real: Vendor Lock-In
O vendor lock-in em LLMs não é apenas teórico. Dados recentes mostram que provedores mudam preços, modelos e políticas com frequência. As consequências incluem:
- Custos imprevisíveis: sem abstração, trocar de provedor exige reescrever todo o código de chamada.
- Indisponibilidade: quedas de API podem derrubar seu produto em horários críticos.
- Riscos legais: mudanças em termos de uso (como as cláusulas de export control) podem inviabilizar seu negócio.
O primeiro passo para escapar disso é projetar uma interface única e consistente para todos os provedores.
2. Os Pilares de um LLM Gateway
Um gateway bem projetado precisa de três componentes essenciais:
2.1 Abstração de Provedores: Uma Interface Única
Crie uma função genérica, como chatCompletion(), que aceita parâmetros padronizados (modelo, mensagens, temperatura) e retorna uma resposta no mesmo formato, independente do provedor interno.
interface LLMProvider {
chatCompletion(params: ChatParams): Promise<ChatResponse>;
}
class OpenAIProvider implements LLMProvider { /* ... */ }
class AnthropicProvider implements LLMProvider { /* ... */ }
class LocalProvider implements LLMProvider { /* ... */ }
Isso permite que você troque de provedor sem alterar uma linha do código de negócio.
2.2 Rate Limiting: Controle de Fluxo Inteligente
Sem rate limiting, um pico de requisições pode estourar sua cota no provedor ou gerar custos exorbitantes. Implemente:
- Limites por cliente (ex: 100 req/min por usuário).
- Limites globais (baseados no plano do provedor).
- Exponential backoff: se o limite for atingido, aguarde e tente novamente com tempo crescente.
Uma boa implementação usa uma biblioteca como express-rate-limit (para APIs Node.js) ou token bucket para controle preciso.
2.3 Caching: Reduza Custos e Latência
Consultas repetitivas (ex: respostas para perguntas frequentes) podem ser armazenadas em cache. Estratégias:
- Cache TTL: respostas comuns podem expirar após alguns minutos.
- Cache por embedding: agrupe consultas semanticamente semelhantes.
- Cache em Redis ou memcached para baixa latência.
O cache reduz drasticamente o custo por requisição e torna o sistema mais rápido.
2.4 Fallback e Roteamento: Resiliência Automática
O fallback é o coração de um gateway robusto. Em vez de falhar, você roteia a requisição para outro provedor:
async function chatCompletionWithFallback(params, providers) {
for (const provider of providers) {
try {
return await provider.chatCompletion(params);
} catch (error) {
if (isRetryable(error)) {
continue; // Tenta próximo provedor
}
throw error;
}
}
throw new Error('Todos os provedores falharam');
}
Roteamento inteligente: você pode priorizar provedores com base em critérios como:
- Preço mais baixo
- Menor latência
- Qualidade de resposta (ex: modelos mais capazes primeiro)
Teto de preço: defina um custo máximo por requisição e mude de provedor se o limite for atingido.
3. Arquitetura Multi-LLM na Prática
Vamos unir tudo em um exemplo funcional. Imagine um serviço que usa:
- Cliente compatível com OpenAI: a interface padronizada (ex: usando a biblioteca
openaicomo base, mas com adaptadores para outros provedores). - OpenRouter como intermediário de roteamento (já oferece fallback e controle de preços).
- Camada própria de fallback codificada no backend.
// Adaptador genérico
class MultiLLMAdapter {
constructor(private providers: LLMProvider[], private fallbackConfig: FallbackConfig) {}
async chat(params, options?: { maxCost?: number }) {
for (const provider of this.providers) {
if (this.exceedsCost(params, provider, options?.maxCost)) continue;
try {
const result = await provider.chatCompletion(params);
await this.cacheResult(params, result);
return result;
} catch (e) {
logger.warn(`Provider ${provider.name} falhou: ${e.message}`);
}
}
throw new AppError('Todos os provedores falharam');
}
}
Boas práticas de implementação:
- Log de métricas: registre latência, custo por provedor, taxa de falhas. Use essas métricas para ajustar a ordem de roteamento.
- Testes de caos: simule quedas de provedores periodicamente para verificar se os fallbacks funcionam.
- Notificações: se todos os provedores falharem, dispare um alerta para a equipe de plantão.
4. O Futuro dos Apps Multi-LLM
O mercado de LLMs está amadurecendo, mas a volatilidade continua. Provedores menores surgem, modelos open-source ganham qualidade, e as regras de uso mudam regularmente. Construir um gateway hoje é um investimento que se paga na primeira grande falha.
Empresas como Lemon.dev e APIMart já oferecem soluções gerenciadas para rate limiting e caching, mas a arquitetura final de fallback ainda depende do seu design.
O segredo não é escolher o modelo perfeito, mas tornar seu sistema capaz de sobreviver a qualquer modelo.
Conclusão: Resiliência é o Novo Padrão
Depender de um único provedor de LLM é como construir sua casa sobre uma única pilastra. Um gateway multi-LLM, com rate limiting, caching e fallback automático, transforma seu sistema em uma plataforma robusta que:
- Reduz riscos: falhas de provedor não derrubam o app.
- Controla custos: caching e roteamento inteligente evitam surpresas na fatura.
- Melhora a experiência do usuário: latência menor e disponibilidade constante.
Comece hoje abstraindo uma única chamada de API. Depois, adicione cache. Por último, implemente fallback. Você não precisa fazer tudo de uma vez, mas precisa começar.
Lembre-se do Fable 5. Sua arquitetura pode ser a diferença entre uma crise e um ajuste de rota.
Quer se aprofundar na implementação? Deixe nos comentários qual provedor você mais usa e quais desafios enfrenta com dependência única.