* feat(groups): 支持配置和选择密钥测试协议 * fix(groups): 完善测试模型选择并遵循渠道协议声明 * fix(groups): 修复禁用分组测试并统一测试设置布局 * fix(groups): 统一测试控件样式并复用模型输入
97 lines
2.6 KiB
Go
97 lines
2.6 KiB
Go
package control
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"strings"
|
|
"unicode"
|
|
|
|
"gorm.io/gorm"
|
|
|
|
"gpt-load/internal/channel"
|
|
"gpt-load/internal/platform/config"
|
|
app_errors "gpt-load/internal/platform/errors"
|
|
"gpt-load/internal/protocol"
|
|
"gpt-load/internal/state"
|
|
stateloader "gpt-load/internal/state/loader"
|
|
"gpt-load/internal/storage/models"
|
|
)
|
|
|
|
func normalizeValidationModel(raw string) (string, error) {
|
|
normalized := strings.TrimSpace(raw)
|
|
if normalized == "" || len([]byte(normalized)) > 255 {
|
|
return "", app_errors.ErrValidation
|
|
}
|
|
for _, character := range normalized {
|
|
if unicode.IsControl(character) {
|
|
return "", app_errors.ErrValidation
|
|
}
|
|
}
|
|
return normalized, nil
|
|
}
|
|
|
|
func mapGroupRowToState(group models.Group) (state.GroupConfig, error) {
|
|
var storedModels []GroupModel
|
|
if err := decodeGroupDiscoveryJSON(group.Models, &storedModels); err != nil {
|
|
return state.GroupConfig{}, err
|
|
}
|
|
settings := make(config.Settings)
|
|
if len(group.Overrides) > 0 {
|
|
if err := decodeGroupDiscoveryJSON(group.Overrides, &settings); err != nil {
|
|
return state.GroupConfig{}, err
|
|
}
|
|
}
|
|
runtimeModels := make([]state.ModelConfig, 0, len(storedModels))
|
|
for _, model := range storedModels {
|
|
runtimeModels = append(runtimeModels, state.ModelConfig{ID: model.ID, Alias: model.Alias})
|
|
}
|
|
validationModel := ""
|
|
if group.ValidationModel != nil {
|
|
validationModel = *group.ValidationModel
|
|
}
|
|
multiplier := priceMultiplierFromStorage(group.PriceMultiplierMicros)
|
|
result := state.GroupConfig{
|
|
PriceMultiplier: &multiplier,
|
|
ID: group.ID,
|
|
Name: group.Name,
|
|
ChannelID: channel.ID(group.ChannelID),
|
|
ConnectionType: string(group.ConnectionType),
|
|
Params: append(json.RawMessage(nil), group.Params...),
|
|
ValidationProtocol: protocol.Protocol(stringValue(group.ValidationProtocol)),
|
|
ValidationModel: validationModel,
|
|
Models: runtimeModels,
|
|
Settings: settings,
|
|
WeightManual: cloneInt(group.WeightManual), Enabled: group.Enabled,
|
|
}
|
|
return result, nil
|
|
}
|
|
|
|
func validateGroupRowCandidate(
|
|
ctx context.Context,
|
|
tx *gorm.DB,
|
|
group models.Group,
|
|
registry *channel.Registry,
|
|
) error {
|
|
candidate, err := mapGroupRowToState(group)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
systemSettings, err := stateloader.LoadSystemSettings(ctx, tx)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
_, err = state.Compile(state.CompileInput{
|
|
SystemSettings: systemSettings,
|
|
ChannelRegistry: registry,
|
|
Groups: []state.GroupConfig{candidate},
|
|
})
|
|
return err
|
|
}
|
|
|
|
func stringValue(value *string) string {
|
|
if value == nil {
|
|
return ""
|
|
}
|
|
return *value
|
|
}
|