| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| package controller |
|
|
| import ( |
| "fmt" |
| "github.com/gin-gonic/gin" |
| "net/http" |
| "strings" |
| "veloera/common" |
| "veloera/constant" |
| "veloera/dto" |
| "veloera/middleware" |
| "veloera/model" |
| "veloera/relay" |
| "veloera/relay/channel/ai360" |
| "veloera/relay/channel/lingyiwanwu" |
| "veloera/relay/channel/minimax" |
| "veloera/relay/channel/moonshot" |
| relaycommon "veloera/relay/common" |
| relayconstant "veloera/relay/constant" |
| ) |
|
|
| |
|
|
| var openAIModels []dto.OpenAIModels |
| var openAIModelsMap map[string]dto.OpenAIModels |
| var channelId2Models map[int][]string |
|
|
| func getPermission() []dto.OpenAIModelPermission { |
| var permission []dto.OpenAIModelPermission |
| permission = append(permission, dto.OpenAIModelPermission{ |
| Id: "modelperm-LwHkVFn8AcMItP432fKKDIKJ", |
| Object: "model_permission", |
| Created: 1626777600, |
| AllowCreateEngine: true, |
| AllowSampling: true, |
| AllowLogprobs: true, |
| AllowSearchIndices: false, |
| AllowView: true, |
| AllowFineTuning: false, |
| Organization: "*", |
| Group: nil, |
| IsBlocking: false, |
| }) |
| return permission |
| } |
|
|
| func init() { |
| |
| permission := getPermission() |
| for i := 0; i < relayconstant.APITypeDummy; i++ { |
| if i == relayconstant.APITypeAIProxyLibrary { |
| continue |
| } |
| adaptor := relay.GetAdaptor(i) |
| channelName := adaptor.GetChannelName() |
| modelNames := adaptor.GetModelList() |
| for _, modelName := range modelNames { |
| openAIModels = append(openAIModels, dto.OpenAIModels{ |
| Id: modelName, |
| Object: "model", |
| Created: 1626777600, |
| OwnedBy: channelName, |
| Permission: permission, |
| Root: modelName, |
| Parent: nil, |
| }) |
| } |
| } |
| for _, modelName := range ai360.ModelList { |
| openAIModels = append(openAIModels, dto.OpenAIModels{ |
| Id: modelName, |
| Object: "model", |
| Created: 1626777600, |
| OwnedBy: ai360.ChannelName, |
| Permission: permission, |
| Root: modelName, |
| Parent: nil, |
| }) |
| } |
| for _, modelName := range moonshot.ModelList { |
| openAIModels = append(openAIModels, dto.OpenAIModels{ |
| Id: modelName, |
| Object: "model", |
| Created: 1626777600, |
| OwnedBy: moonshot.ChannelName, |
| Permission: permission, |
| Root: modelName, |
| Parent: nil, |
| }) |
| } |
| for _, modelName := range lingyiwanwu.ModelList { |
| openAIModels = append(openAIModels, dto.OpenAIModels{ |
| Id: modelName, |
| Object: "model", |
| Created: 1626777600, |
| OwnedBy: lingyiwanwu.ChannelName, |
| Permission: permission, |
| Root: modelName, |
| Parent: nil, |
| }) |
| } |
| for _, modelName := range minimax.ModelList { |
| openAIModels = append(openAIModels, dto.OpenAIModels{ |
| Id: modelName, |
| Object: "model", |
| Created: 1626777600, |
| OwnedBy: minimax.ChannelName, |
| Permission: permission, |
| Root: modelName, |
| Parent: nil, |
| }) |
| } |
| for modelName := range constant.MidjourneyModel2Action { |
| openAIModels = append(openAIModels, dto.OpenAIModels{ |
| Id: modelName, |
| Object: "model", |
| Created: 1626777600, |
| OwnedBy: "midjourney", |
| Permission: permission, |
| Root: modelName, |
| Parent: nil, |
| }) |
| } |
| openAIModelsMap = make(map[string]dto.OpenAIModels) |
| for _, aiModel := range openAIModels { |
| openAIModelsMap[aiModel.Id] = aiModel |
| } |
| channelId2Models = make(map[int][]string) |
| for i := 1; i <= common.ChannelTypeDummy; i++ { |
| apiType, success := relayconstant.ChannelType2APIType(i) |
| if !success || apiType == relayconstant.APITypeAIProxyLibrary { |
| continue |
| } |
| meta := &relaycommon.RelayInfo{ChannelType: i} |
| adaptor := relay.GetAdaptor(apiType) |
| adaptor.Init(meta) |
| channelId2Models[i] = adaptor.GetModelList() |
| } |
| } |
|
|
| func ListModels(c *gin.Context) { |
| userOpenAiModels := make([]dto.OpenAIModels, 0) |
| permission := getPermission() |
| modelPrefixMap := make(map[string][]string) |
|
|
| |
| userId := c.GetInt("id") |
| userGroup, err := model.GetUserGroup(userId, true) |
| if err != nil { |
| c.JSON(http.StatusOK, gin.H{ |
| "success": false, |
| "message": "get user group failed", |
| }) |
| return |
| } |
| group := userGroup |
| tokenGroup := c.GetString("token_group") |
| if tokenGroup != "" { |
| group = tokenGroup |
| } |
|
|
| |
| prefixChannels := middleware.GetPrefixChannels(group) |
| for prefix, channels := range prefixChannels { |
| if prefix == "" { |
| continue |
| } |
|
|
| |
| for _, channel := range channels { |
| for _, modelName := range channel.GetModels() { |
| if modelPrefixMap[modelName] == nil { |
| modelPrefixMap[modelName] = make([]string, 0) |
| } |
| prefixedModel := prefix + modelName |
| |
| exists := false |
| for _, existing := range modelPrefixMap[modelName] { |
| if existing == prefixedModel { |
| exists = true |
| break |
| } |
| } |
| if !exists { |
| modelPrefixMap[modelName] = append(modelPrefixMap[modelName], prefixedModel) |
| } |
| } |
| } |
| } |
|
|
| modelLimitEnable := c.GetBool("token_model_limit_enabled") |
| if modelLimitEnable { |
| s, ok := c.Get("token_model_limit") |
| var tokenModelLimit map[string]bool |
| if ok { |
| tokenModelLimit = s.(map[string]bool) |
| } else { |
| tokenModelLimit = map[string]bool{} |
| } |
|
|
| for allowModel := range tokenModelLimit { |
| |
| prefixedModels := modelPrefixMap[allowModel] |
|
|
| |
| if _, ok := openAIModelsMap[allowModel]; ok { |
| modelInfo := openAIModelsMap[allowModel] |
| userOpenAiModels = append(userOpenAiModels, modelInfo) |
| } else { |
| userOpenAiModels = append(userOpenAiModels, dto.OpenAIModels{ |
| Id: allowModel, |
| Object: "model", |
| Created: 1626777600, |
| OwnedBy: "custom", |
| Permission: permission, |
| Root: allowModel, |
| Parent: nil, |
| }) |
| } |
|
|
| |
| for _, prefixedModel := range prefixedModels { |
| if _, ok := openAIModelsMap[allowModel]; ok { |
| modelInfo := openAIModelsMap[allowModel] |
| |
| prefixedModelInfo := modelInfo |
| prefixedModelInfo.Id = prefixedModel |
| userOpenAiModels = append(userOpenAiModels, prefixedModelInfo) |
| } else { |
| userOpenAiModels = append(userOpenAiModels, dto.OpenAIModels{ |
| Id: prefixedModel, |
| Object: "model", |
| Created: 1626777600, |
| OwnedBy: "custom", |
| Permission: permission, |
| Root: allowModel, |
| Parent: nil, |
| }) |
| } |
| } |
| } |
| } else { |
| models := model.GetGroupModels(group) |
| processedModels := make(map[string]bool) |
|
|
| |
| for baseModel, prefixedModelNameVersions := range modelPrefixMap { |
| isBaseModelAllowed := false |
| for _, groupModel := range models { |
| if groupModel == baseModel { |
| isBaseModelAllowed = true |
| break |
| } |
| } |
|
|
| if isBaseModelAllowed { |
| for _, prefixedModelName := range prefixedModelNameVersions { |
| if processedModels[prefixedModelName] { |
| continue |
| } |
| |
| if modelData, ok := openAIModelsMap[baseModel]; ok { |
| modelInfo := modelData |
| modelInfo.Id = prefixedModelName |
| modelInfo.Root = baseModel |
| userOpenAiModels = append(userOpenAiModels, modelInfo) |
| } else { |
| userOpenAiModels = append(userOpenAiModels, dto.OpenAIModels{ |
| Id: prefixedModelName, |
| Object: "model", |
| Created: 1626777600, |
| OwnedBy: "custom", |
| Permission: permission, |
| Root: baseModel, |
| Parent: nil, |
| }) |
| } |
| processedModels[prefixedModelName] = true |
| } |
| } |
| } |
|
|
| |
| |
| for _, modelName := range models { |
| if processedModels[modelName] { |
| continue |
| } |
|
|
| |
| hasProcessedPrefixedVersion := false |
| if prefixedVersions, exists := modelPrefixMap[modelName]; exists { |
| for _, prefixedVersion := range prefixedVersions { |
| if processedModels[prefixedVersion] { |
| hasProcessedPrefixedVersion = true |
| break |
| } |
| } |
| } |
|
|
| |
| if !hasProcessedPrefixedVersion { |
| |
| if modelData, ok := openAIModelsMap[modelName]; ok { |
| userOpenAiModels = append(userOpenAiModels, modelData) |
| } else { |
| userOpenAiModels = append(userOpenAiModels, dto.OpenAIModels{ |
| Id: modelName, |
| Object: "model", |
| Created: 1626777600, |
| OwnedBy: "custom", |
| Permission: permission, |
| Root: modelName, |
| Parent: nil, |
| }) |
| } |
| processedModels[modelName] = true |
| } |
| } |
| } |
| |
| |
| virtualModels := model.GetAllVirtualModels() |
| for _, virtualModel := range virtualModels { |
| |
| exists := false |
| for _, existingModel := range userOpenAiModels { |
| if existingModel.Id == virtualModel { |
| exists = true |
| break |
| } |
| } |
|
|
| if !exists { |
| |
| if modelData, ok := openAIModelsMap[virtualModel]; ok { |
| userOpenAiModels = append(userOpenAiModels, modelData) |
| } else { |
| |
| userOpenAiModels = append(userOpenAiModels, dto.OpenAIModels{ |
| Id: virtualModel, |
| Object: "model", |
| Created: 1626777600, |
| OwnedBy: "virtual", |
| Permission: permission, |
| Root: virtualModel, |
| Parent: nil, |
| }) |
| } |
| } |
| } |
|
|
| c.JSON(200, gin.H{ |
| "success": true, |
| "data": userOpenAiModels, |
| }) |
| } |
|
|
| func ChannelListModels(c *gin.Context) { |
| c.JSON(200, gin.H{ |
| "success": true, |
| "data": openAIModels, |
| }) |
| } |
|
|
| func DashboardListModels(c *gin.Context) { |
| c.JSON(200, gin.H{ |
| "success": true, |
| "data": channelId2Models, |
| }) |
| } |
|
|
| func EnabledListModels(c *gin.Context) { |
| c.JSON(200, gin.H{ |
| "success": true, |
| "data": model.GetEnabledModels(), |
| }) |
| } |
|
|
| func RetrieveModel(c *gin.Context) { |
| modelId := c.Param("model") |
|
|
| |
| userId := c.GetInt("id") |
| userGroup, err := model.GetUserGroup(userId, true) |
| if err == nil { |
| group := userGroup |
| tokenGroup := c.GetString("token_group") |
| if tokenGroup != "" { |
| group = tokenGroup |
| } |
|
|
| prefixChannels := middleware.GetPrefixChannels(group) |
| for prefix := range prefixChannels { |
| if prefix != "" && strings.HasPrefix(modelId, prefix) { |
| |
| baseModelId := strings.TrimPrefix(modelId, prefix) |
| if aiModel, ok := openAIModelsMap[baseModelId]; ok { |
| modelCopy := aiModel |
| modelCopy.Id = modelId |
| c.JSON(200, modelCopy) |
| return |
| } |
| } |
| } |
| } |
|
|
| |
| if aiModel, ok := openAIModelsMap[modelId]; ok { |
| c.JSON(200, aiModel) |
| } else { |
| openAIError := dto.OpenAIError{ |
| Message: fmt.Sprintf("The model '%s' does not exist", modelId), |
| Type: "invalid_request_error", |
| Param: "model", |
| Code: "model_not_found", |
| } |
| c.JSON(200, gin.H{ |
| "error": openAIError, |
| }) |
| } |
| } |