1. 06 Mar, 2026 5 commits
    • yangjianbo's avatar
      test(openai): 修复回归测试未使用字段告警 · 230f8abd
      yangjianbo authored
      
      
      移除订阅扣费 stub 中未被使用的状态字段与赋值,
      消除 golangci-lint 的 unused 告警,保持回归测试语义不变。
      Co-Authored-By: default avatarClaude Opus 4.6 <noreply@anthropic.com>
      230f8abd
    • yangjianbo's avatar
      fix(openai): 统一专属倍率计费链路并补齐回归测试 · a18bbb5f
      yangjianbo authored
      抽取共享的用户分组专属倍率解析器,统一缓存、singleflight 与回退逻辑。\n\n让 OpenAI 独立计费链路复用专属倍率解析,修复 usage 记录与实际扣费未命中用户专属倍率的问题。\n\n补齐 OpenAI 计费与解析器单元测试,并修复全量回归中暴露的 lint 阻塞项。\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
      a18bbb5f
    • erio's avatar
      fix: OpenAI passthrough accounts bypass model mapping check · 79ae15d5
      erio authored
      透传模式账号仅替换认证,应允许所有模型通过。之前调度阶段的
      isModelSupportedByAccount 不感知透传模式,导致 model_mapping
      中未配置的新模型(如 gpt-5.4)被拒绝返回 503。
      79ae15d5
    • yangjianbo's avatar
      fix(openai): 修复 gpt-5.4 长上下文计费与快照白名单 · f3660264
      yangjianbo authored
      补齐 gpt-5.4 fallback 的长上下文计费元信息,\n确保超过 272000 输入 token 时对整次会话应用\n2x 输入与 1.5x 输出计费规则。\n\n同时将官方快照 gpt-5.4-2026-03-05 加入前端\n白名单候选与回归测试,避免 whitelist 模式误拦截。\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
      
      (cherry picked from commit d95497af87f608c6dadcbe7d6e851de9413ae147)
      f3660264
    • yangjianbo's avatar
      feat(openai): 增加 gpt-5.4 模型支持与定价配置 · 1a0d4ed6
      yangjianbo authored
      
      
      - 接入 gpt-5.4 模型识别与规范化,补充默认模型列表
      - 增加 gpt-5.4 输入/缓存命中/输出价格与计费兜底逻辑
      - 同步前端模型白名单与 OpenCode 上下文窗口(1050000/128000)
      Co-Authored-By: default avatarClaude Opus 4.6 <noreply@anthropic.com>
      (cherry picked from commit 924476dcac6181cd0f3ee731ec7b73672ff03793)
      1a0d4ed6
  2. 05 Mar, 2026 15 commits
  3. 04 Mar, 2026 8 commits
  4. 03 Mar, 2026 9 commits
    • shaw's avatar
      feat: 重构 /v1/usage 端点,支持 quota_limited 和 unrestricted 双模式 · 838dad87
      shaw authored
      - quota_limited 模式:返回 Key 级别的总额度、速率限制窗口用量和过期时间
      - unrestricted 模式:返回订阅限额或钱包余额信息(向后兼容)
      - 新增 model_stats 字段,支持 start_date/end_date 参数查询按模型用量统计
      - 提取 buildUsageData/parseUsageDateRange 等辅助方法,减少主函数复杂度
      - 新增 APIKeyService.GetRateLimitData 和 UsageService.GetAPIKeyModelStats
      838dad87
    • QTom's avatar
      feat(gateway): 系统设置控制未分组 Key 调度 — Handler 层中间件拦截 · 0c7cbe35
      QTom authored
      新增系统设置 allow_ungrouped_key_scheduling(默认关闭),
      未分组的 API Key 在网关请求时直接返回 403,
      由 RequireGroupAssignment 中间件统一拦截,
      支持 Anthropic / Google 两种错误格式响应。
      
      全栈实现:常量 → 结构体 → 解析/更新/初始化 → DTO → 管理接口 →
      中间件 → 路由注册 → 前端设置界面 + i18n。
      0c7cbe35
    • alfadb's avatar
      style: fix gofmt formatting in ops_settings.go · 832b0185
      alfadb authored
      
      
      Remove extra space before inline comment to pass golangci-lint gofmt check.
      Co-Authored-By: default avatarClaude Opus 4.6 <noreply@anthropic.com>
      832b0185
    • alfadb's avatar
      fix(ops): 默认忽略 count_tokens 404 错误 · b1719b26
      alfadb authored
      
      
      将 IgnoreCountTokensErrors 默认值从 false 改为 true。
      
      count_tokens 返回 404 是预期业务行为(上游不支持 endpoint,
      客户端应 fallback 到本地 tokenizer 估算),不应被视为错误。
      Co-Authored-By: default avatarClaude Opus 4.6 <noreply@anthropic.com>
      b1719b26
    • shaw's avatar
      fix: 修复 PR #723 引入的 CI lint 和 test 编译错误 · ccf6a921
      shaw authored
      - wire_gen_test.go: 补充 NewTokenRefreshService 缺失的 tempUnschedCache 参数
      - config.go, token_refresh_service.go: 修复 gofmt 格式问题
      ccf6a921
    • shaw's avatar
      fix: correct migration 061 checksum and add missing BillingCache mock methods · 4a919545
      shaw authored
      - Fix fileChecksum for 061 migration: use TrimSpace hash (66207e7a) instead
        of raw sha256sum (97bdd9a3), matching the actual runtime computation
      - Add 222b4a09 as accepted DB checksum for 061 migration
      - Add missing GetAPIKeyRateLimit/SetAPIKeyRateLimit/UpdateAPIKeyRateLimitUsage/
        InvalidateAPIKeyRateLimit methods to mock BillingCache in test stubs
      - Fix NewBillingCacheService call in singleflight test (add apiKeyRepo param)
      4a919545
    • shaw's avatar
      fix: resolve CI lint errors and test compilation failures for rate limit feature · b8b5cec3
      shaw authored
      - Fix errcheck: properly handle rows.Close() error via named return + defer closure
      - Fix gofmt: auto-format billing_cache.go, api_key_service.go, billing_cache_service.go
      - Add missing rate limit interface methods to 4 test stubs (GetRateLimitData, IncrementRateLimitUsage, ResetRateLimitWindows)
      - Fix NewBillingCacheService calls missing the new apiKeyRepo parameter
      b8b5cec3
    • shaw's avatar
      feat: apikey支持5h/1d/7d速率控制 · a80ec5d8
      shaw authored
      a80ec5d8
    • QTom's avatar
      fix(gateway): 分组隔离 — 禁止未分组账号被跨组调度 · 530a1629
      QTom authored
      当 API Key 无分组时,调度仅从未分组账号池中选取。
      修复 isAccountInGroup 在 groupID==nil 时的逻辑,
      同时补全 scheduler_snapshot_service 和 gemini_compat_service
      中的 SimpleMode 保护,确保分组隔离在所有调度路径生效。
      
      新增 ListSchedulableUngroupedByPlatform/s 方法,
      使用 Ent 的 Not(HasAccountGroups()) 谓词实现未分组账号隔离。
      新增 17 个单元和端到端隔离测试,覆盖所有分支和边界条件。
      530a1629
  5. 02 Mar, 2026 3 commits
    • erio's avatar
      fix: remove unused sanitizeCustomMenuItemsJSON function · 451a8511
      erio authored
      
      
      Replaced by filterUserVisibleMenuItems which includes both array
      validation and admin-item filtering.
      Co-Authored-By: default avatarClaude Opus 4.6 <noreply@anthropic.com>
      451a8511
    • erio's avatar
      fix: security hardening and architectural improvements for custom menu · e97c3766
      erio authored
      
      
      1. (Critical) Filter admin-only menu items from public API responses -
         both GetPublicSettings handler and GetPublicSettingsForInjection now
         exclude visibility=admin items, preventing unauthorized access to
         admin menu URLs.
      
      2. (Medium) Validate JSON array structure in sanitizeCustomMenuItemsJSON -
         use json.Unmarshal into []json.RawMessage instead of json.Valid to
         reject non-array JSON values that would cause frontend runtime errors.
      
      3. (Medium) Decouple router from business JSON parsing - move origin
         extraction logic from router.go to SettingService.GetFrameSrcOrigins,
         eliminating direct JSON parsing of custom_menu_items in the routing
         layer.
      
      4. (Low) Restrict custom menu item ID charset to [a-zA-Z0-9_-] via
         regex validation, preventing route-breaking characters like / ? # or
         spaces.
      
      5. (Low) Handle crypto/rand error in generateMenuItemID - return error
         instead of silently ignoring, preventing potential duplicate IDs.
      Co-Authored-By: default avatarClaude Opus 4.6 <noreply@anthropic.com>
      e97c3766
    • erio's avatar
      style: fix gofmt alignment in setting_service.go · 7541e243
      erio authored
      7541e243