feat(admin): 模型管理 - 支持从上游渠道拉取模型目录 (#36)
以 main 为基线仅补齐拉取模型能力:管理员可一键导入缺失模型(默认停用待定价),并提供登录态后端代理目录接口避免 CORS。 Co-authored-by: ddcat666 <2695092045@qq.com>
This commit is contained in:
36
backend/internal/handler/channel_models.go
Normal file
36
backend/internal/handler/channel_models.go
Normal file
@@ -0,0 +1,36 @@
|
||||
package handler
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
"infinite-canvas/backend/internal/service"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
func RegisterChannelModelRoutes(r *gin.RouterGroup, svc *service.Service) {
|
||||
r.POST("/ai/models", func(c *gin.Context) {
|
||||
user, err := currentUser(c, svc)
|
||||
if err != nil {
|
||||
failService(c, err)
|
||||
return
|
||||
}
|
||||
if !enforceRateLimit(c, "channel-models:"+user.ID, 30, time.Minute) {
|
||||
return
|
||||
}
|
||||
var input service.ChannelModelsRequest
|
||||
if err := c.ShouldBindJSON(&input); err != nil {
|
||||
fail(c, http.StatusBadRequest, errors.New("模型渠道参数格式错误"))
|
||||
return
|
||||
}
|
||||
// handler 不接触上游响应细节,密钥校验和模型目录解析统一收敛到 service。
|
||||
models, err := svc.FetchChannelModels(c.Request.Context(), user, input)
|
||||
if err != nil {
|
||||
failService(c, err)
|
||||
return
|
||||
}
|
||||
ok(c, gin.H{"models": models})
|
||||
})
|
||||
}
|
||||
@@ -205,6 +205,23 @@ func RegisterFinanceRoutes(r *gin.RouterGroup, svc *service.Service) {
|
||||
}
|
||||
ok(c, gin.H{"models": items})
|
||||
})
|
||||
r.POST("/admin/channels/:id/models/fetch", func(c *gin.Context) {
|
||||
user, err := currentUser(c, svc)
|
||||
if err != nil {
|
||||
failService(c, err)
|
||||
return
|
||||
}
|
||||
if !enforceRateLimit(c, "admin-channel-models-fetch:"+user.ID+":"+c.Param("id"), 10, time.Minute) {
|
||||
return
|
||||
}
|
||||
// 上游密钥只在 service 内使用,handler 仅返回去重后的模型标识和新增数量。
|
||||
result, err := svc.FetchAdminChannelModels(c.Request.Context(), user, c.Param("id"))
|
||||
if err != nil {
|
||||
failService(c, err)
|
||||
return
|
||||
}
|
||||
ok(c, result)
|
||||
})
|
||||
r.POST("/admin/channels/:id/models", func(c *gin.Context) {
|
||||
saveChannelModel(c, svc, "")
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user