feat: 引用系统模型端点 referenceSystemModel

用户引用系统模型只存 apiKey/enabled/chatModel,配置实时跟随系统模型(不拷贝)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2026-08-29 14:37:48 +08:00
co-authored by Claude
parent b99f43b31f
commit 66f1d1020f
2 changed files with 62 additions and 0 deletions
+5
View File
@@ -18,6 +18,11 @@ func (c *modelManage) CreateModel(ctx context.Context, req *dto.CreateModelManag
return service.ModelManage.Create(ctx, req)
}
// ReferenceModel 引用系统模型
func (c *modelManage) ReferenceModel(ctx context.Context, req *dto.ReferenceSystemModelReq) (res *dto.ReferenceSystemModelRes, err error) {
return service.ModelManage.ReferenceSystemModel(ctx, req)
}
// UpdateModel 更改配置
func (c *modelManage) UpdateModel(ctx context.Context, req *dto.UpdateModelManageReq) (res *dto.GetModelManageRes, err error) {
return service.ModelManage.Update(ctx, req)
+57
View File
@@ -63,6 +63,63 @@ func (s *modelManageService) Create(ctx context.Context, req *dto.CreateModelMan
return
}
// ReferenceSystemModel 用户引用系统模型:只填 apiKey + 个人开关,配置实时跟随系统模型。
// 不拷贝配置(解析层实时取系统行);同名唯一(复用 Create 语义);会话模型开关复用 CancelChatModel。
func (s *modelManageService) ReferenceSystemModel(ctx context.Context, req *dto.ReferenceSystemModelReq) (res *dto.ReferenceSystemModelRes, err error) {
err = gfdb.DB(ctx, public.DbNameModelGateway).Transaction(ctx, func(ctx context.Context, tx gdb.TX) (err error) {
user, err := utils.GetUserInfo(ctx)
if err != nil {
return err
}
// 1)目标必须是系统模型
sys, err := dao.ModelManage.GetNotTenantId(ctx, &dto.GetModelManageReq{Id: req.SystemModelId})
if err != nil {
return err
}
if sys == nil || sys.SystemModel == nil || !*sys.SystemModel {
return fmt.Errorf("被引用的模型不存在或不是系统模型")
}
// 2)同名唯一:同一用户下不允许重复(引用行与自有模型同名同样拒绝)
exist, err := dao.ModelManage.GetByCreatorAndName(ctx, user.UserName, sys.ModelName)
if err != nil {
return err
}
if exist != nil {
return fmt.Errorf("模型名称 [%s] 已存在,同一用户下不能重复添加同名模型", sys.ModelName)
}
// 3)设为会话模型 → 先取消旧会话模型(isSuperAdmin 语义与 Create 一致)
var isSuperAdmin bool
isSuperAdmin, err = IsSuperAdmin(ctx)
if err != nil {
return err
}
if err = s.CancelChatModel(ctx, sys.ModelType, req.ChatModel, isSuperAdmin); err != nil {
return err
}
// 4)插引用行(配置列零值即可,解析层只读系统行配置)
enabled := true
if req.Enabled != nil {
enabled = *req.Enabled
}
id, err := dao.ModelManage.Insert(ctx, &dto.CreateModelManageReq{
ModelSupplier: sys.ModelSupplier,
ModelName: sys.ModelName,
ModelType: sys.ModelType,
SystemModel: gconv.PtrBool(false),
ChatModel: req.ChatModel,
ApiKey: req.ApiKey,
Enabled: gconv.PtrBool(enabled),
RefSystemModelId: sys.Id,
})
if err != nil {
return err
}
res = &dto.ReferenceSystemModelRes{Id: id}
return nil
})
return
}
// Update 更新模型配置
func (s *modelManageService) Update(ctx context.Context, req *dto.UpdateModelManageReq) (res *dto.GetModelManageRes, err error) {
err = gfdb.DB(ctx, public.DbNameModelGateway).Transaction(ctx, func(ctx context.Context, tx gdb.TX) (err error) {