package modelid import ( "errors" "regexp" "strings" ) var providerIDRegex = regexp.MustCompile(`^[a-zA-Z0-9_]+$`) // ParseUnifiedModelID 将 "provider_id/model_name" 格式的字符串解析为 providerID 和 modelName // 在第一个 "/" 处分割,model_name 可以包含 "/" func ParseUnifiedModelID(id string) (providerID, modelName string, err error) { if id == "" { return "", "", errors.New("统一模型 ID 不能为空") } parts := strings.SplitN(id, "/", 2) if len(parts) != 2 { return "", "", errors.New("统一模型 ID 格式错误,缺少分隔符 \"/\"") } providerID = parts[0] modelName = parts[1] if providerID == "" { return "", "", errors.New("provider_id 不能为空") } if modelName == "" { return "", "", errors.New("model_name 不能为空") } if !providerIDRegex.MatchString(providerID) { return "", "", errors.New("provider_id 仅允许字母、数字、下划线") } return providerID, modelName, nil } // FormatUnifiedModelID 将 providerID 和 modelName 组合格式化为统一模型 ID func FormatUnifiedModelID(providerID, modelName string) string { return providerID + "/" + modelName } // ValidateProviderID 校验 providerID 仅包含字母、数字、下划线,长度 1-64 func ValidateProviderID(id string) error { if id == "" { return errors.New("provider_id 不能为空") } if len(id) > 64 { return errors.New("provider_id 长度不能超过 64 个字符") } if !providerIDRegex.MatchString(id) { return errors.New("provider_id 仅允许字母、数字、下划线") } return nil } // IsValidUnifiedModelID 判断字符串是否为合法的统一模型 ID 格式 func IsValidUnifiedModelID(id string) bool { _, _, err := ParseUnifiedModelID(id) return err == nil }