1. 03 Feb, 2026 12 commits
    • bayma888's avatar
      fix(test): add IncrementQuotaUsed to all APIKeyRepository test stubs · e59e3a9f
      bayma888 authored
      Add the missing IncrementQuotaUsed method to:
      - fakeAPIKeyRepo (api_key_auth_google_test.go)
      - stubApiKeyRepo (api_key_auth_test.go)
      - apiKeyRepoStub (api_key_service_delete_test.go)
      - authRepoStub (api_key_service_cache_test.go)
      e59e3a9f
    • bayma888's avatar
      feat(api-key): add independent quota and expiration support · 6146be14
      bayma888 authored
      This feature allows API Keys to have their own quota limits and expiration
      times, independent of the user's balance.
      
      Backend:
      - Add quota, quota_used, expires_at fields to api_key schema
      - Implement IsExpired() and IsQuotaExhausted() checks in middleware
      - Add ResetQuota and ClearExpiration API endpoints
      - Integrate quota billing in gateway handlers (OpenAI, Anthropic, Gemini)
      - Include quota/expiration fields in auth cache for performance
      - Expiration check returns 403, quota exhausted returns 429
      
      Frontend:
      - Add quota and expiration inputs to key create/edit dialog
      - Add quick-select buttons for expiration (+7, +30, +90 days)
      - Add reset quota confirmation dialog
      - Add expires_at column to keys list
      - Add i18n translations for new features (en/zh)
      
      Migration:
      - Add 045_add_api_key_quota.sql for new columns
      6146be14
    • ducky's avatar
      feat(usage): add reasoning effort column · 53ee6383
      ducky authored
      53ee6383
    • liuxiongfeng's avatar
      feat(accounts): 账号列表显示 Antigravity scope 级别限流状态 · 8824400c
      liuxiongfeng authored
      - 后端 DTO 新增 scope_rate_limits 字段,从 extra 提取限流信息
      - 前端状态列显示 scope 级限流徽章(Claude/Gemini/Image)
      - 清除速率限制时同时清除账号级和 scope 级限流(已有实现)
      
      Cherry-picked from slovx2/sub2api: 66f49b67
      8824400c
    • liuxiongfeng's avatar
      feat(ops): 运维界面展示 Antigravity 账号 scope 级别限流统计 · 6e8eff9b
      liuxiongfeng authored
      在运维监控的并发/排队卡片中,为 Antigravity 平台账号显示各 scope
      (claude/gemini_text/gemini_image) 的限流数量统计,便于管理员了解
      哪些 scope 正在被限流。
      
      Cherry-picked from slovx2/sub2api: 08d6dc52
      6e8eff9b
    • liuxiongfeng's avatar
      fix: jsonb_set 嵌套路径无法创建多层 key 的问题 · f5884d16
      liuxiongfeng authored
      PostgreSQL jsonb_set 在 create_if_missing=true 时无法一次性创建多层嵌套路径。
      例如设置 {antigravity_quota_scopes,gemini_image} 时,如果 antigravity_quota_scopes 不存在,
      jsonb_set 不会自动创建外层 key,导致更新静默失败(affected=1 但数据未变)。
      
      修复方案:嵌套两次 jsonb_set,先确保外层 key 存在,再设置内层值。
      同时在设置限流时更新 last_used_at,使刚触发 429 的账号调度优先级降低。
      
      Cherry-picked from slovx2/sub2api: 4b57e80e
      f5884d16
    • liuxiongfeng's avatar
      feat(antigravity): 默认开启按配额域限流,避免整个账号被锁定 · 56949a58
      liuxiongfeng authored
      将 GATEWAY_ANTIGRAVITY_429_SCOPE_LIMIT 的默认值从关闭改为开启。
      当 Gemini 模型触发 429 限流时,只会限制对应的配额域(gemini_text),
      而 Claude 和 gemini_image 仍可继续使用,提高账号利用率。
      56949a58
    • liuxiongfeng's avatar
      feat(antigravity): map all gemini-2.5 to gemini-3 series · 7d256879
      liuxiongfeng authored
      Antigravity 上游不再支持 gemini-2.5 系列,统一映射到 gemini-3:
      - gemini-2.5-flash → gemini-3-flash
      - gemini-2.5-flash-lite → gemini-3-flash
      - gemini-2.5-flash-thinking → gemini-3-flash
      - gemini-2.5-flash-image → gemini-3-pro-image
      - gemini-2.5-pro → gemini-3-pro-high
      - gemini-2.5-pro-preview → gemini-3-pro-high
      - gemini-2.5-pro-exp → gemini-3-pro-high
      7d256879
    • liuxiongfeng's avatar
      test: update gemini-2.5-pro mapping test case · f9512fda
      liuxiongfeng authored
      Update test expectation to reflect new mapping:
      gemini-2.5-pro -> gemini-3-pro-high
      f9512fda
    • liuxiongfeng's avatar
      feat(antigravity): map gemini-2.5-pro to gemini-3-pro-high · beb63cb1
      liuxiongfeng authored
      Add prefix mapping rules for gemini-2.5-pro variants:
      - gemini-2.5-pro -> gemini-3-pro-high
      - gemini-2.5-pro-preview -> gemini-3-pro-high
      - gemini-2.5-pro-exp -> gemini-3-pro-high
      beb63cb1
    • shuike's avatar
    • shuike's avatar
      feat: 增加邀请码注册功能 · 6c86501d
      shuike authored
      6c86501d
  2. 02 Feb, 2026 13 commits
    • ianshaw's avatar
    • liuxiongfeng's avatar
      test: 为测试 stub 添加缺失的 GroupRepository 接口方法 · ce1d2904
      liuxiongfeng authored
      新增 BindAccountsToGroup 和 GetAccountIDsByGroupIDs 方法的 stub 实现,
      确保测试文件中的 mock 类型满足 GroupRepository 接口要求。
      ce1d2904
    • liuxiongfeng's avatar
      feat(groups): 添加从其他分组复制账号功能 · e1a4a7b8
      liuxiongfeng authored
      - 创建分组时可选择从已有分组复制账号
      - 编辑分组时支持同步账号(全量替换操作)
      - 仅允许选择相同平台的源分组
      - 添加完整的数据校验:去重、自引用检查、平台一致性检查
      - 前端支持多选源分组,带提示说明操作行为
      e1a4a7b8
    • liuxiongfeng's avatar
      refactor(billing): 简化 CalculateCostWithLongContext 逻辑 · b381e8ee
      liuxiongfeng authored
      将 token 直接拆分为范围内和范围外两部分,分别调用 CalculateCost:
      - 范围内:正常计费 (rateMultiplier)
      - 范围外:双倍计费 (rateMultiplier × extraMultiplier)
      
      代码更直观,便于理解和维护
      b381e8ee
    • liuxiongfeng's avatar
      feat(billing): 添加 Gemini 200K 长上下文双倍计费功能 · 45e1429a
      liuxiongfeng authored
      - 新增 CalculateCostWithLongContext 方法支持阈值双倍计费
      - 新增 RecordUsageWithLongContext 方法专用于 Gemini 计费
      - Gemini 超过 200K token 的部分按 2 倍费率计算
      - 其他平台(Claude/OpenAI)完全不受影响
      45e1429a
    • Zero Clover's avatar
      feat(ops): 支持过滤无效 API Key 错误,不写入错误日志 · ad1cdba3
      Zero Clover authored
      新增 IgnoreInvalidApiKeyErrors 开关,启用后 INVALID_API_KEY 和
      API_KEY_REQUIRED 错误将被完全跳过,不写入 Ops 错误日志。
      这些错误由用户错误配置导致,与服务质量无关。
      ad1cdba3
    • shaw's avatar
      fix(gateway): 修复 OAuth token 刷新后调度器缓存不一致问题 · 79fa1813
      shaw authored
      Token 刷新成功后,调度器缓存中的 Account 对象仍包含旧的 credentials,
      导致在 Outbox 异步更新之前(最多 1 秒窗口)请求使用过期 token,
      返回 403 错误(OAuth token has been revoked)。
      
      修复方案:在 token 刷新成功后同步更新调度器缓存,确保调度获取的
      Account 对象立即包含最新的 access_token 和 _token_version。
      
      此修复覆盖所有 OAuth 平台:OpenAI、Claude、Gemini、Antigravity。
      79fa1813
    • Zero Clover's avatar
      feat(ops): 将 USER_INACTIVE 错误排除在 SLA 统计之外 · 673caf41
      Zero Clover authored
      将账户停用 (USER_INACTIVE) 导致的请求失败视为业务限制类错误,不计入 SLA 和错误率统计。
      
      账户停用是预期内的业务结果,不应被视为系统错误或服务质量问题。此改动使错误分类更加准确,避免将预期的业务限制误报为系统故障。
      
      修改内容:
      - 在 classifyOpsIsBusinessLimited 函数中添加 USER_INACTIVE 错误码
      - 该类错误不再触发错误率告警
      
      Fixes Wei-Shaw/sub2api#453
      673caf41
    • JIA-ss's avatar
      feat(gateway): 增强 /v1/usage 端点返回完整用量统计 · c441638f
      JIA-ss authored
      
      
      为 CC Switch 集成增强 /v1/usage 网关端点,在保持原有 4 字段
      (isValid, planName, remaining, unit) 向后兼容的基础上,新增:
      
      - usage 对象:今日/累计的请求数、token 用量、费用,以及 RPM/TPM
      - subscription 对象(订阅模式):日/周/月用量和限额、过期时间
      - balance 字段(余额模式):当前钱包余额
      
      用量数据获取采用 best-effort 策略,失败不影响基础响应。
      Co-Authored-By: default avatarClaude Opus 4.5 <noreply@anthropic.com>
      c441638f
    • 小北's avatar
      feat: 向用户显示管理员调整余额的备注 · ae18397c
      小北 authored
      - 为RedeemCode DTO添加notes字段(仅用于admin_balance/admin_concurrency类型)
      - 更新mapper使其有条件地包含备注信息
      - 在用户兑换历史UI中显示备注
      - 备注以斜体显示,悬停时显示完整内容
      
      用户现在可以看到管理员调整其余额的原因说明。
      
      Changes:
      - backend/internal/handler/dto/types.go: RedeemCode添加notes字段
      - backend/internal/handler/dto/mappers.go: 条件性填充notes
      - frontend/src/api/redeem.ts: TypeScript接口添加notes
      - frontend/src/views/user/RedeemView.vue: UI显示备注信息
      ae18397c
    • 小北's avatar
      feat: 支持在用户搜索中使用备注字段 · 426ce616
      小北 authored
      - 在用户仓库的搜索过滤器中添加备注字段
      - 管理员现在可以通过备注/标记搜索用户
      - 使用不区分大小写的搜索(ContainsFold)
      
      Changes:
      - backend/internal/repository/user_repo.go: 添加 NotesContainsFold 到搜索条件
      426ce616
    • liuxiongfeng's avatar
      fix(billing): 修复 Gemini 接口缓存 token 统计 · 4bfeeecb
      liuxiongfeng authored
      extractGeminiUsage 函数未提取 cachedContentTokenCount,
      导致计费时缓存读取 token 始终为 0。
      
      修复:
      - 提取 usageMetadata.cachedContentTokenCount
      - 设置 CacheReadInputTokens 字段
      - InputTokens 减去缓存 token(与 response_transformer 逻辑一致)
      4bfeeecb
    • liuxiongfeng's avatar
      feat(gateway): Gemini API Key 账户跳过模型映射检查,直接透传 · bbc7b4ae
      liuxiongfeng authored
      Gemini API Key 账户通常代理上游服务,模型支持由上游判断,
      本地不需要预先配置模型映射。
      bbc7b4ae
  3. 31 Jan, 2026 1 commit
  4. 30 Jan, 2026 7 commits
  5. 29 Jan, 2026 3 commits
  6. 28 Jan, 2026 4 commits