Files
new-pai-linghe/service/group.go
吴中洋 b6db60dbfb feat(billing): 按来源域名将 auto 路由到多层价格池(命名嵌套 auto)
- 新增二级 auto(高价池/低价池): 命名的嵌套 auto, 复用现有 auto 跨子分组选渠道/重试/熔断, 对用户隐藏
- 新增域名路由中间件: 仅 auto 生效, 按 X-Forwarded-Host/Host 改写 UsingGroup+TokenGroup(修复重试陷阱)
- 泛化 channel_select / distributor affinity 的 auto 判定(IsAutoTypeGroup + GetAutoSubGroups)
- 新增 option: SecondaryAutoGroups / DomainAutoRouting; 前端分组定价页加可视化配置表
- 价差来自高/低价池各自挂载的渠道定价(子分组 ratio=1.0), 不使用分组系数
- 恢复 docker 本地源码构建配置(Dockerfile workspace 构建 + compose build + postgres 5433)
2026-06-03 03:52:43 +08:00

77 lines
2.4 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package service
import (
"strings"
"github.com/QuantumNous/new-api/setting"
"github.com/QuantumNous/new-api/setting/ratio_setting"
)
func GetUserUsableGroups(userGroup string) map[string]string {
groupsCopy := setting.GetUserUsableGroupsCopy()
if userGroup != "" {
specialSettings, b := ratio_setting.GetGroupRatioSetting().GroupSpecialUsableGroup.Get(userGroup)
if b {
// 处理特殊可用分组
for specialGroup, desc := range specialSettings {
if strings.HasPrefix(specialGroup, "-:") {
// 移除分组
groupToRemove := strings.TrimPrefix(specialGroup, "-:")
delete(groupsCopy, groupToRemove)
} else if strings.HasPrefix(specialGroup, "+:") {
// 添加分组
groupToAdd := strings.TrimPrefix(specialGroup, "+:")
groupsCopy[groupToAdd] = desc
} else {
// 直接添加分组
groupsCopy[specialGroup] = desc
}
}
}
// 如果userGroup不在UserUsableGroups中返回UserUsableGroups + userGroup
if _, ok := groupsCopy[userGroup]; !ok {
groupsCopy[userGroup] = "用户分组"
}
}
return groupsCopy
}
func GroupInUserUsableGroups(userGroup, groupName string) bool {
_, ok := GetUserUsableGroups(userGroup)[groupName]
return ok
}
// GetUserAutoGroup 根据用户分组获取自动分组设置
func GetUserAutoGroup(userGroup string) []string {
groups := GetUserUsableGroups(userGroup)
autoGroups := make([]string, 0)
for _, group := range setting.GetAutoGroups() {
if _, ok := groups[group]; ok {
autoGroups = append(autoGroups, group)
}
}
return autoGroups
}
// GetAutoSubGroups 返回某个 auto 型分组(顶层 "auto" 或二级 auto的可用子分组列表。
// - 顶层 "auto":沿用 GetUserAutoGroup与用户可用分组求交保持现状
// - 二级 auto直接返回其配置的子分组不与 UserUsableGroups 求交),
// 从而让高/低价子分组无需对用户可见即可生效,实现对用户隐藏。
func GetAutoSubGroups(autoName, userGroup string) []string {
if autoName == "auto" {
return GetUserAutoGroup(userGroup)
}
return setting.GetAutoGroupSubGroups(autoName)
}
// GetUserGroupRatio 获取用户使用某个分组的倍率
// userGroup 用户分组
// group 需要获取倍率的分组
func GetUserGroupRatio(userGroup, group string) float64 {
ratio, ok := ratio_setting.GetGroupGroupRatio(userGroup, group)
if ok {
return ratio
}
return ratio_setting.GetGroupRatio(group)
}