fix: mark reused refresh tokens non-retryable

This commit is contained in:
gaoren002 2026-05-11 12:51:11 +00:00
parent 771e0ca973
commit 49b415e333
2 changed files with 7 additions and 5 deletions

View File

@ -417,11 +417,12 @@ func isNonRetryableRefreshError(err error) bool {
}
msg := strings.ToLower(err.Error())
nonRetryable := []string{
"invalid_grant", // refresh_token 已失效
"invalid_client", // 客户端配置错误
"unauthorized_client", // 客户端未授权
"access_denied", // 访问被拒绝
"missing_project_id", // 缺少 project_id
"invalid_grant", // refresh_token 已失效
"refresh_token_reused", // OpenAI refresh_token 已被使用,必须重新授权
"invalid_client", // 客户端配置错误
"unauthorized_client", // 客户端未授权
"access_denied", // 访问被拒绝
"missing_project_id", // 缺少 project_id
"no refresh token available",
}
for _, needle := range nonRetryable {

View File

@ -532,6 +532,7 @@ func TestIsNonRetryableRefreshError(t *testing.T) {
{name: "network_error", err: errors.New("network timeout"), expected: false},
{name: "invalid_grant", err: errors.New("invalid_grant"), expected: true},
{name: "invalid_client", err: errors.New("invalid_client"), expected: true},
{name: "refresh_token_reused", err: errors.New(`OPENAI_OAUTH_TOKEN_REFRESH_FAILED: token refresh failed: status 401, body: {"error":{"code":"refresh_token_reused"}}`), expected: true},
{name: "unauthorized_client", err: errors.New("unauthorized_client"), expected: true},
{name: "access_denied", err: errors.New("access_denied"), expected: true},
{name: "no_refresh_token", err: errors.New("no refresh token available"), expected: true},