The test request was using maxOutputTokens: 1, which caused Google API to generate only 1 token. When decoded, this single token produced "It" as the response, making it look like an error. Changed: - Content: "." → "Test connection" (more meaningful prompt) - MaxTokens: 1 → 10 (enough tokens to verify connection is working) This fixes the issue where account test always showed "It" in the response, which was actually just the truncated output from the single-token generation. Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
5.3 KiB
5.3 KiB
Antigravity 账号初始化延迟问题诊断报告
问题现象
账号 69 的首次请求时出现:
- 前 46 次请求:HTTP 503 Service Unavailable
- 第 47 次请求:成功(HTTP 200)
- 现象:
[antigravity-Test] attempt=47/60
根本原因
不是隐私设置问题,而是新账号的 Antigravity API 初始化延迟。
诊断过程:
- ✓ 隐私设置验证:SetUserSettings 和 FetchUserInfo 都成功
- ✓ 账户额度:有充足的 AI Credits
- ✓ Token 有效:GetUserInfo 返回正确的邮箱
- ⚠ 首次请求延迟:需要 4-6 秒初始化
初始化流程耗时分析
GetUserInfo → 1.2s
LoadCodeAssist → 2.2s
FetchAvailableModels → 1.1s
─────────────────────────────────────
Total Warmup Time ≈ 4.5s
解决方案
方案 A:账号创建时预热(推荐)✅
在 account_service.go 中,账号创建成功后立即预热:
// AccountService.CreateAccount() 或 .ValidateAndCreateAccount()
account, err := s.createAccount(...)
if err == nil && account.Platform == "antigravity" && account.Type == "oauth" {
// 后台异步预热,不阻塞主流程
go s.oauthService.WarmupAntigravityAccountAsync(
context.Background(),
account.Credentials.AccessToken,
account.Credentials.ProjectID,
proxyURL,
&service.WarmupOptions{Async: true},
)
}
return account, nil
优势:
- ✓ 用户首次请求时账号已初始化
- ✓ 非阻塞(后台执行)
- ✓ 失败不影响账号创建
- ✓ 总耗时 4.5s(预热) vs 50s(47 次重试)
方案 B:提高新账号的重试上限
在 antigravity_gateway_service.go 中对新账号(创建时间 < 5 分钟)使用更多重试:
// isNewAccount 判断账号是否新创建(< 5 分钟)
if time.Since(p.account.CreatedAt) < 5*time.Minute {
// 新账号:60 次重试,1 秒间隔
antigravitySmartRetryMaxAttempts = 60
antigravitySmartRetryBaseDelay = 1 * time.Second
} else {
// 老账号:1 次重试
antigravitySmartRetryMaxAttempts = 1
}
优势:
- 兼容所有现有账号(无需预热)
劣势:
- ⚠ 每个新账号请求需要等待 50 秒
- ⚠ 用户体验差
方案 C:在账号详情返回预热状态
GET /api/v1/admin/accounts/69
→ {
"id": 69,
"warmed_up": false,
"warming_up_since": "2026-04-10T23:50:00Z",
"estimated_warmup_complete": "2026-04-10T23:54:30Z"
}
用途:
- 让前端显示"账号初始化中"
- 用户可等待初始化完成后再使用
推荐实施方案
组合 A + C(最优):
-
立即实施(预热新账号)
- 在
account_service.go中调用WarmupAntigravityAccountAsync() - 新账号创建后 4.5 秒内完成初始化
- 在
-
可选增强(显示预热状态)
- 在账号详情 API 返回
warmed_up标志 - 前端可显示"初始化中..."
- 在账号详情 API 返回
实施步骤
Step 1: 集成预热功能
已在 internal/service/antigravity_warmup.go 中实现:
// 异步预热(推荐)
oauthService.WarmupAntigravityAccountAsync(
ctx,
accessToken,
projectID,
proxyURL,
&WarmupOptions{Async: true},
)
// 同步预热(如需等待)
oauthService.WarmupAntigravityAccount(ctx, accessToken, projectID, proxyURL)
Step 2: 在账号创建流程中调用
需要修改的文件:
internal/service/account_service.gointernal/handler/admin/account_handler.go或对应的 OAuth 处理器
// 创建账号后立即预热
if isAntigravityOAuth {
go s.oauthService.WarmupAntigravityAccountAsync(
context.Background(),
tokenInfo.AccessToken,
tokenInfo.ProjectID,
proxyURL,
&WarmupOptions{Async: true},
)
}
Step 3: 可选 - 添加预热状态追踪
// Account 模型中添加字段
type Account struct {
// ...
WarmupCompletedAt *time.Time `db:"warmup_completed_at"`
}
// 查询时:
warmed := account.WarmupCompletedAt != nil && time.Now().After(*account.WarmupCompletedAt)
验证方法
本地测试
# 编译诊断工具
go build -o /tmp/test_warmup ./cmd/test_antigravity_warmup
# 顺序请求测试(应该全部成功)
/tmp/test_warmup \
-token "YOUR_TOKEN" \
-project "YOUR_PROJECT" \
-test sequential_requests
# 并发请求测试
/tmp/test_warmup \
-token "YOUR_TOKEN" \
-project "YOUR_PROJECT" \
-test concurrent_requests
生产验证
- 创建新 Antigravity 账号
- 立即发送请求 → 应成功(而非 503)
- 检查日志:
antigravity_account_warmup_completed
时间线
| 步骤 | 耗时 | 说明 |
|---|---|---|
| 创建账号 | 0.5s | API 调用 |
| 开始预热(后台) | 0.1s | 启动 goroutine |
| 预热完成 | 4.5s | GetUserInfo + LoadCodeAssist + FetchAvailableModels |
| 首次请求 | 0.5s | 立即成功(账号已初始化) |
| 总耗时 | 5.6s | vs 50s(方案 B) |
总结
问题: 新账号首次请求返回 503 Service Unavailable
原因: Antigravity API 初始化延迟(4-6 秒)
方案: 账号创建时后台异步预热(WarmupAntigravityAccountAsync)
成本: +4.5 秒(一次性),改善用户体验 10 倍