渠道: 远程候选按渠道过滤 + key 掩码 + 移除批量导入端点

- 远程模型候选只排除本渠道已允许的模型,同名模型可被多个渠道各自允许
- 渠道 key 掩码统一 xxxxxxx******Mq4Y(保留前 7 位与后 4 位)
- 移除已弃用的批量导入端点 POST /channels/:id/models/import

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Sakurasan
2026-08-16 18:55:05 +08:00
co-authored by Claude
parent d0c879a2ed
commit 4137b6fe20
4 changed files with 35 additions and 95 deletions
+13 -3
View File
@@ -13,7 +13,8 @@ import (
)
// AdminChannelRemoteModels GET /api/v1/admin/channels/:id/models/remote
// 拉取渠道接口的模型列表(仅预览,不绑定)。
// 拉取渠道接口的模型列表,返回本渠道尚未允许的模型(新增候选)。
// 每个渠道有各自的支持列表:只排除本渠道已允许的模型,其他渠道允许的同名模型仍可作为本渠道候选。
func (h *Handler) AdminChannelRemoteModels(c *gin.Context) {
id, err := strconv.ParseUint(c.Param("id"), 10, 64)
if err != nil {
@@ -53,10 +54,19 @@ func (h *Handler) AdminChannelRemoteModels(c *gin.Context) {
resp.Fail(c, http.StatusBadGateway, "failed to parse model list")
return
}
// 本渠道已允许的上游模型名:不作为新增候选(其他渠道的模型仍可勾选)
var boundNames []string
h.a.DB.Model(&store.ChannelModelBinding{}).Where("channel_id = ?", id).Pluck("upstream_model", &boundNames)
boundSet := make(map[string]bool, len(boundNames))
for _, n := range boundNames {
boundSet[strings.TrimSpace(n)] = true
}
items := make([]string, 0, len(list.Data))
for _, m := range list.Data {
if strings.TrimSpace(m.ID) != "" {
items = append(items, strings.TrimSpace(m.ID))
name := strings.TrimSpace(m.ID)
if name != "" && !boundSet[name] {
items = append(items, name)
}
}
resp.OK(c, gin.H{"items": items})