소스 검색

【功能新增】AI:增加函数的管理

YunaiV 5 달 전
부모
커밋
e869aaee83
12개의 변경된 파일401개의 추가작업 그리고 18개의 파일을 삭제
  1. 19 15
      yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/ErrorCodeConstants.java
  2. 73 0
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/model/AiToolController.java
  3. 36 0
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/model/vo/tool/AiToolPageReqVO.java
  4. 27 0
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/model/vo/tool/AiToolRespVO.java
  5. 27 0
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/model/vo/tool/AiToolSaveReqVO.java
  6. 50 0
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/model/AiToolDO.java
  7. 27 0
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/mysql/model/AiToolMapper.java
  8. 54 0
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/model/AiToolService.java
  9. 86 0
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/model/AiToolServiceImpl.java
  10. 1 1
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/model/tool/DirectoryListToolFunction.java
  11. 1 1
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/model/tool/WeatherQueryToolFunction.java
  12. 0 1
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/tool/package-info.java

+ 19 - 15
yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/ErrorCodeConstants.java

@@ -32,29 +32,33 @@ public interface ErrorCodeConstants {
     ErrorCode CHAT_STREAM_ERROR = new ErrorCode(1_040_004_001, "对话生成异常!");
 
     // ========== API 绘画 1-040-005-000 ==========
-    ErrorCode IMAGE_NOT_EXISTS = new ErrorCode(1_022_005_000, "图片不存在!");
-    ErrorCode IMAGE_MIDJOURNEY_SUBMIT_FAIL = new ErrorCode(1_022_005_001, "Midjourney 提交失败!原因:{}");
-    ErrorCode IMAGE_CUSTOM_ID_NOT_EXISTS = new ErrorCode(1_022_005_002, "Midjourney 按钮 customId 不存在! {}");
+    ErrorCode IMAGE_NOT_EXISTS = new ErrorCode(1_040_005_000, "图片不存在!");
+    ErrorCode IMAGE_MIDJOURNEY_SUBMIT_FAIL = new ErrorCode(1_040_005_001, "Midjourney 提交失败!原因:{}");
+    ErrorCode IMAGE_CUSTOM_ID_NOT_EXISTS = new ErrorCode(1_040_005_002, "Midjourney 按钮 customId 不存在! {}");
 
     // ========== API 音乐 1-040-006-000 ==========
-    ErrorCode MUSIC_NOT_EXISTS = new ErrorCode(1_022_006_000, "音乐不存在!");
+    ErrorCode MUSIC_NOT_EXISTS = new ErrorCode(1_040_006_000, "音乐不存在!");
 
-    // ========== API 写作 1-022-007-000 ==========
-    ErrorCode WRITE_NOT_EXISTS = new ErrorCode(1_022_007_000, "作文不存在!");
-    ErrorCode WRITE_STREAM_ERROR = new ErrorCode(1_022_07_001, "写作生成异常!");
+    // ========== API 写作 1-040-007-000 ==========
+    ErrorCode WRITE_NOT_EXISTS = new ErrorCode(1_040_007_000, "作文不存在!");
+    ErrorCode WRITE_STREAM_ERROR = new ErrorCode(1_040_07_001, "写作生成异常!");
 
     // ========== API 思维导图 1-040-008-000 ==========
     ErrorCode MIND_MAP_NOT_EXISTS = new ErrorCode(1_040_008_000, "思维导图不存在!");
 
-    // ========== API 知识库 1-022-008-000 ==========
-    ErrorCode KNOWLEDGE_NOT_EXISTS = new ErrorCode(1_022_008_000, "知识库不存在!");
+    // ========== API 知识库 1-040-009-000 ==========
+    ErrorCode KNOWLEDGE_NOT_EXISTS = new ErrorCode(1_040_009_000, "知识库不存在!");
 
-    ErrorCode KNOWLEDGE_DOCUMENT_NOT_EXISTS = new ErrorCode(1_022_008_101, "文档不存在!");
-    ErrorCode KNOWLEDGE_DOCUMENT_FILE_EMPTY = new ErrorCode(1_022_008_102, "文档内容为空!");
-    ErrorCode KNOWLEDGE_DOCUMENT_FILE_DOWNLOAD_FAIL = new ErrorCode(1_022_008_102, "文件下载失败!");
-    ErrorCode KNOWLEDGE_DOCUMENT_FILE_READ_FAIL = new ErrorCode(1_022_008_102, "文档加载失败!");
+    ErrorCode KNOWLEDGE_DOCUMENT_NOT_EXISTS = new ErrorCode(1_040_009_101, "文档不存在!");
+    ErrorCode KNOWLEDGE_DOCUMENT_FILE_EMPTY = new ErrorCode(1_040_009_102, "文档内容为空!");
+    ErrorCode KNOWLEDGE_DOCUMENT_FILE_DOWNLOAD_FAIL = new ErrorCode(1_040_009_102, "文件下载失败!");
+    ErrorCode KNOWLEDGE_DOCUMENT_FILE_READ_FAIL = new ErrorCode(1_040_009_102, "文档加载失败!");
 
-    ErrorCode KNOWLEDGE_SEGMENT_NOT_EXISTS = new ErrorCode(1_022_008_202, "段落不存在!");
-    ErrorCode KNOWLEDGE_SEGMENT_CONTENT_TOO_LONG = new ErrorCode(1_022_008_203, "内容 Token 数为 {},超过最大限制 {}");
+    ErrorCode KNOWLEDGE_SEGMENT_NOT_EXISTS = new ErrorCode(1_040_009_202, "段落不存在!");
+    ErrorCode KNOWLEDGE_SEGMENT_CONTENT_TOO_LONG = new ErrorCode(1_040_009_203, "内容 Token 数为 {},超过最大限制 {}");
+
+    // ========== AI 工具 1-040-010-000 ==========
+    ErrorCode TOOL_NOT_EXISTS = new ErrorCode(1_040_010_000, "工具不存在");
+    ErrorCode TOOL_NAME_NOT_EXISTS = new ErrorCode(1_040_010_001, "工具({})找不到 Bean");
 
 }

