From fa48cf27eb166e176427c83cec55a4997bc3454c Mon Sep 17 00:00:00 2001 From: song Date: Tue, 30 Dec 2025 23:54:33 +0800 Subject: [PATCH] =?UTF-8?q?feat(Antigravity):=20=E4=B8=BA=E6=97=A0=20proje?= =?UTF-8?q?ct=5Fid=20=E7=9A=84=E8=B4=A6=E6=88=B7=E7=94=9F=E6=88=90?= =?UTF-8?q?=E9=9A=8F=E6=9C=BA=20project=5Fid?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 部分账户类型(如 g1-pro-tier)API 不返回 cloudaicompanionProject, 但实际接受任意格式的 project_id,故添加随机生成逻辑作为兜底。 --- backend/internal/pkg/antigravity/oauth.go | 21 +++++++++++++++++++ .../service/antigravity_oauth_service.go | 6 ++++++ 2 files changed, 27 insertions(+) diff --git a/backend/internal/pkg/antigravity/oauth.go b/backend/internal/pkg/antigravity/oauth.go index 54ac8bb1..bdc018f2 100644 --- a/backend/internal/pkg/antigravity/oauth.go +++ b/backend/internal/pkg/antigravity/oauth.go @@ -177,3 +177,24 @@ func BuildAuthorizationURL(state, codeChallenge string) string { return fmt.Sprintf("%s?%s", AuthorizeURL, params.Encode()) } + +// GenerateMockProjectID 生成随机 project_id(当 API 不返回时使用) +// 格式:{形容词}-{名词}-{5位随机字符} +func GenerateMockProjectID() string { + adjectives := []string{"useful", "bright", "swift", "calm", "bold"} + nouns := []string{"fuze", "wave", "spark", "flow", "core"} + + randBytes, _ := GenerateRandomBytes(7) + + adj := adjectives[int(randBytes[0])%len(adjectives)] + noun := nouns[int(randBytes[1])%len(nouns)] + + // 生成 5 位随机字符(a-z0-9) + const charset = "abcdefghijklmnopqrstuvwxyz0123456789" + suffix := make([]byte, 5) + for i := 0; i < 5; i++ { + suffix[i] = charset[int(randBytes[i+2])%len(charset)] + } + + return fmt.Sprintf("%s-%s-%s", adj, noun, string(suffix)) +} diff --git a/backend/internal/service/antigravity_oauth_service.go b/backend/internal/service/antigravity_oauth_service.go index 0d104043..8192a9fb 100644 --- a/backend/internal/service/antigravity_oauth_service.go +++ b/backend/internal/service/antigravity_oauth_service.go @@ -149,6 +149,12 @@ func (s *AntigravityOAuthService) ExchangeCode(ctx context.Context, input *Antig result.ProjectID = loadResp.CloudAICompanionProject } + // 兜底:随机生成 project_id + if result.ProjectID == "" { + result.ProjectID = antigravity.GenerateMockProjectID() + fmt.Printf("[AntigravityOAuth] 使用随机生成的 project_id: %s\n", result.ProjectID) + } + return result, nil }