Commit f86e24bb865ca55d0b0712beb9e318b056a32c78
1 parent
f9854273
【调整】调整AI对话模块
Showing
11 changed files
with
130 additions
and
110 deletions
yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/AiCommonConstants.java
0 → 100644
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()); |