## 上游来源 - Issue:https://github.com/QuantumNous/new-api/issues/6510 - 标题:`[Bug] 内存缓存与数据库路径的渠道权重比例不一致(weight vs weight+10)` - 上游基线:`main@afe16c64cd73853da1eda3bf236f15d69637b4bf` - 记录时状态:Open ## 问题摘要 官方当前存在两套渠道权重语义: - Redis / 内存缓存路径直接按原始 `weight` 比例选择。 - 非缓存数据库路径按 `weight + 10` 比例选择。 官方 FAQ 明确承诺同优先级渠道按填写的权重比例分配,例如 `2:1` 应得到 `2:1`。隐藏的 `+10` 会使 `2:1` 变成 `12:11`,并使部分显式权重为 0 的渠道继续获得流量。 本 fork 的目标语义应为: ```text sum(weight) > 0:按 weight / sum(weight) 分配 所有 weight == 0:候选渠道等量随机 部分为 0、部分 > 0:weight == 0 的渠道不接收新流量 ``` ## 当前本地边界 - 当前生产配置 Redis,因此实际走原始权重的内存缓存路径。 - 现有部分渠道权重曾按旧 `weight + 10` 语义设计,当前可见配置与原目标比例不完全一致。 - 用户已明确要求:**本跟踪阶段暂不修改任何生产渠道权重、Redis、亲和、优先级、分组或售价配置。** - 生产权重迁移属于后续独立变更,必须重新回读渠道状态、保存脱敏快照、明确变更表并获得单独授权。 ## 建议实现 - 将 DB 路径改为与缓存路径一致的原始权重语义。 - 抽取两条路径共用的加权选择 helper,避免再次漂移。 - 明确并测试全零与部分零权重行为。 - 如上游先修复,优先跟随上游实现;如长期未处理,再在本 fork 独立修复并向上游提交 PR。 - UI tooltip 或文档补充权重 0 的行为,但不引入隐藏偏移量。 ## 验收条件 - [ ] 上游 issue 完成 triage,并在此同步结论、关联 PR 或关闭原因 - [ ] 缓存和非缓存路径对相同候选集使用完全相同的有效权重 - [ ] `2:1` 配置在两条路径下都保持 `2:1` - [ ] 全零权重在两条路径下都等量随机 - [ ] `1:0` 配置在两条路径下都不把新流量分给权重 0 渠道 - [ ] 单元测试不依赖大样本随机统计,优先验证确定性的有效权重/区间构造 - [ ] 引入上游修复或本地修复后通过相关 Go 测试 - [ ] 生产权重调整另开变更步骤并单独授权;本 issue 关闭前不默认执行生产配置迁移 ## 跟踪策略 - [ ] 关注 https://github.com/QuantumNous/new-api/issues/6510 的维护者反馈 - [ ] 关联上游修复 PR 和首次包含修复的 release/tag - [ ] 检查上游是否同时修改 DB、缓存、文档和测试 - [ ] 上游合并后评估与 `nexus` 分支冲突及回归范围 - [ ] 未获生产变更授权前保持现网配置不变
上游来源
[Bug] 内存缓存与数据库路径的渠道权重比例不一致(weight vs weight+10)main@afe16c64cd73853da1eda3bf236f15d69637b4bf问题摘要
官方当前存在两套渠道权重语义:
weight比例选择。weight + 10比例选择。官方 FAQ 明确承诺同优先级渠道按填写的权重比例分配,例如
2:1应得到2:1。隐藏的+10会使2:1变成12:11,并使部分显式权重为 0 的渠道继续获得流量。本 fork 的目标语义应为:
当前本地边界
weight + 10语义设计,当前可见配置与原目标比例不完全一致。建议实现
验收条件
2:1配置在两条路径下都保持2:11:0配置在两条路径下都不把新流量分给权重 0 渠道跟踪策略
nexus分支冲突及回归范围