• erio's avatar
    refactor: replace sync.Map credits state with AICredits rate limit key · 8a260def
    erio authored
    Replace process-memory sync.Map + per-model runtime state with a single
    "AICredits" key in model_rate_limits, making credits exhaustion fully
    isomorphic with model-level rate limiting.
    
    Scheduler: rate-limited accounts with overages enabled + credits available
    are now scheduled instead of excluded.
    
    Forwarding: when model is rate-limited + credits available, inject credits
    proactively without waiting for a 429 round trip.
    
    Storage: credits exhaustion stored as model_rate_limits["AICredits"] with
    5h duration, reusing SetModelRateLimit/isRateLimitActiveForKey.
    
    Frontend: show credits_active (yellow ) when model rate-limited but
    credits available, credits_exhausted (red) when AICredits key active.
    
    Tests: add unit tests for shouldMarkCreditsExhausted, injectEnabledCreditTypes,
    clearCreditsExhausted, and update existing overages tests.
    8a260def
ratelimit_service.go 49.5 KB