Files
tbphp c55312e155 feat(groups): 支持选择测试协议和模型并修复禁用分组测试 (#623)
* feat(groups): 支持配置和选择密钥测试协议

* fix(groups): 完善测试模型选择并遵循渠道协议声明

* fix(groups): 修复禁用分组测试并统一测试设置布局

* fix(groups): 统一测试控件样式并复用模型输入
2026-09-11 12:59:01 +08:00

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
}