mirror of
https://github.com/router-for-me/CLIProxyAPI.git
synced 2026-02-03 13:00:52 +08:00
fix(auth): Make round-robin auth selection deterministic
This commit is contained in:
@@ -15,6 +15,7 @@ import (
|
|||||||
"github.com/router-for-me/CLIProxyAPI/v6/internal/util"
|
"github.com/router-for-me/CLIProxyAPI/v6/internal/util"
|
||||||
cliproxyexecutor "github.com/router-for-me/CLIProxyAPI/v6/sdk/cliproxy/executor"
|
cliproxyexecutor "github.com/router-for-me/CLIProxyAPI/v6/sdk/cliproxy/executor"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
|
"sort"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ProviderExecutor defines the contract required by Manager to execute provider calls.
|
// ProviderExecutor defines the contract required by Manager to execute provider calls.
|
||||||
@@ -796,6 +797,12 @@ func (m *Manager) pickNext(ctx context.Context, provider, model string, opts cli
|
|||||||
}
|
}
|
||||||
candidates = append(candidates, auth.Clone())
|
candidates = append(candidates, auth.Clone())
|
||||||
}
|
}
|
||||||
|
// Ensure stable iteration order across requests to make round-robin deterministic.
|
||||||
|
// Go map iteration order is randomized; without sorting, the selector's index-based
|
||||||
|
// rotation may appear non-round-robin.
|
||||||
|
if len(candidates) > 1 {
|
||||||
|
sort.Slice(candidates, func(i, j int) bool { return candidates[i].ID < candidates[j].ID })
|
||||||
|
}
|
||||||
m.mu.RUnlock()
|
m.mu.RUnlock()
|
||||||
if len(candidates) == 0 {
|
if len(candidates) == 0 {
|
||||||
return nil, nil, &Error{Code: "auth_not_found", Message: "no auth available"}
|
return nil, nil, &Error{Code: "auth_not_found", Message: "no auth available"}
|
||||||
|
|||||||
Reference in New Issue
Block a user