From cf1d0f23ccb51c5f02bd4f08b707cddce365181a Mon Sep 17 00:00:00 2001 From: song Date: Mon, 29 Dec 2025 01:25:09 +0800 Subject: [PATCH] =?UTF-8?q?feat(antigravity):=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E8=B4=A6=E6=88=B7=E7=B1=BB=E5=9E=8B=EF=BC=88tier=EF=BC=89?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/internal/pkg/antigravity/client.go | 23 ++++++++- .../service/antigravity_quota_refresher.go | 21 ++++++++- .../components/account/AccountUsageCell.vue | 47 +++++++++++++++++++ frontend/src/i18n/locales/en.ts | 5 ++ frontend/src/i18n/locales/zh.ts | 5 ++ 5 files changed, 99 insertions(+), 2 deletions(-) diff --git a/backend/internal/pkg/antigravity/client.go b/backend/internal/pkg/antigravity/client.go index 7a2f6ca1..9e65fd72 100644 --- a/backend/internal/pkg/antigravity/client.go +++ b/backend/internal/pkg/antigravity/client.go @@ -36,9 +36,30 @@ type LoadCodeAssistRequest struct { } `json:"metadata"` } +// TierInfo 账户类型信息 +type TierInfo struct { + ID string `json:"id"` // standard-tier, free-tier, g1-pro-tier, g1-ultra-tier + Name string `json:"name"` // 显示名称 + Description string `json:"description"` // 描述 +} + // LoadCodeAssistResponse loadCodeAssist 响应 type LoadCodeAssistResponse struct { - CloudAICompanionProject string `json:"cloudaicompanionProject"` + CloudAICompanionProject string `json:"cloudaicompanionProject"` + CurrentTier *TierInfo `json:"currentTier,omitempty"` + PaidTier *TierInfo `json:"paidTier,omitempty"` +} + +// GetTier 获取账户类型 +// 优先返回 paidTier(付费订阅级别),否则返回 currentTier +func (r *LoadCodeAssistResponse) GetTier() string { + if r.PaidTier != nil && r.PaidTier.ID != "" { + return r.PaidTier.ID + } + if r.CurrentTier != nil { + return r.CurrentTier.ID + } + return "" } // Client Antigravity API 客户端 diff --git a/backend/internal/service/antigravity_quota_refresher.go b/backend/internal/service/antigravity_quota_refresher.go index ed3ca61a..af98438c 100644 --- a/backend/internal/service/antigravity_quota_refresher.go +++ b/backend/internal/service/antigravity_quota_refresher.go @@ -145,8 +145,15 @@ func (r *AntigravityQuotaRefresher) refreshAccountQuota(ctx context.Context, acc } } - // 调用 API 获取配额 client := antigravity.NewClient(proxyURL) + + // 获取账户类型(tier) + loadResp, _ := client.LoadCodeAssist(ctx, accessToken) + if loadResp != nil { + r.updateAccountTier(account, loadResp) + } + + // 调用 API 获取配额 modelsResp, err := client.FetchAvailableModels(ctx, accessToken, projectID) if err != nil { return err @@ -170,6 +177,18 @@ func (r *AntigravityQuotaRefresher) isTokenExpired(account *Account) bool { return time.Now().Add(5 * time.Minute).After(*expiresAt) } +// updateAccountTier 更新账户类型信息 +func (r *AntigravityQuotaRefresher) updateAccountTier(account *Account, loadResp *antigravity.LoadCodeAssistResponse) { + if account.Extra == nil { + account.Extra = make(map[string]any) + } + + tier := loadResp.GetTier() + if tier != "" { + account.Extra["tier"] = tier + } +} + // updateAccountQuota 更新账户的配额信息 func (r *AntigravityQuotaRefresher) updateAccountQuota(account *Account, modelsResp *antigravity.FetchAvailableModelsResponse) { if account.Extra == nil { diff --git a/frontend/src/components/account/AccountUsageCell.vue b/frontend/src/components/account/AccountUsageCell.vue index f46f41be..ea222c33 100644 --- a/frontend/src/components/account/AccountUsageCell.vue +++ b/frontend/src/components/account/AccountUsageCell.vue @@ -95,6 +95,18 @@