Skip to content

feat(token): Add consumed mode for quota management (opt-in)#315

Open
fno2010 wants to merge 3 commits intochenyme:mainfrom
fno2010:feature/token-quota-optimization
Open

feat(token): Add consumed mode for quota management (opt-in)#315
fno2010 wants to merge 3 commits intochenyme:mainfrom
fno2010:feature/token-quota-optimization

Conversation

@fno2010
Copy link
Contributor

@fno2010 fno2010 commented Mar 12, 2026

Summary

本 PR 为实验性功能,默认关闭,预期不影响现有用户。请在充分测试后再开启使用。

本 PR 是针对 Issue #205 中 Token 额度管理机制优化建议的初步实现,提供了 Issue 中提出的"消耗记录模式"作为可选特性。

已实现功能

  1. 新增 consumed_mode_enabled 配置项(默认关闭,保持向后兼容)
    • 当启用时,不再依赖 API 返回的不准确 quota 值
    • 改为在本地记录每个 Token 的消耗次数(consumed)
    • Token 进入冷却时重置 consumed 为 0
  2. 优化 Token 选择策略
    • 在启用消耗模式下,优先选择消耗次数较少的 Token
    • 在默认模式下,仍按原始逻辑,优先选择剩余配额较多的 Token
  3. 前端 UI 适配
    • 根据模式动态切换显示"剩余额度"或"已消耗次数"
    • consumed 模式下禁用编辑 modal 中的额度编辑功能

待改进项

  1. 自动重置周期:目前没有实现额度(quota 和 consumed)的自动重置周期,完全依靠 429 触发冷却。如果使用频率很低,远低于远端服务器内部的额度重置周期,consumed 将永远不会触发重置。这会影响负载均衡——当某个 Token 率先进入冷却后恢复时,它的 consumed 会明显低于其它 Token,因而更容易被调度,也更容易再次触发冷却。可添加一个可配置的最大不活跃时间阈值,当 Token 超过该时间未被使用时,自动重置其 consumed 值。
  2. 自动学习重置周期:手动配置的重置周期可能不够准确,可以增加一个机制,根据 Token 的历史消耗和进入冷却的频率,自动学习并推断 Token 额度的重置周期。

风险提示

本 PR 对现有额度管理机制有较大调整,包括:

  • Token 冷却判断逻辑的变化
  • Token 选择策略的调整(优先选择消耗少的)
  • consumed 字段的引入和重置时机

建议仔细评估后再合并,尤其是:

  • 在生产环境充分测试
  • 评估对现有 Token 行为的影响
  • 确认向后兼容性符合预期

Changes

  • 功能新增

Related Issues

Closes #205

Verification

  • 本地运行验证

验证说明:

本地测试通过,功能正常运行

Breaking Changes

fno2010 added 3 commits March 12, 2026 08:10
- Add 'consumed_mode_enabled' config option (opt-in, default false)
- Track local consumption separately from API quota
- consumed increases in both modes; quota deduction differs by mode
- Prefer tokens with lower consumed amount in pool selection
- UI dynamically switches between 'remaining quota' and 'consumed' display
- Disable quota editing in edit modal when consumed mode is enabled
- Maintain backward compatibility with existing configs
- Reset consumed to 0 when quota reaches 0 in default mode (consume())
- Reset consumed to 0 when 429 rate limit is triggered (mark_rate_limited())
- Remove consumed reset on API sync, only restore active status
- This ensures consumed represents 'usage count per cooling cycle'
在 consumed 模式下,移除错误的『新旧 token 分离逻辑』,改为直接在所有
available token 中选择 consumed 最少的。

问题根因:
- 原逻辑将 consumed > 0 的 token 标记为『新逻辑』并优先选择
- 导致一旦某个 token 被使用过,其他 consumed=0 的 token 就永久被排除
- 造成单个 token 过载,其他 token 闲置的问题

修复方案:
- 删除 new_logic_tokens 和 old_logic_tokens 的分离逻辑
- 直接在所有 available token 中按 consumed 排序,选择最少的
- 确保所有 token 都能参与负载均衡,实现真正的消耗均衡

测试验证:
- 5 个 token,10 次请求,每个 token 恰好被选择 2 次
- 负载均衡差异为 0,符合预期
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

enhancement: Token 额度管理机制优化建议

1 participant