1. 15 Mar, 2026 8 commits
    • erio's avatar
      refactor: replace sync.Map credits state with AICredits rate limit key · 8a260def
      erio authored
      Replace process-memory sync.Map + per-model runtime state with a single
      "AICredits" key in model_rate_limits, making credits exhaustion fully
      isomorphic with model-level rate limiting.
      
      Scheduler: rate-limited accounts with overages enabled + credits available
      are now scheduled instead of excluded.
      
      Forwarding: when model is rate-limited + credits available, inject credits
      proactively without waiting for a 429 round trip.
      
      Storage: credits exhaustion stored as model_rate_limits["AICredits"] with
      5h duration, reusing SetModelRateLimit/isRateLimitActiveForKey.
      
      Frontend: show credits_active (yellow ) when model rate-limited but
      credits available, credits_exhausted (red) when AICredits key active.
      
      Tests: add unit tests for shouldMarkCreditsExhausted, injectEnabledCreditTypes,
      clearCreditsExhausted, and update existing overages tests.
      8a260def
    • SilentFlower's avatar
    • SilentFlower's avatar
    • SilentFlower's avatar
    • SilentFlower's avatar
      feat: implement resolveCreditsOveragesModelKey function to stabilize model key... · 17e40333
      SilentFlower authored
      feat: implement resolveCreditsOveragesModelKey function to stabilize model key resolution for credit overages
      17e40333
    • shaw's avatar
      fix: 恢复 UsageProgressBar 中被意外移除的窗口统计数据展示 · 220fbe65
      shaw authored
      commit 0debe0a8 在修复 OpenAI WS 用量窗口刷新问题时,意外删除了
      UsageProgressBar 中的 window stats 渲染逻辑和格式化函数。
      
      恢复进度条上方的统计行(requests, tokens, account cost, user cost)
      及对应的 4 个格式化 computed 属性。
      220fbe65
    • IanShaw027's avatar
      fix: 修复批量编辑账号时模型白名单显示与实际不一致的问题 #982 · 19d3ecc7
      IanShaw027 authored
      修复批量编辑账号时,UI 显示的是 plain 模型名(如 GPT-5),但实际落库的是 dated 模型名的问题。
      
      核心改动:
      1. 批量编辑白名单不再使用 BulkEditAccountModal.vue 中手写的过期模型列表
         - 移除了 allModels 和 presetMappings 的硬编码列表(共 200+ 行)
         - 直接复用 ModelWhitelistSelector.vue 组件
      
      2. ModelWhitelistSelector 组件支持多平台联合过滤
         - 新增 platforms 属性支持传入多个平台
         - 添加 normalizedPlatforms 计算属性统一处理单平台和多平台场景
         - availableOptions 根据选中的多个平台动态联合过滤模型列表
         - fillRelated 功能支持一次性填充多个平台的相关模型
      
      3. 模型映射预设改为动态生成
         - filteredPresets 改用 getPresetMappingsByPlatform 从统一模型源按平台动态生成
         - 不再依赖弹窗中的手写预设列表
      
      现在的行为:
      - UI 显示什么模型,勾选什么模型,传给后端的就是什么模型
      - 彻底解决了批量编辑链路上"显示与实际不一致"的问题
      - 模型列表和映射预设始终与系统定义保持同步
      19d3ecc7
    • Ethan0x0000's avatar
      feat: 完善使用记录端点可观测性与分布统计 · eefab159
      Ethan0x0000 authored
      将入站、上游与路径三类端点分布统一到使用记录页的一致化卡片交互中,并补齐端点元数据与统计链路,提升排障与流量分析效率。
      eefab159
  2. 14 Mar, 2026 3 commits
    • SsageParuders's avatar
      fix: Bedrock 账户配额限制不生效,配额计数器始终为 $0.00 · 37c044fb
      SsageParuders authored
      applyUsageBillingEffects() 中配额更新条件仅检查了 AccountTypeAPIKey,
      遗漏了 AccountTypeBedrock,导致 Bedrock 账户的配额计数器永远不递增。
      扩展条件以同时支持 APIKey 和 Bedrock 类型。
      
      同时在前端账户筛选下拉框中添加 AWS Bedrock 选项。
      37c044fb
    • shaw's avatar
      refactor(frontend): 将备份和数据管理页面合并为设置页的标签页 · 616930f9
      shaw authored
      将独立的 /admin/backup 和 /admin/data-management 页面整合到设置页,
      作为「备份」和「Sora 存储」标签页,减少侧边栏条目,集中管理配置。
      
      - 移除 BackupView 和 DataManagementView 的 AppLayout 包装
      - 在 SettingsView 中以子组件形式嵌入,使用 v-show 切换标签
      - 删除独立路由和侧边栏菜单入口
      - 备份/数据标签页下隐藏主保存按钮(各自有独立保存)
      - 优化标签栏样式适配7个标签,PC端支持细滚动条
      - 清理未使用的图标组件和 i18n 键
      616930f9
    • SsageParuders's avatar
      refactor: merge bedrock-apikey into bedrock with auth_mode credential · 4644af2c
      SsageParuders authored
      Consolidate two separate channel types (bedrock + bedrock-apikey) into
      a single "AWS Bedrock" channel. Authentication mode is now distinguished
      by credentials.auth_mode ("sigv4" | "apikey") instead of separate types.
      
      Backend:
      - Remove AccountTypeBedrockAPIKey constant
      - IsBedrock() simplified; IsBedrockAPIKey() checks auth_mode
      - Add IsAPIKeyOrBedrock() helper to eliminate repeated type checks
      - Extend pool mode, quota scheduling, and billing to bedrock
      - Add RetryableOnSameAccount to handleBedrockUpstreamErrors
      - Add "bedrock" scope to Beta Policy for independent control
      
      Frontend:
      - Merge two buttons into one "AWS Bedrock" with auth mode radio
      - Badge displays "Anthropic | AWS"
      - Pool mode and quota limit UI available for bedrock
      - Quota display in account list (usage bars, capacity badges, reset)
      - Remove all bedrock-apikey type references
      4644af2c
  3. 13 Mar, 2026 4 commits
    • erio's avatar
      feat(antigravity): add 403 forbidden status detection, classification and display · 6344fa2a
      erio authored
      Backend:
      - Detect and classify 403 responses into three types:
        validation (account needs Google verification),
        violation (terms of service / banned),
        forbidden (generic 403)
      - Extract verification/appeal URLs from 403 response body
        (structured JSON parsing with regex fallback)
      - Add needs_verify, is_banned, needs_reauth, error_code fields
        to UsageInfo (omitempty for zero impact on other platforms)
      - Handle 403 in request path: classify and permanently set account error
      - Save validation_url in error_message for degraded path recovery
      - Enrich usage with account error on both success and degraded paths
      - Add singleflight dedup for usage requests with independent context
      - Differentiate cache TTL: success/403 → 3min, errors → 1min
      - Return degraded UsageInfo instead of HTTP 500 on quota fetch errors
      
      Frontend:
      - Display forbidden status badges with color coding (red for banned,
        amber for needs verification, gray for generic)
      - Show clickable verification/appeal URL links
      - Display needs_reauth and degraded error states in usage cell
      - Add Antigravity tier label badge next to platform type
      
      Tests:
      - Comprehensive unit tests for classifyForbiddenType (7 cases)
      - Unit tests for extractValidationURL (8 cases including unicode escapes)
      - Integration test for FetchQuota forbidden path
      6344fa2a
    • Ylarod's avatar
      sub2api: add bedrock support · 11f7b835
      Ylarod authored
      11f7b835
    • wucm667's avatar
      feat: 账号配额支持固定时间重置模式 · 5b850059
      wucm667 authored
      - 后端新增 rolling/fixed 两种配额重置模式,支持日配额和周配额
      - fixed 模式下可配置重置时刻(小时)、重置星期几(周配额)及时区(IANA)
      - 在 account_repo.go 中使用 SQL 表达式适配两种模式的过期判断与重置时间推进
      - 新增 ComputeQuotaResetAt / ValidateQuotaResetConfig 等辅助函数
      - DTO 层新增相关字段并在 mappers 中完整映射
      - 前端 QuotaLimitCard 新增 rolling/fixed 切换 UI、时区选择器
      - CreateAccountModal / EditAccountModal 透传新配置字段
      - i18n(zh/en)同步新增相关翻译词条
      5b850059
    • Rose Ding's avatar
      feat: 数据库定时备份与恢复(S3 兼容存储,支持 Cloudflare R2) · 53ad1645
      Rose Ding authored
      
      
      新增管理员专属的数据库备份与恢复功能:
      - 全量 PostgreSQL 备份(pg_dump),gzip 压缩后上传到 S3 兼容存储
      - 支持手动备份和 cron 定时备份
      - 支持从备份恢复(psql --single-transaction)
      - 备份文件自动过期清理(默认 14 天)
      - 前端完整管理页面(S3 配置、定时配置、备份列表、恢复/下载/删除)
      - 内置 Cloudflare R2 配置教程弹窗
      - Dockerfile 从 postgres 镜像多阶段复制 pg_dump/psql,确保版本一致
      Co-Authored-By: default avatarClaude Opus 4.6 <noreply@anthropic.com>
      53ad1645
  4. 12 Mar, 2026 3 commits
    • Peter's avatar
      80d8d6c3
    • erio's avatar
      feat(groups): add rate multipliers management modal · d6488112
      erio authored
      Add a dedicated modal in group management for viewing, adding, editing,
      and deleting per-user rate multipliers within a group.
      
      Backend:
      - GET /admin/groups/:id/rate-multipliers - list entries with user details
      - PUT /admin/groups/:id/rate-multipliers - batch sync (full replace)
      - DELETE /admin/groups/:id/rate-multipliers - clear all entries
      - Repository: GetByGroupID, SyncGroupRateMultipliers methods on
        user_group_rate_multipliers table (same table as user-side rates)
      
      Frontend:
      - New GroupRateMultipliersModal component with:
        - User search and add with email autocomplete
        - Editable rate column with local edit mode (cancel/save)
        - Batch adjust: multiply all rates by a factor
        - Clear all (local operation, requires save to persist)
        - Pagination (10/20/50 per page)
        - Platform icon with brand colors in group info bar
        - Unsaved changes indicator with revert option
      - Unit tests for all three backend endpoints
      d6488112
    • QTom's avatar
      a63de121
  5. 11 Mar, 2026 5 commits
  6. 09 Mar, 2026 6 commits
    • kyx236's avatar
      fix: OpenAI临时性400错误支持池模式同账号重试 & HelpTooltip层级修复 · 5fa22fdf
      kyx236 authored
      1. 识别OpenAI "An error occurred while processing your request" 临时性400错误
         并触发failover,同时在池模式下标记RetryableOnSameAccount,允许同账号重试
      2. ForwardAsAnthropic路径同步支持临时性400错误的识别和同账号重试
      3. HelpTooltip组件使用Teleport渲染到body,修复在dialog内被裁切的问题
      5fa22fdf
    • ischanx's avatar
      feat: 允许管理员为持有有效订阅的用户绑定订阅类型分组 · 767a41e2
      ischanx authored
      
      
      之前管理员无法通过 API 密钥管理将用户绑定到订阅类型分组(直接返回错误)。
      现在改为检查用户是否持有该分组的有效订阅,有则允许绑定,无则拒绝。
      
      - admin_service: 新增 userSubRepo 依赖,替换硬拒绝为订阅校验
      - admin_service: 区分 ErrSubscriptionNotFound 和内部错误,避免 DB 故障被误报
      - wire_gen/api_contract_test: 同步新增参数
      - UserApiKeysModal: 管理员分组下拉不再过滤订阅类型分组
      Co-Authored-By: default avatarClaude Opus 4.6 <noreply@anthropic.com>
      767a41e2
    • QTom's avatar
      feat: 支持批量重置状态和批量刷新令牌 · 252d6c53
      QTom authored
      - 提取 refreshSingleAccount 私有方法复用单账号刷新逻辑
      - 新增 BatchClearError handler (POST /admin/accounts/batch-clear-error)
      - 新增 BatchRefresh handler (POST /admin/accounts/batch-refresh)
      - 前端 AccountBulkActionsBar 添加批量重置状态/刷新令牌按钮
      - AccountsView 添加 handler 支持 partial success 反馈
      - i18n 中英文补充批量操作相关翻译
      252d6c53
    • QTom's avatar
      feat: 从 OpenAI JWT 提取 chatgpt_plan_type 并在前端展示 · a582aa89
      QTom authored
      OAuth 授权和 token 刷新时从 id_token 的 OpenAI auth claim 中
      提取 chatgpt_plan_type(plus/team/pro/free),存入 credentials,
      账号管理页面 PlatformTypeBadge 显示订阅类型。
      a582aa89
    • erio's avatar
      fix(frontend): stack quota badges vertically in capacity column · acefa1da
      erio authored
      
      
      QuotaBadge components (daily/weekly/total) were wrapped in a
      horizontal flex container, making them visually inconsistent with
      other capacity badges (concurrency, window cost, sessions, RPM)
      which stack vertically. Remove the wrapper so all badges align
      consistently.
      Co-Authored-By: default avatarClaude Opus 4.6 <noreply@anthropic.com>
      acefa1da
    • yangjianbo's avatar
      fix(billing): 修复 OpenAI fast 档位计费并补齐展示 · 87f4ed59
      yangjianbo authored
      
      
      - 打通 service_tier 在 OpenAI HTTP、WS、passthrough 与 usage 记录中的传递
      - 修正 priority/flex 计费逻辑,并将 fast 归一化为 priority
      - 在用户端和管理端补齐服务档位与计费明细展示
      - 补齐前后端测试,并修复 WS 限流信号重复持久化导致的全量回归失败
      Co-Authored-By: default avatarClaude Opus 4.6 <noreply@anthropic.com>
      87f4ed59
  7. 08 Mar, 2026 5 commits
    • erio's avatar
      feat(frontend): add API Key quota progress bars to usage window column · 4cd6d864
      erio authored
      Display daily/weekly/total quota utilization as progress bars in the
      usage window column for API Key accounts, providing visual feedback
      consistent with other account types (OAuth/Gemini).
      
      - Daily quota: "1d" label with reset countdown
      - Weekly quota: "7d" label with reset countdown
      - Total quota: "total" label (no reset)
      4cd6d864
    • bayma888's avatar
      feat(ui): 使用记录页面点击用户邮箱可查看充值记录 · 60c5949a
      bayma888 authored
      - UsageTable 用户邮箱改为可点击链接,点击弹出余额变动记录
      - 复用 UserBalanceHistoryModal 组件,通过 getById API 获取完整用户信息
      - 新增 hideActions prop 隐藏充值/退款按钮(Usage 页面仅查看)
      - i18n: 新增 clickToViewBalance、failedToLoadUser 词条 (en/zh)
      60c5949a
    • bayma888's avatar
      feat(ui): 优化分组选择器交互体验 · 2ebbd4c9
      bayma888 authored
      - 分组下拉添加搜索框,支持按名称/描述快速筛选
      - 新建/编辑密钥弹窗的分组选择也支持搜索
      - 智能弹出方向:底部空间不足时自动向上弹出
      - 倍率独立为平台配色的圆角标签,更醒目
      - 分组名称加粗,名称与描述之间增加间距
      - 分组选项之间添加分隔线,视觉更清晰
      - 切换图标旁增加"选择分组"文字提示
      - 下拉宽度自适应内容长度
      - i18n: 新增 searchGroup、noGroupFound 词条 (en/zh)
      2ebbd4c9
    • bayma888's avatar
      fix(ui): improve group selector dropdown width and visibility · 785115c6
      bayma888 authored
      - Increase Select dropdown max-width from 320px to 480px for better content display
      - Change KeysView group selector from fixed 256px to adaptive 280-480px width
      - Make group switch icon always visible (60% opacity, 100% on hover)
      - Allow group description to wrap to 2 lines instead of truncating
      - Improve user experience for group selection in API keys page
      785115c6
    • kyx236's avatar
  8. 07 Mar, 2026 6 commits
    • kyx236's avatar
      feat(admin): 支持定时测试自动恢复并统一账号恢复入口 · 0c29468f
      kyx236 authored
      - 为定时测试计划增加 auto_recover 配置,补齐前后端类型、接口、仓储与数据库迁移
      - 在定时测试成功后自动恢复账号 error、rate-limit 等可恢复运行时状态
      - 新增 /admin/accounts/:id/recover-state 接口,合并原有重置状态与清限流操作
      - 更新账号管理菜单与定时测试面板,补充自动恢复开关、说明提示和状态展示
      - 补充账号恢复、限流清理与仓储同步相关测试
      0c29468f
    • 神乐's avatar
      fix: 修复 OpenAI WS 用量刷新遗漏场景 · 9301dae6
      神乐 authored
      9301dae6
    • erio's avatar
      feat: add marquee selection box overlay during drag-to-select · 2475d4a2
      erio authored
      
      
      Show a semi-transparent blue rectangle overlay while dragging to
      select rows, matching the project's primary color theme with dark
      mode support. The box spans the full table width from drag start
      to current mouse position.
      Co-Authored-By: default avatarClaude Opus 4.6 <noreply@anthropic.com>
      2475d4a2
    • 神乐's avatar
      101ef0cf
    • 神乐's avatar
      0debe0a8
    • erio's avatar
      feat(account): add daily/weekly periodic quota limits for API Key accounts · 1ee17383
      erio authored
      
      
      Extend the existing total quota limit with daily and weekly periodic
      dimensions. Each dimension is independently configurable and uses lazy
      reset — when the period expires, usage is automatically reset to zero on
      the next increment. Any dimension exceeding its limit will pause the
      account from scheduling.
      
      Backend:
      - Add GetQuotaDailyLimit/Used, GetQuotaWeeklyLimit/Used, HasAnyQuotaLimit
      - Rewrite IncrementQuotaUsed with atomic CTE SQL for 3-dimension update
      - Rewrite ResetQuotaUsed to clear all dimensions and period timestamps
      - Update postUsageBilling to use HasAnyQuotaLimit()
      - Preserve daily/weekly used values on account edit
      
      Frontend:
      - Refactor QuotaLimitCard from single v-model to 3-dimension props
      - Add QuotaBadge component for compact D/W/$ display
      - Update AccountCapacityCell with per-dimension badges
      - Update Create/Edit modals with daily/weekly quota fields
      - Update AccountActionMenu hasQuotaLimit to check all dimensions
      - Add i18n strings for daily/weekly/total quota labels
      Co-Authored-By: default avatarClaude Opus 4.6 <noreply@anthropic.com>
      1ee17383