fix(auth): handle OAuth model alias in retry logic and refine Qwen quota handling

This commit is contained in:
Luis Pater
2026-04-09 03:44:19 +08:00
parent d54f816363
commit 941334da79
4 changed files with 76 additions and 23 deletions

View File

@@ -1830,7 +1830,11 @@ func (m *Manager) closestCooldownWait(providers []string, model string, attempt
if attempt >= effectiveRetry {
continue
}
blocked, reason, next := isAuthBlockedForModel(auth, model, now)
checkModel := model
if strings.TrimSpace(model) != "" {
checkModel = m.selectionModelForAuth(auth, model)
}
blocked, reason, next := isAuthBlockedForModel(auth, checkModel, now)
if !blocked || next.IsZero() || reason == blockReasonDisabled {
continue
}

View File

@@ -8,6 +8,7 @@ import (
"time"
"github.com/google/uuid"
internalconfig "github.com/router-for-me/CLIProxyAPI/v6/internal/config"
"github.com/router-for-me/CLIProxyAPI/v6/internal/registry"
cliproxyexecutor "github.com/router-for-me/CLIProxyAPI/v6/sdk/cliproxy/executor"
)
@@ -64,6 +65,49 @@ func TestManager_ShouldRetryAfterError_RespectsAuthRequestRetryOverride(t *testi
}
}
func TestManager_ShouldRetryAfterError_UsesOAuthModelAliasForCooldown(t *testing.T) {
m := NewManager(nil, nil, nil)
m.SetRetryConfig(3, 30*time.Second, 0)
m.SetOAuthModelAlias(map[string][]internalconfig.OAuthModelAlias{
"qwen": {
{Name: "qwen3.6-plus", Alias: "coder-model"},
},
})
routeModel := "coder-model"
upstreamModel := "qwen3.6-plus"
next := time.Now().Add(5 * time.Second)
auth := &Auth{
ID: "auth-1",
Provider: "qwen",
ModelStates: map[string]*ModelState{
upstreamModel: {
Unavailable: true,
Status: StatusError,
NextRetryAfter: next,
Quota: QuotaState{
Exceeded: true,
Reason: "quota",
NextRecoverAt: next,
},
},
},
}
if _, errRegister := m.Register(context.Background(), auth); errRegister != nil {
t.Fatalf("register auth: %v", errRegister)
}
_, _, maxWait := m.retrySettings()
wait, shouldRetry := m.shouldRetryAfterError(&Error{HTTPStatus: 429, Message: "quota"}, 0, []string{"qwen"}, routeModel, maxWait)
if !shouldRetry {
t.Fatalf("expected shouldRetry=true, got false (wait=%v)", wait)
}
if wait <= 0 {
t.Fatalf("expected wait > 0, got %v", wait)
}
}
type credentialRetryLimitExecutor struct {
id string