Files
new-api/controller/model.go

260 lines
6.5 KiB
Go
Raw Normal View History

package controller
import (
"fmt"
2025-06-19 14:41:33 +08:00
"github.com/samber/lo"
"net/http"
2024-05-12 19:07:33 +08:00
"one-api/common"
"one-api/constant"
2024-02-29 16:21:25 +08:00
"one-api/dto"
"one-api/model"
2024-02-29 18:31:03 +08:00
"one-api/relay"
"one-api/relay/channel/ai360"
2024-03-20 23:44:03 +08:00
"one-api/relay/channel/lingyiwanwu"
2024-05-16 19:08:37 +08:00
"one-api/relay/channel/minimax"
2024-05-12 19:07:33 +08:00
"one-api/relay/channel/moonshot"
relaycommon "one-api/relay/common"
relayconstant "one-api/relay/constant"
2025-06-16 22:15:12 +08:00
"one-api/setting"
"github.com/gin-gonic/gin"
)
// https://platform.openai.com/docs/api-reference/models/list
2024-05-13 23:02:35 +08:00
var openAIModels []dto.OpenAIModels
var openAIModelsMap map[string]dto.OpenAIModels
2024-05-12 19:07:33 +08:00
var channelId2Models map[int][]string
2024-05-13 23:02:35 +08:00
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() {
// https://platform.openai.com/docs/models/model-endpoint-compatibility
permission := getPermission()
for i := 0; i < relayconstant.APITypeDummy; i++ {
if i == relayconstant.APITypeAIProxyLibrary {
2024-02-29 18:31:03 +08:00
continue
}
adaptor := relay.GetAdaptor(i)
channelName := adaptor.GetChannelName()
modelNames := adaptor.GetModelList()
for _, modelName := range modelNames {
2024-05-13 23:02:35 +08:00
openAIModels = append(openAIModels, dto.OpenAIModels{
2024-02-29 18:31:03 +08:00
Id: modelName,
Object: "model",
Created: 1626777600,
OwnedBy: channelName,
Permission: permission,
Root: modelName,
Parent: nil,
})
}
}
for _, modelName := range ai360.ModelList {
2024-05-13 23:02:35 +08:00
openAIModels = append(openAIModels, dto.OpenAIModels{
2024-02-29 18:31:03 +08:00
Id: modelName,
Object: "model",
2024-02-29 18:31:03 +08:00
Created: 1626777600,
2024-05-12 19:07:33 +08:00
OwnedBy: ai360.ChannelName,
Permission: permission,
2024-02-29 18:31:03 +08:00
Root: modelName,
Parent: nil,
2024-02-29 18:31:03 +08:00
})
}
for _, modelName := range moonshot.ModelList {
2024-05-13 23:02:35 +08:00
openAIModels = append(openAIModels, dto.OpenAIModels{
2024-02-29 18:31:03 +08:00
Id: modelName,
Object: "model",
2024-02-29 18:31:03 +08:00
Created: 1626777600,
2024-05-16 19:08:37 +08:00
OwnedBy: moonshot.ChannelName,
Permission: permission,
2024-02-29 18:31:03 +08:00
Root: modelName,
Parent: nil,
2024-02-29 18:31:03 +08:00
})
}
2024-03-20 23:44:03 +08:00
for _, modelName := range lingyiwanwu.ModelList {
2024-05-13 23:02:35 +08:00
openAIModels = append(openAIModels, dto.OpenAIModels{
2024-03-20 23:44:03 +08:00
Id: modelName,
Object: "model",
Created: 1626777600,
2024-05-16 19:08:37 +08:00
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,
2024-03-20 23:44:03 +08:00
Permission: permission,
Root: modelName,
Parent: nil,
})
}
for modelName, _ := range constant.MidjourneyModel2Action {
2024-05-13 23:02:35 +08:00
openAIModels = append(openAIModels, dto.OpenAIModels{
Id: modelName,
Object: "model",
Created: 1626777600,
OwnedBy: "midjourney",
Permission: permission,
Root: modelName,
Parent: nil,
})
}
2024-05-13 23:02:35 +08:00
openAIModelsMap = make(map[string]dto.OpenAIModels)
2024-05-15 23:56:26 +08:00
for _, aiModel := range openAIModels {
openAIModelsMap[aiModel.Id] = aiModel
}
2024-05-12 19:07:33 +08:00
channelId2Models = make(map[int][]string)
for i := 1; i <= common.ChannelTypeDummy; i++ {
2024-05-13 14:32:32 +08:00
apiType, success := relayconstant.ChannelType2APIType(i)
if !success || apiType == relayconstant.APITypeAIProxyLibrary {
2024-05-12 19:07:33 +08:00
continue
}
meta := &relaycommon.RelayInfo{ChannelType: i}
adaptor := relay.GetAdaptor(apiType)
2024-07-16 22:07:10 +08:00
adaptor.Init(meta)
2024-05-12 19:07:33 +08:00
channelId2Models[i] = adaptor.GetModelList()
}
2025-06-19 14:41:33 +08:00
openAIModels = lo.UniqBy(openAIModels, func(m dto.OpenAIModels) string {
return m.Id
})
}
func ListModels(c *gin.Context) {
2024-05-13 23:02:35 +08:00
userOpenAiModels := make([]dto.OpenAIModels, 0)
permission := getPermission()
2024-09-17 22:41:54 +08:00
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 {
2024-09-17 22:41:54 +08:00
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")
2024-12-29 16:50:26 +08:00
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
}
2025-06-16 22:15:12 +08:00
var models []string
if tokenGroup == "auto" {
for _, autoGroup := range setting.AutoGroups {
groupModels := model.GetGroupModels(autoGroup)
for _, g := range groupModels {
if !common.StringsContains(models, g) {
models = append(models, g)
}
}
}
} else {
models = model.GetGroupModels(group)
}
2024-09-17 22:41:54 +08:00
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{
2024-05-12 19:07:33 +08:00
"success": true,
"data": userOpenAiModels,
})
}
func ChannelListModels(c *gin.Context) {
c.JSON(200, gin.H{
2024-05-12 19:07:33 +08:00
"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")
2024-05-15 23:56:26 +08:00
if aiModel, ok := openAIModelsMap[modelId]; ok {
c.JSON(200, aiModel)
} else {
2024-02-29 16:21:25 +08:00
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,
})
}
}