Commit f86e24bb865ca55d0b0712beb9e318b056a32c78

Authored by cherishsince
1 parent f9854273

【调整】调整AI对话模块

yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/AiCommonConstants.java 0 → 100644
  1 +package cn.iocoder.yudao.module.ai;
  2 +
  3 +/**
  4 + * ai 常用的常量
  5 + *
  6 + * @author fansili
  7 + * @time 2024/5/7 09:29
  8 + * @since 1.0
  9 + */
  10 +public class AiCommonConstants {
  11 +
  12 + /**
  13 + * 对话 - 默认 title
  14 + */
  15 + public static final String CONVERSATION_DEFAULT_TITLE = "新增对话";
  16 +}
yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/ErrorCodeConstants.java
@@ -15,6 +15,10 @@ public interface ErrorCodeConstants { @@ -15,6 +15,10 @@ public interface ErrorCodeConstants {
15 15
16 ErrorCode AI_MODULE_NOT_SUPPORTED = new ErrorCode(1_022_000_000, "AI 模型暂不支持!"); 16 ErrorCode AI_MODULE_NOT_SUPPORTED = new ErrorCode(1_022_000_000, "AI 模型暂不支持!");
17 ErrorCode AI_CHAT_ROLE_NOT_EXISTENT = new ErrorCode(1_022_000_001, "AI Role 不存在!");; 17 ErrorCode AI_CHAT_ROLE_NOT_EXISTENT = new ErrorCode(1_022_000_001, "AI Role 不存在!");;
  18 +
  19 + // conversation
  20 +
  21 + ErrorCode AI_CONVERSATION_NOT_EXISTS = new ErrorCode(1_022_000_002, "AI 对话不存在!");;
18 ErrorCode AI_CHAT_CONTINUE_CONVERSATION_ID_NOT_NULL = new ErrorCode(1_022_000_002, "chat 继续对话,对话 id 不能为空!");; 22 ErrorCode AI_CHAT_CONTINUE_CONVERSATION_ID_NOT_NULL = new ErrorCode(1_022_000_002, "chat 继续对话,对话 id 不能为空!");;
19 ErrorCode AI_CHAT_CONTINUE_NOT_EXIST = new ErrorCode(1_022_000_020, "chat 对话不存在!"); 23 ErrorCode AI_CHAT_CONTINUE_NOT_EXIST = new ErrorCode(1_022_000_020, "chat 对话不存在!");
20 ErrorCode AI_CHAT_CONVERSATION_NOT_YOURS = new ErrorCode(1_022_000_021, "这条 chat 对话不是你的!"); 24 ErrorCode AI_CHAT_CONVERSATION_NOT_YOURS = new ErrorCode(1_022_000_021, "这条 chat 对话不是你的!");
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/chat/AiChatConversationController.java
@@ -2,12 +2,15 @@ package cn.iocoder.yudao.module.ai.controller.admin.chat; @@ -2,12 +2,15 @@ package cn.iocoder.yudao.module.ai.controller.admin.chat;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.CommonResult; 3 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4 import cn.iocoder.yudao.module.ai.controller.admin.chat.vo.conversation.AiChatConversationCreateReqVO; 4 import cn.iocoder.yudao.module.ai.controller.admin.chat.vo.conversation.AiChatConversationCreateReqVO;
  5 +import cn.iocoder.yudao.module.ai.controller.admin.chat.vo.conversation.AiChatConversationListReqVO;
5 import cn.iocoder.yudao.module.ai.controller.admin.chat.vo.conversation.AiChatConversationRespVO; 6 import cn.iocoder.yudao.module.ai.controller.admin.chat.vo.conversation.AiChatConversationRespVO;
6 import cn.iocoder.yudao.module.ai.controller.admin.chat.vo.conversation.AiChatConversationUpdateReqVO; 7 import cn.iocoder.yudao.module.ai.controller.admin.chat.vo.conversation.AiChatConversationUpdateReqVO;
  8 +import cn.iocoder.yudao.module.ai.service.AiChatConversationService;
7 import io.swagger.v3.oas.annotations.Operation; 9 import io.swagger.v3.oas.annotations.Operation;
8 import io.swagger.v3.oas.annotations.Parameter; 10 import io.swagger.v3.oas.annotations.Parameter;
9 import io.swagger.v3.oas.annotations.tags.Tag; 11 import io.swagger.v3.oas.annotations.tags.Tag;
10 import jakarta.validation.Valid; 12 import jakarta.validation.Valid;
  13 +import lombok.AllArgsConstructor;
11 import lombok.extern.slf4j.Slf4j; 14 import lombok.extern.slf4j.Slf4j;
12 import org.springframework.security.access.prepost.PreAuthorize; 15 import org.springframework.security.access.prepost.PreAuthorize;
13 import org.springframework.web.bind.annotation.*; 16 import org.springframework.web.bind.annotation.*;
@@ -16,33 +19,36 @@ import java.util.List; @@ -16,33 +19,36 @@ import java.util.List;
16 19
17 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; 20 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
18 21
  22 +@Slf4j
19 @Tag(name = "管理后台 - 聊天会话") 23 @Tag(name = "管理后台 - 聊天会话")
20 @RestController 24 @RestController
21 @RequestMapping("/ai/chat/conversation") 25 @RequestMapping("/ai/chat/conversation")
22 -@Slf4j 26 +@AllArgsConstructor
23 public class AiChatConversationController { 27 public class AiChatConversationController {
24 28
25 - // TODO @fan:实现一下 29 + private final AiChatConversationService aiChatConversationService;
  30 +
  31 + // TODO done @fan:实现一下
26 @PostMapping("/create") 32 @PostMapping("/create")
27 @Operation(summary = "创建聊天会话") 33 @Operation(summary = "创建聊天会话")
28 @PreAuthorize("@ss.hasPermission('ai:chat-conversation:create')") 34 @PreAuthorize("@ss.hasPermission('ai:chat-conversation:create')")
29 public CommonResult<Long> createConversation(@RequestBody @Valid AiChatConversationCreateReqVO createReqVO) { 35 public CommonResult<Long> createConversation(@RequestBody @Valid AiChatConversationCreateReqVO createReqVO) {
30 - return success(1L); 36 + return success(aiChatConversationService.createConversation(createReqVO));
31 } 37 }
32 38
33 - // TODO @fan:实现一下 39 + // TODO done @fan:实现一下
34 @PutMapping("/update") 40 @PutMapping("/update")
35 @Operation(summary = "更新聊天会话") 41 @Operation(summary = "更新聊天会话")
36 @PreAuthorize("@ss.hasPermission('ai:chat-conversation:create')") 42 @PreAuthorize("@ss.hasPermission('ai:chat-conversation:create')")
37 public CommonResult<Boolean> updateConversation(@RequestBody @Valid AiChatConversationUpdateReqVO updateReqVO) { 43 public CommonResult<Boolean> updateConversation(@RequestBody @Valid AiChatConversationUpdateReqVO updateReqVO) {
38 - return success(true); 44 + return success(aiChatConversationService.updateConversation(updateReqVO));
39 } 45 }
40 46
41 - // TODO @fan:实现一下 47 + // TODO done @fan:实现一下
42 @GetMapping("/list") 48 @GetMapping("/list")
43 @Operation(summary = "获得聊天会话列表") 49 @Operation(summary = "获得聊天会话列表")
44 - public CommonResult<List<AiChatConversationRespVO>> getConversationList() {  
45 - return success(null); 50 + public CommonResult<List<AiChatConversationRespVO>> getConversationList(@ModelAttribute AiChatConversationListReqVO listReqVO) {
  51 + return success(aiChatConversationService.listConversation(listReqVO));
46 } 52 }
47 53
48 // TODO @fan:实现一下 54 // TODO @fan:实现一下
@@ -50,7 +56,7 @@ public class AiChatConversationController { @@ -50,7 +56,7 @@ public class AiChatConversationController {
50 @Operation(summary = "获得聊天会话") 56 @Operation(summary = "获得聊天会话")
51 @Parameter(name = "id", required = true, description = "会话编号", example = "1024") 57 @Parameter(name = "id", required = true, description = "会话编号", example = "1024")
52 public CommonResult<AiChatConversationRespVO> getConversation(@RequestParam("id") Long id) { 58 public CommonResult<AiChatConversationRespVO> getConversation(@RequestParam("id") Long id) {
53 - return success(null); 59 + return success(aiChatConversationService.getConversationOfValidate(id));
54 } 60 }
55 61
56 // TODO @fan:实现一下 62 // TODO @fan:实现一下
@@ -58,7 +64,7 @@ public class AiChatConversationController { @@ -58,7 +64,7 @@ public class AiChatConversationController {
58 @Operation(summary = "删除聊天会话") 64 @Operation(summary = "删除聊天会话")
59 @Parameter(name = "id", required = true, description = "会话编号", example = "1024") 65 @Parameter(name = "id", required = true, description = "会话编号", example = "1024")
60 public CommonResult<Boolean> deleteConversation(@RequestParam("id") Long id) { 66 public CommonResult<Boolean> deleteConversation(@RequestParam("id") Long id) {
61 - return success(null); 67 + return success(aiChatConversationService.deleteConversation(id));
62 } 68 }
63 69
64 } 70 }
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/chat/vo/conversation/AiChatConversationListReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.ai.controller.admin.chat.vo.conversation;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import lombok.Data;
  5 +
  6 +@Schema(description = "管理后台 - AI 聊天会话 Response VO")
  7 +@Data
  8 +public class AiChatConversationListReqVO {
  9 +
  10 + @Schema(description = "会话标题", requiredMode = Schema.RequiredMode.REQUIRED, example = "我是一个标题")
  11 + private String title;
  12 +
  13 +}
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/convert/AiChatConversationConvert.java
1 package cn.iocoder.yudao.module.ai.convert; 1 package cn.iocoder.yudao.module.ai.convert;
2 2
  3 +import cn.iocoder.yudao.module.ai.controller.admin.chat.vo.conversation.AiChatConversationUpdateReqVO;
3 import cn.iocoder.yudao.module.ai.dal.dataobject.chat.AiChatConversationDO; 4 import cn.iocoder.yudao.module.ai.dal.dataobject.chat.AiChatConversationDO;
4 import cn.iocoder.yudao.module.ai.controller.admin.chat.vo.conversation.AiChatConversationRespVO; 5 import cn.iocoder.yudao.module.ai.controller.admin.chat.vo.conversation.AiChatConversationRespVO;
5 import org.mapstruct.Mapper; 6 import org.mapstruct.Mapper;
@@ -34,4 +35,11 @@ public interface AiChatConversationConvert { @@ -34,4 +35,11 @@ public interface AiChatConversationConvert {
34 * @return 35 * @return
35 */ 36 */
36 AiChatConversationRespVO covnertChatConversationRes(AiChatConversationDO aiChatConversationDO); 37 AiChatConversationRespVO covnertChatConversationRes(AiChatConversationDO aiChatConversationDO);
  38 +
  39 + /**
  40 + * 转换 - AiChatConversationDO
  41 + *
  42 + * @param updateReqVO
  43 + */
  44 + AiChatConversationDO convertAiChatConversationDO(AiChatConversationUpdateReqVO updateReqVO);
37 } 45 }
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/mysql/AiChatModalMapper.java
@@ -5,6 +5,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageParam; @@ -5,6 +5,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageParam;
5 import cn.iocoder.yudao.framework.common.pojo.PageResult; 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
6 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; 6 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
7 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; 7 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
  8 +import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatModalDO;
8 import org.apache.ibatis.annotations.Mapper; 9 import org.apache.ibatis.annotations.Mapper;
9 import org.springframework.stereotype.Repository; 10 import org.springframework.stereotype.Repository;
10 11
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/AiChatConversationService.java
1 package cn.iocoder.yudao.module.ai.service; 1 package cn.iocoder.yudao.module.ai.service;
2 2
3 import cn.iocoder.yudao.module.ai.controller.admin.chat.vo.conversation.AiChatConversationCreateReqVO; 3 import cn.iocoder.yudao.module.ai.controller.admin.chat.vo.conversation.AiChatConversationCreateReqVO;
  4 +import cn.iocoder.yudao.module.ai.controller.admin.chat.vo.conversation.AiChatConversationListReqVO;
4 import cn.iocoder.yudao.module.ai.controller.admin.chat.vo.conversation.AiChatConversationRespVO; 5 import cn.iocoder.yudao.module.ai.controller.admin.chat.vo.conversation.AiChatConversationRespVO;
  6 +import cn.iocoder.yudao.module.ai.controller.admin.chat.vo.conversation.AiChatConversationUpdateReqVO;
5 7
6 import java.util.List; 8 import java.util.List;
7 9
@@ -14,29 +16,20 @@ import java.util.List; @@ -14,29 +16,20 @@ import java.util.List;
14 public interface AiChatConversationService { 16 public interface AiChatConversationService {
15 17
16 /** 18 /**
17 - * 对话 - 创建普通对话 19 + * 对话 - 创建对话
18 * 20 *
19 * @param req 21 * @param req
20 * @return 22 * @return
21 */ 23 */
22 - AiChatConversationRespVO createConversation(AiChatConversationCreateUserReq req); 24 + Long createConversation(AiChatConversationCreateReqVO req);
23 25
24 /** 26 /**
25 - * 对话 - 创建role对话 27 + * 对话 - 更新对话
26 * 28 *
27 - * @param req  
28 - * @return  
29 - */  
30 - AiChatConversationRespVO createRoleConversation(AiChatConversationCreateReqVO req);  
31 -  
32 -  
33 - /**  
34 - * 获取 - 对话  
35 - *  
36 - * @param id 29 + * @param updateReqVO
37 * @return 30 * @return
38 */ 31 */
39 - AiChatConversationRespVO getConversation(Long id); 32 + Boolean updateConversation(AiChatConversationUpdateReqVO updateReqVO);
40 33
41 /** 34 /**
42 * 获取 - 对话列表 35 * 获取 - 对话列表
@@ -44,22 +37,21 @@ public interface AiChatConversationService { @@ -44,22 +37,21 @@ public interface AiChatConversationService {
44 * @param req 37 * @param req
45 * @return 38 * @return
46 */ 39 */
47 - List<AiChatConversationRespVO> listConversation(AiChatConversationListReq req); 40 + List<AiChatConversationRespVO> listConversation(AiChatConversationListReqVO req);
48 41
49 /** 42 /**
50 - * 更新 - 更新模型 43 + * 获取 - 对话
51 * 44 *
52 * @param id 45 * @param id
53 - * @param modalId  
54 * @return 46 * @return
55 */ 47 */
56 - void updateModal(Long id, Long modalId); 48 + AiChatConversationRespVO getConversationOfValidate(Long id);
57 49
58 /** 50 /**
59 * 删除 - 根据id 51 * 删除 - 根据id
60 * 52 *
61 * @param id 53 * @param id
62 */ 54 */
63 - void delete(Long id); 55 + Boolean deleteConversation(Long id);
64 56
65 } 57 }
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/AiChatModalService.java
@@ -51,5 +51,5 @@ public interface AiChatModalService { @@ -51,5 +51,5 @@ public interface AiChatModalService {
51 * @param modalId 51 * @param modalId
52 * @return 52 * @return
53 */ 53 */
54 - AiChatModalRes getChatModal(Long modalId); 54 + AiChatModalRes getChatModalOfValidate(Long modalId);
55 } 55 }
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/AiChatConversationServiceImpl.java
@@ -2,17 +2,20 @@ package cn.iocoder.yudao.module.ai.service.impl; @@ -2,17 +2,20 @@ package cn.iocoder.yudao.module.ai.service.impl;
2 2
3 import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; 3 import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil;
4 import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; 4 import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
  5 +import cn.iocoder.yudao.module.ai.AiCommonConstants;
5 import cn.iocoder.yudao.module.ai.ErrorCodeConstants; 6 import cn.iocoder.yudao.module.ai.ErrorCodeConstants;
6 import cn.iocoder.yudao.module.ai.controller.admin.chat.vo.conversation.AiChatConversationCreateReqVO; 7 import cn.iocoder.yudao.module.ai.controller.admin.chat.vo.conversation.AiChatConversationCreateReqVO;
  8 +import cn.iocoder.yudao.module.ai.controller.admin.chat.vo.conversation.AiChatConversationListReqVO;
7 import cn.iocoder.yudao.module.ai.controller.admin.chat.vo.conversation.AiChatConversationRespVO; 9 import cn.iocoder.yudao.module.ai.controller.admin.chat.vo.conversation.AiChatConversationRespVO;
  10 +import cn.iocoder.yudao.module.ai.controller.admin.chat.vo.conversation.AiChatConversationUpdateReqVO;
8 import cn.iocoder.yudao.module.ai.controller.admin.model.vo.model.AiChatModalRes; 11 import cn.iocoder.yudao.module.ai.controller.admin.model.vo.model.AiChatModalRes;
9 import cn.iocoder.yudao.module.ai.controller.admin.model.vo.role.AiChatRoleRes; 12 import cn.iocoder.yudao.module.ai.controller.admin.model.vo.role.AiChatRoleRes;
10 import cn.iocoder.yudao.module.ai.convert.AiChatConversationConvert; 13 import cn.iocoder.yudao.module.ai.convert.AiChatConversationConvert;
11 -import cn.iocoder.yudao.module.ai.enums.AiChatConversationTypeEnum;  
12 -import cn.iocoder.yudao.module.ai.enums.AiChatModalDisableEnum; 14 +import cn.iocoder.yudao.module.ai.dal.dataobject.chat.AiChatConversationDO;
  15 +import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatModalDO;
13 import cn.iocoder.yudao.module.ai.dal.mysql.AiChatConversationMapper; 16 import cn.iocoder.yudao.module.ai.dal.mysql.AiChatConversationMapper;
14 import cn.iocoder.yudao.module.ai.dal.mysql.AiChatModalMapper; 17 import cn.iocoder.yudao.module.ai.dal.mysql.AiChatModalMapper;
15 -import cn.iocoder.yudao.module.ai.dal.mysql.AiChatRoleMapper; 18 +import cn.iocoder.yudao.module.ai.enums.AiChatModalDisableEnum;
16 import cn.iocoder.yudao.module.ai.service.AiChatConversationService; 19 import cn.iocoder.yudao.module.ai.service.AiChatConversationService;
17 import cn.iocoder.yudao.module.ai.service.AiChatModalService; 20 import cn.iocoder.yudao.module.ai.service.AiChatModalService;
18 import cn.iocoder.yudao.module.ai.service.AiChatRoleService; 21 import cn.iocoder.yudao.module.ai.service.AiChatRoleService;
@@ -34,119 +37,95 @@ import java.util.List; @@ -34,119 +37,95 @@ import java.util.List;
34 @AllArgsConstructor 37 @AllArgsConstructor
35 public class AiChatConversationServiceImpl implements AiChatConversationService { 38 public class AiChatConversationServiceImpl implements AiChatConversationService {
36 39
37 - private final AiChatRoleMapper aiChatRoleMapper;  
38 private final AiChatModalMapper aiChatModalMapper; 40 private final AiChatModalMapper aiChatModalMapper;
39 - private final AiChatConversationMapper aiChatConversationMapper;  
40 private final AiChatModalService aiChatModalService; 41 private final AiChatModalService aiChatModalService;
41 private final AiChatRoleService aiChatRoleService; 42 private final AiChatRoleService aiChatRoleService;
  43 + private final AiChatConversationMapper aiChatConversationMapper;
42 44
43 @Override 45 @Override
44 - public AiChatConversationRespVO createConversation(AiChatConversationCreateUserReq req) { 46 + public Long createConversation(AiChatConversationCreateReqVO req) {
45 // 获取用户id 47 // 获取用户id
46 Long loginUserId = SecurityFrameworkUtils.getLoginUserId(); 48 Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
47 - // 查询最新的对话  
48 - AiChatConversationDO latestConversation = aiChatConversationMapper.selectLatestConversation(loginUserId);  
49 - // 如果有对话没有被使用过,那就返回这个  
50 - if (latestConversation != null && latestConversation.getChatCount() <= 0) {  
51 - return AiChatConversationConvert.INSTANCE.covnertChatConversationRes(latestConversation);  
52 - }  
53 - // 获取第一个模型 49 + // 默认使用 sort 排序第一个模型
54 AiChatModalDO aiChatModalDO = aiChatModalMapper.selectFirstModal(); 50 AiChatModalDO aiChatModalDO = aiChatModalMapper.selectFirstModal();
55 - // 创建新的 Conversation  
56 - AiChatConversationDO insertConversation = saveConversation(req.getTitle(), loginUserId,  
57 - null, null, AiChatConversationTypeEnum.USER_CHAT,  
58 - aiChatModalDO.getId(), aiChatModalDO.getModal());  
59 - // 转换 res  
60 - return AiChatConversationConvert.INSTANCE.covnertChatConversationRes(insertConversation);  
61 - }  
62 -  
63 - @Override  
64 - public AiChatConversationRespVO createRoleConversation(AiChatConversationCreateReqVO req) {  
65 - // 获取用户id  
66 - Long loginUserId = SecurityFrameworkUtils.getLoginUserId();  
67 - // 查询最新的对话  
68 -// AiChatConversationDO latestConversation = aiChatConversationMapper.selectLatestConversation(loginUserId);  
69 -// // 如果有对话没有被使用过,那就返回这个  
70 -// if (latestConversation != null && latestConversation.getChatCount() <= 0) {  
71 -// return AiChatConversationConvert.INSTANCE.covnertChatConversationRes(latestConversation);  
72 -// }  
73 // 查询角色 51 // 查询角色
74 - AiChatRoleRes chatRoleRes = aiChatRoleService.getChatRole(req.getRoleId());  
75 - // 获取第一个模型  
76 - AiChatModalDO aiChatModalDO = aiChatModalMapper.selectFirstModal(); 52 + AiChatRoleRes chatRoleRes = null;
  53 + if (req.getRoleId() != null) {
  54 + chatRoleRes = aiChatRoleService.getChatRole(req.getRoleId());
  55 + }
  56 + Long chatRoleId = chatRoleRes != null ? chatRoleRes.getId() : null;
77 // 创建新的 Conversation 57 // 创建新的 Conversation
78 - AiChatConversationDO insertConversation = saveConversation(req.getTitle(), loginUserId,  
79 - req.getRoleId(), chatRoleRes.getName(), AiChatConversationTypeEnum.ROLE_CHAT,  
80 - aiChatModalDO.getId(), aiChatModalDO.getModal());  
81 - // 转换 res  
82 - return AiChatConversationConvert.INSTANCE.covnertChatConversationRes(insertConversation); 58 + AiChatConversationDO insertConversation = saveConversation(AiCommonConstants.CONVERSATION_DEFAULT_TITLE,
  59 + loginUserId, chatRoleId, aiChatModalDO.getId(), aiChatModalDO.getModel()
  60 + );
  61 + // 返回对话id
  62 + return insertConversation.getId();
83 } 63 }
84 64
85 private @NotNull AiChatConversationDO saveConversation(String title, 65 private @NotNull AiChatConversationDO saveConversation(String title,
86 Long userId, 66 Long userId,
87 Long roleId, 67 Long roleId,
88 - String roleName,  
89 - AiChatConversationTypeEnum typeEnum,  
90 Long modalId, 68 Long modalId,
91 - String modal) { 69 + String model) {
92 AiChatConversationDO insertConversation = new AiChatConversationDO(); 70 AiChatConversationDO insertConversation = new AiChatConversationDO();
93 insertConversation.setId(null); 71 insertConversation.setId(null);
94 insertConversation.setUserId(userId); 72 insertConversation.setUserId(userId);
95 - insertConversation.setRoleId(roleId);  
96 - insertConversation.setRoleName(roleName);  
97 insertConversation.setTitle(title); 73 insertConversation.setTitle(title);
98 - insertConversation.setChatCount(0);  
99 - insertConversation.setType(typeEnum.getType());  
100 - insertConversation.setModalId(modalId);  
101 - insertConversation.setModal(modal); 74 + insertConversation.setPinned(false);
  75 +
  76 + insertConversation.setRoleId(roleId);
  77 + insertConversation.setModelId(modalId);
  78 + insertConversation.setModel(model);
  79 +
  80 + insertConversation.setTemperature(null);
  81 + insertConversation.setMaxTokens(null);
  82 + insertConversation.setMaxContexts(null);
102 aiChatConversationMapper.insert(insertConversation); 83 aiChatConversationMapper.insert(insertConversation);
103 return insertConversation; 84 return insertConversation;
104 } 85 }
105 86
106 @Override 87 @Override
107 - public AiChatConversationRespVO getConversation(Long id) {  
108 - AiChatConversationDO aiChatConversationDO = validateExists(id);  
109 - return AiChatConversationConvert.INSTANCE.covnertChatConversationRes(aiChatConversationDO);  
110 - }  
111 -  
112 - private @NotNull AiChatConversationDO validateExists(Long id) {  
113 - AiChatConversationDO aiChatConversationDO = aiChatConversationMapper.selectById(id);  
114 - if (aiChatConversationDO == null) {  
115 - throw ServiceExceptionUtil.exception(ErrorCodeConstants.AI_CHAT_CONTINUE_NOT_EXIST); 88 + public Boolean updateConversation(AiChatConversationUpdateReqVO updateReqVO) {
  89 + // 校验对话是否存在
  90 + validateExists(updateReqVO.getId());
  91 + // 获取模型信息并验证
  92 + AiChatModalRes chatModal = aiChatModalService.getChatModalOfValidate(updateReqVO.getModelId());
  93 + // 校验modal是否可用
  94 + if (AiChatModalDisableEnum.YES.getValue().equals(chatModal.getDisable())) {
  95 + throw ServiceExceptionUtil.exception(ErrorCodeConstants.AI_MODAL_DISABLE_NOT_USED);
116 } 96 }
117 - return aiChatConversationDO; 97 + // 更新对话信息
  98 + AiChatConversationDO updateAiChatConversationDO
  99 + = AiChatConversationConvert.INSTANCE.convertAiChatConversationDO(updateReqVO);
  100 + return aiChatConversationMapper.updateById(updateAiChatConversationDO) > 0;
118 } 101 }
119 102
120 @Override 103 @Override
121 - public List<AiChatConversationRespVO> listConversation(AiChatConversationListReq req) { 104 + public List<AiChatConversationRespVO> listConversation(AiChatConversationListReqVO listReqVO) {
122 // 获取用户id 105 // 获取用户id
123 Long loginUserId = SecurityFrameworkUtils.getLoginUserId(); 106 Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
124 // 查询前100对话 107 // 查询前100对话
125 List<AiChatConversationDO> top100Conversation 108 List<AiChatConversationDO> top100Conversation
126 - = aiChatConversationMapper.selectTop100Conversation(loginUserId, req.getSearch()); 109 + = aiChatConversationMapper.selectTop100Conversation(loginUserId, listReqVO.getTitle());
127 return AiChatConversationConvert.INSTANCE.covnertChatConversationResList(top100Conversation); 110 return AiChatConversationConvert.INSTANCE.covnertChatConversationResList(top100Conversation);
128 } 111 }
129 112
130 @Override 113 @Override
131 - public void updateModal(Long id, Long modalId) {  
132 - // 校验对话是否存在  
133 - validateExists(id);  
134 - // 获取模型  
135 - AiChatModalRes chatModal = aiChatModalService.getChatModal(modalId);  
136 - // 判断模型是否禁用  
137 - if (AiChatModalDisableEnum.YES.getValue().equals(chatModal.getDisable())) {  
138 - throw ServiceExceptionUtil.exception(ErrorCodeConstants.AI_MODAL_DISABLE_NOT_USED);  
139 - }  
140 - // 更新对话  
141 - aiChatConversationMapper.updateById(new AiChatConversationDO()  
142 - .setId(id)  
143 - .setModalId(chatModal.getId())  
144 - .setModal(chatModal.getModal())  
145 - ); 114 + public AiChatConversationRespVO getConversationOfValidate(Long id) {
  115 + AiChatConversationDO aiChatConversationDO = validateExists(id);
  116 + return AiChatConversationConvert.INSTANCE.covnertChatConversationRes(aiChatConversationDO);
146 } 117 }
147 118
148 @Override 119 @Override
149 - public void delete(Long id) {  
150 - aiChatConversationMapper.deleteById(id); 120 + public Boolean deleteConversation(Long id) {
  121 + return aiChatConversationMapper.deleteById(id) > 0;
  122 + }
  123 +
  124 + private @NotNull AiChatConversationDO validateExists(Long id) {
  125 + AiChatConversationDO aiChatConversationDO = aiChatConversationMapper.selectById(id);
  126 + if (aiChatConversationDO == null) {
  127 + throw ServiceExceptionUtil.exception(ErrorCodeConstants.AI_CONVERSATION_NOT_EXISTS);
  128 + }
  129 + return aiChatConversationDO;
151 } 130 }
152 } 131 }
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/AiChatModalServiceImpl.java
@@ -12,6 +12,7 @@ import cn.iocoder.yudao.framework.common.util.json.JsonUtils; @@ -12,6 +12,7 @@ import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
12 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; 12 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
13 import cn.iocoder.yudao.module.ai.ErrorCodeConstants; 13 import cn.iocoder.yudao.module.ai.ErrorCodeConstants;
14 import cn.iocoder.yudao.module.ai.convert.AiChatModalConvert; 14 import cn.iocoder.yudao.module.ai.convert.AiChatModalConvert;
  15 +import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatModalDO;
15 import cn.iocoder.yudao.module.ai.dal.vo.AiChatModalChatConfigVO; 16 import cn.iocoder.yudao.module.ai.dal.vo.AiChatModalChatConfigVO;
16 import cn.iocoder.yudao.module.ai.dal.vo.AiChatModalConfigVO; 17 import cn.iocoder.yudao.module.ai.dal.vo.AiChatModalConfigVO;
17 import cn.iocoder.yudao.module.ai.dal.vo.AiChatModalDallConfigVO; 18 import cn.iocoder.yudao.module.ai.dal.vo.AiChatModalDallConfigVO;
@@ -109,7 +110,7 @@ public class AiChatModalServiceImpl implements AiChatModalService { @@ -109,7 +110,7 @@ public class AiChatModalServiceImpl implements AiChatModalService {
109 } 110 }
110 111
111 @Override 112 @Override
112 - public AiChatModalRes getChatModal(Long modalId) { 113 + public AiChatModalRes getChatModalOfValidate(Long modalId) {
113 // 检查 modal 是否存在 114 // 检查 modal 是否存在
114 AiChatModalDO aiChatModalDO = validateChatModalExists(modalId); 115 AiChatModalDO aiChatModalDO = validateChatModalExists(modalId);
115 return AiChatModalConvert.INSTANCE.convertAiChatModalRes(aiChatModalDO); 116 return AiChatModalConvert.INSTANCE.convertAiChatModalRes(aiChatModalDO);
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/AiChatServiceImpl.java
@@ -58,7 +58,7 @@ public class AiChatServiceImpl implements AiChatService { @@ -58,7 +58,7 @@ public class AiChatServiceImpl implements AiChatService {
58 // 获取 client 类型 58 // 获取 client 类型
59 AiPlatformEnum platformEnum = AiPlatformEnum.valueOfPlatform(req.getModal()); 59 AiPlatformEnum platformEnum = AiPlatformEnum.valueOfPlatform(req.getModal());
60 // 获取对话信息 60 // 获取对话信息
61 - AiChatConversationRespVO conversationRes = chatConversationService.getConversation(req.getConversationId()); 61 + AiChatConversationRespVO conversationRes = chatConversationService.getConversationOfValidate(req.getConversationId());
62 // 保存 chat message 62 // 保存 chat message
63 saveChatMessage(req, conversationRes, loginUserId); 63 saveChatMessage(req, conversationRes, loginUserId);
64 String content = null; 64 String content = null;
@@ -133,7 +133,7 @@ public class AiChatServiceImpl implements AiChatService { @@ -133,7 +133,7 @@ public class AiChatServiceImpl implements AiChatService {
133 // 获取 client 类型 133 // 获取 client 类型
134 AiPlatformEnum platformEnum = AiPlatformEnum.valueOfPlatform(req.getModal()); 134 AiPlatformEnum platformEnum = AiPlatformEnum.valueOfPlatform(req.getModal());
135 // 获取对话信息 135 // 获取对话信息
136 - AiChatConversationRespVO conversationRes = chatConversationService.getConversation(req.getConversationId()); 136 + AiChatConversationRespVO conversationRes = chatConversationService.getConversationOfValidate(req.getConversationId());
137 // 创建 chat 需要的 Prompt 137 // 创建 chat 需要的 Prompt
138 Prompt prompt = new Prompt(req.getPrompt()); 138 Prompt prompt = new Prompt(req.getPrompt());
139 req.setTopK(req.getTopK()); 139 req.setTopK(req.getTopK());