| | package controller |
| |
|
| | import ( |
| | "fmt" |
| | "github.com/gin-gonic/gin" |
| | "net/http" |
| | "one-api/common" |
| | "one-api/constant" |
| | "one-api/dto" |
| | "one-api/model" |
| | "one-api/relay" |
| | "one-api/relay/channel/ai360" |
| | "one-api/relay/channel/lingyiwanwu" |
| | "one-api/relay/channel/minimax" |
| | "one-api/relay/channel/moonshot" |
| | relaycommon "one-api/relay/common" |
| | relayconstant "one-api/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() |
| |
|
| | 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 { |
| | if _, ok := openAIModelsMap[allowModel]; ok { |
| | userOpenAiModels = append(userOpenAiModels, openAIModelsMap[allowModel]) |
| | } else { |
| | userOpenAiModels = append(userOpenAiModels, dto.OpenAIModels{ |
| | Id: allowModel, |
| | Object: "model", |
| | Created: 1626777600, |
| | OwnedBy: "custom", |
| | Permission: permission, |
| | Root: allowModel, |
| | Parent: nil, |
| | }) |
| | } |
| | } |
| | } else { |
| | 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 |
| | } |
| | models := model.GetGroupModels(group) |
| | for _, s := range models { |
| | if _, ok := openAIModelsMap[s]; ok { |
| | userOpenAiModels = append(userOpenAiModels, openAIModelsMap[s]) |
| | } else { |
| | userOpenAiModels = append(userOpenAiModels, dto.OpenAIModels{ |
| | Id: s, |
| | Object: "model", |
| | Created: 1626777600, |
| | OwnedBy: "custom", |
| | Permission: permission, |
| | Root: s, |
| | 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") |
| | 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, |
| | }) |
| | } |
| | } |
| |
|