model_meta.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. package controller
  2. import (
  3. "encoding/json"
  4. "strconv"
  5. "one-api/common"
  6. "one-api/model"
  7. "github.com/gin-gonic/gin"
  8. )
  9. // GetAllModelsMeta 获取模型列表(分页)
  10. func GetAllModelsMeta(c *gin.Context) {
  11. model.RefreshPricing()
  12. pageInfo := common.GetPageQuery(c)
  13. modelsMeta, err := model.GetAllModels(pageInfo.GetStartIdx(), pageInfo.GetPageSize())
  14. if err != nil {
  15. common.ApiError(c, err)
  16. return
  17. }
  18. // 填充附加字段
  19. for _, m := range modelsMeta {
  20. fillModelExtra(m)
  21. }
  22. var total int64
  23. model.DB.Model(&model.Model{}).Count(&total)
  24. pageInfo.SetTotal(int(total))
  25. pageInfo.SetItems(modelsMeta)
  26. common.ApiSuccess(c, pageInfo)
  27. }
  28. // SearchModelsMeta 搜索模型列表
  29. func SearchModelsMeta(c *gin.Context) {
  30. model.RefreshPricing()
  31. keyword := c.Query("keyword")
  32. vendor := c.Query("vendor")
  33. pageInfo := common.GetPageQuery(c)
  34. modelsMeta, total, err := model.SearchModels(keyword, vendor, pageInfo.GetStartIdx(), pageInfo.GetPageSize())
  35. if err != nil {
  36. common.ApiError(c, err)
  37. return
  38. }
  39. for _, m := range modelsMeta {
  40. fillModelExtra(m)
  41. }
  42. pageInfo.SetTotal(int(total))
  43. pageInfo.SetItems(modelsMeta)
  44. common.ApiSuccess(c, pageInfo)
  45. }
  46. // GetModelMeta 根据 ID 获取单条模型信息
  47. func GetModelMeta(c *gin.Context) {
  48. idStr := c.Param("id")
  49. id, err := strconv.Atoi(idStr)
  50. if err != nil {
  51. common.ApiError(c, err)
  52. return
  53. }
  54. var m model.Model
  55. if err := model.DB.First(&m, id).Error; err != nil {
  56. common.ApiError(c, err)
  57. return
  58. }
  59. fillModelExtra(&m)
  60. common.ApiSuccess(c, &m)
  61. }
  62. // CreateModelMeta 新建模型
  63. func CreateModelMeta(c *gin.Context) {
  64. var m model.Model
  65. if err := c.ShouldBindJSON(&m); err != nil {
  66. common.ApiError(c, err)
  67. return
  68. }
  69. if m.ModelName == "" {
  70. common.ApiErrorMsg(c, "模型名称不能为空")
  71. return
  72. }
  73. if err := m.Insert(); err != nil {
  74. common.ApiError(c, err)
  75. return
  76. }
  77. common.ApiSuccess(c, &m)
  78. }
  79. // UpdateModelMeta 更新模型
  80. func UpdateModelMeta(c *gin.Context) {
  81. statusOnly := c.Query("status_only") == "true"
  82. var m model.Model
  83. if err := c.ShouldBindJSON(&m); err != nil {
  84. common.ApiError(c, err)
  85. return
  86. }
  87. if m.Id == 0 {
  88. common.ApiErrorMsg(c, "缺少模型 ID")
  89. return
  90. }
  91. if statusOnly {
  92. // 只更新状态,防止误清空其他字段
  93. if err := model.DB.Model(&model.Model{}).Where("id = ?", m.Id).Update("status", m.Status).Error; err != nil {
  94. common.ApiError(c, err)
  95. return
  96. }
  97. } else {
  98. if err := m.Update(); err != nil {
  99. common.ApiError(c, err)
  100. return
  101. }
  102. }
  103. common.ApiSuccess(c, &m)
  104. }
  105. // DeleteModelMeta 删除模型
  106. func DeleteModelMeta(c *gin.Context) {
  107. idStr := c.Param("id")
  108. id, err := strconv.Atoi(idStr)
  109. if err != nil {
  110. common.ApiError(c, err)
  111. return
  112. }
  113. if err := model.DB.Delete(&model.Model{}, id).Error; err != nil {
  114. common.ApiError(c, err)
  115. return
  116. }
  117. common.ApiSuccess(c, nil)
  118. }
  119. // 辅助函数:填充 Endpoints 和 BoundChannels 和 EnableGroups
  120. func fillModelExtra(m *model.Model) {
  121. if m.Endpoints == "" {
  122. eps := model.GetModelSupportEndpointTypes(m.ModelName)
  123. if b, err := json.Marshal(eps); err == nil {
  124. m.Endpoints = string(b)
  125. }
  126. }
  127. if channels, err := model.GetBoundChannels(m.ModelName); err == nil {
  128. m.BoundChannels = channels
  129. }
  130. // 填充启用分组
  131. m.EnableGroups = model.GetModelEnableGroups(m.ModelName)
  132. // 填充计费类型
  133. m.QuotaType = model.GetModelQuotaType(m.ModelName)
  134. }