Files
OmniRoute/docs/TASKS.md
diegosouzapw 6e29bd1197 feat(resilience): rate limit overhaul — exponential backoff, circuit breaker, anti-thundering herd, Resilience UI
Phase 1: Error classification + provider profiles (constants, providerRegistry, accountFallback)
Phase 2: Circuit breaker integration in combo pipeline (combo.js)
Phase 3: Anti-thundering herd mutex + auto rate limits for API key providers (auth.js, rateLimitManager)
Phase 4: Frontend Resilience tab with Circuit Breaker, Provider Profiles, Rate Limit cards

Tests: 63/63 passing (error-classification, combo-circuit-breaker, thundering-herd, rate-limit-enhanced)
2026-02-15 01:42:50 -03:00

3.5 KiB
Raw Blame History

Rate Limiting & Flow Control Overhaul — Tasks

Referência: Relatório de Análise · Fase docs em /docs/phases/


Fase 1 — Error Classification & Provider Profiles

Backend Core

  • constants.js — Substituir COOLDOWN_MS.transient por transientInitial (5s) + transientMax (60s)
  • constants.js — Adicionar PROVIDER_PROFILES (oauth / apikey) com cooldowns diferenciados
  • constants.js — Adicionar DEFAULT_API_LIMITS (100 RPM, 200ms minTime)
  • providerRegistry.js — Criar helper getProviderCategory(providerId)"oauth" | "apikey"
  • accountFallback.js — Aceitar provider como parâmetro em checkFallbackError
  • accountFallback.js — Implementar backoff exponencial para 502/503/504 transientes
  • accountFallback.js — Calcular cooldown baseado no perfil do provedor
  • accountFallback.js — Adicionar helper getProviderProfile(provider)

Callers (propagar provider)

  • auth.jsmarkAccountUnavailable — Passar provider para checkFallbackError
  • combo.jshandleComboChat / handleRoundRobinCombo — Passar provider nos erros

Testes

  • Atualizar rate-limit-enhanced.test.mjs — Teste "transient errors don't increase backoff" → newBackoffLevel = 1
  • Criar error-classification.test.mjs — Cooldown exponencial 502, perfis OAuth/API, helper getProviderCategory

Fase 2 — Circuit Breaker no Combo Pipeline

Backend

  • combo.js — Importar getCircuitBreaker e CircuitBreakerOpenError
  • combo.jshandleComboChat — Verificar breaker.canExecute() antes de cada modelo
  • combo.jshandleRoundRobinCombo — Integrar breaker per-model
  • combo.js — Marcar semaphore.markRateLimited para 502/503/504 (não só 429)
  • combo.js — Implementar early exit quando todos os modelos têm breaker OPEN

Testes

  • Criar combo-circuit-breaker.test.mjs — Combo skip breaker OPEN, early exit, semáforo 502

Fase 3 — Anti-Thundering Herd & Auto Rate Limit

Backend

  • rateLimitManager.js — Auto-enable para apikey providers com limites elevados
  • rateLimitManager.js — Criar limiter com defaults (100 RPM) quando não configurado
  • auth.js — Adicionar mutex na markAccountUnavailable para evitar marcação paralela

Testes

  • Criar thundering-herd.test.mjs — Mutex, auto-enable, limites não restritivos

Fase 4 — Frontend Resilience UI

Settings Page

  • settings/page.js — Adicionar tab "Resilience" (icon: health_and_safety) entre Routing e Pricing

Novos Componentes

  • Criar ResilienceTab.js — Layout com 3 cards
  • Criar ProviderProfilesCard.js — Toggle OAuth/API Key, inputs para cooldowns
  • Criar CircuitBreakerCard.js — Status real-time per-provider, auto-refresh 5s, botão reset
  • Criar RateLimitOverviewCard.js — Tabela providers × accounts × cooldown

API Routes

  • Criar api/resilience/route.js — GET (estado completo) + PATCH (salvar perfis)
  • Criar api/resilience/reset/route.js — POST (resetar breakers + cooldowns)

Migração

  • Avaliar se PoliciesPanel.js pode ser removido ou simplificado após nova aba

Verificação Final

  • Rodar todos os testes unitários: node --test tests/unit/*.test.mjs
  • Build do Next.js: npm run build
  • Verificar aba Resilience no browser
  • Testar persistência dos perfis (salvar → reload)
  • Testar Reset All Breakers