Files
APIPark/ai-provider/model-runtime/param.go
T
2024-10-08 12:09:33 +08:00

99 lines
2.3 KiB
Go

package model_runtime
import (
"encoding/json"
"fmt"
)
const (
ParameterTypeInt = "int"
ParameterTypeStr = "string"
ParameterTypeFloat = "float"
ParameterTypeBool = "bool"
)
type IParamValidator interface {
Valid(map[string]interface{}) error
GenConfig(target map[string]interface{}, origin map[string]interface{}) (string, error)
}
type ParamValidator []Param
func (p ParamValidator) GenConfig(target map[string]interface{}, origin map[string]interface{}) (string, error) {
for _, rule := range p {
if !rule.Secret {
continue
}
vv, ok := origin[rule.Name]
if !ok {
continue
}
v, ok := vv.(string)
if !ok || v == "******" {
continue
}
target[rule.Name] = origin[rule.Name]
}
data, err := json.Marshal(target)
if err != nil {
return "", err
}
return string(data), nil
}
type Param struct {
Name string `json:"name" yaml:"name"`
Default interface{} `json:"default" yaml:"default"`
Type string `json:"type" yaml:"type"`
Min float64 `json:"min" yaml:"min"`
Max float64 `json:"max" yaml:"max"`
Required bool `json:"required" yaml:"required"`
Secret bool `json:"secret" yaml:"secret"`
}
func (p ParamValidator) Valid(params map[string]interface{}) error {
for _, rule := range p {
v, ok := params[rule.Name]
if !ok {
if rule.Required {
return fmt.Errorf("missing required parameter %s", rule.Name)
}
continue
}
switch rule.Type {
case ParameterTypeInt:
r, ok := v.(int)
if !ok {
return fmt.Errorf("invalid parameter %s: %v", rule.Name, v)
}
if r < int(rule.Min) || r > int(rule.Max) {
return fmt.Errorf("invalid parameter %s: %v", rule.Name, v)
}
case ParameterTypeFloat:
r, ok := v.(float64)
if !ok {
return fmt.Errorf("invalid parameter %s: %v", rule.Name, v)
}
if r < rule.Min || r > rule.Max {
return fmt.Errorf("invalid parameter %s: %v", rule.Name, v)
}
case ParameterTypeStr:
vv, ok := v.(string)
if !ok {
return fmt.Errorf("invalid parameter %s: %v", rule.Name, v)
}
if rule.Required && len(vv) == 0 {
return fmt.Errorf("parameter %s is empty", rule.Name)
}
case ParameterTypeBool:
_, ok = v.(bool)
if !ok {
return fmt.Errorf("invalid parameter %s: %v", rule.Name, v)
}
}
}
return nil
}