diff --git a/internal/ratelimit/tracker.go b/internal/ratelimit/tracker.go index 5b25634..42b5fdc 100644 --- a/internal/ratelimit/tracker.go +++ b/internal/ratelimit/tracker.go @@ -71,7 +71,7 @@ func (t *Tracker) UpdateFromHeaders(h http.Header) { } if v := h.Get("Anthropic-Ratelimit-Unified-5h-Reset"); v != "" { if ts, err := strconv.ParseInt(v, 10, 64); err == nil { - t.fiveHour.ResetsAt = time.Unix(ts, 0).UTC().Truncate(time.Minute) + t.setResetTime(&t.fiveHour, time.Unix(ts, 0).UTC().Truncate(time.Minute), "5h") } } if v := h.Get("Anthropic-Ratelimit-Unified-7d-Utilization"); v != "" { @@ -81,7 +81,7 @@ func (t *Tracker) UpdateFromHeaders(h http.Header) { } if v := h.Get("Anthropic-Ratelimit-Unified-7d-Reset"); v != "" { if ts, err := strconv.ParseInt(v, 10, 64); err == nil { - t.sevenDay.ResetsAt = time.Unix(ts, 0).UTC().Truncate(time.Minute) + t.setResetTime(&t.sevenDay, time.Unix(ts, 0).UTC().Truncate(time.Minute), "7d") } } } @@ -190,24 +190,25 @@ func (t *Tracker) updateWindow(w *Window, rl *RateLimit, name string) { if rl.ResetsAt != nil { parsed, err := time.Parse(time.RFC3339Nano, *rl.ResetsAt) if err != nil { - // Fallback to RFC3339 without fractional seconds parsed, err = time.Parse(time.RFC3339, *rl.ResetsAt) } - parsed = parsed.UTC().Truncate(time.Minute) - if err == nil && parsed != w.ResetsAt && !w.ResetsAt.IsZero() { - // Window reset detected — zero token counters - log.Info(). - Str("window", name). - Int64("prev_tokens_in", w.TokensIn.Load()). - Int64("prev_tokens_out", w.TokensOut.Load()). - Time("old_reset", w.ResetsAt). - Time("new_reset", parsed). - Msg("window reset detected") - w.TokensIn.Store(0) - w.TokensOut.Store(0) - } if err == nil { - w.ResetsAt = parsed + t.setResetTime(w, parsed.UTC().Truncate(time.Minute), name) } } } + +func (t *Tracker) setResetTime(w *Window, newReset time.Time, name string) { + if !w.ResetsAt.IsZero() && newReset != w.ResetsAt { + log.Info(). + Str("window", name). + Int64("prev_tokens_in", w.TokensIn.Load()). + Int64("prev_tokens_out", w.TokensOut.Load()). + Time("old_reset", w.ResetsAt). + Time("new_reset", newReset). + Msg("window reset detected") + w.TokensIn.Store(0) + w.TokensOut.Store(0) + } + w.ResetsAt = newReset +}