From 581ca3a33ab51b8fa9dd0019cedaad5bf59bcc07 Mon Sep 17 00:00:00 2001 From: lizhichao51 Date: Thu, 10 Apr 2025 10:46:16 +0800 Subject: [PATCH 1/8] =?UTF-8?q?[app-platform]=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E5=AF=B9=E4=BA=8E=E6=A8=A1=E5=9E=8B=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E5=A2=9E=E5=88=A0=E6=94=B9=E6=9F=A5=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugins/aipp-custom-model-center/pom.xml | 4 + .../jade/aipp/model/mapper/ModelMapper.java | 14 ++ .../aipp/model/mapper/UserModelMapper.java | 40 +++++ .../fit/jade/aipp/model/po/UserModelPo.java | 4 + .../model/repository/UserModelPluginRepo.java | 74 ++++++++ .../impl/UserModelPluginRepoImpl.java | 163 ++++++++++++++++++ .../src/main/resources/mapper/ModelMapper.xml | 10 ++ .../main/resources/mapper/UserModelMapper.xml | 33 ++++ 8 files changed, 342 insertions(+) create mode 100644 app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/repository/UserModelPluginRepo.java create mode 100644 app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/repository/impl/UserModelPluginRepoImpl.java diff --git a/app-builder/plugins/aipp-custom-model-center/pom.xml b/app-builder/plugins/aipp-custom-model-center/pom.xml index 11f2906a83..bdbd5723b3 100644 --- a/app-builder/plugins/aipp-custom-model-center/pom.xml +++ b/app-builder/plugins/aipp-custom-model-center/pom.xml @@ -65,6 +65,10 @@ assertj-core test + + modelengine.fit.jade.service + tool-service + diff --git a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/mapper/ModelMapper.java b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/mapper/ModelMapper.java index e3ecffe604..56a2b15bcd 100644 --- a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/mapper/ModelMapper.java +++ b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/mapper/ModelMapper.java @@ -34,4 +34,18 @@ public interface ModelMapper { * @return 模型信息列表 {@link List}{@code <}{@link ModelPo}{@code >}. */ List listModels(List modelIds); + + /** + * 插入模型信息。 + * + * @param model 模型对象。 + */ + void insertModel(ModelPo model); + + /** + * 根据模型ID删除模型信息。 + * + * @param modelId 模型ID。 + */ + void deleteByModelId(String modelId); } diff --git a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/mapper/UserModelMapper.java b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/mapper/UserModelMapper.java index 532c6f9b19..83d131a2fc 100644 --- a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/mapper/UserModelMapper.java +++ b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/mapper/UserModelMapper.java @@ -8,6 +8,7 @@ import modelengine.fit.jade.aipp.model.po.UserModelPo; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -34,4 +35,43 @@ public interface UserModelMapper { * @return 默认的用户模型关系。 */ UserModelPo getDefault(String userId); + + /** + * 判断该用户是否已有模型绑定记录。 + * + * @param userId 用户标识。 + * @return true 表示已有模型,false 表示无记录。 + */ + boolean userHasDefaultModel(String userId); + + /** + * 插入用户模型绑定关系。 + * + * @param userModel 用户模型关系对象。 + */ + void addUserModel(UserModelPo userModel); + + /** + * 根据模型ID删除用户模型绑定关系。 + * + * @param modelId 模型ID。 + */ + void deleteByModelId(String modelId); + + /** + * 查找指定用户最新创建的模型记录(按 created_at 降序排序,取第一条)。 + * @param userId 用户标识。 + */ + UserModelPo findLatestUserModel(String userId); + + /** + * 将指定用户所有模型记录的 is_default 状态更新, + * 如果记录的 model_id 等于传入的 modelId,则设置为 1,否则设置为 0。 + * + * @param userId 用户ID + * @param modelId 模型ID + * @return 更新的记录数 + */ + int switchDefaultForUser(@Param("userId") String userId, @Param("modelId") String modelId); + } diff --git a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/po/UserModelPo.java b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/po/UserModelPo.java index fedc68af1f..642638a3b6 100644 --- a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/po/UserModelPo.java +++ b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/po/UserModelPo.java @@ -6,7 +6,9 @@ package modelengine.fit.jade.aipp.model.po; +import lombok.AllArgsConstructor; import lombok.Data; +import lombok.EqualsAndHashCode; import modelengine.jade.common.po.BasePo; /** @@ -16,6 +18,8 @@ * @since 2025/3/11 */ @Data +@EqualsAndHashCode(callSuper = true) +@AllArgsConstructor public class UserModelPo extends BasePo { private String userId; private String modelId; diff --git a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/repository/UserModelPluginRepo.java b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/repository/UserModelPluginRepo.java new file mode 100644 index 0000000000..bec86a0f1b --- /dev/null +++ b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/repository/UserModelPluginRepo.java @@ -0,0 +1,74 @@ +package modelengine.fit.jade.aipp.model.repository; + +import modelengine.fit.jade.aipp.model.po.UserModelDetailPo; +import modelengine.fitframework.annotation.Genericable; +import modelengine.fitframework.annotation.Property; +import modelengine.jade.carver.tool.annotation.Group; +import modelengine.jade.carver.tool.annotation.ToolMethod; + +import java.util.List; + +/** + * 表示用户模型信息用于插件的持久化层的接口。 + * + * @author lizhichao + * @since 2025/4/9 + */ +@Group(name = "User_Model_Tool") +public interface UserModelPluginRepo { + /** + * 根据用户标识来查询该用户可用的用戶模型列表。 + * + * @param userId 表示用户标识。 + * @return 表示该用户可用的用戶模型列表 {@link List}{@code <}{@link UserModelDetailPo}{@code >}。 + */ + @ToolMethod(name = "get_user_model_list", description = "根据用户标识来查询该用户可用的用戶模型列表") + @Genericable(id = "modelengine.fit.jade.aipp.model.getUserModelList") + List getUserModelList(@Property(description = "用户id", required = true) String userId); + + /** + * 为用户添加模型。 + * + * @param userId 表示用户标识。 + * @param apiKey 表示该用户访问模型所需的 API Key。 + * @param modelName 表示模型名称。 + * @param baseUrl 表示模型访问的地址。 + * @return 添加结果提示信息。 + */ + @ToolMethod(name = "add_user_model", description = "为用户添加可用的模型信息") + @Genericable(id = "modelengine.fit.jade.userModel.addUserModel") + String addUserModel( + @Property(description = "用户id", required = true) String userId, + @Property(description = "模型访问的 API Key", required = true) String apiKey, + @Property(description = "模型名称", required = true) String modelName, + @Property(description = "模型访问地址", required = true) String baseUrl + ); + + /** + * 删除用户绑定的模型信息。 + * + * @param userId 表示用户标识。 + * @param modelId 表示待删除的模型标识。 + * @return 删除结果提示信息。 + */ + @ToolMethod(name = "delete_user_model", description = "删除用户绑定的模型信息") + @Genericable(id = "modelengine.fit.jade.userModel.deleteUserModel") + String deleteUserModel( + @Property(description = "用户id", required = true) String userId, + @Property(description = "模型id", required = true) String modelId + ); + + /** + * 将指定模型设置为该用户的默认模型。 + * + * @param userId 表示用户标识。 + * @param modelId 表示要设为默认的模型标识。 + * @return 切换默认模型的提示信息。 + */ + @ToolMethod(name = "switch_default_model", description = "将指定模型设置为用户的默认模型") + @Genericable(id = "modelengine.fit.jade.userModel.switchDefaultModel") + String switchDefaultModel( + @Property(description = "用户id", required = true) String userId, + @Property(description = "默认模型id", required = true) String modelId + ); +} diff --git a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/repository/impl/UserModelPluginRepoImpl.java b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/repository/impl/UserModelPluginRepoImpl.java new file mode 100644 index 0000000000..b0456ededf --- /dev/null +++ b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/repository/impl/UserModelPluginRepoImpl.java @@ -0,0 +1,163 @@ +package modelengine.fit.jade.aipp.model.repository.impl; + +import modelengine.fit.jade.aipp.model.mapper.ModelMapper; +import modelengine.fit.jade.aipp.model.mapper.UserModelMapper; +import modelengine.fit.jade.aipp.model.po.ModelPo; +import modelengine.fit.jade.aipp.model.po.UserModelDetailPo; +import modelengine.fit.jade.aipp.model.po.UserModelPo; +import modelengine.fit.jade.aipp.model.repository.UserModelPluginRepo; +import modelengine.fit.jade.aipp.model.repository.UserModelRepo; +import modelengine.fitframework.annotation.Component; +import modelengine.fitframework.annotation.Fitable; +import modelengine.fitframework.annotation.Property; +import modelengine.fitframework.log.Logger; +import modelengine.fitframework.util.CollectionUtils; +import modelengine.jade.carver.tool.annotation.Attribute; +import modelengine.jade.carver.tool.annotation.Group; +import modelengine.jade.carver.tool.annotation.ToolMethod; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 表示用户模型信息用于插件的持久化层的接口 {@link UserModelRepo} 的实现。 + * + * @author lizhichao + * @since 2025/4/9 + */ +@Component +@Group(name = "User_Model_Tool_Impl") +public class UserModelPluginRepoImpl implements UserModelPluginRepo { + private static final Logger log = Logger.get(UserModelRepoImpl.class); + private static final String FITABLE_ID = "aipp.model.repository"; + public static final String DEFAULT_MODEL_TYPE = "chat_completions"; + private final ModelMapper modelMapper; + private final UserModelMapper userModelMapper; + + /** + * 构造方法。 + * + * @param modelMapper 模型信息表的 MyBatis 映射接口,用于处理模型增删查改。 + * @param userModelMapper 用户与模型绑定关系的 MyBatis 映射接口,用于管理用户模型映射数据。 + */ + public UserModelPluginRepoImpl(ModelMapper modelMapper, UserModelMapper userModelMapper) { + this.modelMapper = modelMapper; + this.userModelMapper = userModelMapper; + } + + @Override + @Fitable(id = FITABLE_ID) + @ToolMethod(name = "获取用户模型列表", description = "根据用户标识来查询该用户可用的模型列表", extensions = { + @Attribute(key = "tags", value = "FIT"), @Attribute(key = "tags", value = "MODEL") + }) + @Property(description = "返回该用户可用的模型列表") + public List getUserModelList(String userId) { + log.info("start get model list for {}.", userId); + List userModelPos = this.userModelMapper.listUserModels(userId); + if (CollectionUtils.isEmpty(userModelPos)) { + log.warn("No user model records found for userId={}.", userId); + return Collections.emptyList(); + } + List modelIds = userModelPos.stream() + .map(UserModelPo::getModelId) + .distinct() + .collect(Collectors.toList()); + List modelPos = this.modelMapper.listModels(modelIds); + // 构建 modelId → ModelPo 映射 + Map modelMap = modelPos.stream() + .map(model -> Map.entry(model.getModelId(), model)) + .collect(Collectors.toMap( + Map.Entry::getKey, + Map.Entry::getValue, + (a, b) -> a + )); + return userModelPos.stream().map(userModel -> { + ModelPo model = modelMap.get(userModel.getModelId()); + return new UserModelDetailPo( + userModel.getCreatedAt(), + userModel.getModelId(), + userModel.getUserId(), + model != null ? model.getName() : null, + model != null ? model.getBaseUrl() : null, + userModel.getIsDefault() + ); + }).collect(Collectors.toList()); + } + + @Override + @Fitable(id = FITABLE_ID) + @ToolMethod(name = "添加模型", description = "为用户添加可用的模型信息", extensions = { + @Attribute(key = "tags", value = "FIT"), @Attribute(key = "tags", value = "MODEL") + }) + @Property(description = "为用户添加可用的模型信息") + public String addUserModel(String userId, String apiKey, + String modelName, String baseUrl) { + log.info("start add user model for {}.", userId); + String modelId = UUID.randomUUID().toString().replace("-", ""); + int isDefault = this.userModelMapper.userHasDefaultModel(userId) ? 0 : 1; + + ModelPo modelPo = new ModelPo(modelId, modelName, modelId, baseUrl, DEFAULT_MODEL_TYPE); + modelPo.setCreatedBy(userId); + modelPo.setUpdatedBy(userId); + this.modelMapper.insertModel(modelPo); + + UserModelPo userModelPo = new UserModelPo(userId, modelId, apiKey, isDefault); + userModelPo.setCreatedBy(userId); + userModelPo.setUpdatedBy(userId); + this.userModelMapper.addUserModel(userModelPo); + return "添加模型成功。"; + } + + @Override + @Fitable(id = FITABLE_ID) + @ToolMethod(name = "删除模型", description = "删除用户绑定的模型信息", extensions = { + @Attribute(key = "tags", value = "FIT"), @Attribute(key = "tags", value = "MODEL") + }) + @Property(description = "删除用户绑定的模型信息") + public String deleteUserModel(String userId, String modelId) { + log.info("start delete user model for {}.", userId); + List userModels = this.userModelMapper.listUserModels(userId); + if (userModels == null || userModels.isEmpty()) { + return "删除模型失败,当前用户没有任何模型记录。"; + } + + UserModelPo target = userModels.stream() + .filter(m -> Objects.equals(m.getModelId(), modelId)) + .findFirst() + .orElse(null); + if (target == null) { + return "删除模型失败,该模型不属于当前用户。"; + } + this.userModelMapper.deleteByModelId(modelId); + this.modelMapper.deleteByModelId(modelId); + // 如果删除的不是默认模型,直接返回 + if (target.getIsDefault() != 1) { + return "删除模型成功。"; + } + userModels.remove(target); + // 如果没有默认模型,但还有其他记录,则设置最新创建的为默认 + if (!userModels.isEmpty()) { + UserModelPo latest = userModels.stream() + .max(Comparator.comparing(UserModelPo::getCreatedAt)) + .orElse(null); + this.userModelMapper.switchDefaultForUser(userId, latest.getModelId()); + return String.format("删除默认模型成功,添加%s为默认模型。", this.modelMapper.get(latest.getModelId()).getName()); + } + return "删除模型成功,当前无默认模型。"; + } + + @Override + @Fitable(id = FITABLE_ID) + @ToolMethod(name = "切换默认模型", description = "将指定模型设置为用户的默认模型", extensions = { + @Attribute(key = "tags", value = "FIT"), @Attribute(key = "tags", value = "MODEL") + }) + @Property(description = "将指定模型设置为用户的默认模型") + public String switchDefaultModel(String userId, String modelId) { + log.info("start switch default model for {}.", userId); + int rows = this.userModelMapper.switchDefaultForUser(userId, modelId); + if (rows == 0) { + return "未查到对应模型。"; + } + return String.format("已切换%s为默认模型。", this.modelMapper.get(modelId).getName()); + } +} diff --git a/app-builder/plugins/aipp-custom-model-center/src/main/resources/mapper/ModelMapper.xml b/app-builder/plugins/aipp-custom-model-center/src/main/resources/mapper/ModelMapper.xml index 61b690d7c5..7100793873 100644 --- a/app-builder/plugins/aipp-custom-model-center/src/main/resources/mapper/ModelMapper.xml +++ b/app-builder/plugins/aipp-custom-model-center/src/main/resources/mapper/ModelMapper.xml @@ -29,4 +29,14 @@ #{item} + + + INSERT INTO t_app_engine_model (model_id, name, tag, base_url, type, created_by, updated_by) + VALUES (#{modelId}, #{name}, #{tag}, #{baseUrl}, #{type}, #{createdBy}, #{updatedBy}) + + + + DELETE FROM t_app_engine_model + WHERE model_id = #{modelId} + \ No newline at end of file diff --git a/app-builder/plugins/aipp-custom-model-center/src/main/resources/mapper/UserModelMapper.xml b/app-builder/plugins/aipp-custom-model-center/src/main/resources/mapper/UserModelMapper.xml index 7b901695c8..bbe78f9584 100644 --- a/app-builder/plugins/aipp-custom-model-center/src/main/resources/mapper/UserModelMapper.xml +++ b/app-builder/plugins/aipp-custom-model-center/src/main/resources/mapper/UserModelMapper.xml @@ -27,4 +27,37 @@ where user_id = #{userId} and is_default = 1 + + + + + INSERT INTO t_app_engine_user_model (user_id, model_id, api_key, is_default, created_by, updated_by) + VALUES (#{userId}, #{modelId}, #{apiKey}, #{isDefault}, #{createdBy}, #{updatedBy}) + + + + DELETE FROM t_app_engine_user_model + WHERE model_id = #{modelId} + + + + + + UPDATE t_app_engine_user_model + SET is_default = CASE WHEN model_id = #{modelId} THEN 1 ELSE 0 END + WHERE user_id = #{userId} + \ No newline at end of file From 9bc768b20f08f88f2292ec0e3d11ca66a0b75519 Mon Sep 17 00:00:00 2001 From: lizhichao51 Date: Mon, 14 Apr 2025 15:31:46 +0800 Subject: [PATCH 2/8] =?UTF-8?q?[app-platform]=20=E6=8C=89=E7=85=A7?= =?UTF-8?q?=E5=9B=A2=E9=98=9F=E6=A0=87=E5=87=86=E5=88=B7=E6=96=B0=E6=B3=A8?= =?UTF-8?q?=E9=87=8A=E4=BF=A1=E6=81=AF,=20UserModelPo=E5=A2=9E=E5=8A=A0cre?= =?UTF-8?q?atedAt=E5=8F=82=E6=95=B0=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jade/aipp/model/mapper/ModelMapper.java | 5 +- .../aipp/model/mapper/UserModelMapper.java | 30 +++++----- .../jade/aipp/model/po/UserModelDetailPo.java | 55 +++++++++++++++++++ .../fit/jade/aipp/model/po/UserModelPo.java | 6 ++ .../model/repository/UserModelPluginRepo.java | 47 +++++++--------- .../impl/UserModelPluginRepoImpl.java | 19 +++---- .../main/resources/mapper/UserModelMapper.xml | 8 +-- 7 files changed, 114 insertions(+), 56 deletions(-) create mode 100644 app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/po/UserModelDetailPo.java diff --git a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/mapper/ModelMapper.java b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/mapper/ModelMapper.java index 56a2b15bcd..4c4411c14b 100644 --- a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/mapper/ModelMapper.java +++ b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/mapper/ModelMapper.java @@ -7,6 +7,7 @@ package modelengine.fit.jade.aipp.model.mapper; import modelengine.fit.jade.aipp.model.po.ModelPo; + import org.apache.ibatis.annotations.Mapper; import java.util.List; @@ -38,14 +39,14 @@ public interface ModelMapper { /** * 插入模型信息。 * - * @param model 模型对象。 + * @param model 表示待插入的模型信息 {@link ModelPo}。 */ void insertModel(ModelPo model); /** * 根据模型ID删除模型信息。 * - * @param modelId 模型ID。 + * @param modelId 表示删除模型标识 {@link String}。 */ void deleteByModelId(String modelId); } diff --git a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/mapper/UserModelMapper.java b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/mapper/UserModelMapper.java index 83d131a2fc..1264f1141c 100644 --- a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/mapper/UserModelMapper.java +++ b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/mapper/UserModelMapper.java @@ -7,6 +7,7 @@ package modelengine.fit.jade.aipp.model.mapper; import modelengine.fit.jade.aipp.model.po.UserModelPo; + import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -37,41 +38,42 @@ public interface UserModelMapper { UserModelPo getDefault(String userId); /** - * 判断该用户是否已有模型绑定记录。 + * 判断指定用户是否已绑定默认模型。 * - * @param userId 用户标识。 - * @return true 表示已有模型,false 表示无记录。 + * @param userId 表示用户标识 {@link String}。 + * @return 若已绑定默认模型则返回 {@code true},否则返回 {@code false}。 */ boolean userHasDefaultModel(String userId); /** * 插入用户模型绑定关系。 * - * @param userModel 用户模型关系对象。 + * @param userModel 表示待插入的用户模型关系对象 {@link UserModelPo}。 */ void addUserModel(UserModelPo userModel); /** - * 根据模型ID删除用户模型绑定关系。 + * 根据模型标识删除对应的用户模型绑定关系。 * - * @param modelId 模型ID。 + * @param modelId 表示模型标识 {@link String}。 */ void deleteByModelId(String modelId); /** - * 查找指定用户最新创建的模型记录(按 created_at 降序排序,取第一条)。 - * @param userId 用户标识。 + * 查找指定用户最新创建的模型绑定记录(按创建时间降序,取第一条)。 + * + * @param userId 表示用户标识 {@link String}。 + * @return 最新的用户模型关系 {@link UserModelPo}。 */ UserModelPo findLatestUserModel(String userId); /** - * 将指定用户所有模型记录的 is_default 状态更新, - * 如果记录的 model_id 等于传入的 modelId,则设置为 1,否则设置为 0。 + * 更新指定用户的所有模型绑定记录的默认状态。 + *

若记录中的模型标识与传入的 {@link String modelId} 一致,则设置为默认(1),否则设为非默认(0)。

* - * @param userId 用户ID - * @param modelId 模型ID - * @return 更新的记录数 + * @param userId 表示用户标识 {@link String}。 + * @param modelId 表示需设为默认的模型标识 {@link String}。 + * @return 成功更新的记录条数 {@code int}。 */ int switchDefaultForUser(@Param("userId") String userId, @Param("modelId") String modelId); - } diff --git a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/po/UserModelDetailPo.java b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/po/UserModelDetailPo.java new file mode 100644 index 0000000000..a107f5814d --- /dev/null +++ b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/po/UserModelDetailPo.java @@ -0,0 +1,55 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) 2025 Huawei Technologies Co., Ltd. All rights reserved. + * This file is a part of the ModelEngine Project. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +package modelengine.fit.jade.aipp.model.po; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import modelengine.jade.common.po.BasePo; + +import java.time.LocalDateTime; + +/** + * 用户模型关系信息用于前端表单展示。 + * + * @author lizhichao + * @since 2025/4/8 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AllArgsConstructor +public class UserModelDetailPo extends BasePo { + /** + * 表示创建时间。 + */ + private LocalDateTime createdAt; + + /** + * 模型 ID。 + */ + private String modelId; + + /** + * 用户标识。 + */ + private String userId; + + /** + * 模型名称。 + */ + private String modelName; + + /** + * 模型访问地址。 + */ + private String baseUrl; + + /** + * 是否为默认模型(1表示默认,0表示非默认)。 + */ + private int isDefault; +} \ No newline at end of file diff --git a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/po/UserModelPo.java b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/po/UserModelPo.java index 642638a3b6..313e8fcf1c 100644 --- a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/po/UserModelPo.java +++ b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/po/UserModelPo.java @@ -11,6 +11,8 @@ import lombok.EqualsAndHashCode; import modelengine.jade.common.po.BasePo; +import java.time.LocalDateTime; + /** * 用户模型关系信息 ORM 对象。 * @@ -21,6 +23,10 @@ @EqualsAndHashCode(callSuper = true) @AllArgsConstructor public class UserModelPo extends BasePo { + /** + * 表示创建时间。 + */ + private LocalDateTime createdAt; private String userId; private String modelId; private String apiKey; diff --git a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/repository/UserModelPluginRepo.java b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/repository/UserModelPluginRepo.java index bec86a0f1b..e752669506 100644 --- a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/repository/UserModelPluginRepo.java +++ b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/repository/UserModelPluginRepo.java @@ -17,10 +17,10 @@ @Group(name = "User_Model_Tool") public interface UserModelPluginRepo { /** - * 根据用户标识来查询该用户可用的用戶模型列表。 + * 根据用户标识来查询该用户可用的用户模型列表。 * - * @param userId 表示用户标识。 - * @return 表示该用户可用的用戶模型列表 {@link List}{@code <}{@link UserModelDetailPo}{@code >}。 + * @param userId 表示用户标识 {@link String}。 + * @return 表示该用户可用的用户模型列表 {@link List}{@code <}{@link UserModelDetailPo}{@code >}。 */ @ToolMethod(name = "get_user_model_list", description = "根据用户标识来查询该用户可用的用戶模型列表") @Genericable(id = "modelengine.fit.jade.aipp.model.getUserModelList") @@ -28,47 +28,42 @@ public interface UserModelPluginRepo { /** * 为用户添加模型。 + *

插入模型名称、访问地址与密钥等信息,并与指定用户进行绑定。

* - * @param userId 表示用户标识。 - * @param apiKey 表示该用户访问模型所需的 API Key。 - * @param modelName 表示模型名称。 - * @param baseUrl 表示模型访问的地址。 - * @return 添加结果提示信息。 + * @param userId 表示用户标识 {@link String}。 + * @param apiKey 表示该用户访问模型所需的 API Key {@link String}。 + * @param modelName 表示模型名称 {@link String}。 + * @param baseUrl 表示模型访问的地址 {@link String}。 + * @return 添加结果提示信息 {@link String}。 */ @ToolMethod(name = "add_user_model", description = "为用户添加可用的模型信息") @Genericable(id = "modelengine.fit.jade.userModel.addUserModel") - String addUserModel( - @Property(description = "用户id", required = true) String userId, + String addUserModel(@Property(description = "用户id", required = true) String userId, @Property(description = "模型访问的 API Key", required = true) String apiKey, @Property(description = "模型名称", required = true) String modelName, - @Property(description = "模型访问地址", required = true) String baseUrl - ); + @Property(description = "模型访问地址", required = true) String baseUrl); /** * 删除用户绑定的模型信息。 * - * @param userId 表示用户标识。 - * @param modelId 表示待删除的模型标识。 - * @return 删除结果提示信息。 + * @param userId 表示用户标识 {@link String}。 + * @param modelId 表示待删除的模型标识 {@link String}。 + * @return 删除结果提示信息 {@link String}。 */ @ToolMethod(name = "delete_user_model", description = "删除用户绑定的模型信息") @Genericable(id = "modelengine.fit.jade.userModel.deleteUserModel") - String deleteUserModel( - @Property(description = "用户id", required = true) String userId, - @Property(description = "模型id", required = true) String modelId - ); + String deleteUserModel(@Property(description = "用户id", required = true) String userId, + @Property(description = "模型id", required = true) String modelId); /** * 将指定模型设置为该用户的默认模型。 * - * @param userId 表示用户标识。 - * @param modelId 表示要设为默认的模型标识。 - * @return 切换默认模型的提示信息。 + * @param userId 表示用户标识 {@link String}。 + * @param modelId 表示要设为默认的模型标识 {@link String}。 + * @return 切换默认模型的提示信息 {@link String}。 */ @ToolMethod(name = "switch_default_model", description = "将指定模型设置为用户的默认模型") @Genericable(id = "modelengine.fit.jade.userModel.switchDefaultModel") - String switchDefaultModel( - @Property(description = "用户id", required = true) String userId, - @Property(description = "默认模型id", required = true) String modelId - ); + String switchDefaultModel(@Property(description = "用户id", required = true) String userId, + @Property(description = "默认模型id", required = true) String modelId); } diff --git a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/repository/impl/UserModelPluginRepoImpl.java b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/repository/impl/UserModelPluginRepoImpl.java index b0456ededf..fd7bd2c6c7 100644 --- a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/repository/impl/UserModelPluginRepoImpl.java +++ b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/repository/impl/UserModelPluginRepoImpl.java @@ -16,6 +16,7 @@ import modelengine.jade.carver.tool.annotation.Group; import modelengine.jade.carver.tool.annotation.ToolMethod; +import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @@ -37,8 +38,8 @@ public class UserModelPluginRepoImpl implements UserModelPluginRepo { /** * 构造方法。 * - * @param modelMapper 模型信息表的 MyBatis 映射接口,用于处理模型增删查改。 - * @param userModelMapper 用户与模型绑定关系的 MyBatis 映射接口,用于管理用户模型映射数据。 + * @param modelMapper 表示模型信息表的 MyBatis 映射接口 {@link ModelMapper},用于处理模型的增删查改操作。 + * @param userModelMapper 表示用户与模型绑定关系的 MyBatis 映射接口 {@link UserModelMapper},用于管理用户模型映射数据。 */ public UserModelPluginRepoImpl(ModelMapper modelMapper, UserModelMapper userModelMapper) { this.modelMapper = modelMapper; @@ -73,14 +74,12 @@ public List getUserModelList(String userId) { )); return userModelPos.stream().map(userModel -> { ModelPo model = modelMap.get(userModel.getModelId()); - return new UserModelDetailPo( - userModel.getCreatedAt(), + return new UserModelDetailPo(userModel.getCreatedAt(), userModel.getModelId(), userModel.getUserId(), model != null ? model.getName() : null, model != null ? model.getBaseUrl() : null, - userModel.getIsDefault() - ); + userModel.getIsDefault()); }).collect(Collectors.toList()); } @@ -90,8 +89,7 @@ public List getUserModelList(String userId) { @Attribute(key = "tags", value = "FIT"), @Attribute(key = "tags", value = "MODEL") }) @Property(description = "为用户添加可用的模型信息") - public String addUserModel(String userId, String apiKey, - String modelName, String baseUrl) { + public String addUserModel(String userId, String apiKey, String modelName, String baseUrl) { log.info("start add user model for {}.", userId); String modelId = UUID.randomUUID().toString().replace("-", ""); int isDefault = this.userModelMapper.userHasDefaultModel(userId) ? 0 : 1; @@ -101,7 +99,7 @@ public String addUserModel(String userId, String apiKey, modelPo.setUpdatedBy(userId); this.modelMapper.insertModel(modelPo); - UserModelPo userModelPo = new UserModelPo(userId, modelId, apiKey, isDefault); + UserModelPo userModelPo = new UserModelPo(LocalDateTime.now(), userId, modelId, apiKey, isDefault); userModelPo.setCreatedBy(userId); userModelPo.setUpdatedBy(userId); this.userModelMapper.addUserModel(userModelPo); @@ -141,7 +139,8 @@ public String deleteUserModel(String userId, String modelId) { .max(Comparator.comparing(UserModelPo::getCreatedAt)) .orElse(null); this.userModelMapper.switchDefaultForUser(userId, latest.getModelId()); - return String.format("删除默认模型成功,添加%s为默认模型。", this.modelMapper.get(latest.getModelId()).getName()); + return String.format("删除默认模型成功,添加%s为默认模型。", + this.modelMapper.get(latest.getModelId()).getName()); } return "删除模型成功,当前无默认模型。"; } diff --git a/app-builder/plugins/aipp-custom-model-center/src/main/resources/mapper/UserModelMapper.xml b/app-builder/plugins/aipp-custom-model-center/src/main/resources/mapper/UserModelMapper.xml index bbe78f9584..462fc304d4 100644 --- a/app-builder/plugins/aipp-custom-model-center/src/main/resources/mapper/UserModelMapper.xml +++ b/app-builder/plugins/aipp-custom-model-center/src/main/resources/mapper/UserModelMapper.xml @@ -3,6 +3,7 @@ + @@ -10,7 +11,7 @@ - user_id, model_id, api_key, is_default + created_at, user_id, model_id, api_key, is_default - SELECT user_id, model_id, api_key, is_default + SELECT created_at, user_id, model_id, api_key, is_default FROM t_app_engine_user_model WHERE user_id = #{userId} - ORDER BY created_at DESC - LIMIT 1 + ORDER BY created_at DESC LIMIT 1 From 140e07cef4646e82c0abb1e31b5b62240b31ac84 Mon Sep 17 00:00:00 2001 From: lizhichao51 Date: Wed, 16 Apr 2025 11:12:57 +0800 Subject: [PATCH 3/8] =?UTF-8?q?[app-builder]=20=E4=BF=AE=E6=94=B9=E6=A3=80?= =?UTF-8?q?=E8=A7=86=E6=84=8F=E8=A7=81=EF=BC=8C=E9=87=8D=E6=9E=84=E4=BA=86?= =?UTF-8?q?=E6=A8=A1=E5=9E=8B=E5=88=97=E8=A1=A8=E6=8E=A5=E5=8F=A3=E7=9A=84?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=EF=BC=8C=E6=8F=90=E9=AB=98=E4=BA=86=E5=8F=AF?= =?UTF-8?q?=E8=AF=BB=E6=80=A7=E5=92=8C=E7=BB=B4=E6=8A=A4=E6=80=A7=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugins/aipp-custom-model-center/pom.xml | 12 +- .../jade/aipp/model/mapper/ModelMapper.java | 12 +- .../aipp/model/mapper/UserModelMapper.java | 26 ++-- .../fit/jade/aipp/model/po/ModelPo.java | 69 ++++++++- .../jade/aipp/model/po/UserModelDetailPo.java | 89 +++++++++--- .../fit/jade/aipp/model/po/UserModelPo.java | 68 +++++++-- .../model/repository/UserModelPluginRepo.java | 69 --------- .../aipp/model/repository/UserModelRepo.java | 65 ++++++++- .../repository/impl/UserModelRepoImpl.java | 45 +++++- .../service/impl/CustomAippModelCenter.java | 3 +- .../impl/UserModelConfigService.java} | 132 ++++++++++-------- .../src/main/resources/mapper/ModelMapper.xml | 14 +- .../main/resources/mapper/UserModelMapper.xml | 18 +-- .../impl/CustomAippModelCenterTest.java | 52 +++++-- .../impl/UserModelConfigServiceTest.java | 113 +++++++++++++++ .../services/aipp-model-center/pom.xml | 8 ++ .../aipp/model/dto/UserModelDetailDto.java | 56 ++++++++ .../aipp/model/service/UserModelConfig.java | 75 ++++++++++ 18 files changed, 720 insertions(+), 206 deletions(-) delete mode 100644 app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/repository/UserModelPluginRepo.java rename app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/{repository/impl/UserModelPluginRepoImpl.java => service/impl/UserModelConfigService.java} (53%) create mode 100644 app-builder/plugins/aipp-custom-model-center/src/test/java/modelengine/fit/jade/aipp/model/service/impl/UserModelConfigServiceTest.java create mode 100644 app-builder/services/aipp-model-center/src/main/java/modelengine/fit/jade/aipp/model/dto/UserModelDetailDto.java create mode 100644 app-builder/services/aipp-model-center/src/main/java/modelengine/fit/jade/aipp/model/service/UserModelConfig.java diff --git a/app-builder/plugins/aipp-custom-model-center/pom.xml b/app-builder/plugins/aipp-custom-model-center/pom.xml index bdbd5723b3..b8635cf714 100644 --- a/app-builder/plugins/aipp-custom-model-center/pom.xml +++ b/app-builder/plugins/aipp-custom-model-center/pom.xml @@ -44,6 +44,14 @@ org.fitframework.integration fit-druid + + modelengine.fit.jade.service + tool-service + + + com.fasterxml.jackson.core + jackson-annotations + @@ -65,10 +73,6 @@ assertj-core test - - modelengine.fit.jade.service - tool-service - diff --git a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/mapper/ModelMapper.java b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/mapper/ModelMapper.java index 4c4411c14b..39bb25b68a 100644 --- a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/mapper/ModelMapper.java +++ b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/mapper/ModelMapper.java @@ -24,29 +24,29 @@ public interface ModelMapper { * 根据模型标识查询模型信息。 * * @param modelId 表示模型标识。 - * @return 模型信息 {@link ModelPo}。 + * @return 模型信息的 {@link ModelPo}。 */ - ModelPo get(String modelId); + ModelPo getModel(String modelId); /** * 根据模型标识列表批量查询模型信息。 * * @param modelIds 表示模型标识列表。 - * @return 模型信息列表 {@link List}{@code <}{@link ModelPo}{@code >}. + * @return 模型信息列表的 {@link List}{@code <}{@link ModelPo}{@code >}. */ List listModels(List modelIds); /** * 插入模型信息。 * - * @param model 表示待插入的模型信息 {@link ModelPo}。 + * @param model 表示待插入的模型信息的 {@link ModelPo}。 */ void insertModel(ModelPo model); /** - * 根据模型ID删除模型信息。 + * 根据模型标识删除模型信息。 * - * @param modelId 表示删除模型标识 {@link String}。 + * @param modelId 表示删除模型标识的 {@link String}。 */ void deleteByModelId(String modelId); } diff --git a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/mapper/UserModelMapper.java b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/mapper/UserModelMapper.java index 1264f1141c..eb57982fde 100644 --- a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/mapper/UserModelMapper.java +++ b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/mapper/UserModelMapper.java @@ -25,7 +25,7 @@ public interface UserModelMapper { * 根据用户标识获取用户模型关系列表。 * * @param userId 表示用户标识。 - * @return 用户模型关系列表 {@link List}{@code <}{@link UserModelPo}{@code >}. + * @return 用户模型关系列表的 {@link List}{@code <}{@link UserModelPo}{@code >}. */ List listUserModels(String userId); @@ -33,47 +33,47 @@ public interface UserModelMapper { * 根据用户标识获取默认用户模型关系。 * * @param userId 表示用户标识。 - * @return 默认的用户模型关系。 + * @return 默认的用户模型关系的 {@link UserModelPo}。 */ UserModelPo getDefault(String userId); /** * 判断指定用户是否已绑定默认模型。 * - * @param userId 表示用户标识 {@link String}。 + * @param userId 表示用户标识的 {@link String}。 * @return 若已绑定默认模型则返回 {@code true},否则返回 {@code false}。 */ - boolean userHasDefaultModel(String userId); + boolean hasDefaultModel(String userId); /** * 插入用户模型绑定关系。 * - * @param userModel 表示待插入的用户模型关系对象 {@link UserModelPo}。 + * @param userModel 表示待插入的用户模型关系对象的 {@link UserModelPo}。 */ - void addUserModel(UserModelPo userModel); + void insertUserModel(UserModelPo userModel); /** * 根据模型标识删除对应的用户模型绑定关系。 * - * @param modelId 表示模型标识 {@link String}。 + * @param modelId 表示模型标识的 {@link String}。 */ void deleteByModelId(String modelId); /** * 查找指定用户最新创建的模型绑定记录(按创建时间降序,取第一条)。 * - * @param userId 表示用户标识 {@link String}。 - * @return 最新的用户模型关系 {@link UserModelPo}。 + * @param userId 表示用户标识的 {@link String}。 + * @return 最新的用户模型关系的 {@link UserModelPo}。 */ UserModelPo findLatestUserModel(String userId); /** * 更新指定用户的所有模型绑定记录的默认状态。 - *

若记录中的模型标识与传入的 {@link String modelId} 一致,则设置为默认(1),否则设为非默认(0)。

+ *

若记录中的模型标识与传入的 {@code modelId} 一致,则设置为默认(1),否则设为非默认(0)。

* - * @param userId 表示用户标识 {@link String}。 - * @param modelId 表示需设为默认的模型标识 {@link String}。 - * @return 成功更新的记录条数 {@code int}。 + * @param userId 表示用户标识的 {@link String}。 + * @param modelId 表示需设为默认的模型标识的 {@link String}。 + * @return 成功更新的记录条数的 {@code int}。 */ int switchDefaultForUser(@Param("userId") String userId, @Param("modelId") String modelId); } diff --git a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/po/ModelPo.java b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/po/ModelPo.java index 8f702b20db..285e0cf042 100644 --- a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/po/ModelPo.java +++ b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/po/ModelPo.java @@ -6,10 +6,11 @@ package modelengine.fit.jade.aipp.model.po; -import lombok.AllArgsConstructor; import lombok.Data; import modelengine.jade.common.po.BasePo; +import java.time.LocalDateTime; + /** * 模型信息 ORM 对象。 * @@ -17,11 +18,75 @@ * @since 2025/3/11 */ @Data -@AllArgsConstructor public class ModelPo extends BasePo { private String modelId; private String name; private String tag; private String baseUrl; private String type; + + /** + * 用于构建 {@link ModelPo} 实例的构建器类。 + */ + public static class Builder { + private final ModelPo instance = new ModelPo(); + + public Builder modelId(String modelId) { + instance.setModelId(modelId); + return this; + } + + public Builder name(String name) { + instance.setName(name); + return this; + } + + public Builder tag(String tag) { + instance.setTag(tag); + return this; + } + + public Builder baseUrl(String baseUrl) { + instance.setBaseUrl(baseUrl); + return this; + } + + public Builder type(String type) { + instance.setType(type); + return this; + } + + public Builder id(Long id) { + instance.setId(id); + return this; + } + + public Builder createdAt(LocalDateTime createdAt) { + instance.setCreatedAt(createdAt); + return this; + } + + public Builder updatedAt(LocalDateTime updatedAt) { + instance.setUpdatedAt(updatedAt); + return this; + } + + public Builder createdBy(String createdBy) { + instance.setCreatedBy(createdBy); + return this; + } + + public Builder updatedBy(String updatedBy) { + instance.setUpdatedBy(updatedBy); + return this; + } + + public ModelPo build() { + return instance; + } + } + + public static Builder builder() { + return new Builder(); + } } diff --git a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/po/UserModelDetailPo.java b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/po/UserModelDetailPo.java index a107f5814d..28ef8a4748 100644 --- a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/po/UserModelDetailPo.java +++ b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/po/UserModelDetailPo.java @@ -6,9 +6,8 @@ package modelengine.fit.jade.aipp.model.po; -import lombok.AllArgsConstructor; import lombok.Data; -import lombok.EqualsAndHashCode; + import modelengine.jade.common.po.BasePo; import java.time.LocalDateTime; @@ -16,40 +15,98 @@ /** * 用户模型关系信息用于前端表单展示。 * - * @author lizhichao - * @since 2025/4/8 + * @author 李智超 + * @since 2025-04-08 */ @Data -@EqualsAndHashCode(callSuper = true) -@AllArgsConstructor public class UserModelDetailPo extends BasePo { /** - * 表示创建时间。 - */ - private LocalDateTime createdAt; - - /** - * 模型 ID。 + * 表示模型标识。 */ private String modelId; /** - * 用户标识。 + * 表示用户标识。 */ private String userId; /** - * 模型名称。 + * 表示模型名称。 */ private String modelName; /** - * 模型访问地址。 + * 表示模型访问地址。 */ private String baseUrl; /** - * 是否为默认模型(1表示默认,0表示非默认)。 + * 表示是否为默认模型(1表示默认,0表示非默认)。 */ private int isDefault; + + /** + * 用于构建 {@link UserModelDetailPo} 实例的构建器类。 + */ + public static class Builder { + private final UserModelDetailPo instance = new UserModelDetailPo(); + + public Builder id(Long id) { + instance.setId(id); + return this; + } + + public Builder createdAt(LocalDateTime createdAt) { + instance.setCreatedAt(createdAt); + return this; + } + + public Builder updatedAt(LocalDateTime updatedAt) { + instance.setUpdatedAt(updatedAt); + return this; + } + + public Builder createdBy(String createdBy) { + instance.setCreatedBy(createdBy); + return this; + } + + public Builder updatedBy(String updatedBy) { + instance.setUpdatedBy(updatedBy); + return this; + } + + public Builder modelId(String modelId) { + instance.setModelId(modelId); + return this; + } + + public Builder userId(String userId) { + instance.setUserId(userId); + return this; + } + + public Builder modelName(String modelName) { + instance.setModelName(modelName); + return this; + } + + public Builder baseUrl(String baseUrl) { + instance.setBaseUrl(baseUrl); + return this; + } + + public Builder isDefault(int isDefault) { + instance.setIsDefault(isDefault); + return this; + } + + public UserModelDetailPo build() { + return instance; + } + } + + public static Builder builder() { + return new Builder(); + } } \ No newline at end of file diff --git a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/po/UserModelPo.java b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/po/UserModelPo.java index 313e8fcf1c..c7f48bf023 100644 --- a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/po/UserModelPo.java +++ b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/po/UserModelPo.java @@ -6,9 +6,7 @@ package modelengine.fit.jade.aipp.model.po; -import lombok.AllArgsConstructor; import lombok.Data; -import lombok.EqualsAndHashCode; import modelengine.jade.common.po.BasePo; import java.time.LocalDateTime; @@ -20,15 +18,69 @@ * @since 2025/3/11 */ @Data -@EqualsAndHashCode(callSuper = true) -@AllArgsConstructor public class UserModelPo extends BasePo { - /** - * 表示创建时间。 - */ - private LocalDateTime createdAt; private String userId; private String modelId; private String apiKey; private int isDefault; + + /** + * 用于构建 {@link UserModelPo} 实例的构建器类。 + */ + public static class Builder { + private final UserModelPo instance = new UserModelPo(); + + public Builder userId(String userId) { + instance.setUserId(userId); + return this; + } + + public Builder modelId(String modelId) { + instance.setModelId(modelId); + return this; + } + + public Builder apiKey(String apiKey) { + instance.setApiKey(apiKey); + return this; + } + + public Builder isDefault(int isDefault) { + instance.setIsDefault(isDefault); + return this; + } + + public Builder id(Long id) { + instance.setId(id); + return this; + } + + public Builder createdAt(LocalDateTime createdAt) { + instance.setCreatedAt(createdAt); + return this; + } + + public Builder updatedAt(LocalDateTime updatedAt) { + instance.setUpdatedAt(updatedAt); + return this; + } + + public Builder createdBy(String createdBy) { + instance.setCreatedBy(createdBy); + return this; + } + + public Builder updatedBy(String updatedBy) { + instance.setUpdatedBy(updatedBy); + return this; + } + + public UserModelPo build() { + return instance; + } + } + + public static Builder builder() { + return new Builder(); + } } diff --git a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/repository/UserModelPluginRepo.java b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/repository/UserModelPluginRepo.java deleted file mode 100644 index e752669506..0000000000 --- a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/repository/UserModelPluginRepo.java +++ /dev/null @@ -1,69 +0,0 @@ -package modelengine.fit.jade.aipp.model.repository; - -import modelengine.fit.jade.aipp.model.po.UserModelDetailPo; -import modelengine.fitframework.annotation.Genericable; -import modelengine.fitframework.annotation.Property; -import modelengine.jade.carver.tool.annotation.Group; -import modelengine.jade.carver.tool.annotation.ToolMethod; - -import java.util.List; - -/** - * 表示用户模型信息用于插件的持久化层的接口。 - * - * @author lizhichao - * @since 2025/4/9 - */ -@Group(name = "User_Model_Tool") -public interface UserModelPluginRepo { - /** - * 根据用户标识来查询该用户可用的用户模型列表。 - * - * @param userId 表示用户标识 {@link String}。 - * @return 表示该用户可用的用户模型列表 {@link List}{@code <}{@link UserModelDetailPo}{@code >}。 - */ - @ToolMethod(name = "get_user_model_list", description = "根据用户标识来查询该用户可用的用戶模型列表") - @Genericable(id = "modelengine.fit.jade.aipp.model.getUserModelList") - List getUserModelList(@Property(description = "用户id", required = true) String userId); - - /** - * 为用户添加模型。 - *

插入模型名称、访问地址与密钥等信息,并与指定用户进行绑定。

- * - * @param userId 表示用户标识 {@link String}。 - * @param apiKey 表示该用户访问模型所需的 API Key {@link String}。 - * @param modelName 表示模型名称 {@link String}。 - * @param baseUrl 表示模型访问的地址 {@link String}。 - * @return 添加结果提示信息 {@link String}。 - */ - @ToolMethod(name = "add_user_model", description = "为用户添加可用的模型信息") - @Genericable(id = "modelengine.fit.jade.userModel.addUserModel") - String addUserModel(@Property(description = "用户id", required = true) String userId, - @Property(description = "模型访问的 API Key", required = true) String apiKey, - @Property(description = "模型名称", required = true) String modelName, - @Property(description = "模型访问地址", required = true) String baseUrl); - - /** - * 删除用户绑定的模型信息。 - * - * @param userId 表示用户标识 {@link String}。 - * @param modelId 表示待删除的模型标识 {@link String}。 - * @return 删除结果提示信息 {@link String}。 - */ - @ToolMethod(name = "delete_user_model", description = "删除用户绑定的模型信息") - @Genericable(id = "modelengine.fit.jade.userModel.deleteUserModel") - String deleteUserModel(@Property(description = "用户id", required = true) String userId, - @Property(description = "模型id", required = true) String modelId); - - /** - * 将指定模型设置为该用户的默认模型。 - * - * @param userId 表示用户标识 {@link String}。 - * @param modelId 表示要设为默认的模型标识 {@link String}。 - * @return 切换默认模型的提示信息 {@link String}。 - */ - @ToolMethod(name = "switch_default_model", description = "将指定模型设置为用户的默认模型") - @Genericable(id = "modelengine.fit.jade.userModel.switchDefaultModel") - String switchDefaultModel(@Property(description = "用户id", required = true) String userId, - @Property(description = "默认模型id", required = true) String modelId); -} diff --git a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/repository/UserModelRepo.java b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/repository/UserModelRepo.java index 8fa2e309ed..80fe4f5640 100644 --- a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/repository/UserModelRepo.java +++ b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/repository/UserModelRepo.java @@ -8,6 +8,7 @@ import modelengine.fit.jade.aipp.model.po.ModelAccessPo; import modelengine.fit.jade.aipp.model.po.ModelPo; +import modelengine.fit.jade.aipp.model.po.UserModelPo; import java.util.List; @@ -24,7 +25,7 @@ public interface UserModelRepo { * @param userId 表示用户标识。 * @return 表示该用户可用的模型列表 {@link List}{@code <}{@link ModelPo}{@code >}。 */ - List get(String userId); + List getModelList(String userId); /** * 查询特定的模型访问信息。 @@ -43,4 +44,66 @@ public interface UserModelRepo { * @return 模型信息 {@link ModelPo}. */ ModelPo getDefaultModel(String userId); + + /** + * 根据用户标识来查询该用户可用的用户模型列表。 + * + * @param userId 表示用户标识。 + * @return 表示该用户可用的用户模型列表 {@link List}{@code <}{@link UserModelPo}{@code >}。 + */ + List listUserModels(String userId); + + /** + * 根据模型标识列表批量查询模型信息。 + * + * @param modelIds 表示模型标识列表。 + * @return 模型信息列表的 {@link List}{@code <}{@link ModelPo}{@code >}。 + */ + List listModels(List modelIds); + + /** + * 查询该用户是否存在默认模型。 + * + * @param userId 表示用户标识。 + * @return 是否存在默认模型的 {@code int}。 + */ + int hasDefaultModel(String userId); + + /** + * 插入一条模型信息。 + * + * @param modelPo 表示要插入的模型数据。 + */ + void insertModel(ModelPo modelPo); + + /** + * 插入一条用户模型关联信息。 + * + * @param userModelPo 表示要插入的用户模型数据。 + */ + void insertUserModel(UserModelPo userModelPo); + + /** + * 根据模型标识删除该模型的用户关联信息。 + * + * @param modelId 表示模型标识。 + */ + void deleteByModelId(String modelId); + + /** + * 设置某个模型为该用户的默认模型。 + * + * @param userId 表示用户标识。 + * @param modelId 表示要设置为默认的模型标识。 + * @return 受影响的记录行数的 {@code int}。 + */ + int switchDefaultForUser(String userId, String modelId); + + /** + * 根据模型标识查询模型信息。 + * + * @param modelId 表示模型标识。 + * @return 模型信息的 {@link ModelPo}。 + */ + ModelPo getModel(String modelId); } diff --git a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/repository/impl/UserModelRepoImpl.java b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/repository/impl/UserModelRepoImpl.java index 8c00db9d12..f8163a2c50 100644 --- a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/repository/impl/UserModelRepoImpl.java +++ b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/repository/impl/UserModelRepoImpl.java @@ -37,7 +37,7 @@ public UserModelRepoImpl(ModelMapper modelMapper, UserModelMapper userModelMappe } @Override - public List get(String userId) { + public List getModelList(String userId) { return this.getModelPos(this.userModelMapper.listUserModels(userId)); } @@ -75,6 +75,47 @@ public ModelPo getDefaultModel(String userId) { if (defaultModel == null) { return null; } - return this.modelMapper.get(defaultModel.getModelId()); + return this.modelMapper.getModel(defaultModel.getModelId()); + } + + @Override + public List listUserModels(String userId) { + return this.userModelMapper.listUserModels(userId); + } + + @Override + public List listModels(List modelIds) { + return this.modelMapper.listModels(modelIds); + } + + @Override + public int hasDefaultModel(String userId) { + return this.userModelMapper.hasDefaultModel(userId) ? 0 : 1; + } + + @Override + public void insertModel(ModelPo modelPo) { + this.modelMapper.insertModel(modelPo); + } + + @Override + public void insertUserModel(UserModelPo userModelPo) { + this.userModelMapper.insertUserModel(userModelPo); + } + + @Override + public void deleteByModelId(String modelId) { + this.userModelMapper.deleteByModelId(modelId); + this.modelMapper.deleteByModelId(modelId); + } + + @Override + public int switchDefaultForUser(String userId, String modelId) { + return this.userModelMapper.switchDefaultForUser(userId, modelId); + } + + @Override + public ModelPo getModel(String modelId) { + return this.modelMapper.getModel(modelId); } } diff --git a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/service/impl/CustomAippModelCenter.java b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/service/impl/CustomAippModelCenter.java index f418b501a0..0a7e49bc1a 100644 --- a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/service/impl/CustomAippModelCenter.java +++ b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/service/impl/CustomAippModelCenter.java @@ -4,7 +4,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ - package modelengine.fit.jade.aipp.model.service.impl; import modelengine.fit.jade.aipp.model.dto.ModelAccessInfo; @@ -51,7 +50,7 @@ public CustomAippModelCenter(UserModelRepo userModelRepo, @Override public ModelListDto fetchModelList(String type, String scene, OperationContext context) { LOG.info("[Custom][fetchModelList] operator={}, type={}, scene={}.", context.getOperator(), type, scene); - List modelList = this.userModelRepo.get(context.getOperator()); + List modelList = this.userModelRepo.getModelList(context.getOperator()); if (CollectionUtils.isEmpty(modelList)) { return this.defaultModelCenter.fetchModelList(type, scene, context); } diff --git a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/repository/impl/UserModelPluginRepoImpl.java b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/service/impl/UserModelConfigService.java similarity index 53% rename from app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/repository/impl/UserModelPluginRepoImpl.java rename to app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/service/impl/UserModelConfigService.java index fd7bd2c6c7..a7e10ff0a8 100644 --- a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/repository/impl/UserModelPluginRepoImpl.java +++ b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/service/impl/UserModelConfigService.java @@ -1,12 +1,17 @@ -package modelengine.fit.jade.aipp.model.repository.impl; +/*--------------------------------------------------------------------------------------------- + * Copyright (c) 2025 Huawei Technologies Co., Ltd. All rights reserved. + * This file is a part of the ModelEngine Project. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +package modelengine.fit.jade.aipp.model.service.impl; + +import modelengine.fit.jade.aipp.model.dto.UserModelDetailDto; -import modelengine.fit.jade.aipp.model.mapper.ModelMapper; -import modelengine.fit.jade.aipp.model.mapper.UserModelMapper; import modelengine.fit.jade.aipp.model.po.ModelPo; -import modelengine.fit.jade.aipp.model.po.UserModelDetailPo; import modelengine.fit.jade.aipp.model.po.UserModelPo; -import modelengine.fit.jade.aipp.model.repository.UserModelPluginRepo; import modelengine.fit.jade.aipp.model.repository.UserModelRepo; +import modelengine.fit.jade.aipp.model.service.UserModelConfig; import modelengine.fitframework.annotation.Component; import modelengine.fitframework.annotation.Fitable; import modelengine.fitframework.annotation.Property; @@ -16,34 +21,30 @@ import modelengine.jade.carver.tool.annotation.Group; import modelengine.jade.carver.tool.annotation.ToolMethod; -import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; /** - * 表示用户模型信息用于插件的持久化层的接口 {@link UserModelRepo} 的实现。 + * 表示用户模型信息用于插件的持久化层的接口的实现。 * - * @author lizhichao - * @since 2025/4/9 + * @author 李智超 + * @since 2025-04-09 */ @Component -@Group(name = "User_Model_Tool_Impl") -public class UserModelPluginRepoImpl implements UserModelPluginRepo { - private static final Logger log = Logger.get(UserModelRepoImpl.class); - private static final String FITABLE_ID = "aipp.model.repository"; +@Group(name = "User_Model_Config_Service") +public class UserModelConfigService implements UserModelConfig { + private static final Logger log = Logger.get(UserModelConfig.class); + private static final String FITABLE_ID = "aipp.model.service.impl"; public static final String DEFAULT_MODEL_TYPE = "chat_completions"; - private final ModelMapper modelMapper; - private final UserModelMapper userModelMapper; + private final UserModelRepo userModelRepo; /** * 构造方法。 * - * @param modelMapper 表示模型信息表的 MyBatis 映射接口 {@link ModelMapper},用于处理模型的增删查改操作。 - * @param userModelMapper 表示用户与模型绑定关系的 MyBatis 映射接口 {@link UserModelMapper},用于管理用户模型映射数据。 + * @param userModelRepo 用于访问用户模型数据的仓库接口实例。 */ - public UserModelPluginRepoImpl(ModelMapper modelMapper, UserModelMapper userModelMapper) { - this.modelMapper = modelMapper; - this.userModelMapper = userModelMapper; + public UserModelConfigService(UserModelRepo userModelRepo) { + this.userModelRepo = userModelRepo; } @Override @@ -52,34 +53,33 @@ public UserModelPluginRepoImpl(ModelMapper modelMapper, UserModelMapper userMode @Attribute(key = "tags", value = "FIT"), @Attribute(key = "tags", value = "MODEL") }) @Property(description = "返回该用户可用的模型列表") - public List getUserModelList(String userId) { + public List getUserModelList(String userId) { log.info("start get model list for {}.", userId); - List userModelPos = this.userModelMapper.listUserModels(userId); + List userModelPos = this.userModelRepo.listUserModels(userId); if (CollectionUtils.isEmpty(userModelPos)) { log.warn("No user model records found for userId={}.", userId); return Collections.emptyList(); } - List modelIds = userModelPos.stream() - .map(UserModelPo::getModelId) - .distinct() - .collect(Collectors.toList()); - List modelPos = this.modelMapper.listModels(modelIds); + + List modelIds = + userModelPos.stream().map(UserModelPo::getModelId).distinct().collect(Collectors.toList()); + List modelPos = this.userModelRepo.listModels(modelIds); + // 构建 modelId → ModelPo 映射 Map modelMap = modelPos.stream() .map(model -> Map.entry(model.getModelId(), model)) - .collect(Collectors.toMap( - Map.Entry::getKey, - Map.Entry::getValue, - (a, b) -> a - )); + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (a, b) -> a)); + return userModelPos.stream().map(userModel -> { ModelPo model = modelMap.get(userModel.getModelId()); - return new UserModelDetailPo(userModel.getCreatedAt(), - userModel.getModelId(), - userModel.getUserId(), - model != null ? model.getName() : null, - model != null ? model.getBaseUrl() : null, - userModel.getIsDefault()); + return UserModelDetailDto.builder() + .createdAt(userModel.getCreatedAt()) + .modelId(userModel.getModelId()) + .userId(userModel.getUserId()) + .modelName(model != null ? model.getName() : null) + .baseUrl(model != null ? model.getBaseUrl() : null) + .isDefault(userModel.getIsDefault()) + .build(); }).collect(Collectors.toList()); } @@ -92,17 +92,28 @@ public List getUserModelList(String userId) { public String addUserModel(String userId, String apiKey, String modelName, String baseUrl) { log.info("start add user model for {}.", userId); String modelId = UUID.randomUUID().toString().replace("-", ""); - int isDefault = this.userModelMapper.userHasDefaultModel(userId) ? 0 : 1; + int isDefault = this.userModelRepo.hasDefaultModel(userId); - ModelPo modelPo = new ModelPo(modelId, modelName, modelId, baseUrl, DEFAULT_MODEL_TYPE); - modelPo.setCreatedBy(userId); - modelPo.setUpdatedBy(userId); - this.modelMapper.insertModel(modelPo); + ModelPo modelPo = ModelPo.builder() + .modelId(modelId) + .name(modelName) + .tag(modelId) + .baseUrl(baseUrl) + .type(DEFAULT_MODEL_TYPE) + .createdBy(userId) + .updatedBy(userId) + .build(); + this.userModelRepo.insertModel(modelPo); - UserModelPo userModelPo = new UserModelPo(LocalDateTime.now(), userId, modelId, apiKey, isDefault); - userModelPo.setCreatedBy(userId); - userModelPo.setUpdatedBy(userId); - this.userModelMapper.addUserModel(userModelPo); + UserModelPo userModelPo = UserModelPo.builder() + .userId(userId) + .modelId(modelId) + .apiKey(apiKey) + .isDefault(isDefault) + .createdBy(userId) + .updatedBy(userId) + .build(); + this.userModelRepo.insertUserModel(userModelPo); return "添加模型成功。"; } @@ -114,8 +125,8 @@ public String addUserModel(String userId, String apiKey, String modelName, Strin @Property(description = "删除用户绑定的模型信息") public String deleteUserModel(String userId, String modelId) { log.info("start delete user model for {}.", userId); - List userModels = this.userModelMapper.listUserModels(userId); - if (userModels == null || userModels.isEmpty()) { + List userModels = this.userModelRepo.listUserModels(userId); + if (CollectionUtils.isEmpty(userModels)) { return "删除模型失败,当前用户没有任何模型记录。"; } @@ -126,21 +137,24 @@ public String deleteUserModel(String userId, String modelId) { if (target == null) { return "删除模型失败,该模型不属于当前用户。"; } - this.userModelMapper.deleteByModelId(modelId); - this.modelMapper.deleteByModelId(modelId); + this.userModelRepo.deleteByModelId(modelId); // 如果删除的不是默认模型,直接返回 if (target.getIsDefault() != 1) { return "删除模型成功。"; } userModels.remove(target); // 如果没有默认模型,但还有其他记录,则设置最新创建的为默认 - if (!userModels.isEmpty()) { - UserModelPo latest = userModels.stream() + if (CollectionUtils.isNotEmpty(userModels)) { + UserModelPo latestUserModel = userModels.stream() + .filter(m -> m.getCreatedAt() != null) .max(Comparator.comparing(UserModelPo::getCreatedAt)) .orElse(null); - this.userModelMapper.switchDefaultForUser(userId, latest.getModelId()); - return String.format("删除默认模型成功,添加%s为默认模型。", - this.modelMapper.get(latest.getModelId()).getName()); + + if (latestUserModel != null) { + this.userModelRepo.switchDefaultForUser(userId, latestUserModel.getModelId()); + return String.format("删除默认模型成功,已将%s设为默认模型。", + this.userModelRepo.getModel(latestUserModel.getModelId()).getName()); + } } return "删除模型成功,当前无默认模型。"; } @@ -153,10 +167,10 @@ public String deleteUserModel(String userId, String modelId) { @Property(description = "将指定模型设置为用户的默认模型") public String switchDefaultModel(String userId, String modelId) { log.info("start switch default model for {}.", userId); - int rows = this.userModelMapper.switchDefaultForUser(userId, modelId); + int rows = this.userModelRepo.switchDefaultForUser(userId, modelId); if (rows == 0) { return "未查到对应模型。"; } - return String.format("已切换%s为默认模型。", this.modelMapper.get(modelId).getName()); + return String.format("已切换%s为默认模型。", this.userModelRepo.getModel(modelId).getName()); } -} +} \ No newline at end of file diff --git a/app-builder/plugins/aipp-custom-model-center/src/main/resources/mapper/ModelMapper.xml b/app-builder/plugins/aipp-custom-model-center/src/main/resources/mapper/ModelMapper.xml index 7100793873..f492df2bc4 100644 --- a/app-builder/plugins/aipp-custom-model-center/src/main/resources/mapper/ModelMapper.xml +++ b/app-builder/plugins/aipp-custom-model-center/src/main/resources/mapper/ModelMapper.xml @@ -14,17 +14,17 @@ model_id, name, tag, base_url, type - + SELECT - from t_app_engine_model - where model_id = #{modelId} + FROM t_app_engine_model + WHERE model_id = #{modelId} - select + SELECT - from t_app_engine_user_model - where user_id = #{userId} + FROM t_app_engine_user_model + WHERE user_id = #{userId} - SELECT EXISTS ( SELECT 1 FROM t_app_engine_user_model @@ -38,7 +38,7 @@ ) - + INSERT INTO t_app_engine_user_model (user_id, model_id, api_key, is_default, created_by, updated_by) VALUES (#{userId}, #{modelId}, #{apiKey}, #{isDefault}, #{createdBy}, #{updatedBy}) diff --git a/app-builder/plugins/aipp-custom-model-center/src/test/java/modelengine/fit/jade/aipp/model/service/impl/CustomAippModelCenterTest.java b/app-builder/plugins/aipp-custom-model-center/src/test/java/modelengine/fit/jade/aipp/model/service/impl/CustomAippModelCenterTest.java index 99777c2c7d..0f228e950e 100644 --- a/app-builder/plugins/aipp-custom-model-center/src/test/java/modelengine/fit/jade/aipp/model/service/impl/CustomAippModelCenterTest.java +++ b/app-builder/plugins/aipp-custom-model-center/src/test/java/modelengine/fit/jade/aipp/model/service/impl/CustomAippModelCenterTest.java @@ -42,8 +42,14 @@ void setUp() { @Test void shouldGetResultWhenFetchModelListGivenUserModelRepoHasData() { String userId = "user1"; - ModelPo modelPo = new ModelPo("id", "gpt", "tag1", "http://xxx", "type"); - Mockito.when(this.userModelRepo.get(userId)).thenReturn(Collections.singletonList(modelPo)); + ModelPo modelPo = ModelPo.builder() + .modelId("id") + .name("gpt") + .baseUrl("http://xxx") + .type("type") + .tag("tag1") + .build(); + Mockito.when(this.userModelRepo.getModelList(userId)).thenReturn(Collections.singletonList(modelPo)); OperationContext context = new OperationContext(); context.setOperator(userId); @@ -64,9 +70,15 @@ void shouldGetDefaultWhenFetchModelListGivenUserModelRepoNoData() { String userId = "user1"; String type = "type"; String scene = "scene"; - ModelPo modelPo = new ModelPo("id", "gpt", "tag1", "http://xxx", type); + ModelPo modelPo = ModelPo.builder() + .modelId("id") + .name("gpt") + .baseUrl("http://xxx") + .type(type) + .tag("tag1") + .build(); ModelAccessInfo model1 = ModelAccessInfo.builder().serviceName("gpt").baseUrl("").tag("").build(); - Mockito.when(this.userModelRepo.get(userId)).thenReturn(Collections.emptyList()); + Mockito.when(this.userModelRepo.getModelList(userId)).thenReturn(Collections.emptyList()); ModelListDto expectModelList = ModelListDto.builder() .models(Collections.singletonList(model1)) .total(1) @@ -85,7 +97,13 @@ void shouldGetDefaultWhenFetchModelListGivenUserModelRepoNoData() { @Test void shouldGetResultWhenGetModelAccessInfoGivenUserModelRepoHasData() { String userId = "user1"; - ModelPo modelPo = new ModelPo("id", "gpt", "tag1", "http://xxx", "type"); + ModelPo modelPo = ModelPo.builder() + .modelId("id") + .name("gpt") + .baseUrl("http://xxx") + .type("type") + .tag("tag1") + .build(); ModelAccessPo modelAccessPo = ModelAccessPo.builder().modelPO(modelPo).apiKey("key").build(); Mockito.when(this.userModelRepo.getModelAccessInfo(userId, modelPo.getTag(), modelPo.getName())) .thenReturn(modelAccessPo); @@ -108,7 +126,13 @@ void shouldGetResultWhenGetModelAccessInfoGivenUserModelRepoHasData() { void shouldGetDefaultWhenGetModelAccessInfoGivenUserModelRepoNoData() { String userId = "user1"; String type = "type"; - ModelPo modelPo = new ModelPo("id", "gpt", "tag1", "http://xxx", type); + ModelPo modelPo = ModelPo.builder() + .modelId("id") + .name("gpt") + .baseUrl("http://xxx") + .type(type) + .tag("tag1") + .build(); ModelAccessInfo expectModel = ModelAccessInfo.builder().serviceName("gpt").baseUrl("").tag("").build(); OperationContext context = new OperationContext(); context.setOperator(userId); @@ -126,7 +150,13 @@ void shouldGetDefaultWhenGetModelAccessInfoGivenUserModelRepoNoData() { @Test void shouldGetResultWhenGetDefaultModelGivenUserModelRepoHasData() { String userId = "user1"; - ModelPo modelPo = new ModelPo("id", "gpt", "tag1", "http://xxx", "type"); + ModelPo modelPo = ModelPo.builder() + .modelId("id") + .name("gpt") + .baseUrl("http://xxx") + .type("type") + .tag("tag1") + .build(); Mockito.when(this.userModelRepo.getDefaultModel(userId)).thenReturn(modelPo); OperationContext context = new OperationContext(); context.setOperator(userId); @@ -144,7 +174,13 @@ void shouldGetResultWhenGetDefaultModelGivenUserModelRepoHasData() { void shouldGetDefaultWhenGetDefaultModelGivenUserModelRepoNoData() { String userId = "user1"; String type = "type"; - ModelPo modelPo = new ModelPo("id", "gpt", "tag1", "http://xxx", type); + ModelPo modelPo = ModelPo.builder() + .modelId("id") + .name("gpt") + .baseUrl("http://xxx") + .type(type) + .tag("tag1") + .build(); ModelAccessInfo expectModel = ModelAccessInfo.builder().serviceName("gpt").baseUrl("").tag("").build(); OperationContext context = new OperationContext(); context.setOperator(userId); diff --git a/app-builder/plugins/aipp-custom-model-center/src/test/java/modelengine/fit/jade/aipp/model/service/impl/UserModelConfigServiceTest.java b/app-builder/plugins/aipp-custom-model-center/src/test/java/modelengine/fit/jade/aipp/model/service/impl/UserModelConfigServiceTest.java new file mode 100644 index 0000000000..64fc718de8 --- /dev/null +++ b/app-builder/plugins/aipp-custom-model-center/src/test/java/modelengine/fit/jade/aipp/model/service/impl/UserModelConfigServiceTest.java @@ -0,0 +1,113 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) 2025 Huawei Technologies Co., Ltd. All rights reserved. + * This file is a part of the ModelEngine Project. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +package modelengine.fit.jade.aipp.model.service.impl; + +import modelengine.fit.jade.aipp.model.dto.UserModelDetailDto; +import modelengine.fit.jade.aipp.model.po.ModelPo; +import modelengine.fit.jade.aipp.model.po.UserModelPo; +import modelengine.fit.jade.aipp.model.repository.UserModelRepo; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.ArgumentMatchers; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.time.LocalDateTime; +import java.util.*; + +import static org.junit.jupiter.api.Assertions.*; + +@ExtendWith(MockitoExtension.class) +class UserModelConfigServiceTest { + + private UserModelConfigService userModelConfigService; + + @Mock + private UserModelRepo userModelRepo; + + @BeforeEach + void setUp() { + this.userModelConfigService = new UserModelConfigService(userModelRepo); + } + + @Test + void shouldReturnUserModelListWhenUserHasModels() { + String userId = "user1"; + String modelId = "m1"; + + UserModelPo userModelPo = UserModelPo.builder() + .userId(userId) + .modelId(modelId) + .isDefault(1) + .createdAt(LocalDateTime.now()) + .build(); + + ModelPo modelPo = ModelPo.builder() + .modelId(modelId) + .name("gpt") + .baseUrl("http://xxx") + .build(); + + Mockito.when(userModelRepo.listUserModels(userId)) + .thenReturn(Collections.singletonList(userModelPo)); + Mockito.when(userModelRepo.listModels(Collections.singletonList(modelId))) + .thenReturn(Collections.singletonList(modelPo)); + + List result = userModelConfigService.getUserModelList(userId); + assertEquals(1, result.size()); + assertEquals("gpt", result.get(0).getModelName()); + } + + @Test + void shouldAddUserModelSuccessfully() { + String userId = "user1"; + String apiKey = "key"; + String modelName = "gpt"; + String baseUrl = "http://xxx"; + + Mockito.when(userModelRepo.hasDefaultModel(userId)).thenReturn(1); + + String result = userModelConfigService.addUserModel(userId, apiKey, modelName, baseUrl); + assertEquals("添加模型成功。", result); + Mockito.verify(userModelRepo, Mockito.times(1)).insertModel(ArgumentMatchers.any(ModelPo.class)); + Mockito.verify(userModelRepo, Mockito.times(1)).insertUserModel(ArgumentMatchers.any(UserModelPo.class)); + } + + @Test + void shouldDeleteModelWhenItIsNotDefault() { + String userId = "user1"; + String modelId = "m1"; + + UserModelPo userModelPo = UserModelPo.builder() + .userId(userId) + .modelId(modelId) + .isDefault(0) + .createdAt(LocalDateTime.now()) + .build(); + + Mockito.when(userModelRepo.listUserModels(userId)).thenReturn(Collections.singletonList(userModelPo)); + + String result = userModelConfigService.deleteUserModel(userId, modelId); + assertEquals("删除模型成功。", result); + Mockito.verify(userModelRepo).deleteByModelId(modelId); + } + + @Test + void shouldSwitchDefaultModel() { + String userId = "user1"; + String modelId = "m1"; + + Mockito.when(userModelRepo.switchDefaultForUser(userId, modelId)).thenReturn(1); + Mockito.when(userModelRepo.getModel(modelId)) + .thenReturn(ModelPo.builder().name("gpt").build()); + + String result = userModelConfigService.switchDefaultModel(userId, modelId); + assertEquals("已切换gpt为默认模型。", result); + } +} diff --git a/app-builder/services/aipp-model-center/pom.xml b/app-builder/services/aipp-model-center/pom.xml index a3e56bb3af..9cf6f6ea60 100644 --- a/app-builder/services/aipp-model-center/pom.xml +++ b/app-builder/services/aipp-model-center/pom.xml @@ -21,5 +21,13 @@ modelengine.fit.jane jane-common + + org.fitframework + fit-api + + + modelengine.fit.jade.service + tool-service + \ No newline at end of file diff --git a/app-builder/services/aipp-model-center/src/main/java/modelengine/fit/jade/aipp/model/dto/UserModelDetailDto.java b/app-builder/services/aipp-model-center/src/main/java/modelengine/fit/jade/aipp/model/dto/UserModelDetailDto.java new file mode 100644 index 0000000000..db37946ad5 --- /dev/null +++ b/app-builder/services/aipp-model-center/src/main/java/modelengine/fit/jade/aipp/model/dto/UserModelDetailDto.java @@ -0,0 +1,56 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) 2025 Huawei Technologies Co., Ltd. All rights reserved. + * This file is a part of the ModelEngine Project. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +package modelengine.fit.jade.aipp.model.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +/** + * 服务上用户模型列表的传输类。 + * + * @author 李智超 + * @since 2025-04-15 + */ +@Builder +@Data +@AllArgsConstructor +@NoArgsConstructor +public class UserModelDetailDto { + /** + * 表示创建时间。 + */ + private LocalDateTime createdAt; + + /** + * 表示模型标识。 + */ + private String modelId; + + /** + * 表示用户标识。 + */ + private String userId; + + /** + * 表示模型名称。 + */ + private String modelName; + + /** + * 表示模型访问地址。 + */ + private String baseUrl; + + /** + * 表示是否为默认模型(1表示默认,0表示非默认)。 + */ + private int isDefault; +} diff --git a/app-builder/services/aipp-model-center/src/main/java/modelengine/fit/jade/aipp/model/service/UserModelConfig.java b/app-builder/services/aipp-model-center/src/main/java/modelengine/fit/jade/aipp/model/service/UserModelConfig.java new file mode 100644 index 0000000000..4b12e374fc --- /dev/null +++ b/app-builder/services/aipp-model-center/src/main/java/modelengine/fit/jade/aipp/model/service/UserModelConfig.java @@ -0,0 +1,75 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) 2025 Huawei Technologies Co., Ltd. All rights reserved. + * This file is a part of the ModelEngine Project. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +package modelengine.fit.jade.aipp.model.service; + +import modelengine.fit.jade.aipp.model.dto.UserModelDetailDto; +import modelengine.fitframework.annotation.Genericable; +import modelengine.fitframework.annotation.Property; +import modelengine.jade.carver.tool.annotation.Group; +import modelengine.jade.carver.tool.annotation.ToolMethod; + +import java.util.List; + +/** + * 表示用户模型配置信息用于插件的持久化层的接口。 + * + * @author 李智超 + * @since 2025-04-09 + */ +@Group(name = "User_Model_Config") +public interface UserModelConfig { + /** + * 根据用户标识来查询该用户可用的用户模型列表。 + * + * @param userId 表示用户标识的 {@link String}。 + * @return 表示该用户可用的用户模型列表的 {@link List}{@code <}{@link UserModelDetailDto}{@code >}。 + */ + @ToolMethod(name = "get_user_model_list", description = "根据用户标识来查询该用户可用的用戶模型列表") + @Genericable(id = "modelengine.fit.jade.aipp.model.service.getUserModelList") + List getUserModelList(@Property(description = "用户id", required = true) String userId); + + /** + * 为用户添加模型。 + *

插入模型名称、访问地址与密钥等信息,并与指定用户进行绑定。

+ * + * @param userId 表示用户标识的 {@link String}。 + * @param apiKey 表示该用户访问模型所需的 API Key 的 {@link String}。 + * @param modelName 表示模型名称的 {@link String}。 + * @param baseUrl 表示模型访问的地址的 {@link String}。 + * @return 添加结果提示信息的 {@link String}。 + */ + @ToolMethod(name = "add_user_model", description = "为用户添加可用的模型信息") + @Genericable(id = "modelengine.fit.jade.aipp.model.service.addUserModel") + String addUserModel(@Property(description = "用户id", required = true) String userId, + @Property(description = "模型访问的 API Key", required = true) String apiKey, + @Property(description = "模型名称", required = true) String modelName, + @Property(description = "模型访问地址", required = true) String baseUrl); + + /** + * 删除用户绑定的模型信息。 + * + * @param userId 表示用户标识的 {@link String}。 + * @param modelId 表示待删除的模型标识的 {@link String}。 + * @return 删除结果提示信息的 {@link String}。 + */ + @ToolMethod(name = "delete_user_model", description = "删除用户绑定的模型信息") + @Genericable(id = "modelengine.fit.jade.aipp.model.service.deleteUserModel") + String deleteUserModel(@Property(description = "用户id", required = true) String userId, + @Property(description = "模型id", required = true) String modelId); + + /** + * 将指定模型设置为该用户的默认模型。 + * + * @param userId 表示用户标识的 {@link String}。 + * @param modelId 表示要设为默认的模型标识的 {@link String}。 + * @return 切换默认模型的提示信息的 {@link String}。 + */ + @ToolMethod(name = "switch_default_model", description = "将指定模型设置为用户的默认模型") + @Genericable(id = "modelengine.fit.jade.aipp.model.service.switchDefaultModel") + String switchDefaultModel(@Property(description = "用户id", required = true) String userId, + @Property(description = "默认模型id", required = true) String modelId); +} From 10f9128b17b18f6c44aae26e9051228c2685a6b0 Mon Sep 17 00:00:00 2001 From: lizhichao51 Date: Wed, 16 Apr 2025 19:49:38 +0800 Subject: [PATCH 4/8] =?UTF-8?q?[app-builder]=20=E4=BF=AE=E6=94=B9=E6=A3=80?= =?UTF-8?q?=E8=A7=86=E6=84=8F=E8=A7=81,=E4=B8=BA=E6=A8=A1=E5=9E=8B?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E7=9A=84=E5=A2=9E=E5=88=A0=E6=94=B9=E6=9F=A5?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E6=B7=BB=E5=8A=A0=E4=BA=86=E5=8D=95=E5=85=83?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=EF=BC=8C=E7=A1=AE=E4=BF=9D=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E7=9A=84=E7=A8=B3=E5=AE=9A=E6=80=A7=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugins/aipp-custom-model-center/pom.xml | 4 - .../jade/aipp/model/mapper/ModelMapper.java | 6 +- .../aipp/model/mapper/UserModelMapper.java | 6 +- .../fit/jade/aipp/model/po/ModelPo.java | 92 +++++++++++++++--- .../jade/aipp/model/po/UserModelDetailPo.java | 95 ++++++++++++++++--- .../fit/jade/aipp/model/po/UserModelPo.java | 86 ++++++++++++++--- .../aipp/model/repository/UserModelRepo.java | 40 ++++---- .../repository/impl/UserModelRepoImpl.java | 4 +- .../service/impl/UserModelConfigService.java | 13 ++- .../impl/UserModelConfigServiceTest.java | 41 ++++---- 10 files changed, 299 insertions(+), 88 deletions(-) diff --git a/app-builder/plugins/aipp-custom-model-center/pom.xml b/app-builder/plugins/aipp-custom-model-center/pom.xml index b8635cf714..b2273aa1eb 100644 --- a/app-builder/plugins/aipp-custom-model-center/pom.xml +++ b/app-builder/plugins/aipp-custom-model-center/pom.xml @@ -48,10 +48,6 @@ modelengine.fit.jade.service tool-service - - com.fasterxml.jackson.core - jackson-annotations - diff --git a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/mapper/ModelMapper.java b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/mapper/ModelMapper.java index 39bb25b68a..7a0f3666db 100644 --- a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/mapper/ModelMapper.java +++ b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/mapper/ModelMapper.java @@ -23,7 +23,7 @@ public interface ModelMapper { /** * 根据模型标识查询模型信息。 * - * @param modelId 表示模型标识。 + * @param modelId 表示模型标识的 {@link String}。 * @return 模型信息的 {@link ModelPo}。 */ ModelPo getModel(String modelId); @@ -31,8 +31,8 @@ public interface ModelMapper { /** * 根据模型标识列表批量查询模型信息。 * - * @param modelIds 表示模型标识列表。 - * @return 模型信息列表的 {@link List}{@code <}{@link ModelPo}{@code >}. + * @param modelIds 表示模型标识列表的 {@link List}{@code <}{@link String}{@code >}。 + * @return 模型信息列表的 {@link List}{@code <}{@link ModelPo}{@code >}。 */ List listModels(List modelIds); diff --git a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/mapper/UserModelMapper.java b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/mapper/UserModelMapper.java index eb57982fde..8e4ddaffd5 100644 --- a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/mapper/UserModelMapper.java +++ b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/mapper/UserModelMapper.java @@ -24,15 +24,15 @@ public interface UserModelMapper { /** * 根据用户标识获取用户模型关系列表。 * - * @param userId 表示用户标识。 - * @return 用户模型关系列表的 {@link List}{@code <}{@link UserModelPo}{@code >}. + * @param userId 表示用户标识的 {@link String}。 + * @return 用户模型关系列表的 {@link List}{@code <}{@link UserModelPo}{@code >}。 */ List listUserModels(String userId); /** * 根据用户标识获取默认用户模型关系。 * - * @param userId 表示用户标识。 + * @param userId 表示用户标识的 {@link String}。 * @return 默认的用户模型关系的 {@link UserModelPo}。 */ UserModelPo getDefault(String userId); diff --git a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/po/ModelPo.java b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/po/ModelPo.java index 285e0cf042..096a0d66c1 100644 --- a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/po/ModelPo.java +++ b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/po/ModelPo.java @@ -31,61 +31,131 @@ public class ModelPo extends BasePo { public static class Builder { private final ModelPo instance = new ModelPo(); + /** + * 设置模型标识符。 + * + * @param modelId 表示模型唯一标识的 {@link String}。 + * @return {@link Builder} 构建器本身。 + */ public Builder modelId(String modelId) { - instance.setModelId(modelId); + this.instance.setModelId(modelId); return this; } + /** + * 设置模型名称。 + * + * @param name 表示模型名称的 {@link String}。 + * @return {@link Builder} 构建器本身。 + */ public Builder name(String name) { - instance.setName(name); + this.instance.setName(name); return this; } + /** + * 设置模型标签。 + * + * @param tag 表示模型所属标签的 {@link String}。 + * @return {@link Builder} 构建器本身。 + */ public Builder tag(String tag) { - instance.setTag(tag); + this.instance.setTag(tag); return this; } + /** + * 设置模型基础地址。 + * + * @param baseUrl 表示模型服务访问基础地址的 {@link String}。 + * @return {@link Builder} 构建器本身。 + */ public Builder baseUrl(String baseUrl) { - instance.setBaseUrl(baseUrl); + this.instance.setBaseUrl(baseUrl); return this; } + /** + * 设置模型类型。 + * + * @param type 表示模型类型的 {@link String}。 + * @return {@link Builder} 构建器本身。 + */ public Builder type(String type) { - instance.setType(type); + this.instance.setType(type); return this; } + /** + * 设置数据库主键标识。 + * + * @param id 表示模型数据的唯一数据库主键的 {@link Long}。 + * @return {@link Builder} 构建器本身。 + */ public Builder id(Long id) { - instance.setId(id); + this.instance.setId(id); return this; } + /** + * 设置创建时间。 + * + * @param createdAt 表示模型创建时间的 {@link LocalDateTime}。 + * @return {@link Builder} 构建器本身。 + */ public Builder createdAt(LocalDateTime createdAt) { - instance.setCreatedAt(createdAt); + this.instance.setCreatedAt(createdAt); return this; } + /** + * 设置更新时间。 + * + * @param updatedAt 表示模型最近更新时间的 {@link LocalDateTime}。 + * @return {@link Builder} 构建器本身。 + */ public Builder updatedAt(LocalDateTime updatedAt) { - instance.setUpdatedAt(updatedAt); + this.instance.setUpdatedAt(updatedAt); return this; } + /** + * 设置创建人标识。 + * + * @param createdBy 表示创建该模型记录的用户标识的 {@link String}。 + * @return {@link Builder} 构建器本身。 + */ public Builder createdBy(String createdBy) { - instance.setCreatedBy(createdBy); + this.instance.setCreatedBy(createdBy); return this; } + /** + * 设置更新人标识。 + * + * @param updatedBy 表示最近更新该模型记录的用户标识的 {@link String}。 + * @return {@link Builder} 构建器本身。 + */ public Builder updatedBy(String updatedBy) { - instance.setUpdatedBy(updatedBy); + this.instance.setUpdatedBy(updatedBy); return this; } + /** + * 构建并返回 {@link ModelPo} 实例。 + * + * @return 构建完成的 {@link ModelPo} 实例。 + */ public ModelPo build() { - return instance; + return this.instance; } } + /** + * 创建并返回一个新的 {@link Builder} 构建器实例。 + * + * @return {@link Builder} 实例,用于构建 {@link ModelPo}。 + */ public static Builder builder() { return new Builder(); } diff --git a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/po/UserModelDetailPo.java b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/po/UserModelDetailPo.java index 28ef8a4748..4c55bfebdb 100644 --- a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/po/UserModelDetailPo.java +++ b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/po/UserModelDetailPo.java @@ -7,7 +7,6 @@ package modelengine.fit.jade.aipp.model.po; import lombok.Data; - import modelengine.jade.common.po.BasePo; import java.time.LocalDateTime; @@ -41,7 +40,7 @@ public class UserModelDetailPo extends BasePo { private String baseUrl; /** - * 表示是否为默认模型(1表示默认,0表示非默认)。 + * 表示是否为默认模型(1 表示默认,0 表示非默认)。 */ private int isDefault; @@ -51,61 +50,131 @@ public class UserModelDetailPo extends BasePo { public static class Builder { private final UserModelDetailPo instance = new UserModelDetailPo(); + /** + * 设置数据库主键标识。 + * + * @param id 表示用户模型记录的唯一数据库主键的 {@link Long}。 + * @return {@link Builder} 构建器本身。 + */ public Builder id(Long id) { - instance.setId(id); + this.instance.setId(id); return this; } + /** + * 设置创建时间。 + * + * @param createdAt 表示该用户模型记录的创建时间的 {@link LocalDateTime}。 + * @return {@link Builder} 构建器本身。 + */ public Builder createdAt(LocalDateTime createdAt) { - instance.setCreatedAt(createdAt); + this.instance.setCreatedAt(createdAt); return this; } + /** + * 设置更新时间。 + * + * @param updatedAt 表示该用户模型记录的最后更新时间的 {@link LocalDateTime}。 + * @return {@link Builder} 构建器本身。 + */ public Builder updatedAt(LocalDateTime updatedAt) { - instance.setUpdatedAt(updatedAt); + this.instance.setUpdatedAt(updatedAt); return this; } + /** + * 设置创建人标识。 + * + * @param createdBy 表示创建该用户模型记录的用户标识的 {@link String}。 + * @return {@link Builder} 构建器本身。 + */ public Builder createdBy(String createdBy) { - instance.setCreatedBy(createdBy); + this.instance.setCreatedBy(createdBy); return this; } + /** + * 设置更新人标识。 + * + * @param updatedBy 表示最近更新该用户模型记录的用户标识的 {@link String}。 + * @return {@link Builder} 构建器本身。 + */ public Builder updatedBy(String updatedBy) { - instance.setUpdatedBy(updatedBy); + this.instance.setUpdatedBy(updatedBy); return this; } + /** + * 设置模型标识。 + * + * @param modelId 表示关联的模型标识的 {@link String}。 + * @return {@link Builder} 构建器本身。 + */ public Builder modelId(String modelId) { - instance.setModelId(modelId); + this.instance.setModelId(modelId); return this; } + /** + * 设置用户标识。 + * + * @param userId 表示关联的用户标识的 {@link String}。 + * @return {@link Builder} 构建器本身。 + */ public Builder userId(String userId) { - instance.setUserId(userId); + this.instance.setUserId(userId); return this; } + /** + * 设置模型名称。 + * + * @param modelName 表示模型名称的 {@link String}。 + * @return {@link Builder} 构建器本身。 + */ public Builder modelName(String modelName) { - instance.setModelName(modelName); + this.instance.setModelName(modelName); return this; } + /** + * 设置模型访问地址。 + * + * @param baseUrl 表示模型服务访问地址的 {@link String}。 + * @return {@link Builder} 构建器本身。 + */ public Builder baseUrl(String baseUrl) { - instance.setBaseUrl(baseUrl); + this.instance.setBaseUrl(baseUrl); return this; } + /** + * 设置是否为默认模型。 + * + * @param isDefault 表示是否为默认模型的 {@code int}(1 表示默认,0 表示非默认)。 + * @return {@link Builder} 构建器本身。 + */ public Builder isDefault(int isDefault) { - instance.setIsDefault(isDefault); + this.instance.setIsDefault(isDefault); return this; } + /** + * 构建并返回 {@link UserModelDetailPo} 实例。 + * + * @return 构建完成的 {@link UserModelDetailPo} 实例。 + */ public UserModelDetailPo build() { - return instance; + return this.instance; } } + /** + * 创建并返回一个新的 {@link Builder} 构建器实例。 + * + * @return {@link Builder} 实例,用于构建 {@link UserModelDetailPo}。 + */ public static Builder builder() { return new Builder(); } diff --git a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/po/UserModelPo.java b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/po/UserModelPo.java index c7f48bf023..bfce91247a 100644 --- a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/po/UserModelPo.java +++ b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/po/UserModelPo.java @@ -30,57 +30,121 @@ public class UserModelPo extends BasePo { public static class Builder { private final UserModelPo instance = new UserModelPo(); + /** + * 设置用户标识。 + * + * @param userId 表示用户标识的 {@link String}。 + * @return {@link Builder} 构建器本身。 + */ public Builder userId(String userId) { - instance.setUserId(userId); + this.instance.setUserId(userId); return this; } + /** + * 设置模型标识。 + * + * @param modelId 表示关联的模型标识的 {@link String}。 + * @return {@link Builder} 构建器本身。 + */ public Builder modelId(String modelId) { - instance.setModelId(modelId); + this.instance.setModelId(modelId); return this; } + /** + * 设置模型访问所需的访问密钥。 + * + * @param apiKey 表示模型访问密钥的 {@link String}。 + * @return {@link Builder} 构建器本身。 + */ public Builder apiKey(String apiKey) { - instance.setApiKey(apiKey); + this.instance.setApiKey(apiKey); return this; } + /** + * 设置是否为默认模型。 + * + * @param isDefault 表示是否为默认模型的 {@code int}(1 表示默认,0 表示非默认)。 + * @return {@link Builder} 构建器本身。 + */ public Builder isDefault(int isDefault) { - instance.setIsDefault(isDefault); + this.instance.setIsDefault(isDefault); return this; } + /** + * 设置数据库主键 ID。 + * + * @param id 表示用户模型记录的唯一数据库主键的 {@link Long}。 + * @return {@link Builder} 构建器本身。 + */ public Builder id(Long id) { - instance.setId(id); + this.instance.setId(id); return this; } + /** + * 设置创建时间。 + * + * @param createdAt 表示用户模型记录的创建时间的 {@link LocalDateTime}。 + * @return {@link Builder} 构建器本身。 + */ public Builder createdAt(LocalDateTime createdAt) { - instance.setCreatedAt(createdAt); + this.instance.setCreatedAt(createdAt); return this; } + /** + * 设置更新时间。 + * + * @param updatedAt 表示用户模型记录的最后更新时间的 {@link LocalDateTime}。 + * @return {@link Builder} 构建器本身。 + */ public Builder updatedAt(LocalDateTime updatedAt) { - instance.setUpdatedAt(updatedAt); + this.instance.setUpdatedAt(updatedAt); return this; } + /** + * 设置创建人标识。 + * + * @param createdBy 表示创建该记录的用户标识的 {@link String}。 + * @return {@link Builder} 构建器本身。 + */ public Builder createdBy(String createdBy) { - instance.setCreatedBy(createdBy); + this.instance.setCreatedBy(createdBy); return this; } + /** + * 设置更新人标识。 + * + * @param updatedBy 表示最近更新该记录的用户标识的 {@link String}。 + * @return {@link Builder} 构建器本身。 + */ public Builder updatedBy(String updatedBy) { - instance.setUpdatedBy(updatedBy); + this.instance.setUpdatedBy(updatedBy); return this; } + /** + * 构建并返回 {@link UserModelPo} 实例。 + * + * @return 构建完成的 {@link UserModelPo} 实例。 + */ public UserModelPo build() { - return instance; + return this.instance; } } + /** + * 创建并返回一个新的 {@link Builder} 构建器实例。 + * + * @return {@link Builder} 实例,用于构建 {@link UserModelPo}。 + */ public static Builder builder() { return new Builder(); } -} +} \ No newline at end of file diff --git a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/repository/UserModelRepo.java b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/repository/UserModelRepo.java index 80fe4f5640..cf76d73e37 100644 --- a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/repository/UserModelRepo.java +++ b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/repository/UserModelRepo.java @@ -22,41 +22,41 @@ public interface UserModelRepo { /** * 根据用户标识来查询该用户可用的模型列表。 * - * @param userId 表示用户标识。 - * @return 表示该用户可用的模型列表 {@link List}{@code <}{@link ModelPo}{@code >}。 + * @param userId 表示用户标识的 {@link String}。 + * @return 该用户可用的模型列表的 {@link List}{@code <}{@link ModelPo}{@code >}。 */ List getModelList(String userId); /** * 查询特定的模型访问信息。 * - * @param userId 表示用户标识。 - * @param tag 表示模型标签。 - * @param name 表示模型名称。 - * @return 模型访问信息 {@link ModelAccessPo}。 + * @param userId 表示用户标识的 {@link String}。 + * @param tag 表示模型标签的 {@link String}。 + * @param name 表示模型名称的 {@link String}。 + * @return 模型访问信息的 {@link ModelAccessPo}。 */ ModelAccessPo getModelAccessInfo(String userId, String tag, String name); /** * 获取一个用户的默认模型。 * - * @param userId 表示用户标识。 - * @return 模型信息 {@link ModelPo}. + * @param userId 表示用户标识的 {@link String}。 + * @return 模型信息的 {@link ModelPo}。 */ ModelPo getDefaultModel(String userId); /** * 根据用户标识来查询该用户可用的用户模型列表。 * - * @param userId 表示用户标识。 - * @return 表示该用户可用的用户模型列表 {@link List}{@code <}{@link UserModelPo}{@code >}。 + * @param userId 表示用户标识的 {@link String}。 + * @return 该用户可用的用户模型列表的 {@link List}{@code <}{@link UserModelPo}{@code >}。 */ List listUserModels(String userId); /** * 根据模型标识列表批量查询模型信息。 * - * @param modelIds 表示模型标识列表。 + * @param modelIds 表示模型标识列表的 {@link List}{@code <}{@link String}{@code >}。 * @return 模型信息列表的 {@link List}{@code <}{@link ModelPo}{@code >}。 */ List listModels(List modelIds); @@ -64,37 +64,37 @@ public interface UserModelRepo { /** * 查询该用户是否存在默认模型。 * - * @param userId 表示用户标识。 - * @return 是否存在默认模型的 {@code int}。 + * @param userId 表示用户标识的 {@link String}。 + * @return 是否存在默认模型的 {@code boolean}。 */ - int hasDefaultModel(String userId); + boolean hasDefaultModel(String userId); /** * 插入一条模型信息。 * - * @param modelPo 表示要插入的模型数据。 + * @param modelPo 表示要插入的模型数据的 {@link ModelPo}。 */ void insertModel(ModelPo modelPo); /** * 插入一条用户模型关联信息。 * - * @param userModelPo 表示要插入的用户模型数据。 + * @param userModelPo 表示要插入的用户模型数据的 {@link UserModelPo}。 */ void insertUserModel(UserModelPo userModelPo); /** * 根据模型标识删除该模型的用户关联信息。 * - * @param modelId 表示模型标识。 + * @param modelId 表示模型标识的 {@link String}。 */ void deleteByModelId(String modelId); /** * 设置某个模型为该用户的默认模型。 * - * @param userId 表示用户标识。 - * @param modelId 表示要设置为默认的模型标识。 + * @param userId 表示用户标识的 {@link String}。 + * @param modelId 表示要设置为默认的模型标识的 {@link String}。 * @return 受影响的记录行数的 {@code int}。 */ int switchDefaultForUser(String userId, String modelId); @@ -102,7 +102,7 @@ public interface UserModelRepo { /** * 根据模型标识查询模型信息。 * - * @param modelId 表示模型标识。 + * @param modelId 表示模型标识的 {@link String}。 * @return 模型信息的 {@link ModelPo}。 */ ModelPo getModel(String modelId); diff --git a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/repository/impl/UserModelRepoImpl.java b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/repository/impl/UserModelRepoImpl.java index f8163a2c50..508c036d01 100644 --- a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/repository/impl/UserModelRepoImpl.java +++ b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/repository/impl/UserModelRepoImpl.java @@ -89,8 +89,8 @@ public List listModels(List modelIds) { } @Override - public int hasDefaultModel(String userId) { - return this.userModelMapper.hasDefaultModel(userId) ? 0 : 1; + public boolean hasDefaultModel(String userId) { + return this.userModelMapper.hasDefaultModel(userId); } @Override diff --git a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/service/impl/UserModelConfigService.java b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/service/impl/UserModelConfigService.java index a7e10ff0a8..4ce002252b 100644 --- a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/service/impl/UserModelConfigService.java +++ b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/service/impl/UserModelConfigService.java @@ -21,7 +21,12 @@ import modelengine.jade.carver.tool.annotation.Group; import modelengine.jade.carver.tool.annotation.ToolMethod; -import java.util.*; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.UUID; import java.util.stream.Collectors; /** @@ -41,7 +46,7 @@ public class UserModelConfigService implements UserModelConfig { /** * 构造方法。 * - * @param userModelRepo 用于访问用户模型数据的仓库接口实例。 + * @param userModelRepo 表示用于访问用户模型数据的仓储接口的 {@link UserModelRepo}。 */ public UserModelConfigService(UserModelRepo userModelRepo) { this.userModelRepo = userModelRepo; @@ -92,7 +97,7 @@ public List getUserModelList(String userId) { public String addUserModel(String userId, String apiKey, String modelName, String baseUrl) { log.info("start add user model for {}.", userId); String modelId = UUID.randomUUID().toString().replace("-", ""); - int isDefault = this.userModelRepo.hasDefaultModel(userId); + boolean hasDefault = this.userModelRepo.hasDefaultModel(userId); ModelPo modelPo = ModelPo.builder() .modelId(modelId) @@ -109,7 +114,7 @@ public String addUserModel(String userId, String apiKey, String modelName, Strin .userId(userId) .modelId(modelId) .apiKey(apiKey) - .isDefault(isDefault) + .isDefault(hasDefault ? 0 : 1) .createdBy(userId) .updatedBy(userId) .build(); diff --git a/app-builder/plugins/aipp-custom-model-center/src/test/java/modelengine/fit/jade/aipp/model/service/impl/UserModelConfigServiceTest.java b/app-builder/plugins/aipp-custom-model-center/src/test/java/modelengine/fit/jade/aipp/model/service/impl/UserModelConfigServiceTest.java index 64fc718de8..3afc8c3fba 100644 --- a/app-builder/plugins/aipp-custom-model-center/src/test/java/modelengine/fit/jade/aipp/model/service/impl/UserModelConfigServiceTest.java +++ b/app-builder/plugins/aipp-custom-model-center/src/test/java/modelengine/fit/jade/aipp/model/service/impl/UserModelConfigServiceTest.java @@ -6,11 +6,15 @@ package modelengine.fit.jade.aipp.model.service.impl; +import static org.junit.jupiter.api.Assertions.assertEquals; + import modelengine.fit.jade.aipp.model.dto.UserModelDetailDto; import modelengine.fit.jade.aipp.model.po.ModelPo; import modelengine.fit.jade.aipp.model.po.UserModelPo; import modelengine.fit.jade.aipp.model.repository.UserModelRepo; + import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.ArgumentMatchers; @@ -19,13 +23,18 @@ import org.mockito.junit.jupiter.MockitoExtension; import java.time.LocalDateTime; -import java.util.*; - -import static org.junit.jupiter.api.Assertions.*; - +import java.util.Collections; +import java.util.List; + +/** + * 表示 {@link UserModelConfigService} 的单元测试。 + * + * @author 李智超 + * @since 2025-04-016 + */ +@DisplayName("测试 UserModelConfigService") @ExtendWith(MockitoExtension.class) -class UserModelConfigServiceTest { - +public class UserModelConfigServiceTest { private UserModelConfigService userModelConfigService; @Mock @@ -37,6 +46,7 @@ void setUp() { } @Test + @DisplayName("当用户拥有模型时,返回用户模型列表") void shouldReturnUserModelListWhenUserHasModels() { String userId = "user1"; String modelId = "m1"; @@ -48,14 +58,9 @@ void shouldReturnUserModelListWhenUserHasModels() { .createdAt(LocalDateTime.now()) .build(); - ModelPo modelPo = ModelPo.builder() - .modelId(modelId) - .name("gpt") - .baseUrl("http://xxx") - .build(); + ModelPo modelPo = ModelPo.builder().modelId(modelId).name("gpt").baseUrl("http://testUrl").build(); - Mockito.when(userModelRepo.listUserModels(userId)) - .thenReturn(Collections.singletonList(userModelPo)); + Mockito.when(userModelRepo.listUserModels(userId)).thenReturn(Collections.singletonList(userModelPo)); Mockito.when(userModelRepo.listModels(Collections.singletonList(modelId))) .thenReturn(Collections.singletonList(modelPo)); @@ -65,13 +70,14 @@ void shouldReturnUserModelListWhenUserHasModels() { } @Test + @DisplayName("成功添加用户模型") void shouldAddUserModelSuccessfully() { String userId = "user1"; String apiKey = "key"; String modelName = "gpt"; - String baseUrl = "http://xxx"; + String baseUrl = "http://testUrl"; - Mockito.when(userModelRepo.hasDefaultModel(userId)).thenReturn(1); + Mockito.when(userModelRepo.hasDefaultModel(userId)).thenReturn(Boolean.TRUE); String result = userModelConfigService.addUserModel(userId, apiKey, modelName, baseUrl); assertEquals("添加模型成功。", result); @@ -80,6 +86,7 @@ void shouldAddUserModelSuccessfully() { } @Test + @DisplayName("删除非默认模型时,执行删除操作") void shouldDeleteModelWhenItIsNotDefault() { String userId = "user1"; String modelId = "m1"; @@ -99,13 +106,13 @@ void shouldDeleteModelWhenItIsNotDefault() { } @Test + @DisplayName("成功切换默认模型") void shouldSwitchDefaultModel() { String userId = "user1"; String modelId = "m1"; Mockito.when(userModelRepo.switchDefaultForUser(userId, modelId)).thenReturn(1); - Mockito.when(userModelRepo.getModel(modelId)) - .thenReturn(ModelPo.builder().name("gpt").build()); + Mockito.when(userModelRepo.getModel(modelId)).thenReturn(ModelPo.builder().name("gpt").build()); String result = userModelConfigService.switchDefaultModel(userId, modelId); assertEquals("已切换gpt为默认模型。", result); From dfbbf375f3f1e707f3d79b866bf24c8c87f9bde2 Mon Sep 17 00:00:00 2001 From: lizhichao51 Date: Wed, 16 Apr 2025 19:55:14 +0800 Subject: [PATCH 5/8] =?UTF-8?q?[app-builder]=20=E4=BF=AE=E6=94=B9=E6=A3=80?= =?UTF-8?q?=E8=A7=86=E6=84=8F=E8=A7=81=EF=BC=8C=E4=BF=AE=E5=A4=8D=E5=8D=95?= =?UTF-8?q?=E4=BE=A7=E5=86=85=E5=AE=B9=E6=97=A0=E5=AE=9E=E9=99=85=E6=84=8F?= =?UTF-8?q?=E4=B9=89=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/CustomAippModelCenterTest.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app-builder/plugins/aipp-custom-model-center/src/test/java/modelengine/fit/jade/aipp/model/service/impl/CustomAippModelCenterTest.java b/app-builder/plugins/aipp-custom-model-center/src/test/java/modelengine/fit/jade/aipp/model/service/impl/CustomAippModelCenterTest.java index 0f228e950e..61559fea8f 100644 --- a/app-builder/plugins/aipp-custom-model-center/src/test/java/modelengine/fit/jade/aipp/model/service/impl/CustomAippModelCenterTest.java +++ b/app-builder/plugins/aipp-custom-model-center/src/test/java/modelengine/fit/jade/aipp/model/service/impl/CustomAippModelCenterTest.java @@ -45,7 +45,7 @@ void shouldGetResultWhenFetchModelListGivenUserModelRepoHasData() { ModelPo modelPo = ModelPo.builder() .modelId("id") .name("gpt") - .baseUrl("http://xxx") + .baseUrl("http://testUrl") .type("type") .tag("tag1") .build(); @@ -73,7 +73,7 @@ void shouldGetDefaultWhenFetchModelListGivenUserModelRepoNoData() { ModelPo modelPo = ModelPo.builder() .modelId("id") .name("gpt") - .baseUrl("http://xxx") + .baseUrl("http://testUrl") .type(type) .tag("tag1") .build(); @@ -100,7 +100,7 @@ void shouldGetResultWhenGetModelAccessInfoGivenUserModelRepoHasData() { ModelPo modelPo = ModelPo.builder() .modelId("id") .name("gpt") - .baseUrl("http://xxx") + .baseUrl("http://testUrl") .type("type") .tag("tag1") .build(); @@ -129,7 +129,7 @@ void shouldGetDefaultWhenGetModelAccessInfoGivenUserModelRepoNoData() { ModelPo modelPo = ModelPo.builder() .modelId("id") .name("gpt") - .baseUrl("http://xxx") + .baseUrl("http://testUrl") .type(type) .tag("tag1") .build(); @@ -153,7 +153,7 @@ void shouldGetResultWhenGetDefaultModelGivenUserModelRepoHasData() { ModelPo modelPo = ModelPo.builder() .modelId("id") .name("gpt") - .baseUrl("http://xxx") + .baseUrl("http://testUrl") .type("type") .tag("tag1") .build(); @@ -177,7 +177,7 @@ void shouldGetDefaultWhenGetDefaultModelGivenUserModelRepoNoData() { ModelPo modelPo = ModelPo.builder() .modelId("id") .name("gpt") - .baseUrl("http://xxx") + .baseUrl("http://testUrl") .type(type) .tag("tag1") .build(); From 71b516ec626d40671ea1bcbc168431dd1c6ccf46 Mon Sep 17 00:00:00 2001 From: lizhichao51 Date: Wed, 16 Apr 2025 19:58:58 +0800 Subject: [PATCH 6/8] =?UTF-8?q?[app-builder]=20=E4=BF=AE=E6=94=B9=E6=A3=80?= =?UTF-8?q?=E8=A7=86=E6=84=8F=E8=A7=81,=E4=BF=AE=E6=94=B9=E6=B3=A8?= =?UTF-8?q?=E9=87=8A=E6=84=8F=E4=B9=89=E8=AF=AD=E7=97=85=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modelengine/fit/jade/aipp/model/mapper/ModelMapper.java | 2 +- .../fit/jade/aipp/model/repository/UserModelRepo.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/mapper/ModelMapper.java b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/mapper/ModelMapper.java index 7a0f3666db..326574b22f 100644 --- a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/mapper/ModelMapper.java +++ b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/mapper/ModelMapper.java @@ -46,7 +46,7 @@ public interface ModelMapper { /** * 根据模型标识删除模型信息。 * - * @param modelId 表示删除模型标识的 {@link String}。 + * @param modelId 表示待删除模型标识的 {@link String}。 */ void deleteByModelId(String modelId); } diff --git a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/repository/UserModelRepo.java b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/repository/UserModelRepo.java index cf76d73e37..e253ee950a 100644 --- a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/repository/UserModelRepo.java +++ b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/repository/UserModelRepo.java @@ -86,7 +86,7 @@ public interface UserModelRepo { /** * 根据模型标识删除该模型的用户关联信息。 * - * @param modelId 表示模型标识的 {@link String}。 + * @param modelId 表示待删除模型标识的 {@link String}。 */ void deleteByModelId(String modelId); From 8713e76eef5b2f4acf52fd6dfe2ad33cd3242ccc Mon Sep 17 00:00:00 2001 From: lizhichao51 Date: Wed, 16 Apr 2025 20:42:11 +0800 Subject: [PATCH 7/8] =?UTF-8?q?[app-builder]=20=E4=BF=AE=E6=94=B9=E6=A3=80?= =?UTF-8?q?=E8=A7=86=E6=84=8F=E8=A7=81=EF=BC=8C=E4=BF=AE=E6=94=B9=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E5=90=84=E5=AD=97=E6=AE=B5=E4=B8=BA=E6=9B=B4=E6=9C=89?= =?UTF-8?q?=E6=84=8F=E4=B9=89=E7=9A=84=E5=90=8D=E5=AD=97=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fit/jade/aipp/model/mapper/UserModelMapper.java | 2 +- .../fit/jade/aipp/model/repository/UserModelRepo.java | 2 +- .../jade/aipp/model/repository/impl/UserModelRepoImpl.java | 4 ++-- .../jade/aipp/model/service/impl/UserModelConfigService.java | 4 ++-- .../src/main/resources/mapper/UserModelMapper.xml | 2 +- .../aipp/model/service/impl/UserModelConfigServiceTest.java | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/mapper/UserModelMapper.java b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/mapper/UserModelMapper.java index 8e4ddaffd5..41c185f320 100644 --- a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/mapper/UserModelMapper.java +++ b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/mapper/UserModelMapper.java @@ -75,5 +75,5 @@ public interface UserModelMapper { * @param modelId 表示需设为默认的模型标识的 {@link String}。 * @return 成功更新的记录条数的 {@code int}。 */ - int switchDefaultForUser(@Param("userId") String userId, @Param("modelId") String modelId); + int setDefault(@Param("userId") String userId, @Param("modelId") String modelId); } diff --git a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/repository/UserModelRepo.java b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/repository/UserModelRepo.java index e253ee950a..6237e0a5cc 100644 --- a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/repository/UserModelRepo.java +++ b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/repository/UserModelRepo.java @@ -97,7 +97,7 @@ public interface UserModelRepo { * @param modelId 表示要设置为默认的模型标识的 {@link String}。 * @return 受影响的记录行数的 {@code int}。 */ - int switchDefaultForUser(String userId, String modelId); + int switchDefaultUserModel(String userId, String modelId); /** * 根据模型标识查询模型信息。 diff --git a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/repository/impl/UserModelRepoImpl.java b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/repository/impl/UserModelRepoImpl.java index 508c036d01..6a2fdb8aa4 100644 --- a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/repository/impl/UserModelRepoImpl.java +++ b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/repository/impl/UserModelRepoImpl.java @@ -110,8 +110,8 @@ public void deleteByModelId(String modelId) { } @Override - public int switchDefaultForUser(String userId, String modelId) { - return this.userModelMapper.switchDefaultForUser(userId, modelId); + public int switchDefaultUserModel(String userId, String modelId) { + return this.userModelMapper.setDefault(userId, modelId); } @Override diff --git a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/service/impl/UserModelConfigService.java b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/service/impl/UserModelConfigService.java index 4ce002252b..0c477cc295 100644 --- a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/service/impl/UserModelConfigService.java +++ b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/service/impl/UserModelConfigService.java @@ -156,7 +156,7 @@ public String deleteUserModel(String userId, String modelId) { .orElse(null); if (latestUserModel != null) { - this.userModelRepo.switchDefaultForUser(userId, latestUserModel.getModelId()); + this.userModelRepo.switchDefaultUserModel(userId, latestUserModel.getModelId()); return String.format("删除默认模型成功,已将%s设为默认模型。", this.userModelRepo.getModel(latestUserModel.getModelId()).getName()); } @@ -172,7 +172,7 @@ public String deleteUserModel(String userId, String modelId) { @Property(description = "将指定模型设置为用户的默认模型") public String switchDefaultModel(String userId, String modelId) { log.info("start switch default model for {}.", userId); - int rows = this.userModelRepo.switchDefaultForUser(userId, modelId); + int rows = this.userModelRepo.switchDefaultUserModel(userId, modelId); if (rows == 0) { return "未查到对应模型。"; } diff --git a/app-builder/plugins/aipp-custom-model-center/src/main/resources/mapper/UserModelMapper.xml b/app-builder/plugins/aipp-custom-model-center/src/main/resources/mapper/UserModelMapper.xml index 2d37ebf5d2..f154cb1baa 100644 --- a/app-builder/plugins/aipp-custom-model-center/src/main/resources/mapper/UserModelMapper.xml +++ b/app-builder/plugins/aipp-custom-model-center/src/main/resources/mapper/UserModelMapper.xml @@ -55,7 +55,7 @@ ORDER BY created_at DESC LIMIT 1 - + UPDATE t_app_engine_user_model SET is_default = CASE WHEN model_id = #{modelId} THEN 1 ELSE 0 END WHERE user_id = #{userId} diff --git a/app-builder/plugins/aipp-custom-model-center/src/test/java/modelengine/fit/jade/aipp/model/service/impl/UserModelConfigServiceTest.java b/app-builder/plugins/aipp-custom-model-center/src/test/java/modelengine/fit/jade/aipp/model/service/impl/UserModelConfigServiceTest.java index 3afc8c3fba..f5a7fb009f 100644 --- a/app-builder/plugins/aipp-custom-model-center/src/test/java/modelengine/fit/jade/aipp/model/service/impl/UserModelConfigServiceTest.java +++ b/app-builder/plugins/aipp-custom-model-center/src/test/java/modelengine/fit/jade/aipp/model/service/impl/UserModelConfigServiceTest.java @@ -111,7 +111,7 @@ void shouldSwitchDefaultModel() { String userId = "user1"; String modelId = "m1"; - Mockito.when(userModelRepo.switchDefaultForUser(userId, modelId)).thenReturn(1); + Mockito.when(userModelRepo.switchDefaultUserModel(userId, modelId)).thenReturn(1); Mockito.when(userModelRepo.getModel(modelId)).thenReturn(ModelPo.builder().name("gpt").build()); String result = userModelConfigService.switchDefaultModel(userId, modelId); From e553e44e9d5e49fa0ddaf7ca2cd2feb7cd6aaa08 Mon Sep 17 00:00:00 2001 From: lizhichao51 Date: Thu, 17 Apr 2025 11:48:14 +0800 Subject: [PATCH 8/8] =?UTF-8?q?[app-builder]=20=E4=BF=AE=E6=94=B9=E6=A3=80?= =?UTF-8?q?=E8=A7=86=E6=84=8F=E8=A7=81=EF=BC=8C=E4=BC=98=E5=8C=96=20repo?= =?UTF-8?q?=20=E5=B1=82=E4=B8=8E=20service=20=E5=B1=82=E7=9A=84=E8=81=8C?= =?UTF-8?q?=E8=B4=A3=E8=BE=B9=E7=95=8C=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fit/jade/aipp/model/repository/UserModelRepo.java | 4 ++-- .../jade/aipp/model/repository/impl/UserModelRepoImpl.java | 4 ++-- .../jade/aipp/model/service/impl/CustomAippModelCenter.java | 2 +- .../aipp/model/service/impl/UserModelConfigService.java | 6 +++--- .../aipp/model/service/impl/CustomAippModelCenterTest.java | 4 ++-- .../aipp/model/service/impl/UserModelConfigServiceTest.java | 4 ++-- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/repository/UserModelRepo.java b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/repository/UserModelRepo.java index 6237e0a5cc..80bcfd675a 100644 --- a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/repository/UserModelRepo.java +++ b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/repository/UserModelRepo.java @@ -25,7 +25,7 @@ public interface UserModelRepo { * @param userId 表示用户标识的 {@link String}。 * @return 该用户可用的模型列表的 {@link List}{@code <}{@link ModelPo}{@code >}。 */ - List getModelList(String userId); + List listModelsByUserId(String userId); /** * 查询特定的模型访问信息。 @@ -51,7 +51,7 @@ public interface UserModelRepo { * @param userId 表示用户标识的 {@link String}。 * @return 该用户可用的用户模型列表的 {@link List}{@code <}{@link UserModelPo}{@code >}。 */ - List listUserModels(String userId); + List listUserModelsByUserId(String userId); /** * 根据模型标识列表批量查询模型信息。 diff --git a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/repository/impl/UserModelRepoImpl.java b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/repository/impl/UserModelRepoImpl.java index 6a2fdb8aa4..6f79168212 100644 --- a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/repository/impl/UserModelRepoImpl.java +++ b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/repository/impl/UserModelRepoImpl.java @@ -37,7 +37,7 @@ public UserModelRepoImpl(ModelMapper modelMapper, UserModelMapper userModelMappe } @Override - public List getModelList(String userId) { + public List listModelsByUserId(String userId) { return this.getModelPos(this.userModelMapper.listUserModels(userId)); } @@ -79,7 +79,7 @@ public ModelPo getDefaultModel(String userId) { } @Override - public List listUserModels(String userId) { + public List listUserModelsByUserId(String userId) { return this.userModelMapper.listUserModels(userId); } diff --git a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/service/impl/CustomAippModelCenter.java b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/service/impl/CustomAippModelCenter.java index 0a7e49bc1a..bd47202d86 100644 --- a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/service/impl/CustomAippModelCenter.java +++ b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/service/impl/CustomAippModelCenter.java @@ -50,7 +50,7 @@ public CustomAippModelCenter(UserModelRepo userModelRepo, @Override public ModelListDto fetchModelList(String type, String scene, OperationContext context) { LOG.info("[Custom][fetchModelList] operator={}, type={}, scene={}.", context.getOperator(), type, scene); - List modelList = this.userModelRepo.getModelList(context.getOperator()); + List modelList = this.userModelRepo.listModelsByUserId(context.getOperator()); if (CollectionUtils.isEmpty(modelList)) { return this.defaultModelCenter.fetchModelList(type, scene, context); } diff --git a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/service/impl/UserModelConfigService.java b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/service/impl/UserModelConfigService.java index 0c477cc295..2f636f4326 100644 --- a/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/service/impl/UserModelConfigService.java +++ b/app-builder/plugins/aipp-custom-model-center/src/main/java/modelengine/fit/jade/aipp/model/service/impl/UserModelConfigService.java @@ -40,7 +40,7 @@ public class UserModelConfigService implements UserModelConfig { private static final Logger log = Logger.get(UserModelConfig.class); private static final String FITABLE_ID = "aipp.model.service.impl"; - public static final String DEFAULT_MODEL_TYPE = "chat_completions"; + private static final String DEFAULT_MODEL_TYPE = "chat_completions"; private final UserModelRepo userModelRepo; /** @@ -60,7 +60,7 @@ public UserModelConfigService(UserModelRepo userModelRepo) { @Property(description = "返回该用户可用的模型列表") public List getUserModelList(String userId) { log.info("start get model list for {}.", userId); - List userModelPos = this.userModelRepo.listUserModels(userId); + List userModelPos = this.userModelRepo.listUserModelsByUserId(userId); if (CollectionUtils.isEmpty(userModelPos)) { log.warn("No user model records found for userId={}.", userId); return Collections.emptyList(); @@ -130,7 +130,7 @@ public String addUserModel(String userId, String apiKey, String modelName, Strin @Property(description = "删除用户绑定的模型信息") public String deleteUserModel(String userId, String modelId) { log.info("start delete user model for {}.", userId); - List userModels = this.userModelRepo.listUserModels(userId); + List userModels = this.userModelRepo.listUserModelsByUserId(userId); if (CollectionUtils.isEmpty(userModels)) { return "删除模型失败,当前用户没有任何模型记录。"; } diff --git a/app-builder/plugins/aipp-custom-model-center/src/test/java/modelengine/fit/jade/aipp/model/service/impl/CustomAippModelCenterTest.java b/app-builder/plugins/aipp-custom-model-center/src/test/java/modelengine/fit/jade/aipp/model/service/impl/CustomAippModelCenterTest.java index 61559fea8f..881ec7501c 100644 --- a/app-builder/plugins/aipp-custom-model-center/src/test/java/modelengine/fit/jade/aipp/model/service/impl/CustomAippModelCenterTest.java +++ b/app-builder/plugins/aipp-custom-model-center/src/test/java/modelengine/fit/jade/aipp/model/service/impl/CustomAippModelCenterTest.java @@ -49,7 +49,7 @@ void shouldGetResultWhenFetchModelListGivenUserModelRepoHasData() { .type("type") .tag("tag1") .build(); - Mockito.when(this.userModelRepo.getModelList(userId)).thenReturn(Collections.singletonList(modelPo)); + Mockito.when(this.userModelRepo.listModelsByUserId(userId)).thenReturn(Collections.singletonList(modelPo)); OperationContext context = new OperationContext(); context.setOperator(userId); @@ -78,7 +78,7 @@ void shouldGetDefaultWhenFetchModelListGivenUserModelRepoNoData() { .tag("tag1") .build(); ModelAccessInfo model1 = ModelAccessInfo.builder().serviceName("gpt").baseUrl("").tag("").build(); - Mockito.when(this.userModelRepo.getModelList(userId)).thenReturn(Collections.emptyList()); + Mockito.when(this.userModelRepo.listModelsByUserId(userId)).thenReturn(Collections.emptyList()); ModelListDto expectModelList = ModelListDto.builder() .models(Collections.singletonList(model1)) .total(1) diff --git a/app-builder/plugins/aipp-custom-model-center/src/test/java/modelengine/fit/jade/aipp/model/service/impl/UserModelConfigServiceTest.java b/app-builder/plugins/aipp-custom-model-center/src/test/java/modelengine/fit/jade/aipp/model/service/impl/UserModelConfigServiceTest.java index f5a7fb009f..a8334be233 100644 --- a/app-builder/plugins/aipp-custom-model-center/src/test/java/modelengine/fit/jade/aipp/model/service/impl/UserModelConfigServiceTest.java +++ b/app-builder/plugins/aipp-custom-model-center/src/test/java/modelengine/fit/jade/aipp/model/service/impl/UserModelConfigServiceTest.java @@ -60,7 +60,7 @@ void shouldReturnUserModelListWhenUserHasModels() { ModelPo modelPo = ModelPo.builder().modelId(modelId).name("gpt").baseUrl("http://testUrl").build(); - Mockito.when(userModelRepo.listUserModels(userId)).thenReturn(Collections.singletonList(userModelPo)); + Mockito.when(userModelRepo.listUserModelsByUserId(userId)).thenReturn(Collections.singletonList(userModelPo)); Mockito.when(userModelRepo.listModels(Collections.singletonList(modelId))) .thenReturn(Collections.singletonList(modelPo)); @@ -98,7 +98,7 @@ void shouldDeleteModelWhenItIsNotDefault() { .createdAt(LocalDateTime.now()) .build(); - Mockito.when(userModelRepo.listUserModels(userId)).thenReturn(Collections.singletonList(userModelPo)); + Mockito.when(userModelRepo.listUserModelsByUserId(userId)).thenReturn(Collections.singletonList(userModelPo)); String result = userModelConfigService.deleteUserModel(userId, modelId); assertEquals("删除模型成功。", result);