+ 73 - 0
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/model/AiToolController.java

@@ -0,0 +1,73 @@
+package cn.iocoder.yudao.module.ai.controller.admin.model;
+
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.module.ai.controller.admin.model.vo.tool.AiToolPageReqVO;
+import cn.iocoder.yudao.module.ai.controller.admin.model.vo.tool.AiToolRespVO;
+import cn.iocoder.yudao.module.ai.controller.admin.model.vo.tool.AiToolSaveReqVO;
+import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiToolDO;
+import cn.iocoder.yudao.module.ai.service.model.AiToolService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.annotation.Resource;
+import jakarta.validation.Valid;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+
+@Tag(name = "管理后台 - AI 工具")
+@RestController
+@RequestMapping("/ai/tool")
+@Validated
+public class AiToolController {
+
+    @Resource
+    private AiToolService toolService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建AI 工具")
+    @PreAuthorize("@ss.hasPermission('ai:tool:create')")
+    public CommonResult<Long> createTool(@Valid @RequestBody AiToolSaveReqVO createReqVO) {
+        return success(toolService.createTool(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新AI 工具")
+    @PreAuthorize("@ss.hasPermission('ai:tool:update')")
+    public CommonResult<Boolean> updateTool(@Valid @RequestBody AiToolSaveReqVO updateReqVO) {
+        toolService.updateTool(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除AI 工具")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('ai:tool:delete')")
+    public CommonResult<Boolean> deleteTool(@RequestParam("id") Long id) {
+        toolService.deleteTool(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得AI 工具")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('ai:tool:query')")
+    public CommonResult<AiToolRespVO> getTool(@RequestParam("id") Long id) {
+        AiToolDO tool = toolService.getTool(id);
+        return success(BeanUtils.toBean(tool, AiToolRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得AI 工具分页")
+    @PreAuthorize("@ss.hasPermission('ai:tool:query')")
+    public CommonResult<PageResult<AiToolRespVO>> getToolPage(@Valid AiToolPageReqVO pageReqVO) {
+        PageResult<AiToolDO> pageResult = toolService.getToolPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, AiToolRespVO.class));
+    }
+
+}

+ 36 - 0
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/model/vo/tool/AiToolPageReqVO.java

@@ -0,0 +1,36 @@
+package cn.iocoder.yudao.module.ai.controller.admin.model.vo.tool;
+
+import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.validation.InEnum;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - AI 工具分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class AiToolPageReqVO extends PageParam {
+
+    @Schema(description = "工具名称", example = "王五")
+    private String name;
+
+    @Schema(description = "工具描述", example = "你猜")
+    private String description;
+
+    @Schema(description = "状态", example = "1")
+    @InEnum(CommonStatusEnum.class)
+    private Integer status;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+}

+ 27 - 0
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/model/vo/tool/AiToolRespVO.java

@@ -0,0 +1,27 @@
+package cn.iocoder.yudao.module.ai.controller.admin.model.vo.tool;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - AI 工具 Response VO")
+@Data
+public class AiToolRespVO {
+
+    @Schema(description = "工具编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "19661")
+    private Long id;
+
+    @Schema(description = "工具名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五")
+    private String name;
+
+    @Schema(description = "工具描述", example = "你猜")
+    private String description;
+
+    @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    private Integer status;
+
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    private LocalDateTime createTime;
+
+}

+ 27 - 0
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/model/vo/tool/AiToolSaveReqVO.java

@@ -0,0 +1,27 @@
+package cn.iocoder.yudao.module.ai.controller.admin.model.vo.tool;
+
+import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
+import cn.iocoder.yudao.framework.common.validation.InEnum;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotEmpty;
+import lombok.Data;
+
+@Schema(description = "管理后台 - AI 工具新增/修改 Request VO")
+@Data
+public class AiToolSaveReqVO {
+
+    @Schema(description = "工具编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "19661")
+    private Long id;
+
+    @Schema(description = "工具名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五")
+    @NotEmpty(message = "工具名称不能为空")
+    private String name;
+
+    @Schema(description = "工具描述", example = "你猜")
+    private String description;
+
+    @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @InEnum(CommonStatusEnum.class)
+    private Integer status;
+
+}

+ 50 - 0
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/model/AiToolDO.java

@@ -0,0 +1,50 @@
+package cn.iocoder.yudao.module.ai.dal.dataobject.model;
+
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import cn.iocoder.yudao.module.ai.service.model.tool.DirectoryListToolFunction;
+import cn.iocoder.yudao.module.ai.service.model.tool.WeatherQueryToolFunction;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+
+/**
+ * AI 工具 DO
+ *
+ * @author 芋道源码
+ */
+@TableName("ai_tool")
+@KeySequence("ai_tool_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class AiToolDO extends BaseDO {
+
+    /**
+     * 工具编号
+     */
+    @TableId
+    private Long id;
+    /**
+     * 工具名称
+     *
+     * 对应 Bean 的名字,例如说:
+     * 1. {@link DirectoryListToolFunction} 的 Bean 名字是 directory_list
+     * 2. {@link WeatherQueryToolFunction} 的 Bean 名字是 weather_query
+     */
+    private String name;
+    /**
+     * 工具描述
+     */
+    private String description;
+    /**
+     * 状态
+     *
+     * 枚举 {@link cn.iocoder.yudao.framework.common.enums.CommonStatusEnum}
+     */
+    private Integer status;
+
+}

+ 27 - 0
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/mysql/model/AiToolMapper.java

@@ -0,0 +1,27 @@
+package cn.iocoder.yudao.module.ai.dal.mysql.model;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.module.ai.controller.admin.model.vo.tool.AiToolPageReqVO;
+import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiToolDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * AI 工具 Mapper
+ *
+ * @author 芋道源码
+ */
+@Mapper
+public interface AiToolMapper extends BaseMapperX<AiToolDO> {
+
+    default PageResult<AiToolDO> selectPage(AiToolPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<AiToolDO>()
+                .likeIfPresent(AiToolDO::getName, reqVO.getName())
+                .eqIfPresent(AiToolDO::getDescription, reqVO.getDescription())
+                .eqIfPresent(AiToolDO::getStatus, reqVO.getStatus())
+                .betweenIfPresent(AiToolDO::getCreateTime, reqVO.getCreateTime())
+                .orderByDesc(AiToolDO::getId));
+    }
+
+}

+ 54 - 0
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/model/AiToolService.java

@@ -0,0 +1,54 @@
+package cn.iocoder.yudao.module.ai.service.model;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.ai.controller.admin.model.vo.tool.AiToolPageReqVO;
+import cn.iocoder.yudao.module.ai.controller.admin.model.vo.tool.AiToolSaveReqVO;
+import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiToolDO;
+import jakarta.validation.Valid;
+
+/**
+ * AI 工具 Service 接口
+ *
+ * @author 芋道源码
+ */
+public interface AiToolService {
+
+    /**
+     * 创建AI 工具
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createTool(@Valid AiToolSaveReqVO createReqVO);
+
+    /**
+     * 更新AI 工具
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateTool(@Valid AiToolSaveReqVO updateReqVO);
+
+    /**
+     * 删除AI 工具
+     *
+     * @param id 编号
+     */
+    void deleteTool(Long id);
+
+    /**
+     * 获得AI 工具
+     *
+     * @param id 编号
+     * @return AI 工具
+     */
+    AiToolDO getTool(Long id);
+
+    /**
+     * 获得AI 工具分页
+     *
+     * @param pageReqVO 分页查询
+     * @return AI 工具分页
+     */
+    PageResult<AiToolDO> getToolPage(AiToolPageReqVO pageReqVO);
+
+}

+ 86 - 0
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/model/AiToolServiceImpl.java

@@ -0,0 +1,86 @@
+package cn.iocoder.yudao.module.ai.service.model;
+
+import cn.hutool.extra.spring.SpringUtil;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.module.ai.controller.admin.model.vo.tool.AiToolPageReqVO;
+import cn.iocoder.yudao.module.ai.controller.admin.model.vo.tool.AiToolSaveReqVO;
+import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiToolDO;
+import cn.iocoder.yudao.module.ai.dal.mysql.model.AiToolMapper;
+import jakarta.annotation.Resource;
+import org.springframework.beans.factory.NoSuchBeanDefinitionException;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.ai.enums.ErrorCodeConstants.TOOL_NAME_NOT_EXISTS;
+import static cn.iocoder.yudao.module.ai.enums.ErrorCodeConstants.TOOL_NOT_EXISTS;
+
+/**
+ * AI 工具 Service 实现类
+ *
+ * @author 芋道源码
+ */
+@Service
+@Validated
+public class AiToolServiceImpl implements AiToolService {
+
+    @Resource
+    private AiToolMapper toolMapper;
+
+    @Override
+    public Long createTool(AiToolSaveReqVO createReqVO) {
+        // 校验名称是否存在
+        validateToolNameExists(createReqVO.getName());
+
+        // 插入
+        AiToolDO tool = BeanUtils.toBean(createReqVO, AiToolDO.class);
+        toolMapper.insert(tool);
+        return tool.getId();
+    }
+
+    @Override
+    public void updateTool(AiToolSaveReqVO updateReqVO) {
+        // 1.1 校验存在
+        validateToolExists(updateReqVO.getId());
+        // 1.2 校验名称是否存在
+        validateToolNameExists(updateReqVO.getName());
+
+        // 2. 更新
+        AiToolDO updateObj = BeanUtils.toBean(updateReqVO, AiToolDO.class);
+        toolMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deleteTool(Long id) {
+        // 校验存在
+        validateToolExists(id);
+        // 删除
+        toolMapper.deleteById(id);
+    }
+
+    private void validateToolExists(Long id) {
+        if (toolMapper.selectById(id) == null) {
+            throw exception(TOOL_NOT_EXISTS);
+        }
+    }
+
+    private void validateToolNameExists(String name) {
+        try {
+            SpringUtil.getBean(name);
+        } catch (NoSuchBeanDefinitionException e) {
+            throw exception(TOOL_NAME_NOT_EXISTS, name);
+        }
+    }
+
+    @Override
+    public AiToolDO getTool(Long id) {
+        return toolMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<AiToolDO> getToolPage(AiToolPageReqVO pageReqVO) {
+        return toolMapper.selectPage(pageReqVO);
+    }
+
+}

+ 1 - 1
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/tool/function/DirectoryListToolFunction.java → yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/model/tool/DirectoryListToolFunction.java

@@ -1,4 +1,4 @@
-package cn.iocoder.yudao.module.ai.service.tool.function;
+package cn.iocoder.yudao.module.ai.service.model.tool;
 
 import cn.hutool.core.date.LocalDateTimeUtil;
 import cn.hutool.core.io.FileUtil;

+ 1 - 1
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/tool/function/WeatherQueryToolFunction.java → yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/model/tool/WeatherQueryToolFunction.java

@@ -1,4 +1,4 @@
-package cn.iocoder.yudao.module.ai.service.tool.function;
+package cn.iocoder.yudao.module.ai.service.model.tool;
 
 import cn.hutool.core.date.LocalDateTimeUtil;
 import cn.hutool.core.util.RandomUtil;

+ 0 - 1
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/tool/package-info.java

@@ -1 +0,0 @@
-package cn.iocoder.yudao.module.ai.service.tool;