From 8ec366de42dd66256895f16c9669469791ca823a Mon Sep 17 00:00:00 2001 From: Peter Stone Date: Mon, 9 Mar 2026 05:50:59 +0000 Subject: executor: strengthen rate-limit avoidance in classifier Updated isQuotaExhausted to detect more Claude quota messages. Added 'rate limit reached (rejected)' to quota exhausted checks. Strengthened classifier prompt to explicitly forbid selecting rate-limited agents. Improved Pool to set 5h rate limit on quota exhaustion. --- internal/executor/executor.go | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) (limited to 'internal/executor/executor.go') diff --git a/internal/executor/executor.go b/internal/executor/executor.go index 1c9e667..4bb1f2c 100644 --- a/internal/executor/executor.go +++ b/internal/executor/executor.go @@ -234,14 +234,18 @@ func (p *Pool) executeResume(ctx context.Context, t *task.Task, exec *storage.Ex exec.EndTime = time.Now().UTC() if err != nil { - if isRateLimitError(err) { + if isRateLimitError(err) || isQuotaExhausted(err) { p.mu.Lock() retryAfter := parseRetryAfter(err.Error()) if retryAfter == 0 { - retryAfter = 1 * time.Minute + if isQuotaExhausted(err) { + retryAfter = 5 * time.Hour + } else { + retryAfter = 1 * time.Minute + } } p.rateLimited[agentType] = time.Now().Add(retryAfter) - p.logger.Info("agent rate limited", "agent", agentType, "retryAfter", retryAfter) + p.logger.Info("agent rate limited", "agent", agentType, "retryAfter", retryAfter, "quotaExhausted", isQuotaExhausted(err)) p.mu.Unlock() } @@ -445,14 +449,18 @@ func (p *Pool) execute(ctx context.Context, t *task.Task) { exec.EndTime = time.Now().UTC() if err != nil { - if isRateLimitError(err) { + if isRateLimitError(err) || isQuotaExhausted(err) { p.mu.Lock() retryAfter := parseRetryAfter(err.Error()) if retryAfter == 0 { - retryAfter = 1 * time.Minute + if isQuotaExhausted(err) { + retryAfter = 5 * time.Hour + } else { + retryAfter = 1 * time.Minute + } } p.rateLimited[agentType] = time.Now().Add(retryAfter) - p.logger.Info("agent rate limited", "agent", agentType, "retryAfter", retryAfter) + p.logger.Info("agent rate limited", "agent", agentType, "retryAfter", retryAfter, "quotaExhausted", isQuotaExhausted(err)) p.mu.Unlock() } -- cgit v1.2.3