fix(oauth): 修复 OAuth 令牌刷新时 missing_project_id 误报问题

问题描述:
在网络波动环境下,LoadCodeAssist 临时失败会被错误地标记为
"missing_project_id" 不可重试错误,导致账户被禁用。但实际上
账户配置正确,手动刷新后即可恢复。

解决方案:
1. 为 LoadCodeAssist 增加重试机制(最多4次,指数退避)
2. 区分真正的配置缺失和临时网络故障:
   - 如果之前有 project_id,本次获取失败只保留旧值,不报错
   - 只有从未获取过 project_id 且本次也失败时,才标记为缺失
3. 优化错误判断逻辑,避免误报

改进效果:
- 提高在复杂网络环境(如家宽代理)下的鲁棒性
- 减少因临时网络波动导致的服务中断
- 保持真正配置错误的检测能力

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
Ubuntu
2026-01-24 17:22:15 +08:00
parent fbf72f0ec4
commit ffaa6c4a17
3 changed files with 60 additions and 11 deletions

View File

@@ -3,6 +3,7 @@ package service
import (
"context"
"fmt"
"log"
"time"
)
@@ -61,9 +62,17 @@ func (r *AntigravityTokenRefresher) Refresh(ctx context.Context, account *Accoun
}
}
// 如果 project_id 获取失败,返回 credentials 但同时返回错误让账户被标记
// 如果 project_id 获取失败但之前有 project_id不返回错误只是临时网络故障
// 只有真正缺失 project_id从未获取过时才返回错误
if tokenInfo.ProjectIDMissing {
return newCredentials, fmt.Errorf("missing_project_id: 账户缺少project id可能无法使用Antigravity")
// 检查是否保留了旧的 project_id
if tokenInfo.ProjectID != "" {
// 有旧的 project_id只是本次获取失败记录警告但不返回错误
log.Printf("[AntigravityTokenRefresher] Account %d: LoadCodeAssist 临时失败,保留旧 project_id", account.ID)
} else {
// 真正缺失 project_id返回错误
return newCredentials, fmt.Errorf("missing_project_id: 账户缺少project id可能无法使用Antigravity")
}
}
return newCredentials, nil