From 66f1d1020fdda4f073ac0b41a065ca14c46fc9e4 Mon Sep 17 00:00:00 2001 From: qhd <1766646056@qq.com> Date: Sat, 29 Aug 2026 14:37:48 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=BC=95=E7=94=A8=E7=B3=BB=E7=BB=9F?= =?UTF-8?q?=E6=A8=A1=E5=9E=8B=E7=AB=AF=E7=82=B9=20referenceSystemModel?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 用户引用系统模型只存 apiKey/enabled/chatModel,配置实时跟随系统模型(不拷贝) Co-Authored-By: Claude --- controller/model_manage_controller.go | 5 +++ service/model_manage_service.go | 57 +++++++++++++++++++++++++++ 2 files changed, 62 insertions(+) diff --git a/controller/model_manage_controller.go b/controller/model_manage_controller.go index dc9f75e..8361af7 100644 --- a/controller/model_manage_controller.go +++ b/controller/model_manage_controller.go @@ -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) diff --git a/service/model_manage_service.go b/service/model_manage_service.go index 9cb66e5..7c03856 100644 --- a/service/model_manage_service.go +++ b/service/model_manage_service.go @@ -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) {