package service import ( "context" "log/slog" "time" "github.com/Wei-Shaw/sub2api/internal/pkg/antigravity" ) // WarmupAntigravityAccount 预热新的 Antigravity 账号 // 在账号创建后立即调用,避免首次请求的 503 延迟 // // 预热流程: // 1. GetUserInfo - 验证 token 有效性 // 2. LoadCodeAssist - 初始化项目信息 // 3. FetchAvailableModels - 初始化模型列表 // // 总耗时通常 4-6 秒,预热期间的失败不影响账号创建结果(非阻塞) func (s *AntigravityOAuthService) WarmupAntigravityAccount(ctx context.Context, accessToken, projectID, proxyURL string) { logger := slog.Default() // 5 秒超时预热(防止卡住其他操作) warmupCtx, cancel := context.WithTimeout(ctx, 5*time.Second) defer cancel() client, err := antigravity.NewClient(proxyURL) if err != nil { logger.Warn("antigravity_warmup_client_creation_failed", "error", err) return } start := time.Now() defer func() { elapsed := time.Since(start) logger.Info("antigravity_account_warmup_completed", "elapsed_ms", elapsed.Milliseconds()) }() // Step 1: 验证 token _, err = client.GetUserInfo(warmupCtx, accessToken) if err != nil { logger.Warn("antigravity_warmup_get_user_info_failed", "error", err) // 继续后续步骤(部分失败不中止) } // Step 2: 初始化项目信息 _, _, err = client.LoadCodeAssist(warmupCtx, accessToken) if err != nil { logger.Warn("antigravity_warmup_load_code_assist_failed", "error", err) } // Step 3: 初始化模型列表 if projectID != "" { _, _, err := client.FetchAvailableModels(warmupCtx, accessToken, projectID) if err != nil { logger.Warn("antigravity_warmup_fetch_available_models_failed", "error", err) } } } // WarmupOptions 预热选项 type WarmupOptions struct { // Async 为 true 时在后台预热(推荐) Async bool // Timeout 单次预热操作的超时时间 Timeout time.Duration } // WarmupAntigravityAccountAsync 异步预热账号(推荐用法) func (s *AntigravityOAuthService) WarmupAntigravityAccountAsync(ctx context.Context, accessToken, projectID, proxyURL string, opts *WarmupOptions) { if opts == nil { opts = &WarmupOptions{ Async: true, Timeout: 5 * time.Second, } } if opts.Async { go s.WarmupAntigravityAccount(ctx, accessToken, projectID, proxyURL) } else { s.WarmupAntigravityAccount(ctx, accessToken, projectID, proxyURL) } }