✨ feat: Support channel setting chat only
This commit is contained in:
parent
be874c330f
commit
2bc2dfca39
@ -21,6 +21,20 @@ type ChannelsChooser struct {
|
|||||||
Match []string
|
Match []string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type ChannelsFilterFunc func(channelId int, choice *ChannelChoice) bool
|
||||||
|
|
||||||
|
func FilterChannelId(skipChannelId int) ChannelsFilterFunc {
|
||||||
|
return func(channelId int, choice *ChannelChoice) bool {
|
||||||
|
return skipChannelId > 0 && channelId == skipChannelId
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func FilterOnlyChat() ChannelsFilterFunc {
|
||||||
|
return func(channelId int, choice *ChannelChoice) bool {
|
||||||
|
return choice.Channel.OnlyChat
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (cc *ChannelsChooser) Cooldowns(channelId int) bool {
|
func (cc *ChannelsChooser) Cooldowns(channelId int) bool {
|
||||||
if common.RetryCooldownSeconds == 0 {
|
if common.RetryCooldownSeconds == 0 {
|
||||||
return false
|
return false
|
||||||
@ -35,20 +49,31 @@ func (cc *ChannelsChooser) Cooldowns(channelId int) bool {
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
func (cc *ChannelsChooser) balancer(channelIds []int, skipChannelId int) *Channel {
|
func (cc *ChannelsChooser) balancer(channelIds []int, filters []ChannelsFilterFunc) *Channel {
|
||||||
nowTime := time.Now().Unix()
|
nowTime := time.Now().Unix()
|
||||||
totalWeight := 0
|
totalWeight := 0
|
||||||
|
|
||||||
validChannels := make([]*ChannelChoice, 0, len(channelIds))
|
validChannels := make([]*ChannelChoice, 0, len(channelIds))
|
||||||
for _, channelId := range channelIds {
|
for _, channelId := range channelIds {
|
||||||
if skipChannelId > 0 && channelId == skipChannelId {
|
choice, ok := cc.Channels[channelId]
|
||||||
|
if !ok || choice.CooldownsTime >= nowTime {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if choice, ok := cc.Channels[channelId]; ok && choice.CooldownsTime < nowTime {
|
|
||||||
weight := int(*choice.Channel.Weight)
|
isSkip := false
|
||||||
totalWeight += weight
|
for _, filter := range filters {
|
||||||
validChannels = append(validChannels, choice)
|
if filter(channelId, choice) {
|
||||||
|
isSkip = true
|
||||||
|
break
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
if isSkip {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
weight := int(*choice.Channel.Weight)
|
||||||
|
totalWeight += weight
|
||||||
|
validChannels = append(validChannels, choice)
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(validChannels) == 0 {
|
if len(validChannels) == 0 {
|
||||||
@ -71,7 +96,7 @@ func (cc *ChannelsChooser) balancer(channelIds []int, skipChannelId int) *Channe
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (cc *ChannelsChooser) Next(group, modelName string, skipChannelId int) (*Channel, error) {
|
func (cc *ChannelsChooser) Next(group, modelName string, filters ...ChannelsFilterFunc) (*Channel, error) {
|
||||||
cc.RLock()
|
cc.RLock()
|
||||||
defer cc.RUnlock()
|
defer cc.RUnlock()
|
||||||
if _, ok := cc.Rule[group]; !ok {
|
if _, ok := cc.Rule[group]; !ok {
|
||||||
@ -92,7 +117,7 @@ func (cc *ChannelsChooser) Next(group, modelName string, skipChannelId int) (*Ch
|
|||||||
}
|
}
|
||||||
|
|
||||||
for _, priority := range channelsPriority {
|
for _, priority := range channelsPriority {
|
||||||
channel := cc.balancer(priority, skipChannelId)
|
channel := cc.balancer(priority, filters)
|
||||||
if channel != nil {
|
if channel != nil {
|
||||||
return channel, nil
|
return channel, nil
|
||||||
}
|
}
|
||||||
|
@ -29,6 +29,7 @@ type Channel struct {
|
|||||||
Priority *int64 `json:"priority" gorm:"bigint;default:0"`
|
Priority *int64 `json:"priority" gorm:"bigint;default:0"`
|
||||||
Proxy *string `json:"proxy" gorm:"type:varchar(255);default:''"`
|
Proxy *string `json:"proxy" gorm:"type:varchar(255);default:''"`
|
||||||
TestModel string `json:"test_model" form:"test_model" gorm:"type:varchar(50);default:''"`
|
TestModel string `json:"test_model" form:"test_model" gorm:"type:varchar(50);default:''"`
|
||||||
|
OnlyChat bool `json:"only_chat" form:"only_chat" gorm:"default:false"`
|
||||||
|
|
||||||
Plugin *datatypes.JSONType[PluginType] `json:"plugin" form:"plugin" gorm:"type:json"`
|
Plugin *datatypes.JSONType[PluginType] `json:"plugin" form:"plugin" gorm:"type:json"`
|
||||||
}
|
}
|
||||||
|
@ -32,6 +32,10 @@ func (r *relayChat) setRequest() error {
|
|||||||
return errors.New("max_tokens is invalid")
|
return errors.New("max_tokens is invalid")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if r.chatRequest.Tools != nil {
|
||||||
|
r.c.Set("skip_only_chat", true)
|
||||||
|
}
|
||||||
|
|
||||||
r.originalModel = r.chatRequest.Model
|
r.originalModel = r.chatRequest.Model
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
@ -101,7 +101,16 @@ func fetchChannelById(channelId int) (*model.Channel, error) {
|
|||||||
func fetchChannelByModel(c *gin.Context, modelName string) (*model.Channel, error) {
|
func fetchChannelByModel(c *gin.Context, modelName string) (*model.Channel, error) {
|
||||||
group := c.GetString("group")
|
group := c.GetString("group")
|
||||||
skip_channel_id := c.GetInt("skip_channel_id")
|
skip_channel_id := c.GetInt("skip_channel_id")
|
||||||
channel, err := model.ChannelGroup.Next(group, modelName, skip_channel_id)
|
skip_only_chat := c.GetBool("skip_only_chat")
|
||||||
|
var filters []model.ChannelsFilterFunc
|
||||||
|
if skip_only_chat {
|
||||||
|
filters = append(filters, model.FilterOnlyChat())
|
||||||
|
}
|
||||||
|
if skip_channel_id > 0 {
|
||||||
|
filters = append(filters, model.FilterChannelId(skip_channel_id))
|
||||||
|
}
|
||||||
|
|
||||||
|
channel, err := model.ChannelGroup.Next(group, modelName, filters...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
message := fmt.Sprintf("当前分组 %s 下对于模型 %s 无可用渠道", group, modelName)
|
message := fmt.Sprintf("当前分组 %s 下对于模型 %s 无可用渠道", group, modelName)
|
||||||
if channel != nil {
|
if channel != nil {
|
||||||
|
@ -629,6 +629,22 @@ const EditModal = ({ open, channelId, onCancel, onOk, groupOptions }) => {
|
|||||||
)}
|
)}
|
||||||
</FormControl>
|
</FormControl>
|
||||||
)}
|
)}
|
||||||
|
{inputPrompt.only_chat && (
|
||||||
|
<FormControl fullWidth>
|
||||||
|
<FormControlLabel
|
||||||
|
control={
|
||||||
|
<Switch
|
||||||
|
checked={values.only_chat === true}
|
||||||
|
onClick={() => {
|
||||||
|
setFieldValue('only_chat', !values.only_chat);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
}
|
||||||
|
label={inputLabel.only_chat}
|
||||||
|
/>
|
||||||
|
<FormHelperText id="helper-tex-only_chat_model-label"> {inputPrompt.only_chat} </FormHelperText>
|
||||||
|
</FormControl>
|
||||||
|
)}
|
||||||
{pluginList[values.type] &&
|
{pluginList[values.type] &&
|
||||||
Object.keys(pluginList[values.type]).map((pluginId) => {
|
Object.keys(pluginList[values.type]).map((pluginId) => {
|
||||||
const plugin = pluginList[values.type][pluginId];
|
const plugin = pluginList[values.type][pluginId];
|
||||||
|
@ -10,7 +10,8 @@ const defaultConfig = {
|
|||||||
model_mapping: '',
|
model_mapping: '',
|
||||||
models: [],
|
models: [],
|
||||||
groups: ['default'],
|
groups: ['default'],
|
||||||
plugin: {}
|
plugin: {},
|
||||||
|
only_chat: false
|
||||||
},
|
},
|
||||||
inputLabel: {
|
inputLabel: {
|
||||||
name: '渠道名称',
|
name: '渠道名称',
|
||||||
@ -22,7 +23,8 @@ const defaultConfig = {
|
|||||||
test_model: '测速模型',
|
test_model: '测速模型',
|
||||||
models: '模型',
|
models: '模型',
|
||||||
model_mapping: '模型映射关系',
|
model_mapping: '模型映射关系',
|
||||||
groups: '用户组'
|
groups: '用户组',
|
||||||
|
only_chat: '仅支持聊天'
|
||||||
},
|
},
|
||||||
prompt: {
|
prompt: {
|
||||||
type: '请选择渠道类型',
|
type: '请选择渠道类型',
|
||||||
@ -36,7 +38,8 @@ const defaultConfig = {
|
|||||||
'请选择该渠道所支持的模型,你也可以输入通配符*来匹配模型,例如:gpt-3.5*,表示支持所有gpt-3.5开头的模型,*号只能在最后一位使用,前面必须有字符,例如:gpt-3.5*是正确的,*gpt-3.5是错误的',
|
'请选择该渠道所支持的模型,你也可以输入通配符*来匹配模型,例如:gpt-3.5*,表示支持所有gpt-3.5开头的模型,*号只能在最后一位使用,前面必须有字符,例如:gpt-3.5*是正确的,*gpt-3.5是错误的',
|
||||||
model_mapping:
|
model_mapping:
|
||||||
'请输入要修改的模型映射关系,格式为:api请求模型ID:实际转发给渠道的模型ID,使用JSON数组表示,例如:{"gpt-3.5": "gpt-35"}',
|
'请输入要修改的模型映射关系,格式为:api请求模型ID:实际转发给渠道的模型ID,使用JSON数组表示,例如:{"gpt-3.5": "gpt-35"}',
|
||||||
groups: '请选择该渠道所支持的用户组'
|
groups: '请选择该渠道所支持的用户组',
|
||||||
|
only_chat: '如果选择了仅支持聊天,那么遇到有函数调用的请求会跳过该渠道'
|
||||||
},
|
},
|
||||||
modelGroup: 'OpenAI'
|
modelGroup: 'OpenAI'
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user