fix(codex): honor usage_limit_reached resets_at for retry_after

This commit is contained in:
lyd123qw2008
2026-02-21 13:50:23 +08:00
parent 4445a165e9
commit f5d46b9ca2
3 changed files with 94 additions and 3 deletions

View File

@@ -0,0 +1,58 @@
package executor
import (
"net/http"
"strconv"
"testing"
"time"
)
func TestParseCodexRetryAfter_ResetsInSeconds(t *testing.T) {
body := []byte(`{"error":{"type":"usage_limit_reached","resets_in_seconds":123}}`)
retryAfter := parseCodexRetryAfter(http.StatusTooManyRequests, body)
if retryAfter == nil {
t.Fatalf("expected retryAfter, got nil")
}
if *retryAfter != 123*time.Second {
t.Fatalf("retryAfter = %v, want %v", *retryAfter, 123*time.Second)
}
}
func TestParseCodexRetryAfter_PrefersResetsAt(t *testing.T) {
resetAt := time.Now().Add(5 * time.Minute).Unix()
body := []byte(`{"error":{"type":"usage_limit_reached","resets_at":` + itoa(resetAt) + `,"resets_in_seconds":1}}`)
retryAfter := parseCodexRetryAfter(http.StatusTooManyRequests, body)
if retryAfter == nil {
t.Fatalf("expected retryAfter, got nil")
}
if *retryAfter < 4*time.Minute || *retryAfter > 6*time.Minute {
t.Fatalf("retryAfter = %v, want around 5m", *retryAfter)
}
}
func TestParseCodexRetryAfter_FallbackWhenResetsAtPast(t *testing.T) {
resetAt := time.Now().Add(-1 * time.Minute).Unix()
body := []byte(`{"error":{"type":"usage_limit_reached","resets_at":` + itoa(resetAt) + `,"resets_in_seconds":77}}`)
retryAfter := parseCodexRetryAfter(http.StatusTooManyRequests, body)
if retryAfter == nil {
t.Fatalf("expected retryAfter, got nil")
}
if *retryAfter != 77*time.Second {
t.Fatalf("retryAfter = %v, want %v", *retryAfter, 77*time.Second)
}
}
func TestParseCodexRetryAfter_NonApplicableReturnsNil(t *testing.T) {
body := []byte(`{"error":{"type":"usage_limit_reached","resets_in_seconds":30}}`)
if got := parseCodexRetryAfter(http.StatusBadRequest, body); got != nil {
t.Fatalf("expected nil for non-429, got %v", *got)
}
body = []byte(`{"error":{"type":"server_error","resets_in_seconds":30}}`)
if got := parseCodexRetryAfter(http.StatusTooManyRequests, body); got != nil {
t.Fatalf("expected nil for non-usage_limit_reached, got %v", *got)
}
}
func itoa(v int64) string {
return strconv.FormatInt(v, 10)
}