feat(gemini): 完善 Gemini OAuth 配额系统和用量显示

主要改动:
- 后端:重构 Gemini 配额服务,支持多层级配额策略(GCP Standard/Free, Google One, AI Studio, Code Assist)
- 后端:优化 OAuth 服务,增强 tier_id 识别和存储逻辑
- 后端:改进用量统计服务,支持不同平台的配额查询
- 后端:优化限流服务,增加临时解除调度状态管理
- 前端:统一四种授权方式的用量显示格式和徽标样式
- 前端:增强账户配额信息展示,支持多种配额类型
- 前端:改进创建和重新授权模态框的用户体验
- 国际化:完善中英文配额相关文案
- 移除 CHANGELOG.md 文件

测试:所有单元测试通过
This commit is contained in:
IanShaw027
2026-01-04 15:36:00 +08:00
parent cc4cc806ea
commit a185ad1144
21 changed files with 1205 additions and 368 deletions

View File

@@ -1257,6 +1257,25 @@ export default {
'All model requests are forwarded directly to the Gemini API without model restrictions or mappings.',
baseUrlHint: 'Leave default for official Gemini API',
apiKeyHint: 'Your Gemini API Key (starts with AIza)',
tier: {
label: 'Tier (Quota Level)',
hint: 'Tip: The system will try to auto-detect the tier first; if auto-detection is unavailable or fails, your selected tier is used as a fallback (simulated quota).',
aiStudioHint:
'AI Studio quotas are per-model (Pro/Flash are limited independently). If billing is enabled, choose Pay-as-you-go.',
googleOne: {
free: 'Google One Free (1000 RPD / 60 RPM, shared pool)',
pro: 'Google AI Pro (1500 RPD / 120 RPM, shared pool)',
ultra: 'Google AI Ultra (2000 RPD / 120 RPM, shared pool)'
},
gcp: {
standard: 'GCP Standard (1500 RPD / 120 RPM, shared pool)',
enterprise: 'GCP Enterprise (2000 RPD / 120 RPM, shared pool)'
},
aiStudio: {
free: 'AI Studio Free Tier (Pro: 50 RPD / 2 RPM; Flash: 1500 RPD / 15 RPM)',
paid: 'AI Studio Pay-as-you-go (Pro: ∞ RPD / 1000 RPM; Flash: ∞ RPD / 2000 RPM)'
}
},
accountType: {
oauthTitle: 'OAuth (Gemini)',
oauthDesc: 'Authorize with your Google account and choose an OAuth type.',
@@ -1317,6 +1336,17 @@ export default {
},
simulatedNote: 'Simulated quota, for reference only',
rows: {
googleOne: {
channel: 'Google One OAuth (Individuals / Code Assist for Individuals)',
limitsFree: 'Shared pool: 1000 RPD / 60 RPM',
limitsPro: 'Shared pool: 1500 RPD / 120 RPM',
limitsUltra: 'Shared pool: 2000 RPD / 120 RPM'
},
gcp: {
channel: 'GCP Code Assist OAuth (Enterprise)',
limitsStandard: 'Shared pool: 1500 RPD / 120 RPM',
limitsEnterprise: 'Shared pool: 2000 RPD / 120 RPM'
},
cli: {
channel: 'Gemini CLI (Official Google Login / Code Assist)',
free: 'Free Google Account',
@@ -1334,7 +1364,7 @@ export default {
free: 'No billing (free tier)',
paid: 'Billing enabled (pay-as-you-go)',
limitsFree: 'RPD 50; RPM 2 (Pro) / 15 (Flash)',
limitsPaid: 'RPD unlimited; RPM 1000+ (per model quota)'
limitsPaid: 'RPD unlimited; RPM 1000 (Pro) / 2000 (Flash) (per model)'
},
customOAuth: {
channel: 'Custom OAuth Client (GCP)',

View File

@@ -1395,6 +1395,24 @@ export default {
modelPassthroughDesc: '所有模型请求将直接转发至 Gemini API不进行模型限制或映射。',
baseUrlHint: '留空使用官方 Gemini API',
apiKeyHint: '您的 Gemini API Key以 AIza 开头)',
tier: {
label: 'Tier配额等级',
hint: '提示:系统会优先尝试自动识别 Tier若自动识别不可用或失败则使用你选择的 Tier 作为回退(本地模拟配额)。',
aiStudioHint: 'AI Studio 的配额是按模型分别限流Pro/Flash 独立)。若已绑卡(按量付费),请选 Pay-as-you-go。',
googleOne: {
free: 'Google One Free1000 RPD / 60 RPM共享池',
pro: 'Google AI Pro1500 RPD / 120 RPM共享池',
ultra: 'Google AI Ultra2000 RPD / 120 RPM共享池'
},
gcp: {
standard: 'GCP Standard1500 RPD / 120 RPM共享池',
enterprise: 'GCP Enterprise2000 RPD / 120 RPM共享池'
},
aiStudio: {
free: 'AI Studio Free TierPro: 50 RPD / 2 RPMFlash: 1500 RPD / 15 RPM',
paid: 'AI Studio Pay-as-you-goPro: ∞ RPD / 1000 RPMFlash: ∞ RPD / 2000 RPM'
}
},
accountType: {
oauthTitle: 'OAuth 授权Gemini',
oauthDesc: '使用 Google 账号授权,并选择 OAuth 子类型。',
@@ -1454,6 +1472,17 @@ export default {
},
simulatedNote: '本地模拟配额,仅供参考',
rows: {
googleOne: {
channel: 'Google One OAuth个人版 / Code Assist for Individuals',
limitsFree: '共享池1000 RPD / 60 RPM不分模型',
limitsPro: '共享池1500 RPD / 120 RPM不分模型',
limitsUltra: '共享池2000 RPD / 120 RPM不分模型'
},
gcp: {
channel: 'GCP Code Assist OAuth企业版',
limitsStandard: '共享池1500 RPD / 120 RPM不分模型',
limitsEnterprise: '共享池2000 RPD / 120 RPM不分模型'
},
cli: {
channel: 'Gemini CLI官方 Google 登录 / Code Assist',
free: '免费 Google 账号',
@@ -1471,7 +1500,7 @@ export default {
free: '未绑卡(免费层)',
paid: '已绑卡(按量付费)',
limitsFree: 'RPD 50RPM 2Pro/ 15Flash',
limitsPaid: 'RPD 不限RPM 1000+(按模型配额)'
limitsPaid: 'RPD 不限RPM 1000Pro/ 2000Flash(按模型配额)'
},
customOAuth: {
channel: 'Custom OAuth ClientGCP',