From 71e3240af6d8f2f29f1b847d0853881c81e108d0 Mon Sep 17 00:00:00 2001 From: cherishsince Date: Thu, 25 Apr 2024 15:48:48 +0800 Subject: [PATCH] 【优化】代码优化,统一增加ai前缀 --- yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/AiChatConversationTypeEnum.java | 37 +++++++++++++++++++++++++++++++++++++ yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/AiChatRoleClassifyEnum.java | 37 +++++++++++++++++++++++++++++++++++++ yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/AiChatRoleSourceEnum.java | 36 ++++++++++++++++++++++++++++++++++++ yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/AiChatRoleVisibilityEnum.java | 36 ++++++++++++++++++++++++++++++++++++ yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/AiChatTypeEnum.java | 34 ++++++++++++++++++++++++++++++++++ yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/AiOpenAiModelEnum.java | 35 +++++++++++++++++++++++++++++++++++ yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/ChatConversationTypeEnum.java | 37 ------------------------------------- yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/ChatRoleClassifyEnum.java | 37 ------------------------------------- yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/ChatRoleSourceEnum.java | 36 ------------------------------------ yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/ChatRoleVisibilityEnum.java | 36 ------------------------------------ yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/ChatTypeEnum.java | 34 ---------------------------------- yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/OpenAiModelEnum.java | 35 ----------------------------------- yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/AiChatController.java | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/AiChatConversationController.java | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/AiChatMessageController.java | 44 ++++++++++++++++++++++++++++++++++++++++++++ yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/AiChatRoleController.java | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/ChatController.java | 56 -------------------------------------------------------- yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/ChatConversationController.java | 64 ---------------------------------------------------------------- yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/ChatMessageController.java | 44 -------------------------------------------- yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/ChatRoleController.java | 64 ---------------------------------------------------------------- yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/convert/AiChatConversationConvert.java | 37 +++++++++++++++++++++++++++++++++++++ yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/convert/AiChatMessageConvert.java | 29 +++++++++++++++++++++++++++++ yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/convert/AiChatModalConvert.java | 38 ++++++++++++++++++++++++++++++++++++++ yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/convert/AiChatRoleConvert.java | 47 +++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/convert/ChatConversationConvert.java | 37 ------------------------------------- yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/convert/ChatMessageConvert.java | 29 ----------------------------- yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/convert/ChatModalConvert.java | 38 -------------------------------------- yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/convert/ChatRoleConvert.java | 47 ----------------------------------------------- yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/mapper/AiChatMessageMapper.java | 1 - yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/AiChatConversationService.java | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/AiChatMessageService.java | 31 +++++++++++++++++++++++++++++++ yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/AiChatRoleService.java | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/AiChatService.java | 31 +++++++++++++++++++++++++++++++ yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/ChatConversationService.java | 58 ---------------------------------------------------------- yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/ChatMessageService.java | 31 ------------------------------- yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/ChatRoleService.java | 57 --------------------------------------------------------- yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/ChatService.java | 31 ------------------------------- yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/AiChatConversationServiceImpl.java | 113 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/AiChatMessageServiceImpl.java | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/AiChatModalServiceImpl.java | 8 ++++---- yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/AiChatRoleServiceImpl.java | 112 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/AiChatServiceImpl.java | 171 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/ChatConversationServiceImpl.java | 113 ----------------------------------------------------------------------------------------------------------------- yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/ChatMessageServiceImpl.java | 70 ---------------------------------------------------------------------- yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/ChatRoleServiceImpl.java | 112 ---------------------------------------------------------------------------------------------------------------- yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/ChatServiceImpl.java | 171 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatConversationCreateRoleReq.java | 26 ++++++++++++++++++++++++++ yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatConversationCreateUserReq.java | 22 ++++++++++++++++++++++ yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatConversationListReq.java | 20 ++++++++++++++++++++ yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatConversationRes.java | 38 ++++++++++++++++++++++++++++++++++++++ yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatMessageDeleteReq.java | 28 ++++++++++++++++++++++++++++ yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatMessageListRes.java | 42 ++++++++++++++++++++++++++++++++++++++++++ yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatMessageReq.java | 24 ++++++++++++++++++++++++ yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatReq.java | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatReqVO.java | 4 ++-- yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatRoleAddReq.java | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatRoleListReq.java | 20 ++++++++++++++++++++ yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatRoleListRes.java | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatRoleUpdateReq.java | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatRoleUpdateVisibilityReq.java | 22 ++++++++++++++++++++++ yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatConversationCreateRoleReq.java | 26 -------------------------- yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatConversationCreateUserReq.java | 22 ---------------------- yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatConversationListReq.java | 20 -------------------- yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatConversationRes.java | 38 -------------------------------------- yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatMessageDeleteReq.java | 28 ---------------------------- yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatMessageListRes.java | 42 ------------------------------------------ yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatMessageReq.java | 24 ------------------------ yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatReq.java | 48 ------------------------------------------------ yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatRoleAddReq.java | 54 ------------------------------------------------------ yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatRoleListReq.java | 20 -------------------- yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatRoleListRes.java | 52 ---------------------------------------------------- yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatRoleUpdateReq.java | 54 ------------------------------------------------------ yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatRoleUpdateVisibilityReq.java | 22 ---------------------- 73 files changed, 1684 insertions(+), 1694 deletions(-) create mode 100644 yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/AiChatConversationTypeEnum.java create mode 100644 yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/AiChatRoleClassifyEnum.java create mode 100644 yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/AiChatRoleSourceEnum.java create mode 100644 yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/AiChatRoleVisibilityEnum.java create mode 100644 yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/AiChatTypeEnum.java create mode 100644 yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/AiOpenAiModelEnum.java delete mode 100644 yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/ChatConversationTypeEnum.java delete mode 100644 yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/ChatRoleClassifyEnum.java delete mode 100644 yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/ChatRoleSourceEnum.java delete mode 100644 yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/ChatRoleVisibilityEnum.java delete mode 100644 yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/ChatTypeEnum.java delete mode 100644 yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/OpenAiModelEnum.java create mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/AiChatController.java create mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/AiChatConversationController.java create mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/AiChatMessageController.java create mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/AiChatRoleController.java delete mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/ChatController.java delete mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/ChatConversationController.java delete mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/ChatMessageController.java delete mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/ChatRoleController.java create mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/convert/AiChatConversationConvert.java create mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/convert/AiChatMessageConvert.java create mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/convert/AiChatModalConvert.java create mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/convert/AiChatRoleConvert.java delete mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/convert/ChatConversationConvert.java delete mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/convert/ChatMessageConvert.java delete mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/convert/ChatModalConvert.java delete mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/convert/ChatRoleConvert.java create mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/AiChatConversationService.java create mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/AiChatMessageService.java create mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/AiChatRoleService.java create mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/AiChatService.java delete mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/ChatConversationService.java delete mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/ChatMessageService.java delete mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/ChatRoleService.java delete mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/ChatService.java create mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/AiChatConversationServiceImpl.java create mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/AiChatMessageServiceImpl.java create mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/AiChatRoleServiceImpl.java create mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/AiChatServiceImpl.java delete mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/ChatConversationServiceImpl.java delete mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/ChatMessageServiceImpl.java delete mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/ChatRoleServiceImpl.java delete mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/ChatServiceImpl.java create mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatConversationCreateRoleReq.java create mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatConversationCreateUserReq.java create mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatConversationListReq.java create mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatConversationRes.java create mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatMessageDeleteReq.java create mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatMessageListRes.java create mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatMessageReq.java create mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatReq.java create mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatRoleAddReq.java create mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatRoleListReq.java create mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatRoleListRes.java create mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatRoleUpdateReq.java create mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatRoleUpdateVisibilityReq.java delete mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatConversationCreateRoleReq.java delete mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatConversationCreateUserReq.java delete mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatConversationListReq.java delete mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatConversationRes.java delete mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatMessageDeleteReq.java delete mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatMessageListRes.java delete mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatMessageReq.java delete mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatReq.java delete mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatRoleAddReq.java delete mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatRoleListReq.java delete mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatRoleListRes.java delete mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatRoleUpdateReq.java delete mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatRoleUpdateVisibilityReq.java diff --git a/yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/AiChatConversationTypeEnum.java b/yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/AiChatConversationTypeEnum.java new file mode 100644 index 0000000..a91bed9 --- /dev/null +++ b/yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/AiChatConversationTypeEnum.java @@ -0,0 +1,37 @@ +package cn.iocoder.yudao.module.ai.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 对话类型 + * 创建对话、继续对话 + * + * @author fansili + * @time 2024/4/14 18:15 + * @since 1.0 + */ +@AllArgsConstructor +@Getter +public enum AiChatConversationTypeEnum { + + // roleChat、userChat + ROLE_CHAT("roleChat", "角色对话"), + USER_CHAT("userChat", "用户对话"), + + ; + + private String type; + + private String name; + + public static AiChatConversationTypeEnum valueOfType(String type) { + for (AiChatConversationTypeEnum itemEnum : AiChatConversationTypeEnum.values()) { + if (itemEnum.getType().equals(type)) { + return itemEnum; + } + } + throw new IllegalArgumentException("Invalid MessageType value: " + type); + } + +} diff --git a/yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/AiChatRoleClassifyEnum.java b/yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/AiChatRoleClassifyEnum.java new file mode 100644 index 0000000..2221ef7 --- /dev/null +++ b/yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/AiChatRoleClassifyEnum.java @@ -0,0 +1,37 @@ +package cn.iocoder.yudao.module.ai.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 聊天role 分类 + * + * @author fansili + * @time 2024/4/24 16:41 + * @since 1.0 + */ +@AllArgsConstructor +@Getter +public enum AiChatRoleClassifyEnum { + + WRITING("writing", "写作"), + + ENTERTAINMENT("entertainment", "娱乐"), + + ; + + + private String classify; + + private String name; + + + public static AiChatRoleClassifyEnum valueOfClassify(String classify) { + for (AiChatRoleClassifyEnum itemEnum : AiChatRoleClassifyEnum.values()) { + if (itemEnum.getClassify().equals(classify)) { + return itemEnum; + } + } + throw new IllegalArgumentException("Invalid MessageType value: " + classify); + } +} diff --git a/yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/AiChatRoleSourceEnum.java b/yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/AiChatRoleSourceEnum.java new file mode 100644 index 0000000..94b0044 --- /dev/null +++ b/yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/AiChatRoleSourceEnum.java @@ -0,0 +1,36 @@ +package cn.iocoder.yudao.module.ai.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * chat角色 source + * + * @author fansili + * @time 2024/4/24 16:37 + * @since 1.0 + */ +@AllArgsConstructor +@Getter +public enum AiChatRoleSourceEnum { + + SYSTEM("system", "系统"), + CUSTOMER("customer", "用户自定义"), + + + ; + + private String type; + + private String name; + + + public static AiChatRoleSourceEnum valueOfType(String type) { + for (AiChatRoleSourceEnum itemEnum : AiChatRoleSourceEnum.values()) { + if (itemEnum.getType().equals(type)) { + return itemEnum; + } + } + throw new IllegalArgumentException("Invalid MessageType value: " + type); + } +} diff --git a/yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/AiChatRoleVisibilityEnum.java b/yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/AiChatRoleVisibilityEnum.java new file mode 100644 index 0000000..ec7a19a --- /dev/null +++ b/yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/AiChatRoleVisibilityEnum.java @@ -0,0 +1,36 @@ +package cn.iocoder.yudao.module.ai.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * chat角色 可见范围 + * + * @author fansili + * @time 2024/4/24 16:44 + * @since 1.0 + */ +@AllArgsConstructor +@Getter +public enum AiChatRoleVisibilityEnum { + + PUBLIC("public", "公开"), + PRIVATE("private", "私有的"), + + ; + + private String type; + + private String name; + + + public static AiChatRoleVisibilityEnum valueOfType(String type) { + for (AiChatRoleVisibilityEnum itemEnum : AiChatRoleVisibilityEnum.values()) { + if (itemEnum.getType().equals(type)) { + return itemEnum; + } + } + throw new IllegalArgumentException("Invalid MessageType value: " + type); + } + +} diff --git a/yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/AiChatTypeEnum.java b/yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/AiChatTypeEnum.java new file mode 100644 index 0000000..6ee7fab --- /dev/null +++ b/yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/AiChatTypeEnum.java @@ -0,0 +1,34 @@ +package cn.iocoder.yudao.module.ai.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 聊天类型 + * + * @author fansili + * @time 2024/4/14 17:58 + * @since 1.0 + */ +@AllArgsConstructor +@Getter +public enum AiChatTypeEnum { + + ROLE_CHAT("roleChat", "角色模板聊天"), + USER_CHAT("userChat", "用户普通聊天"), + + ; + + private String type; + + private String name; + + public static AiChatTypeEnum valueOfType(String type) { + for (AiChatTypeEnum itemEnum : AiChatTypeEnum.values()) { + if (itemEnum.getType().equals(type)) { + return itemEnum; + } + } + throw new IllegalArgumentException("Invalid MessageType value: " + type); + } +} diff --git a/yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/AiOpenAiModelEnum.java b/yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/AiOpenAiModelEnum.java new file mode 100644 index 0000000..d87c980 --- /dev/null +++ b/yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/AiOpenAiModelEnum.java @@ -0,0 +1,35 @@ +package cn.iocoder.yudao.module.ai.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +// TODO done @fansili:1)类注释要加下;2)author 和 time 用 javadoc,@author 和 @since;3)@AllArgsConstructor 使用这个注解,去掉构造方法;4)value 改成 model 字段,然后注释都写下哈;5)message 改成 name,然后注释都写下哈 +/** + * @author: fansili + * @time: 2024/3/4 12:36 + */ +@Getter +@AllArgsConstructor +public enum AiOpenAiModelEnum { + + /** + * open ai 3.5模型 + */ + OPEN_AI_GPT_3_5("gpt-3.5-turbo", "GPT3.5"), + /** + * open ai 4.0 收费模型 + */ + OPEN_AI_GPT_4("gpt-4-turbo", "GPT4") + + ; + + /** + * 模型 - 用于参数传递 + */ + private String model; + /** + * 模型名字 - 用于展示 + */ + private String name; + +} diff --git a/yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/ChatConversationTypeEnum.java b/yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/ChatConversationTypeEnum.java deleted file mode 100644 index 18891bb..0000000 --- a/yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/ChatConversationTypeEnum.java +++ /dev/null @@ -1,37 +0,0 @@ -package cn.iocoder.yudao.module.ai.enums; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 对话类型 - * 创建对话、继续对话 - * - * @author fansili - * @time 2024/4/14 18:15 - * @since 1.0 - */ -@AllArgsConstructor -@Getter -public enum ChatConversationTypeEnum { - - // roleChat、userChat - ROLE_CHAT("roleChat", "角色对话"), - USER_CHAT("userChat", "用户对话"), - - ; - - private String type; - - private String name; - - public static ChatConversationTypeEnum valueOfType(String type) { - for (ChatConversationTypeEnum itemEnum : ChatConversationTypeEnum.values()) { - if (itemEnum.getType().equals(type)) { - return itemEnum; - } - } - throw new IllegalArgumentException("Invalid MessageType value: " + type); - } - -} diff --git a/yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/ChatRoleClassifyEnum.java b/yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/ChatRoleClassifyEnum.java deleted file mode 100644 index 583bf74..0000000 --- a/yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/ChatRoleClassifyEnum.java +++ /dev/null @@ -1,37 +0,0 @@ -package cn.iocoder.yudao.module.ai.enums; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 聊天role 分类 - * - * @author fansili - * @time 2024/4/24 16:41 - * @since 1.0 - */ -@AllArgsConstructor -@Getter -public enum ChatRoleClassifyEnum { - - WRITING("writing", "写作"), - - ENTERTAINMENT("entertainment", "娱乐"), - - ; - - - private String classify; - - private String name; - - - public static ChatRoleClassifyEnum valueOfClassify(String classify) { - for (ChatRoleClassifyEnum itemEnum : ChatRoleClassifyEnum.values()) { - if (itemEnum.getClassify().equals(classify)) { - return itemEnum; - } - } - throw new IllegalArgumentException("Invalid MessageType value: " + classify); - } -} diff --git a/yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/ChatRoleSourceEnum.java b/yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/ChatRoleSourceEnum.java deleted file mode 100644 index 877da17..0000000 --- a/yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/ChatRoleSourceEnum.java +++ /dev/null @@ -1,36 +0,0 @@ -package cn.iocoder.yudao.module.ai.enums; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * chat角色 source - * - * @author fansili - * @time 2024/4/24 16:37 - * @since 1.0 - */ -@AllArgsConstructor -@Getter -public enum ChatRoleSourceEnum { - - SYSTEM("system", "系统"), - CUSTOMER("customer", "用户自定义"), - - - ; - - private String type; - - private String name; - - - public static ChatRoleSourceEnum valueOfType(String type) { - for (ChatRoleSourceEnum itemEnum : ChatRoleSourceEnum.values()) { - if (itemEnum.getType().equals(type)) { - return itemEnum; - } - } - throw new IllegalArgumentException("Invalid MessageType value: " + type); - } -} diff --git a/yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/ChatRoleVisibilityEnum.java b/yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/ChatRoleVisibilityEnum.java deleted file mode 100644 index c8b09ae..0000000 --- a/yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/ChatRoleVisibilityEnum.java +++ /dev/null @@ -1,36 +0,0 @@ -package cn.iocoder.yudao.module.ai.enums; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * chat角色 可见范围 - * - * @author fansili - * @time 2024/4/24 16:44 - * @since 1.0 - */ -@AllArgsConstructor -@Getter -public enum ChatRoleVisibilityEnum { - - PUBLIC("public", "公开"), - PRIVATE("private", "私有的"), - - ; - - private String type; - - private String name; - - - public static ChatRoleVisibilityEnum valueOfType(String type) { - for (ChatRoleVisibilityEnum itemEnum : ChatRoleVisibilityEnum.values()) { - if (itemEnum.getType().equals(type)) { - return itemEnum; - } - } - throw new IllegalArgumentException("Invalid MessageType value: " + type); - } - -} diff --git a/yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/ChatTypeEnum.java b/yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/ChatTypeEnum.java deleted file mode 100644 index cdf7c3b..0000000 --- a/yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/ChatTypeEnum.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.iocoder.yudao.module.ai.enums; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 聊天类型 - * - * @author fansili - * @time 2024/4/14 17:58 - * @since 1.0 - */ -@AllArgsConstructor -@Getter -public enum ChatTypeEnum { - - ROLE_CHAT("roleChat", "角色模板聊天"), - USER_CHAT("userChat", "用户普通聊天"), - - ; - - private String type; - - private String name; - - public static ChatTypeEnum valueOfType(String type) { - for (ChatTypeEnum itemEnum : ChatTypeEnum.values()) { - if (itemEnum.getType().equals(type)) { - return itemEnum; - } - } - throw new IllegalArgumentException("Invalid MessageType value: " + type); - } -} diff --git a/yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/OpenAiModelEnum.java b/yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/OpenAiModelEnum.java deleted file mode 100644 index 3daa3f5..0000000 --- a/yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/OpenAiModelEnum.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.iocoder.yudao.module.ai.enums; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -// TODO done @fansili:1)类注释要加下;2)author 和 time 用 javadoc,@author 和 @since;3)@AllArgsConstructor 使用这个注解,去掉构造方法;4)value 改成 model 字段,然后注释都写下哈;5)message 改成 name,然后注释都写下哈 -/** - * @author: fansili - * @time: 2024/3/4 12:36 - */ -@Getter -@AllArgsConstructor -public enum OpenAiModelEnum { - - /** - * open ai 3.5模型 - */ - OPEN_AI_GPT_3_5("gpt-3.5-turbo", "GPT3.5"), - /** - * open ai 4.0 收费模型 - */ - OPEN_AI_GPT_4("gpt-4-turbo", "GPT4") - - ; - - /** - * 模型 - 用于参数传递 - */ - private String model; - /** - * 模型名字 - 用于展示 - */ - private String name; - -} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/AiChatController.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/AiChatController.java new file mode 100644 index 0000000..09b83fc --- /dev/null +++ b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/AiChatController.java @@ -0,0 +1,50 @@ +package cn.iocoder.yudao.module.ai.controller; + +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.module.ai.service.AiChatService; +import cn.iocoder.yudao.module.ai.vo.AiChatReq; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; + +/** + * ia 模块 + * + * @author fansili + * @time 2024/4/13 17:44 + * @since 1.0 + */ +@Tag(name = "A1-AI聊天") +@RestController +@RequestMapping("/ai") +@Slf4j +@AllArgsConstructor +public class AiChatController { + + @Autowired + private final AiChatService chatService; + + @Operation(summary = "聊天-chat", description = "这个一般等待时间比较久,需要全部完成才会返回!") + @GetMapping("/chat") + public CommonResult chat(@Validated @ModelAttribute AiChatReq req) { + return CommonResult.success(chatService.chat(req)); + } + + // TODO @芋艿:调用这个方法异常,Unable to handle the Spring Security Exception because the response is already committed. + @Operation(summary = "聊天-stream", description = "这里跟通义千问一样采用的是 Server-Sent Events (SSE) 通讯模式") + @GetMapping(value = "/chatStream", produces = MediaType.TEXT_EVENT_STREAM_VALUE) + public SseEmitter chatStream(@Validated @ModelAttribute AiChatReq req) { + Utf8SseEmitter sseEmitter = new Utf8SseEmitter(); + chatService.chatStream(req, sseEmitter); + return sseEmitter; + } +} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/AiChatConversationController.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/AiChatConversationController.java new file mode 100644 index 0000000..e0f9420 --- /dev/null +++ b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/AiChatConversationController.java @@ -0,0 +1,64 @@ +package cn.iocoder.yudao.module.ai.controller; + +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.module.ai.service.AiChatConversationService; +import cn.iocoder.yudao.module.ai.vo.AiChatConversationCreateRoleReq; +import cn.iocoder.yudao.module.ai.vo.AiChatConversationCreateUserReq; +import cn.iocoder.yudao.module.ai.vo.AiChatConversationListReq; +import cn.iocoder.yudao.module.ai.vo.AiChatConversationRes; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * ia 模块 + * + * @author fansili + * @time 2024/4/13 17:44 + * @since 1.0 + */ +@Tag(name = "A2-聊天-对话") +@RestController +@RequestMapping("/ai/chat/conversation") +@Slf4j +@AllArgsConstructor +public class AiChatConversationController { + + private final AiChatConversationService chatConversationService; + + @Operation(summary = "创建 - 对话普通对话") + @PostMapping("/createConversation") + public CommonResult createConversation(@RequestBody @Validated AiChatConversationCreateUserReq req) { + return CommonResult.success(chatConversationService.createConversation(req)); + } + + @Operation(summary = "创建 - 对话角色对话") + @PostMapping("/createRoleConversation") + public CommonResult createRoleConversation(@RequestBody @Validated AiChatConversationCreateRoleReq req) { + return CommonResult.success(chatConversationService.createRoleConversation(req)); + } + + @Operation(summary = "获取 - 获取对话") + @GetMapping("/{id}") + public CommonResult getConversation(@PathVariable("id") Long id) { + return CommonResult.success(chatConversationService.getConversation(id)); + } + + @Operation(summary = "获取 - 获取对话list") + @GetMapping("/list") + public CommonResult> listConversation(@ModelAttribute @Validated AiChatConversationListReq req) { + return CommonResult.success(chatConversationService.listConversation(req)); + } + + @Operation(summary = "删除") + @DeleteMapping("/{id}") + public CommonResult delete(@PathVariable("id") Long id) { + chatConversationService.delete(id); + return CommonResult.success(null); + } +} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/AiChatMessageController.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/AiChatMessageController.java new file mode 100644 index 0000000..ecfb6c8 --- /dev/null +++ b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/AiChatMessageController.java @@ -0,0 +1,44 @@ +package cn.iocoder.yudao.module.ai.controller; + +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.ai.service.AiChatMessageService; +import cn.iocoder.yudao.module.ai.vo.AiChatMessageListRes; +import cn.iocoder.yudao.module.ai.vo.AiChatMessageReq; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +/** + * chat message + * + * @author fansili + * @time 2024/4/24 17:22 + * @since 1.0 + */ +@Tag(name = "A3-聊天-对话") +@RestController +@RequestMapping("/ai/chat/message") +@Slf4j +@AllArgsConstructor +public class AiChatMessageController { + + private final AiChatMessageService chatMessageService; + + @Operation(summary = "聊天记录", description = "查询个人的聊天记录") + @GetMapping("/list") + public PageResult list(@Validated @ModelAttribute AiChatMessageReq req) { + return chatMessageService.list(req); + } + + @Operation(summary = "聊天记录 - 删除", description = "删除记录") + @DeleteMapping("/{chatConversationId}/{id}") + public CommonResult delete(@PathVariable("chatConversationId") Long chatConversationId, + @PathVariable("id") Long id) { + chatMessageService.delete(chatConversationId, id); + return CommonResult.success(null); + } +} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/AiChatRoleController.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/AiChatRoleController.java new file mode 100644 index 0000000..137b8bf --- /dev/null +++ b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/AiChatRoleController.java @@ -0,0 +1,64 @@ +package cn.iocoder.yudao.module.ai.controller; + +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.ai.service.AiChatRoleService; +import cn.iocoder.yudao.module.ai.vo.*; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +/** + * ai chat 角色 + * + * @fansili + * @since v1.0 + */ +@Tag(name = "A4-chat角色") +@RestController +@RequestMapping("/ai/chat") +@Slf4j +@AllArgsConstructor +public class AiChatRoleController { + + private final AiChatRoleService chatRoleService; + + @Operation(summary = "chat角色 - 角色列表") + @GetMapping("/role/list") + public PageResult list(@Validated @ModelAttribute AiChatRoleListReq req) { + return chatRoleService.list(req); + } + + @Operation(summary = "chat角色 - 添加") + @PutMapping("/role") + public CommonResult add(@Validated @RequestBody AiChatRoleAddReq req) { + chatRoleService.add(req); + return CommonResult.success(null); + } + + @Operation(summary = "chat角色 - 修改") + @PostMapping("/role/{id}") + public CommonResult update(@PathVariable("id") Long id, + @Validated @RequestBody AiChatRoleUpdateReq req) { + chatRoleService.update(id, req); + return CommonResult.success(null); + } + + @Operation(summary = "chat角色 - 修改可见性") + @PostMapping("/role/{id}/update-visibility") + public CommonResult updateVisibility(@PathVariable("id") Long id, + @Validated @RequestBody AiChatRoleUpdateVisibilityReq req) { + chatRoleService.updateVisibility(id, req); + return CommonResult.success(null); + } + + @Operation(summary = "chat角色 - 删除") + @DeleteMapping("/role/{id}") + public CommonResult delete(@PathVariable("id") Long id) { + chatRoleService.delete(id); + return CommonResult.success(null); + } +} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/ChatController.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/ChatController.java deleted file mode 100644 index 9b7f9f3..0000000 --- a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/ChatController.java +++ /dev/null @@ -1,56 +0,0 @@ -package cn.iocoder.yudao.module.ai.controller; - -import cn.hutool.core.exceptions.ExceptionUtil; -import cn.iocoder.yudao.framework.ai.chat.ChatResponse; -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.module.ai.service.ChatService; -import cn.iocoder.yudao.module.ai.vo.ChatReq; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.MediaType; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; -import reactor.core.publisher.Flux; - -import java.io.IOException; -import java.util.function.Consumer; - -/** - * ia 模块 - * - * @author fansili - * @time 2024/4/13 17:44 - * @since 1.0 - */ -@Tag(name = "A1-AI聊天") -@RestController -@RequestMapping("/ai") -@Slf4j -@AllArgsConstructor -public class ChatController { - - @Autowired - private final ChatService chatService; - - @Operation(summary = "聊天-chat", description = "这个一般等待时间比较久,需要全部完成才会返回!") - @GetMapping("/chat") - public CommonResult chat(@Validated @ModelAttribute ChatReq req) { - return CommonResult.success(chatService.chat(req)); - } - - // TODO @芋艿:调用这个方法异常,Unable to handle the Spring Security Exception because the response is already committed. - @Operation(summary = "聊天-stream", description = "这里跟通义千问一样采用的是 Server-Sent Events (SSE) 通讯模式") - @GetMapping(value = "/chatStream", produces = MediaType.TEXT_EVENT_STREAM_VALUE) - public SseEmitter chatStream(@Validated @ModelAttribute ChatReq req) { - Utf8SseEmitter sseEmitter = new Utf8SseEmitter(); - chatService.chatStream(req, sseEmitter); - return sseEmitter; - } -} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/ChatConversationController.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/ChatConversationController.java deleted file mode 100644 index ffd75cd..0000000 --- a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/ChatConversationController.java +++ /dev/null @@ -1,64 +0,0 @@ -package cn.iocoder.yudao.module.ai.controller; - -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.module.ai.service.ChatConversationService; -import cn.iocoder.yudao.module.ai.vo.ChatConversationCreateRoleReq; -import cn.iocoder.yudao.module.ai.vo.ChatConversationCreateUserReq; -import cn.iocoder.yudao.module.ai.vo.ChatConversationListReq; -import cn.iocoder.yudao.module.ai.vo.ChatConversationRes; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * ia 模块 - * - * @author fansili - * @time 2024/4/13 17:44 - * @since 1.0 - */ -@Tag(name = "A2-聊天-对话") -@RestController -@RequestMapping("/ai/chat/conversation") -@Slf4j -@AllArgsConstructor -public class ChatConversationController { - - private final ChatConversationService chatConversationService; - - @Operation(summary = "创建 - 对话普通对话") - @PostMapping("/createConversation") - public CommonResult createConversation(@RequestBody @Validated ChatConversationCreateUserReq req) { - return CommonResult.success(chatConversationService.createConversation(req)); - } - - @Operation(summary = "创建 - 对话角色对话") - @PostMapping("/createRoleConversation") - public CommonResult createRoleConversation(@RequestBody @Validated ChatConversationCreateRoleReq req) { - return CommonResult.success(chatConversationService.createRoleConversation(req)); - } - - @Operation(summary = "获取 - 获取对话") - @GetMapping("/{id}") - public CommonResult getConversation(@PathVariable("id") Long id) { - return CommonResult.success(chatConversationService.getConversation(id)); - } - - @Operation(summary = "获取 - 获取对话list") - @GetMapping("/list") - public CommonResult> listConversation(@ModelAttribute @Validated ChatConversationListReq req) { - return CommonResult.success(chatConversationService.listConversation(req)); - } - - @Operation(summary = "删除") - @DeleteMapping("/{id}") - public CommonResult delete(@PathVariable("id") Long id) { - chatConversationService.delete(id); - return CommonResult.success(null); - } -} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/ChatMessageController.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/ChatMessageController.java deleted file mode 100644 index f864508..0000000 --- a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/ChatMessageController.java +++ /dev/null @@ -1,44 +0,0 @@ -package cn.iocoder.yudao.module.ai.controller; - -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.ai.service.ChatMessageService; -import cn.iocoder.yudao.module.ai.vo.ChatMessageListRes; -import cn.iocoder.yudao.module.ai.vo.ChatMessageReq; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -/** - * chat message - * - * @author fansili - * @time 2024/4/24 17:22 - * @since 1.0 - */ -@Tag(name = "A3-聊天-对话") -@RestController -@RequestMapping("/ai/chat/message") -@Slf4j -@AllArgsConstructor -public class ChatMessageController { - - private final ChatMessageService chatMessageService; - - @Operation(summary = "聊天记录", description = "查询个人的聊天记录") - @GetMapping("/list") - public PageResult list(@Validated @ModelAttribute ChatMessageReq req) { - return chatMessageService.list(req); - } - - @Operation(summary = "聊天记录 - 删除", description = "删除记录") - @DeleteMapping("/{chatConversationId}/{id}") - public CommonResult delete(@PathVariable("chatConversationId") Long chatConversationId, - @PathVariable("id") Long id) { - chatMessageService.delete(chatConversationId, id); - return CommonResult.success(null); - } -} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/ChatRoleController.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/ChatRoleController.java deleted file mode 100644 index 9473296..0000000 --- a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/ChatRoleController.java +++ /dev/null @@ -1,64 +0,0 @@ -package cn.iocoder.yudao.module.ai.controller; - -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.ai.service.ChatRoleService; -import cn.iocoder.yudao.module.ai.vo.*; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -/** - * ai chat 角色 - * - * @fansili - * @since v1.0 - */ -@Tag(name = "A4-chat角色") -@RestController -@RequestMapping("/ai/chat") -@Slf4j -@AllArgsConstructor -public class ChatRoleController { - - private final ChatRoleService chatRoleService; - - @Operation(summary = "chat角色 - 角色列表") - @GetMapping("/role/list") - public PageResult list(@Validated @ModelAttribute ChatRoleListReq req) { - return chatRoleService.list(req); - } - - @Operation(summary = "chat角色 - 添加") - @PutMapping("/role") - public CommonResult add(@Validated @RequestBody ChatRoleAddReq req) { - chatRoleService.add(req); - return CommonResult.success(null); - } - - @Operation(summary = "chat角色 - 修改") - @PostMapping("/role/{id}") - public CommonResult update(@PathVariable("id") Long id, - @Validated @RequestBody ChatRoleUpdateReq req) { - chatRoleService.update(id, req); - return CommonResult.success(null); - } - - @Operation(summary = "chat角色 - 修改可见性") - @PostMapping("/role/{id}/update-visibility") - public CommonResult updateVisibility(@PathVariable("id") Long id, - @Validated @RequestBody ChatRoleUpdateVisibilityReq req) { - chatRoleService.updateVisibility(id, req); - return CommonResult.success(null); - } - - @Operation(summary = "chat角色 - 删除") - @DeleteMapping("/role/{id}") - public CommonResult delete(@PathVariable("id") Long id) { - chatRoleService.delete(id); - return CommonResult.success(null); - } -} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/convert/AiChatConversationConvert.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/convert/AiChatConversationConvert.java new file mode 100644 index 0000000..d6c93a1 --- /dev/null +++ b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/convert/AiChatConversationConvert.java @@ -0,0 +1,37 @@ +package cn.iocoder.yudao.module.ai.convert; + +import cn.iocoder.yudao.module.ai.dal.dataobject.AiChatConversationDO; +import cn.iocoder.yudao.module.ai.vo.AiChatConversationRes; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 聊天 对话 convert + * + * @author fansili + * @time 2024/4/18 16:39 + * @since 1.0 + */ +@Mapper +public interface AiChatConversationConvert { + + AiChatConversationConvert INSTANCE = Mappers.getMapper(AiChatConversationConvert.class); + + /** + * 转换 - 多个 ChatConversationRes + * + * @param top100Conversation + * @return + */ + List covnertChatConversationResList(List top100Conversation); + + /** + * 转换 - 单个 ChatConversationRes + * + * @param aiChatConversationDO + * @return + */ + AiChatConversationRes covnertChatConversationRes(AiChatConversationDO aiChatConversationDO); +} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/convert/AiChatMessageConvert.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/convert/AiChatMessageConvert.java new file mode 100644 index 0000000..3a920a4 --- /dev/null +++ b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/convert/AiChatMessageConvert.java @@ -0,0 +1,29 @@ +package cn.iocoder.yudao.module.ai.convert; + +import cn.iocoder.yudao.module.ai.dal.dataobject.AiChatMessageDO; +import cn.iocoder.yudao.module.ai.vo.AiChatMessageListRes; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 聊天 对话 convert + * + * @author fansili + * @time 2024/4/18 16:39 + * @since 1.0 + */ +@Mapper +public interface AiChatMessageConvert { + + AiChatMessageConvert INSTANCE = Mappers.getMapper(AiChatMessageConvert.class); + + /** + * 转换 ChatMessageListRes + * + * @param list + * @return + */ + List convert(List list); +} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/convert/AiChatModalConvert.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/convert/AiChatModalConvert.java new file mode 100644 index 0000000..cb3f644 --- /dev/null +++ b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/convert/AiChatModalConvert.java @@ -0,0 +1,38 @@ +package cn.iocoder.yudao.module.ai.convert; + +import cn.iocoder.yudao.module.ai.dal.dataobject.AiChatModalDO; +import cn.iocoder.yudao.module.ai.vo.AiChatModalAddReq; +import cn.iocoder.yudao.module.ai.vo.AiChatModalListRes; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 聊天 对话 convert + * + * @author fansili + * @time 2024/4/18 16:39 + * @since 1.0 + */ +@Mapper +public interface AiChatModalConvert { + + AiChatModalConvert INSTANCE = Mappers.getMapper(AiChatModalConvert.class); + + /** + * 转换 - AiChatModalListRes + * + * @param list + * @return + */ + List convertAiChatModalListRes(List list); + + /** + * 转换 - AiChatModalDO + * + * @param req + * @return + */ + AiChatModalDO convertAiChatModalDO(AiChatModalAddReq req); +} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/convert/AiChatRoleConvert.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/convert/AiChatRoleConvert.java new file mode 100644 index 0000000..80977c4 --- /dev/null +++ b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/convert/AiChatRoleConvert.java @@ -0,0 +1,47 @@ +package cn.iocoder.yudao.module.ai.convert; + +import cn.iocoder.yudao.module.ai.dal.dataobject.AiChatRoleDO; +import cn.iocoder.yudao.module.ai.vo.AiChatRoleAddReq; +import cn.iocoder.yudao.module.ai.vo.AiChatRoleUpdateReq; +import cn.iocoder.yudao.module.ai.vo.AiChatRoleListRes; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 聊天 对话 convert + * + * @author fansili + * @time 2024/4/18 16:39 + * @since 1.0 + */ +@Mapper +public interface AiChatRoleConvert { + + AiChatRoleConvert INSTANCE = Mappers.getMapper(AiChatRoleConvert.class); + + /** + * 转换 - ChatRoleListRes + * + * @param roleList + * @return + */ + List convertChatRoleListRes(List roleList); + + /** + * 转换 - AiChatRoleDO + * + * @param req + * @return + */ + AiChatRoleDO convertAiChatRoleDO(AiChatRoleAddReq req); + + /** + * 转换 - AiChatRoleDO + * + * @param req + * @return + */ + AiChatRoleDO convertAiChatRoleDO(AiChatRoleUpdateReq req); +} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/convert/ChatConversationConvert.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/convert/ChatConversationConvert.java deleted file mode 100644 index b2f6951..0000000 --- a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/convert/ChatConversationConvert.java +++ /dev/null @@ -1,37 +0,0 @@ -package cn.iocoder.yudao.module.ai.convert; - -import cn.iocoder.yudao.module.ai.dal.dataobject.AiChatConversationDO; -import cn.iocoder.yudao.module.ai.vo.ChatConversationRes; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -/** - * 聊天 对话 convert - * - * @author fansili - * @time 2024/4/18 16:39 - * @since 1.0 - */ -@Mapper -public interface ChatConversationConvert { - - ChatConversationConvert INSTANCE = Mappers.getMapper(ChatConversationConvert.class); - - /** - * 转换 - 多个 ChatConversationRes - * - * @param top100Conversation - * @return - */ - List covnertChatConversationResList(List top100Conversation); - - /** - * 转换 - 单个 ChatConversationRes - * - * @param aiChatConversationDO - * @return - */ - ChatConversationRes covnertChatConversationRes(AiChatConversationDO aiChatConversationDO); -} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/convert/ChatMessageConvert.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/convert/ChatMessageConvert.java deleted file mode 100644 index 9176d01..0000000 --- a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/convert/ChatMessageConvert.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.iocoder.yudao.module.ai.convert; - -import cn.iocoder.yudao.module.ai.dal.dataobject.AiChatMessageDO; -import cn.iocoder.yudao.module.ai.vo.ChatMessageListRes; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -/** - * 聊天 对话 convert - * - * @author fansili - * @time 2024/4/18 16:39 - * @since 1.0 - */ -@Mapper -public interface ChatMessageConvert { - - ChatMessageConvert INSTANCE = Mappers.getMapper(ChatMessageConvert.class); - - /** - * 转换 ChatMessageListRes - * - * @param list - * @return - */ - List convert(List list); -} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/convert/ChatModalConvert.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/convert/ChatModalConvert.java deleted file mode 100644 index a83d4f0..0000000 --- a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/convert/ChatModalConvert.java +++ /dev/null @@ -1,38 +0,0 @@ -package cn.iocoder.yudao.module.ai.convert; - -import cn.iocoder.yudao.module.ai.dal.dataobject.AiChatModalDO; -import cn.iocoder.yudao.module.ai.vo.AiChatModalAddReq; -import cn.iocoder.yudao.module.ai.vo.AiChatModalListRes; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -/** - * 聊天 对话 convert - * - * @author fansili - * @time 2024/4/18 16:39 - * @since 1.0 - */ -@Mapper -public interface ChatModalConvert { - - ChatModalConvert INSTANCE = Mappers.getMapper(ChatModalConvert.class); - - /** - * 转换 - AiChatModalListRes - * - * @param list - * @return - */ - List convertAiChatModalListRes(List list); - - /** - * 转换 - AiChatModalDO - * - * @param req - * @return - */ - AiChatModalDO convertAiChatModalDO(AiChatModalAddReq req); -} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/convert/ChatRoleConvert.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/convert/ChatRoleConvert.java deleted file mode 100644 index d30ea80..0000000 --- a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/convert/ChatRoleConvert.java +++ /dev/null @@ -1,47 +0,0 @@ -package cn.iocoder.yudao.module.ai.convert; - -import cn.iocoder.yudao.module.ai.dal.dataobject.AiChatRoleDO; -import cn.iocoder.yudao.module.ai.vo.ChatRoleAddReq; -import cn.iocoder.yudao.module.ai.vo.ChatRoleListRes; -import cn.iocoder.yudao.module.ai.vo.ChatRoleUpdateReq; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; - -/** - * 聊天 对话 convert - * - * @author fansili - * @time 2024/4/18 16:39 - * @since 1.0 - */ -@Mapper -public interface ChatRoleConvert { - - ChatRoleConvert INSTANCE = Mappers.getMapper(ChatRoleConvert.class); - - /** - * 转换 - ChatRoleListRes - * - * @param roleList - * @return - */ - List convertChatRoleListRes(List roleList); - - /** - * 转换 - AiChatRoleDO - * - * @param req - * @return - */ - AiChatRoleDO convertAiChatRoleDO(ChatRoleAddReq req); - - /** - * 转换 - AiChatRoleDO - * - * @param req - * @return - */ - AiChatRoleDO convertAiChatRoleDO(ChatRoleUpdateReq req); -} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/mapper/AiChatMessageMapper.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/mapper/AiChatMessageMapper.java index ed1127a..cdac20a 100644 --- a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/mapper/AiChatMessageMapper.java +++ b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/mapper/AiChatMessageMapper.java @@ -3,7 +3,6 @@ package cn.iocoder.yudao.module.ai.mapper; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.module.ai.dal.dataobject.AiChatMessageDO; -import cn.iocoder.yudao.module.ai.vo.ChatMessageReq; import org.apache.ibatis.annotations.Mapper; import org.springframework.stereotype.Repository; diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/AiChatConversationService.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/AiChatConversationService.java new file mode 100644 index 0000000..fbae7c8 --- /dev/null +++ b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/AiChatConversationService.java @@ -0,0 +1,58 @@ +package cn.iocoder.yudao.module.ai.service; + +import cn.iocoder.yudao.module.ai.vo.AiChatConversationCreateRoleReq; +import cn.iocoder.yudao.module.ai.vo.AiChatConversationCreateUserReq; +import cn.iocoder.yudao.module.ai.vo.AiChatConversationListReq; +import cn.iocoder.yudao.module.ai.vo.AiChatConversationRes; + +import java.util.List; + +/** + * chat 对话 + * + * @fansili + * @since v1.0 + */ +public interface AiChatConversationService { + + /** + * 对话 - 创建普通对话 + * + * @param req + * @return + */ + AiChatConversationRes createConversation(AiChatConversationCreateUserReq req); + + /** + * 对话 - 创建role对话 + * + * @param req + * @return + */ + AiChatConversationRes createRoleConversation(AiChatConversationCreateRoleReq req); + + + /** + * 获取 - 对话 + * + * @param id + * @return + */ + AiChatConversationRes getConversation(Long id); + + /** + * 获取 - 对话列表 + * + * @param req + * @return + */ + List listConversation(AiChatConversationListReq req); + + /** + * 删除 - 根据id + * + * @param id + */ + void delete(Long id); + +} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/AiChatMessageService.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/AiChatMessageService.java new file mode 100644 index 0000000..ef1cfa4 --- /dev/null +++ b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/AiChatMessageService.java @@ -0,0 +1,31 @@ +package cn.iocoder.yudao.module.ai.service; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.ai.vo.AiChatMessageListRes; +import cn.iocoder.yudao.module.ai.vo.AiChatMessageReq; + +/** + * chat message + * + * @author fansili + * @time 2024/4/24 17:25 + * @since 1.0 + */ +public interface AiChatMessageService { + + /** + * message - 列表 + * + * @param req + * @return + */ + PageResult list(AiChatMessageReq req); + + /** + * message - 删除 + * + * @param chatConversationId + * @param id + */ + void delete(Long chatConversationId, Long id); +} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/AiChatRoleService.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/AiChatRoleService.java new file mode 100644 index 0000000..d3bd201 --- /dev/null +++ b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/AiChatRoleService.java @@ -0,0 +1,54 @@ +package cn.iocoder.yudao.module.ai.service; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.ai.vo.*; + +/** + * chat 角色 + * + * @fansili + * @since v1.0 + */ +public interface AiChatRoleService { + + /** + * 获取聊天角色列表 + * + * @param req + * @return + */ + PageResult list(AiChatRoleListReq req); + + /** + * chat角色 - 添加 + * + * @param req + * @return + */ + void add(AiChatRoleAddReq req); + + /** + * chat角色 - 修改 + * + * @param id + * @param req + */ + void update(Long id, AiChatRoleUpdateReq req); + + + /** + * chat角色 - 修改可见性 + * + * @param id + * @param req + */ + void updateVisibility(Long id, AiChatRoleUpdateVisibilityReq req); + + /** + * chat角色 - 删除 + * + * @param chatRoleId + */ + void delete(Long chatRoleId); + +} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/AiChatService.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/AiChatService.java new file mode 100644 index 0000000..b3596e9 --- /dev/null +++ b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/AiChatService.java @@ -0,0 +1,31 @@ +package cn.iocoder.yudao.module.ai.service; + +import cn.iocoder.yudao.module.ai.controller.Utf8SseEmitter; +import cn.iocoder.yudao.module.ai.vo.AiChatReq; + +/** + * 聊天 chat + * + * @author fansili + * @time 2024/4/14 15:55 + * @since 1.0 + */ +public interface AiChatService { + + /** + * chat + * + * @param req + * @return + */ + String chat(AiChatReq req); + + /** + * chat stream + * + * @param req + * @param sseEmitter + * @return + */ + void chatStream(AiChatReq req, Utf8SseEmitter sseEmitter); +} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/ChatConversationService.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/ChatConversationService.java deleted file mode 100644 index 428a26e..0000000 --- a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/ChatConversationService.java +++ /dev/null @@ -1,58 +0,0 @@ -package cn.iocoder.yudao.module.ai.service; - -import cn.iocoder.yudao.module.ai.vo.ChatConversationCreateRoleReq; -import cn.iocoder.yudao.module.ai.vo.ChatConversationCreateUserReq; -import cn.iocoder.yudao.module.ai.vo.ChatConversationListReq; -import cn.iocoder.yudao.module.ai.vo.ChatConversationRes; - -import java.util.List; - -/** - * chat 对话 - * - * @fansili - * @since v1.0 - */ -public interface ChatConversationService { - - /** - * 对话 - 创建普通对话 - * - * @param req - * @return - */ - ChatConversationRes createConversation(ChatConversationCreateUserReq req); - - /** - * 对话 - 创建role对话 - * - * @param req - * @return - */ - ChatConversationRes createRoleConversation(ChatConversationCreateRoleReq req); - - - /** - * 获取 - 对话 - * - * @param id - * @return - */ - ChatConversationRes getConversation(Long id); - - /** - * 获取 - 对话列表 - * - * @param req - * @return - */ - List listConversation(ChatConversationListReq req); - - /** - * 删除 - 根据id - * - * @param id - */ - void delete(Long id); - -} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/ChatMessageService.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/ChatMessageService.java deleted file mode 100644 index 625bc1b..0000000 --- a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/ChatMessageService.java +++ /dev/null @@ -1,31 +0,0 @@ -package cn.iocoder.yudao.module.ai.service; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.ai.vo.ChatMessageListRes; -import cn.iocoder.yudao.module.ai.vo.ChatMessageReq; - -/** - * chat message - * - * @author fansili - * @time 2024/4/24 17:25 - * @since 1.0 - */ -public interface ChatMessageService { - - /** - * message - 列表 - * - * @param req - * @return - */ - PageResult list(ChatMessageReq req); - - /** - * message - 删除 - * - * @param chatConversationId - * @param id - */ - void delete(Long chatConversationId, Long id); -} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/ChatRoleService.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/ChatRoleService.java deleted file mode 100644 index d189455..0000000 --- a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/ChatRoleService.java +++ /dev/null @@ -1,57 +0,0 @@ -package cn.iocoder.yudao.module.ai.service; - -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.ai.vo.*; - -import java.util.List; - -/** - * chat 角色 - * - * @fansili - * @since v1.0 - */ -public interface ChatRoleService { - - /** - * 获取聊天角色列表 - * - * @param req - * @return - */ - PageResult list(ChatRoleListReq req); - - /** - * chat角色 - 添加 - * - * @param req - * @return - */ - void add(ChatRoleAddReq req); - - /** - * chat角色 - 修改 - * - * @param id - * @param req - */ - void update(Long id, ChatRoleUpdateReq req); - - - /** - * chat角色 - 修改可见性 - * - * @param id - * @param req - */ - void updateVisibility(Long id, ChatRoleUpdateVisibilityReq req); - - /** - * chat角色 - 删除 - * - * @param chatRoleId - */ - void delete(Long chatRoleId); - -} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/ChatService.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/ChatService.java deleted file mode 100644 index fd19d82..0000000 --- a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/ChatService.java +++ /dev/null @@ -1,31 +0,0 @@ -package cn.iocoder.yudao.module.ai.service; - -import cn.iocoder.yudao.module.ai.controller.Utf8SseEmitter; -import cn.iocoder.yudao.module.ai.vo.ChatReq; - -/** - * 聊天 chat - * - * @author fansili - * @time 2024/4/14 15:55 - * @since 1.0 - */ -public interface ChatService { - - /** - * chat - * - * @param req - * @return - */ - String chat(ChatReq req); - - /** - * chat stream - * - * @param req - * @param sseEmitter - * @return - */ - void chatStream(ChatReq req, Utf8SseEmitter sseEmitter); -} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/AiChatConversationServiceImpl.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/AiChatConversationServiceImpl.java new file mode 100644 index 0000000..8e6a520 --- /dev/null +++ b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/AiChatConversationServiceImpl.java @@ -0,0 +1,113 @@ +package cn.iocoder.yudao.module.ai.service.impl; + +import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; +import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; +import cn.iocoder.yudao.module.ai.ErrorCodeConstants; +import cn.iocoder.yudao.module.ai.convert.AiChatConversationConvert; +import cn.iocoder.yudao.module.ai.dal.dataobject.AiChatConversationDO; +import cn.iocoder.yudao.module.ai.dal.dataobject.AiChatRoleDO; +import cn.iocoder.yudao.module.ai.enums.AiChatConversationTypeEnum; +import cn.iocoder.yudao.module.ai.mapper.AiChatConversationMapper; +import cn.iocoder.yudao.module.ai.mapper.AiChatRoleMapper; +import cn.iocoder.yudao.module.ai.service.AiChatConversationService; +import cn.iocoder.yudao.module.ai.vo.AiChatConversationCreateRoleReq; +import cn.iocoder.yudao.module.ai.vo.AiChatConversationCreateUserReq; +import cn.iocoder.yudao.module.ai.vo.AiChatConversationListReq; +import cn.iocoder.yudao.module.ai.vo.AiChatConversationRes; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.NotNull; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * chat 对话 + * + * @fansili + * @since v1.0 + */ +@Service +@Slf4j +@AllArgsConstructor +public class AiChatConversationServiceImpl implements AiChatConversationService { + + private final AiChatRoleMapper aiChatRoleMapper; + private final AiChatConversationMapper aiChatConversationMapper; + + @Override + public AiChatConversationRes createConversation(AiChatConversationCreateUserReq req) { + // 获取用户id + Long loginUserId = SecurityFrameworkUtils.getLoginUserId(); + // 查询最新的对话 + AiChatConversationDO latestConversation = aiChatConversationMapper.selectLatestConversation(loginUserId); + // 如果有对话没有被使用过,那就返回这个 + if (latestConversation != null && latestConversation.getChatCount() <= 0) { + return AiChatConversationConvert.INSTANCE.covnertChatConversationRes(latestConversation); + } + // 创建新的 Conversation + AiChatConversationDO insertConversation = saveConversation(req.getTitle(), loginUserId, + null, null, AiChatConversationTypeEnum.USER_CHAT); + // 转换 res + return AiChatConversationConvert.INSTANCE.covnertChatConversationRes(insertConversation); + } + + @Override + public AiChatConversationRes createRoleConversation(AiChatConversationCreateRoleReq req) { + // 获取用户id + Long loginUserId = SecurityFrameworkUtils.getLoginUserId(); + // 查询最新的对话 + AiChatConversationDO latestConversation = aiChatConversationMapper.selectLatestConversation(loginUserId); + // 如果有对话没有被使用过,那就返回这个 + if (latestConversation != null && latestConversation.getChatCount() <= 0) { + return AiChatConversationConvert.INSTANCE.covnertChatConversationRes(latestConversation); + } + AiChatRoleDO aiChatRoleDO = aiChatRoleMapper.selectById(req.getChatRoleId()); + // 创建新的 Conversation + AiChatConversationDO insertConversation = saveConversation(req.getTitle(), loginUserId, + req.getChatRoleId(), aiChatRoleDO.getRoleName(), AiChatConversationTypeEnum.ROLE_CHAT); + // 转换 res + return AiChatConversationConvert.INSTANCE.covnertChatConversationRes(insertConversation); + } + + private @NotNull AiChatConversationDO saveConversation(String title, + Long userId, + Long chatRoleId, + String chatRoleName, + AiChatConversationTypeEnum typeEnum) { + AiChatConversationDO insertConversation = new AiChatConversationDO(); + insertConversation.setId(null); + insertConversation.setUserId(userId); + insertConversation.setChatRoleId(chatRoleId); + insertConversation.setChatRoleName(chatRoleName); + insertConversation.setTitle(title); + insertConversation.setChatCount(0); + insertConversation.setType(typeEnum.getType()); + aiChatConversationMapper.insert(insertConversation); + return insertConversation; + } + + @Override + public AiChatConversationRes getConversation(Long id) { + AiChatConversationDO aiChatConversationDO = aiChatConversationMapper.selectById(id); + if (aiChatConversationDO == null) { + throw ServiceExceptionUtil.exception(ErrorCodeConstants.AI_CHAT_CONTINUE_NOT_EXIST); + } + return AiChatConversationConvert.INSTANCE.covnertChatConversationRes(aiChatConversationDO); + } + + @Override + public List listConversation(AiChatConversationListReq req) { + // 获取用户id + Long loginUserId = SecurityFrameworkUtils.getLoginUserId(); + // 查询前100对话 + List top100Conversation + = aiChatConversationMapper.selectTop100Conversation(loginUserId, req.getSearch()); + return AiChatConversationConvert.INSTANCE.covnertChatConversationResList(top100Conversation); + } + + @Override + public void delete(Long id) { + aiChatConversationMapper.deleteById(id); + } +} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/AiChatMessageServiceImpl.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/AiChatMessageServiceImpl.java new file mode 100644 index 0000000..576fff3 --- /dev/null +++ b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/AiChatMessageServiceImpl.java @@ -0,0 +1,70 @@ +package cn.iocoder.yudao.module.ai.service.impl; + +import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; +import cn.iocoder.yudao.module.ai.ErrorCodeConstants; +import cn.iocoder.yudao.module.ai.convert.AiChatMessageConvert; +import cn.iocoder.yudao.module.ai.dal.dataobject.AiChatConversationDO; +import cn.iocoder.yudao.module.ai.dal.dataobject.AiChatMessageDO; +import cn.iocoder.yudao.module.ai.mapper.AiChatConversationMapper; +import cn.iocoder.yudao.module.ai.mapper.AiChatMessageMapper; +import cn.iocoder.yudao.module.ai.service.AiChatMessageService; +import cn.iocoder.yudao.module.ai.vo.AiChatMessageListRes; +import cn.iocoder.yudao.module.ai.vo.AiChatMessageReq; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * chat message + * + * @author fansili + * @time 2024/4/24 17:25 + * @since 1.0 + */ +@AllArgsConstructor +@Service +@Slf4j +public class AiChatMessageServiceImpl implements AiChatMessageService { + + private final AiChatMessageMapper aiChatMessageMapper; + private final AiChatConversationMapper aiChatConversationMapper; + + @Override + public PageResult list(AiChatMessageReq req) { + // 查询 + LambdaQueryWrapperX queryWrapperX = new LambdaQueryWrapperX<>(); + queryWrapperX.eq(AiChatMessageDO::getChatConversationId, req.getChatConversationId()); + // 默认排序 + queryWrapperX.orderByDesc(AiChatMessageDO::getId); + PageResult pageResult = aiChatMessageMapper.selectPage(req, queryWrapperX); + // 转换 res + List messageListResList = AiChatMessageConvert.INSTANCE.convert(pageResult.getList()); + return new PageResult(messageListResList, pageResult.getTotal()); + } + + @Override + public void delete(Long chatConversationId, Long id) { + // 获取登录用户 + Long loginUserId = SecurityFrameworkUtils.getLoginUserId(); + // 校验 ChatConversation + validateChatConversation(chatConversationId, loginUserId); + // 删除 + aiChatMessageMapper.deleteByConversationAndId(chatConversationId, id); + } + + private AiChatConversationDO validateChatConversation(Long chatConversationId, Long loginUserId) { + AiChatConversationDO aiChatConversationDO = aiChatConversationMapper.selectById(chatConversationId); + if (aiChatConversationDO == null) { + throw ServiceExceptionUtil.exception(ErrorCodeConstants.AI_CHAT_CONTINUE_NOT_EXIST); + } + if (!aiChatConversationDO.getUserId().equals(loginUserId)) { + throw ServiceExceptionUtil.exception(ErrorCodeConstants.AI_CHAT_CONVERSATION_NOT_YOURS); + } + return aiChatConversationDO; + } +} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/AiChatModalServiceImpl.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/AiChatModalServiceImpl.java index af1a223..9e4b6e4 100644 --- a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/AiChatModalServiceImpl.java +++ b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/AiChatModalServiceImpl.java @@ -5,7 +5,7 @@ import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.module.ai.ErrorCodeConstants; -import cn.iocoder.yudao.module.ai.convert.ChatModalConvert; +import cn.iocoder.yudao.module.ai.convert.AiChatModalConvert; import cn.iocoder.yudao.module.ai.dal.dataobject.AiChatModalDO; import cn.iocoder.yudao.module.ai.enums.AiChatModalDisableEnum; import cn.iocoder.yudao.module.ai.mapper.AiChatModalMapper; @@ -47,14 +47,14 @@ public class AiChatModalServiceImpl implements AiChatModalService { // 查询 PageResult aiChatModalDOPageResult = aiChatModalMapper.selectPage(req, queryWrapperX); // 转换 res - List resList = ChatModalConvert.INSTANCE.convertAiChatModalListRes(aiChatModalDOPageResult.getList()); + List resList = AiChatModalConvert.INSTANCE.convertAiChatModalListRes(aiChatModalDOPageResult.getList()); return new PageResult<>(resList, aiChatModalDOPageResult.getTotal()); } @Override public void add(AiChatModalAddReq req) { // 转换 do - AiChatModalDO insertChatModalDO = ChatModalConvert.INSTANCE.convertAiChatModalDO(req); + AiChatModalDO insertChatModalDO = AiChatModalConvert.INSTANCE.convertAiChatModalDO(req); // insertChatModalDO.setDisable(AiChatModalDisableEnum.NO.getValue()); // 保存数据库 @@ -66,7 +66,7 @@ public class AiChatModalServiceImpl implements AiChatModalService { // 校验模型是否存在 validateChatModalExists(id); // 转换 updateChatModalDO - AiChatModalDO updateChatModalDO = ChatModalConvert.INSTANCE.convertAiChatModalDO(req); + AiChatModalDO updateChatModalDO = AiChatModalConvert.INSTANCE.convertAiChatModalDO(req); updateChatModalDO.setId(id); // 更新数据库 aiChatModalMapper.updateById(updateChatModalDO); diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/AiChatRoleServiceImpl.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/AiChatRoleServiceImpl.java new file mode 100644 index 0000000..870168e --- /dev/null +++ b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/AiChatRoleServiceImpl.java @@ -0,0 +1,112 @@ +package cn.iocoder.yudao.module.ai.service.impl; + +import cn.hutool.core.util.StrUtil; +import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; +import cn.iocoder.yudao.module.ai.ErrorCodeConstants; +import cn.iocoder.yudao.module.ai.convert.AiChatRoleConvert; +import cn.iocoder.yudao.module.ai.dal.dataobject.AiChatRoleDO; +import cn.iocoder.yudao.module.ai.enums.AiChatRoleClassifyEnum; +import cn.iocoder.yudao.module.ai.enums.AiChatRoleSourceEnum; +import cn.iocoder.yudao.module.ai.enums.AiChatRoleVisibilityEnum; +import cn.iocoder.yudao.module.ai.mapper.AiChatRoleMapper; +import cn.iocoder.yudao.module.ai.service.AiChatRoleService; +import cn.iocoder.yudao.module.ai.vo.*; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * chat 角色 + * + * @fansili + * @since v1.0 + */ +@Service +@AllArgsConstructor +@Slf4j +public class AiChatRoleServiceImpl implements AiChatRoleService { + + private final AiChatRoleMapper aiChatRoleMapper; + + @Override + public PageResult list(AiChatRoleListReq req) { + // 查询条件 + LambdaQueryWrapperX queryWrapperX = new LambdaQueryWrapperX<>(); + // search 查询 + if (!StrUtil.isBlank(req.getSearch())) { + queryWrapperX.eq(AiChatRoleDO::getRoleName, req.getSearch()); + } + // 默认排序id desc + queryWrapperX.orderByDesc(AiChatRoleDO::getId); + // + PageResult aiChatRoleDOPageResult = aiChatRoleMapper.selectPage(req, queryWrapperX); + Long total = aiChatRoleDOPageResult.getTotal(); + List roleList = aiChatRoleDOPageResult.getList(); + // 换货res + List chatRoleListResList = AiChatRoleConvert.INSTANCE.convertChatRoleListRes(roleList); + return new PageResult<>(chatRoleListResList, total); + } + + @Override + public void add(AiChatRoleAddReq req) { + // 转换enum,并校验enum + AiChatRoleClassifyEnum.valueOfClassify(req.getClassify()); + AiChatRoleVisibilityEnum.valueOfType(req.getVisibility()); + AiChatRoleSourceEnum.valueOfType(req.getRoleSource()); + // 转换do + AiChatRoleDO insertAiChatRoleDO = AiChatRoleConvert.INSTANCE.convertAiChatRoleDO(req); + insertAiChatRoleDO.setUserId(SecurityFrameworkUtils.getLoginUserId()); + insertAiChatRoleDO.setUseCount(0); + // 保存 + aiChatRoleMapper.insert(insertAiChatRoleDO); + } + + @Override + public void update(Long id, AiChatRoleUpdateReq req) { + // 转换enum,并校验enum + AiChatRoleClassifyEnum.valueOfClassify(req.getClassify()); + AiChatRoleVisibilityEnum.valueOfType(req.getVisibility()); + AiChatRoleSourceEnum.valueOfType(req.getRoleSource()); + // 检查角色是否存在 + validateChatRoleExists(id); + // 转换do + AiChatRoleDO updateChatRole = AiChatRoleConvert.INSTANCE.convertAiChatRoleDO(req); + updateChatRole.setId(id); + aiChatRoleMapper.updateById(updateChatRole); + } + + + @Override + public void updateVisibility(Long id, AiChatRoleUpdateVisibilityReq req) { + // 转换enum,并校验enum + AiChatRoleVisibilityEnum.valueOfType(req.getVisibility()); + // 检查角色是否存在 + validateChatRoleExists(id); + // 更新 + aiChatRoleMapper.updateById(new AiChatRoleDO() + .setId(id) + .setVisibility(req.getVisibility()) + ); + } + + @Override + public void delete(Long chatRoleId) { + // 检查角色是否存在 + validateChatRoleExists(chatRoleId); + // 删除 + aiChatRoleMapper.deleteById(chatRoleId); + } + + private AiChatRoleDO validateChatRoleExists(Long id) { + AiChatRoleDO aiChatRoleDO = aiChatRoleMapper.selectById(id); + if (aiChatRoleDO == null) { + throw ServiceExceptionUtil.exception(ErrorCodeConstants.AI_CHAT_ROLE_NOT_EXIST); + } + return aiChatRoleDO; + } +} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/AiChatServiceImpl.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/AiChatServiceImpl.java new file mode 100644 index 0000000..1caad8a --- /dev/null +++ b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/AiChatServiceImpl.java @@ -0,0 +1,171 @@ +package cn.iocoder.yudao.module.ai.service.impl; + +import cn.hutool.core.exceptions.ExceptionUtil; +import cn.iocoder.yudao.framework.ai.chat.ChatResponse; +import cn.iocoder.yudao.framework.ai.chat.messages.MessageType; +import cn.iocoder.yudao.framework.ai.chat.prompt.Prompt; +import cn.iocoder.yudao.framework.ai.config.AiClient; +import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; +import cn.iocoder.yudao.module.ai.controller.Utf8SseEmitter; +import cn.iocoder.yudao.module.ai.dal.dataobject.AiChatMessageDO; +import cn.iocoder.yudao.module.ai.enums.AiClientNameEnum; +import cn.iocoder.yudao.module.ai.mapper.AiChatConversationMapper; +import cn.iocoder.yudao.module.ai.mapper.AiChatMessageMapper; +import cn.iocoder.yudao.module.ai.mapper.AiChatRoleMapper; +import cn.iocoder.yudao.module.ai.service.AiChatConversationService; +import cn.iocoder.yudao.module.ai.service.AiChatService; +import cn.iocoder.yudao.module.ai.vo.AiChatConversationRes; +import cn.iocoder.yudao.module.ai.vo.AiChatReq; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import reactor.core.publisher.Flux; + +import java.io.IOException; +import java.util.function.Consumer; + +/** + * 聊天 service + * + * @author fansili + * @time 2024/4/14 15:55 + * @since 1.0 + */ +@Slf4j +@Service +@AllArgsConstructor +public class AiChatServiceImpl implements AiChatService { + + private final AiClient aiClient; + private final AiChatRoleMapper aiChatRoleMapper; + private final AiChatMessageMapper aiChatMessageMapper; + private final AiChatConversationMapper aiChatConversationMapper; + private final AiChatConversationService chatConversationService; + + /** + * chat + * + * @param req + * @return + */ + @Transactional(rollbackFor = Exception.class) + public String chat(AiChatReq req) { + Long loginUserId = SecurityFrameworkUtils.getLoginUserId(); + // 获取 client 类型 + AiClientNameEnum clientNameEnum = AiClientNameEnum.valueOfName(req.getModal()); + // 获取对话信息 + AiChatConversationRes conversationRes = chatConversationService.getConversation(req.getConversationId()); + // 保存 chat message + saveChatMessage(req, conversationRes, loginUserId); + String content = null; + try { + // 创建 chat 需要的 Prompt + Prompt prompt = new Prompt(req.getPrompt()); + req.setTopK(req.getTopK()); + req.setTopP(req.getTopP()); + req.setTemperature(req.getTemperature()); + // 发送 call 调用 + ChatResponse call = aiClient.call(prompt, clientNameEnum.getName()); + content = call.getResult().getOutput().getContent(); + // 更新 conversation + + } catch (Exception e) { + content = ExceptionUtil.getMessage(e); + } finally { + // 保存 chat message + saveSystemChatMessage(req, conversationRes, loginUserId, content); + } + return content; + } + + private void saveChatMessage(AiChatReq req, AiChatConversationRes conversationRes, Long loginUserId) { + Long chatConversationId = conversationRes.getId(); + // 增加 chat message 记录 + aiChatMessageMapper.insert( + new AiChatMessageDO() + .setId(null) + .setChatConversationId(chatConversationId) + .setUserId(loginUserId) + .setMessage(req.getPrompt()) + .setMessageType(MessageType.USER.getValue()) + .setTopK(req.getTopK()) + .setTopP(req.getTopP()) + .setTemperature(req.getTemperature()) + ); + // chat count 先+1 + aiChatConversationMapper.updateIncrChatCount(req.getConversationId()); + } + + public void saveSystemChatMessage(AiChatReq req, AiChatConversationRes conversationRes, Long loginUserId, String systemPrompts) { + Long chatConversationId = conversationRes.getId(); + // 增加 chat message 记录 + aiChatMessageMapper.insert( + new AiChatMessageDO() + .setId(null) + .setChatConversationId(chatConversationId) + .setUserId(loginUserId) + .setMessage(systemPrompts) + .setMessageType(MessageType.SYSTEM.getValue()) + .setTopK(req.getTopK()) + .setTopP(req.getTopP()) + .setTemperature(req.getTemperature()) + ); + + // chat count 先+1 + aiChatConversationMapper.updateIncrChatCount(req.getConversationId()); + } + + /** + * chat stream + * + * @param req + * @param sseEmitter + * @return + */ + @Override + public void chatStream(AiChatReq req, Utf8SseEmitter sseEmitter) { + Long loginUserId = SecurityFrameworkUtils.getLoginUserId(); + // 获取 client 类型 + AiClientNameEnum clientNameEnum = AiClientNameEnum.valueOfName(req.getModal()); + // 获取对话信息 + AiChatConversationRes conversationRes = chatConversationService.getConversation(req.getConversationId()); + // 创建 chat 需要的 Prompt + Prompt prompt = new Prompt(req.getPrompt()); + req.setTopK(req.getTopK()); + req.setTopP(req.getTopP()); + req.setTemperature(req.getTemperature()); + // 保存 chat message + saveChatMessage(req, conversationRes, loginUserId); + Flux streamResponse = aiClient.stream(prompt, clientNameEnum.getName()); + + StringBuffer contentBuffer = new StringBuffer(); + streamResponse.subscribe( + new Consumer() { + @Override + public void accept(ChatResponse chatResponse) { + String content = chatResponse.getResults().get(0).getOutput().getContent(); + try { + contentBuffer.append(content); + sseEmitter.send(content, MediaType.APPLICATION_JSON); + } catch (IOException e) { + log.error("发送异常{}", ExceptionUtil.getMessage(e)); + // 如果不是因为关闭而抛出异常,则重新连接 + sseEmitter.completeWithError(e); + } + } + }, + error -> { + // + log.error("subscribe错误 {}", ExceptionUtil.getMessage(error)); + }, + () -> { + log.info("发送完成!"); + sseEmitter.complete(); + // 保存 chat message + saveSystemChatMessage(req, conversationRes, loginUserId, contentBuffer.toString()); + } + ); + } +} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/ChatConversationServiceImpl.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/ChatConversationServiceImpl.java deleted file mode 100644 index 7b6f5fa..0000000 --- a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/ChatConversationServiceImpl.java +++ /dev/null @@ -1,113 +0,0 @@ -package cn.iocoder.yudao.module.ai.service.impl; - -import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; -import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; -import cn.iocoder.yudao.module.ai.ErrorCodeConstants; -import cn.iocoder.yudao.module.ai.convert.ChatConversationConvert; -import cn.iocoder.yudao.module.ai.dal.dataobject.AiChatConversationDO; -import cn.iocoder.yudao.module.ai.dal.dataobject.AiChatRoleDO; -import cn.iocoder.yudao.module.ai.enums.ChatConversationTypeEnum; -import cn.iocoder.yudao.module.ai.mapper.AiChatConversationMapper; -import cn.iocoder.yudao.module.ai.mapper.AiChatRoleMapper; -import cn.iocoder.yudao.module.ai.service.ChatConversationService; -import cn.iocoder.yudao.module.ai.vo.ChatConversationCreateRoleReq; -import cn.iocoder.yudao.module.ai.vo.ChatConversationCreateUserReq; -import cn.iocoder.yudao.module.ai.vo.ChatConversationListReq; -import cn.iocoder.yudao.module.ai.vo.ChatConversationRes; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.jetbrains.annotations.NotNull; -import org.springframework.stereotype.Service; - -import java.util.List; - -/** - * chat 对话 - * - * @fansili - * @since v1.0 - */ -@Service -@Slf4j -@AllArgsConstructor -public class ChatConversationServiceImpl implements ChatConversationService { - - private final AiChatRoleMapper aiChatRoleMapper; - private final AiChatConversationMapper aiChatConversationMapper; - - @Override - public ChatConversationRes createConversation(ChatConversationCreateUserReq req) { - // 获取用户id - Long loginUserId = SecurityFrameworkUtils.getLoginUserId(); - // 查询最新的对话 - AiChatConversationDO latestConversation = aiChatConversationMapper.selectLatestConversation(loginUserId); - // 如果有对话没有被使用过,那就返回这个 - if (latestConversation != null && latestConversation.getChatCount() <= 0) { - return ChatConversationConvert.INSTANCE.covnertChatConversationRes(latestConversation); - } - // 创建新的 Conversation - AiChatConversationDO insertConversation = saveConversation(req.getTitle(), loginUserId, - null, null, ChatConversationTypeEnum.USER_CHAT); - // 转换 res - return ChatConversationConvert.INSTANCE.covnertChatConversationRes(insertConversation); - } - - @Override - public ChatConversationRes createRoleConversation(ChatConversationCreateRoleReq req) { - // 获取用户id - Long loginUserId = SecurityFrameworkUtils.getLoginUserId(); - // 查询最新的对话 - AiChatConversationDO latestConversation = aiChatConversationMapper.selectLatestConversation(loginUserId); - // 如果有对话没有被使用过,那就返回这个 - if (latestConversation != null && latestConversation.getChatCount() <= 0) { - return ChatConversationConvert.INSTANCE.covnertChatConversationRes(latestConversation); - } - AiChatRoleDO aiChatRoleDO = aiChatRoleMapper.selectById(req.getChatRoleId()); - // 创建新的 Conversation - AiChatConversationDO insertConversation = saveConversation(req.getTitle(), loginUserId, - req.getChatRoleId(), aiChatRoleDO.getRoleName(), ChatConversationTypeEnum.ROLE_CHAT); - // 转换 res - return ChatConversationConvert.INSTANCE.covnertChatConversationRes(insertConversation); - } - - private @NotNull AiChatConversationDO saveConversation(String title, - Long userId, - Long chatRoleId, - String chatRoleName, - ChatConversationTypeEnum typeEnum) { - AiChatConversationDO insertConversation = new AiChatConversationDO(); - insertConversation.setId(null); - insertConversation.setUserId(userId); - insertConversation.setChatRoleId(chatRoleId); - insertConversation.setChatRoleName(chatRoleName); - insertConversation.setTitle(title); - insertConversation.setChatCount(0); - insertConversation.setType(typeEnum.getType()); - aiChatConversationMapper.insert(insertConversation); - return insertConversation; - } - - @Override - public ChatConversationRes getConversation(Long id) { - AiChatConversationDO aiChatConversationDO = aiChatConversationMapper.selectById(id); - if (aiChatConversationDO == null) { - throw ServiceExceptionUtil.exception(ErrorCodeConstants.AI_CHAT_CONTINUE_NOT_EXIST); - } - return ChatConversationConvert.INSTANCE.covnertChatConversationRes(aiChatConversationDO); - } - - @Override - public List listConversation(ChatConversationListReq req) { - // 获取用户id - Long loginUserId = SecurityFrameworkUtils.getLoginUserId(); - // 查询前100对话 - List top100Conversation - = aiChatConversationMapper.selectTop100Conversation(loginUserId, req.getSearch()); - return ChatConversationConvert.INSTANCE.covnertChatConversationResList(top100Conversation); - } - - @Override - public void delete(Long id) { - aiChatConversationMapper.deleteById(id); - } -} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/ChatMessageServiceImpl.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/ChatMessageServiceImpl.java deleted file mode 100644 index ab0c05f..0000000 --- a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/ChatMessageServiceImpl.java +++ /dev/null @@ -1,70 +0,0 @@ -package cn.iocoder.yudao.module.ai.service.impl; - -import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; -import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; -import cn.iocoder.yudao.module.ai.ErrorCodeConstants; -import cn.iocoder.yudao.module.ai.convert.ChatMessageConvert; -import cn.iocoder.yudao.module.ai.dal.dataobject.AiChatConversationDO; -import cn.iocoder.yudao.module.ai.dal.dataobject.AiChatMessageDO; -import cn.iocoder.yudao.module.ai.mapper.AiChatConversationMapper; -import cn.iocoder.yudao.module.ai.mapper.AiChatMessageMapper; -import cn.iocoder.yudao.module.ai.service.ChatMessageService; -import cn.iocoder.yudao.module.ai.vo.ChatMessageListRes; -import cn.iocoder.yudao.module.ai.vo.ChatMessageReq; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.List; - -/** - * chat message - * - * @author fansili - * @time 2024/4/24 17:25 - * @since 1.0 - */ -@AllArgsConstructor -@Service -@Slf4j -public class ChatMessageServiceImpl implements ChatMessageService { - - private final AiChatMessageMapper aiChatMessageMapper; - private final AiChatConversationMapper aiChatConversationMapper; - - @Override - public PageResult list(ChatMessageReq req) { - // 查询 - LambdaQueryWrapperX queryWrapperX = new LambdaQueryWrapperX<>(); - queryWrapperX.eq(AiChatMessageDO::getChatConversationId, req.getChatConversationId()); - // 默认排序 - queryWrapperX.orderByDesc(AiChatMessageDO::getId); - PageResult pageResult = aiChatMessageMapper.selectPage(req, queryWrapperX); - // 转换 res - List messageListResList = ChatMessageConvert.INSTANCE.convert(pageResult.getList()); - return new PageResult(messageListResList, pageResult.getTotal()); - } - - @Override - public void delete(Long chatConversationId, Long id) { - // 获取登录用户 - Long loginUserId = SecurityFrameworkUtils.getLoginUserId(); - // 校验 ChatConversation - validateChatConversation(chatConversationId, loginUserId); - // 删除 - aiChatMessageMapper.deleteByConversationAndId(chatConversationId, id); - } - - private AiChatConversationDO validateChatConversation(Long chatConversationId, Long loginUserId) { - AiChatConversationDO aiChatConversationDO = aiChatConversationMapper.selectById(chatConversationId); - if (aiChatConversationDO == null) { - throw ServiceExceptionUtil.exception(ErrorCodeConstants.AI_CHAT_CONTINUE_NOT_EXIST); - } - if (!aiChatConversationDO.getUserId().equals(loginUserId)) { - throw ServiceExceptionUtil.exception(ErrorCodeConstants.AI_CHAT_CONVERSATION_NOT_YOURS); - } - return aiChatConversationDO; - } -} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/ChatRoleServiceImpl.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/ChatRoleServiceImpl.java deleted file mode 100644 index af2e833..0000000 --- a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/ChatRoleServiceImpl.java +++ /dev/null @@ -1,112 +0,0 @@ -package cn.iocoder.yudao.module.ai.service.impl; - -import cn.hutool.core.util.StrUtil; -import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; -import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; -import cn.iocoder.yudao.module.ai.ErrorCodeConstants; -import cn.iocoder.yudao.module.ai.convert.ChatRoleConvert; -import cn.iocoder.yudao.module.ai.dal.dataobject.AiChatRoleDO; -import cn.iocoder.yudao.module.ai.enums.ChatRoleClassifyEnum; -import cn.iocoder.yudao.module.ai.enums.ChatRoleSourceEnum; -import cn.iocoder.yudao.module.ai.enums.ChatRoleVisibilityEnum; -import cn.iocoder.yudao.module.ai.mapper.AiChatRoleMapper; -import cn.iocoder.yudao.module.ai.service.ChatRoleService; -import cn.iocoder.yudao.module.ai.vo.*; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.List; - -/** - * chat 角色 - * - * @fansili - * @since v1.0 - */ -@Service -@AllArgsConstructor -@Slf4j -public class ChatRoleServiceImpl implements ChatRoleService { - - private final AiChatRoleMapper aiChatRoleMapper; - - @Override - public PageResult list(ChatRoleListReq req) { - // 查询条件 - LambdaQueryWrapperX queryWrapperX = new LambdaQueryWrapperX<>(); - // search 查询 - if (!StrUtil.isBlank(req.getSearch())) { - queryWrapperX.eq(AiChatRoleDO::getRoleName, req.getSearch()); - } - // 默认排序id desc - queryWrapperX.orderByDesc(AiChatRoleDO::getId); - // - PageResult aiChatRoleDOPageResult = aiChatRoleMapper.selectPage(req, queryWrapperX); - Long total = aiChatRoleDOPageResult.getTotal(); - List roleList = aiChatRoleDOPageResult.getList(); - // 换货res - List chatRoleListResList = ChatRoleConvert.INSTANCE.convertChatRoleListRes(roleList); - return new PageResult<>(chatRoleListResList, total); - } - - @Override - public void add(ChatRoleAddReq req) { - // 转换enum,并校验enum - ChatRoleClassifyEnum.valueOfClassify(req.getClassify()); - ChatRoleVisibilityEnum.valueOfType(req.getVisibility()); - ChatRoleSourceEnum.valueOfType(req.getRoleSource()); - // 转换do - AiChatRoleDO insertAiChatRoleDO = ChatRoleConvert.INSTANCE.convertAiChatRoleDO(req); - insertAiChatRoleDO.setUserId(SecurityFrameworkUtils.getLoginUserId()); - insertAiChatRoleDO.setUseCount(0); - // 保存 - aiChatRoleMapper.insert(insertAiChatRoleDO); - } - - @Override - public void update(Long id, ChatRoleUpdateReq req) { - // 转换enum,并校验enum - ChatRoleClassifyEnum.valueOfClassify(req.getClassify()); - ChatRoleVisibilityEnum.valueOfType(req.getVisibility()); - ChatRoleSourceEnum.valueOfType(req.getRoleSource()); - // 检查角色是否存在 - validateChatRoleExists(id); - // 转换do - AiChatRoleDO updateChatRole = ChatRoleConvert.INSTANCE.convertAiChatRoleDO(req); - updateChatRole.setId(id); - aiChatRoleMapper.updateById(updateChatRole); - } - - - @Override - public void updateVisibility(Long id, ChatRoleUpdateVisibilityReq req) { - // 转换enum,并校验enum - ChatRoleVisibilityEnum.valueOfType(req.getVisibility()); - // 检查角色是否存在 - validateChatRoleExists(id); - // 更新 - aiChatRoleMapper.updateById(new AiChatRoleDO() - .setId(id) - .setVisibility(req.getVisibility()) - ); - } - - @Override - public void delete(Long chatRoleId) { - // 检查角色是否存在 - validateChatRoleExists(chatRoleId); - // 删除 - aiChatRoleMapper.deleteById(chatRoleId); - } - - private AiChatRoleDO validateChatRoleExists(Long id) { - AiChatRoleDO aiChatRoleDO = aiChatRoleMapper.selectById(id); - if (aiChatRoleDO == null) { - throw ServiceExceptionUtil.exception(ErrorCodeConstants.AI_CHAT_ROLE_NOT_EXIST); - } - return aiChatRoleDO; - } -} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/ChatServiceImpl.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/ChatServiceImpl.java deleted file mode 100644 index 57e6b73..0000000 --- a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/ChatServiceImpl.java +++ /dev/null @@ -1,171 +0,0 @@ -package cn.iocoder.yudao.module.ai.service.impl; - -import cn.hutool.core.exceptions.ExceptionUtil; -import cn.iocoder.yudao.framework.ai.chat.ChatResponse; -import cn.iocoder.yudao.framework.ai.chat.messages.MessageType; -import cn.iocoder.yudao.framework.ai.chat.prompt.Prompt; -import cn.iocoder.yudao.framework.ai.config.AiClient; -import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; -import cn.iocoder.yudao.module.ai.controller.Utf8SseEmitter; -import cn.iocoder.yudao.module.ai.dal.dataobject.AiChatMessageDO; -import cn.iocoder.yudao.module.ai.enums.AiClientNameEnum; -import cn.iocoder.yudao.module.ai.mapper.AiChatConversationMapper; -import cn.iocoder.yudao.module.ai.mapper.AiChatMessageMapper; -import cn.iocoder.yudao.module.ai.mapper.AiChatRoleMapper; -import cn.iocoder.yudao.module.ai.service.ChatConversationService; -import cn.iocoder.yudao.module.ai.service.ChatService; -import cn.iocoder.yudao.module.ai.vo.ChatConversationRes; -import cn.iocoder.yudao.module.ai.vo.ChatReq; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.http.MediaType; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import reactor.core.publisher.Flux; - -import java.io.IOException; -import java.util.function.Consumer; - -/** - * 聊天 service - * - * @author fansili - * @time 2024/4/14 15:55 - * @since 1.0 - */ -@Slf4j -@Service -@AllArgsConstructor -public class ChatServiceImpl implements ChatService { - - private final AiClient aiClient; - private final AiChatRoleMapper aiChatRoleMapper; - private final AiChatMessageMapper aiChatMessageMapper; - private final AiChatConversationMapper aiChatConversationMapper; - private final ChatConversationService chatConversationService; - - /** - * chat - * - * @param req - * @return - */ - @Transactional(rollbackFor = Exception.class) - public String chat(ChatReq req) { - Long loginUserId = SecurityFrameworkUtils.getLoginUserId(); - // 获取 client 类型 - AiClientNameEnum clientNameEnum = AiClientNameEnum.valueOfName(req.getModal()); - // 获取对话信息 - ChatConversationRes conversationRes = chatConversationService.getConversation(req.getConversationId()); - // 保存 chat message - saveChatMessage(req, conversationRes, loginUserId); - String content = null; - try { - // 创建 chat 需要的 Prompt - Prompt prompt = new Prompt(req.getPrompt()); - req.setTopK(req.getTopK()); - req.setTopP(req.getTopP()); - req.setTemperature(req.getTemperature()); - // 发送 call 调用 - ChatResponse call = aiClient.call(prompt, clientNameEnum.getName()); - content = call.getResult().getOutput().getContent(); - // 更新 conversation - - } catch (Exception e) { - content = ExceptionUtil.getMessage(e); - } finally { - // 保存 chat message - saveSystemChatMessage(req, conversationRes, loginUserId, content); - } - return content; - } - - private void saveChatMessage(ChatReq req, ChatConversationRes conversationRes, Long loginUserId) { - Long chatConversationId = conversationRes.getId(); - // 增加 chat message 记录 - aiChatMessageMapper.insert( - new AiChatMessageDO() - .setId(null) - .setChatConversationId(chatConversationId) - .setUserId(loginUserId) - .setMessage(req.getPrompt()) - .setMessageType(MessageType.USER.getValue()) - .setTopK(req.getTopK()) - .setTopP(req.getTopP()) - .setTemperature(req.getTemperature()) - ); - // chat count 先+1 - aiChatConversationMapper.updateIncrChatCount(req.getConversationId()); - } - - public void saveSystemChatMessage(ChatReq req, ChatConversationRes conversationRes, Long loginUserId, String systemPrompts) { - Long chatConversationId = conversationRes.getId(); - // 增加 chat message 记录 - aiChatMessageMapper.insert( - new AiChatMessageDO() - .setId(null) - .setChatConversationId(chatConversationId) - .setUserId(loginUserId) - .setMessage(systemPrompts) - .setMessageType(MessageType.SYSTEM.getValue()) - .setTopK(req.getTopK()) - .setTopP(req.getTopP()) - .setTemperature(req.getTemperature()) - ); - - // chat count 先+1 - aiChatConversationMapper.updateIncrChatCount(req.getConversationId()); - } - - /** - * chat stream - * - * @param req - * @param sseEmitter - * @return - */ - @Override - public void chatStream(ChatReq req, Utf8SseEmitter sseEmitter) { - Long loginUserId = SecurityFrameworkUtils.getLoginUserId(); - // 获取 client 类型 - AiClientNameEnum clientNameEnum = AiClientNameEnum.valueOfName(req.getModal()); - // 获取对话信息 - ChatConversationRes conversationRes = chatConversationService.getConversation(req.getConversationId()); - // 创建 chat 需要的 Prompt - Prompt prompt = new Prompt(req.getPrompt()); - req.setTopK(req.getTopK()); - req.setTopP(req.getTopP()); - req.setTemperature(req.getTemperature()); - // 保存 chat message - saveChatMessage(req, conversationRes, loginUserId); - Flux streamResponse = aiClient.stream(prompt, clientNameEnum.getName()); - - StringBuffer contentBuffer = new StringBuffer(); - streamResponse.subscribe( - new Consumer() { - @Override - public void accept(ChatResponse chatResponse) { - String content = chatResponse.getResults().get(0).getOutput().getContent(); - try { - contentBuffer.append(content); - sseEmitter.send(content, MediaType.APPLICATION_JSON); - } catch (IOException e) { - log.error("发送异常{}", ExceptionUtil.getMessage(e)); - // 如果不是因为关闭而抛出异常,则重新连接 - sseEmitter.completeWithError(e); - } - } - }, - error -> { - // - log.error("subscribe错误 {}", ExceptionUtil.getMessage(error)); - }, - () -> { - log.info("发送完成!"); - sseEmitter.complete(); - // 保存 chat message - saveSystemChatMessage(req, conversationRes, loginUserId, contentBuffer.toString()); - } - ); - } -} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatConversationCreateRoleReq.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatConversationCreateRoleReq.java new file mode 100644 index 0000000..95223ce --- /dev/null +++ b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatConversationCreateRoleReq.java @@ -0,0 +1,26 @@ +package cn.iocoder.yudao.module.ai.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * 聊天对话 + * + * @author fansili + * @time 2024/4/18 16:24 + * @since 1.0 + */ +@Data +@Accessors(chain = true) +public class AiChatConversationCreateRoleReq { + + @Schema(description = "chat角色Id") + @NotNull(message = "聊天角色id不能为空!") + private Long chatRoleId; + + @Schema(description = "标题(有程序自动生成)") + @NotNull(message = "标题不能为空!") + private String title; +} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatConversationCreateUserReq.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatConversationCreateUserReq.java new file mode 100644 index 0000000..c8276ef --- /dev/null +++ b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatConversationCreateUserReq.java @@ -0,0 +1,22 @@ +package cn.iocoder.yudao.module.ai.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * 聊天对话 + * + * @author fansili + * @time 2024/4/18 16:24 + * @since 1.0 + */ +@Data +@Accessors(chain = true) +public class AiChatConversationCreateUserReq { + + @Schema(description = "对话标题") + @NotNull(message = "标题不能为空!") + private String title; +} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatConversationListReq.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatConversationListReq.java new file mode 100644 index 0000000..208bf67 --- /dev/null +++ b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatConversationListReq.java @@ -0,0 +1,20 @@ +package cn.iocoder.yudao.module.ai.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * 聊天对话 list req + * + * @author fansili + * @time 2024/4/18 16:24 + * @since 1.0 + */ +@Data +@Accessors(chain = true) +public class AiChatConversationListReq { + + @Schema(description = "查询根据title") + private String search; +} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatConversationRes.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatConversationRes.java new file mode 100644 index 0000000..ca8254d --- /dev/null +++ b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatConversationRes.java @@ -0,0 +1,38 @@ +package cn.iocoder.yudao.module.ai.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * 聊天对话 res + * + * @author fansili + * @time 2024/4/18 16:24 + * @since 1.0 + */ +@Data +@Accessors(chain = true) +public class AiChatConversationRes { + + @Schema(description = "id") + private Long id; + + @Schema(description = "用户id") + private Long userId; + + @Schema(description = "chat角色Id") + private Long chatRoleId; + + @Schema(description = "chat角色名称") + private String chatRoleName; + + @Schema(description = "标题(有程序自动生成)") + private String title; + + @Schema(description = "对话类型(roleChat、userChat)") + private String type; + + @Schema(description = "聊天次数(有程序自动生成)") + private Integer chatCount; +} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatMessageDeleteReq.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatMessageDeleteReq.java new file mode 100644 index 0000000..dafd7d8 --- /dev/null +++ b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatMessageDeleteReq.java @@ -0,0 +1,28 @@ +package cn.iocoder.yudao.module.ai.vo; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * chat message list req + * + * @author fansili + * @time 2024/4/14 16:12 + * @since 1.0 + */ +@Data +@Accessors(chain = true) +public class AiChatMessageDeleteReq extends PageParam { + + @Schema(description = "id") + @NotNull + private Long id; + + @Schema(description = "聊天ID,关联到特定的会话或对话") + @NotNull + private Long chatConversationId; + +} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatMessageListRes.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatMessageListRes.java new file mode 100644 index 0000000..ecfbc00 --- /dev/null +++ b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatMessageListRes.java @@ -0,0 +1,42 @@ +package cn.iocoder.yudao.module.ai.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * 看板 message list req + * + * @author fansili + * @time 2024/4/24 17:28 + * @since 1.0 + */ +@Data +@Accessors(chain = true) +public class AiChatMessageListRes { + + @Schema(description = "编号") + private Long id; + + @Schema(description = "聊天ID,关联到特定的会话或对话") + private Long chatConversationId; + + @Schema(description = "角色ID,用于标识发送消息的用户或系统的身份") + private Long userId; + + @Schema(description = "消息具体内容,存储用户的发言或者系统响应的文字信息") + private String message; + + @Schema(description = "消息类型,枚举值可能包括'system'(系统消息)、'user'(用户消息)和'assistant'(助手消息)") + private String messageType; + + @Schema(description = "在生成消息时采用的Top-K采样大小") + private Double topK; + + @Schema(description = "Top-P核采样方法的概率阈值") + private Double topP; + + @Schema(description = "温度参数,用于调整生成回复的随机性和多样性程度,") + private Double temperature; + +} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatMessageReq.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatMessageReq.java new file mode 100644 index 0000000..60b7e91 --- /dev/null +++ b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatMessageReq.java @@ -0,0 +1,24 @@ +package cn.iocoder.yudao.module.ai.vo; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * chat message list req + * + * @author fansili + * @time 2024/4/14 16:12 + * @since 1.0 + */ +@Data +@Accessors(chain = true) +public class AiChatMessageReq extends PageParam { + + @Schema(description = "聊天ID,关联到特定的会话或对话") + @NotNull + private Long chatConversationId; + +} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatReq.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatReq.java new file mode 100644 index 0000000..0597f89 --- /dev/null +++ b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatReq.java @@ -0,0 +1,48 @@ +package cn.iocoder.yudao.module.ai.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * chat req + * + * @author fansili + * @time 2024/4/14 16:12 + * @since 1.0 + */ +@Data +@Accessors(chain = true) +public class AiChatReq { + + @Schema(description = "ai模型(查看 AiClientNameEnum)") + @NotNull(message = "模型不能为空!") + @Size(max = 30, message = "模型字符最大 30个字符!") + private String modal; + + @Schema(description = "对话Id") + @NotNull(message = "对话id不能为空") + private Long conversationId; + + @Schema(description = "chat角色模板") + private Long chatRoleId; + + @NotNull(message = "提示词不能为空!") + @Size(max = 5000, message = "提示词最大5000个字符!") + @Schema(description = "填入固定值,1 issues, 2 pr") + private String prompt; + + @Schema(description = "用于控制随机性和多样性的温度参数") + private Double temperature; + + @Schema(description = "生成时,核采样方法的概率阈值。例如,取值为0.8时,仅保留累计概率之和大于等于0.8的概率分布中的token,\n" + + " * 作为随机采样的候选集。取值范围为(0,1.0),取值越大,生成的随机性越高;取值越低,生成的随机性越低。\n" + + " * 默认值为0.8。注意,取值不要大于等于1\n") + private Double topP; + + @Schema(description = "在生成消息时采用的Top-K采样大小,表示模型生成回复时考虑的候选项集合的大小") + private Double topK; + +} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatReqVO.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatReqVO.java index eafbecd..f4bca2f 100644 --- a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatReqVO.java +++ b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatReqVO.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.ai.vo; -import cn.iocoder.yudao.module.ai.enums.OpenAiModelEnum; +import cn.iocoder.yudao.module.ai.enums.AiOpenAiModelEnum; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotNull; import lombok.Data; @@ -16,6 +16,6 @@ public class AiChatReqVO { @Schema(description = "AI模型", requiredMode = Schema.RequiredMode.REQUIRED) @NotNull(message = "AI模型不能为空") - private OpenAiModelEnum aiModel; + private AiOpenAiModelEnum aiModel; } diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatRoleAddReq.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatRoleAddReq.java new file mode 100644 index 0000000..63342c6 --- /dev/null +++ b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatRoleAddReq.java @@ -0,0 +1,54 @@ +package cn.iocoder.yudao.module.ai.vo; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * chat 角色列表 + * + * @fansili + * @since v1.0 + */ +@Data +@Accessors(chain = true) +public class AiChatRoleAddReq extends PageParam { + + @NotNull + @Schema(description = "模型编号,关联到角色使用的特定模型") + private String modelId; + + @NotNull + @Schema(description = "角色名,角色的显示名称") + private String roleName; + + @NotNull + @Schema(description = "角色介绍,详细描述角色的功能或用途") + private String roleIntroduce; + + @NotNull + @Schema(description = "角色来源,如 system(系统预置)、customer(用户自定义)") + private String roleSource; + + @NotNull + @Schema(description = "分类,角色所属的类别,如娱乐、创作等") + private String classify; + + @NotNull + @Schema(description = "发布状态,private 表示仅自己可见,public表示公开,disable表示禁用\n") + private String visibility; + + @NotNull + @Schema(description = "生成时的Top-K采样候选集大小") + private Double topK; + + @NotNull + @Schema(description = "生成时使用的核采样方法的概率阈值") + private Double topP; + + @NotNull + @Schema(description = "用于控制随机性和多样性的温度参数") + private Double temperature; +} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatRoleListReq.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatRoleListReq.java new file mode 100644 index 0000000..1dd5e54 --- /dev/null +++ b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatRoleListReq.java @@ -0,0 +1,20 @@ +package cn.iocoder.yudao.module.ai.vo; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * chat 角色列表 + * + * @fansili + * @since v1.0 + */ +@Data +@Accessors(chain = true) +public class AiChatRoleListReq extends PageParam { + + @Schema(description = "查询") + private String search; +} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatRoleListRes.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatRoleListRes.java new file mode 100644 index 0000000..8f582cc --- /dev/null +++ b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatRoleListRes.java @@ -0,0 +1,52 @@ +package cn.iocoder.yudao.module.ai.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * chat 角色列表 + * + * @fansili + * @since v1.0 + */ +@Data +@Accessors(chain = true) +public class AiChatRoleListRes { + + @Schema(description = "id") + private Long id; + + @Schema(description = "用户id") + private Long userId; + + @Schema(description = "模型id") + private String modelId; + + @Schema(description = "角色名字") + private String roleName; + + @Schema(description = "角色介绍,详细描述角色的功能或用途") + private String roleIntroduce; + + @Schema(description = "角色来源,如 system(系统预置)、customer(用户自定义)") + private String roleSource; + + @Schema(description = "分类,角色所属的类别,如娱乐、创作等") + private String classify; + + @Schema(description = "发布状态,0表示仅自己可见,1表示公开,2表示禁用") + private String visibility; + + @Schema(description = "生成时的Top-K采样候选集大小") + private Double topK; + + @Schema(description = "生成时使用的核采样方法的概率阈值") + private Double topP; + + @Schema(description = "用于控制随机性和多样性的温度参数") + private Double temperature; + + @Schema(description = "角色的使用次数统计") + private Integer useCount; +} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatRoleUpdateReq.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatRoleUpdateReq.java new file mode 100644 index 0000000..c6197f8 --- /dev/null +++ b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatRoleUpdateReq.java @@ -0,0 +1,54 @@ +package cn.iocoder.yudao.module.ai.vo; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * chat 角色 - 更新 + * + * @fansili + * @since v1.0 + */ +@Data +@Accessors(chain = true) +public class AiChatRoleUpdateReq extends PageParam { + + @NotNull + @Schema(description = "模型编号,关联到角色使用的特定模型") + private String modelId; + + @NotNull + @Schema(description = "角色名,角色的显示名称") + private String roleName; + + @NotNull + @Schema(description = "角色介绍,详细描述角色的功能或用途") + private String roleIntroduce; + + @NotNull + @Schema(description = "角色来源,如 system(系统预置)、customer(用户自定义)") + private String roleSource; + + @NotNull + @Schema(description = "分类,角色所属的类别,如娱乐、创作等") + private String classify; + + @NotNull + @Schema(description = "发布状态,0表示仅自己可见,1表示公开,2表示禁用") + private String visibility; + + @NotNull + @Schema(description = "生成时的Top-K采样候选集大小") + private Double topK; + + @NotNull + @Schema(description = "生成时使用的核采样方法的概率阈值") + private Double topP; + + @NotNull + @Schema(description = "用于控制随机性和多样性的温度参数") + private Double temperature; +} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatRoleUpdateVisibilityReq.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatRoleUpdateVisibilityReq.java new file mode 100644 index 0000000..d0d216b --- /dev/null +++ b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiChatRoleUpdateVisibilityReq.java @@ -0,0 +1,22 @@ +package cn.iocoder.yudao.module.ai.vo; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * chat 角色 - 修改可见性 + * + * @fansili + * @since v1.0 + */ +@Data +@Accessors(chain = true) +public class AiChatRoleUpdateVisibilityReq extends PageParam { + + @NotNull + @Schema(description = "发布状态,0表示仅自己可见,1表示公开,2表示禁用") + private String visibility; +} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatConversationCreateRoleReq.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatConversationCreateRoleReq.java deleted file mode 100644 index 9af6a44..0000000 --- a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatConversationCreateRoleReq.java +++ /dev/null @@ -1,26 +0,0 @@ -package cn.iocoder.yudao.module.ai.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotNull; -import lombok.Data; -import lombok.experimental.Accessors; - -/** - * 聊天对话 - * - * @author fansili - * @time 2024/4/18 16:24 - * @since 1.0 - */ -@Data -@Accessors(chain = true) -public class ChatConversationCreateRoleReq { - - @Schema(description = "chat角色Id") - @NotNull(message = "聊天角色id不能为空!") - private Long chatRoleId; - - @Schema(description = "标题(有程序自动生成)") - @NotNull(message = "标题不能为空!") - private String title; -} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatConversationCreateUserReq.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatConversationCreateUserReq.java deleted file mode 100644 index 9f96717..0000000 --- a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatConversationCreateUserReq.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.iocoder.yudao.module.ai.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotNull; -import lombok.Data; -import lombok.experimental.Accessors; - -/** - * 聊天对话 - * - * @author fansili - * @time 2024/4/18 16:24 - * @since 1.0 - */ -@Data -@Accessors(chain = true) -public class ChatConversationCreateUserReq { - - @Schema(description = "对话标题") - @NotNull(message = "标题不能为空!") - private String title; -} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatConversationListReq.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatConversationListReq.java deleted file mode 100644 index 846c8b2..0000000 --- a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatConversationListReq.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.iocoder.yudao.module.ai.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; - -/** - * 聊天对话 list req - * - * @author fansili - * @time 2024/4/18 16:24 - * @since 1.0 - */ -@Data -@Accessors(chain = true) -public class ChatConversationListReq { - - @Schema(description = "查询根据title") - private String search; -} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatConversationRes.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatConversationRes.java deleted file mode 100644 index aa11c04..0000000 --- a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatConversationRes.java +++ /dev/null @@ -1,38 +0,0 @@ -package cn.iocoder.yudao.module.ai.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; - -/** - * 聊天对话 res - * - * @author fansili - * @time 2024/4/18 16:24 - * @since 1.0 - */ -@Data -@Accessors(chain = true) -public class ChatConversationRes { - - @Schema(description = "id") - private Long id; - - @Schema(description = "用户id") - private Long userId; - - @Schema(description = "chat角色Id") - private Long chatRoleId; - - @Schema(description = "chat角色名称") - private String chatRoleName; - - @Schema(description = "标题(有程序自动生成)") - private String title; - - @Schema(description = "对话类型(roleChat、userChat)") - private String type; - - @Schema(description = "聊天次数(有程序自动生成)") - private Integer chatCount; -} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatMessageDeleteReq.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatMessageDeleteReq.java deleted file mode 100644 index 9b2986e..0000000 --- a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatMessageDeleteReq.java +++ /dev/null @@ -1,28 +0,0 @@ -package cn.iocoder.yudao.module.ai.vo; - -import cn.iocoder.yudao.framework.common.pojo.PageParam; -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotNull; -import lombok.Data; -import lombok.experimental.Accessors; - -/** - * chat message list req - * - * @author fansili - * @time 2024/4/14 16:12 - * @since 1.0 - */ -@Data -@Accessors(chain = true) -public class ChatMessageDeleteReq extends PageParam { - - @Schema(description = "id") - @NotNull - private Long id; - - @Schema(description = "聊天ID,关联到特定的会话或对话") - @NotNull - private Long chatConversationId; - -} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatMessageListRes.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatMessageListRes.java deleted file mode 100644 index 52017c0..0000000 --- a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatMessageListRes.java +++ /dev/null @@ -1,42 +0,0 @@ -package cn.iocoder.yudao.module.ai.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; - -/** - * 看板 message list req - * - * @author fansili - * @time 2024/4/24 17:28 - * @since 1.0 - */ -@Data -@Accessors(chain = true) -public class ChatMessageListRes { - - @Schema(description = "编号") - private Long id; - - @Schema(description = "聊天ID,关联到特定的会话或对话") - private Long chatConversationId; - - @Schema(description = "角色ID,用于标识发送消息的用户或系统的身份") - private Long userId; - - @Schema(description = "消息具体内容,存储用户的发言或者系统响应的文字信息") - private String message; - - @Schema(description = "消息类型,枚举值可能包括'system'(系统消息)、'user'(用户消息)和'assistant'(助手消息)") - private String messageType; - - @Schema(description = "在生成消息时采用的Top-K采样大小") - private Double topK; - - @Schema(description = "Top-P核采样方法的概率阈值") - private Double topP; - - @Schema(description = "温度参数,用于调整生成回复的随机性和多样性程度,") - private Double temperature; - -} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatMessageReq.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatMessageReq.java deleted file mode 100644 index b0f38a3..0000000 --- a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatMessageReq.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.iocoder.yudao.module.ai.vo; - -import cn.iocoder.yudao.framework.common.pojo.PageParam; -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotNull; -import lombok.Data; -import lombok.experimental.Accessors; - -/** - * chat message list req - * - * @author fansili - * @time 2024/4/14 16:12 - * @since 1.0 - */ -@Data -@Accessors(chain = true) -public class ChatMessageReq extends PageParam { - - @Schema(description = "聊天ID,关联到特定的会话或对话") - @NotNull - private Long chatConversationId; - -} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatReq.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatReq.java deleted file mode 100644 index cf41e4c..0000000 --- a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatReq.java +++ /dev/null @@ -1,48 +0,0 @@ -package cn.iocoder.yudao.module.ai.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.Size; -import lombok.Data; -import lombok.experimental.Accessors; - -/** - * chat req - * - * @author fansili - * @time 2024/4/14 16:12 - * @since 1.0 - */ -@Data -@Accessors(chain = true) -public class ChatReq { - - @Schema(description = "ai模型(查看 AiClientNameEnum)") - @NotNull(message = "模型不能为空!") - @Size(max = 30, message = "模型字符最大 30个字符!") - private String modal; - - @Schema(description = "对话Id") - @NotNull(message = "对话id不能为空") - private Long conversationId; - - @Schema(description = "chat角色模板") - private Long chatRoleId; - - @NotNull(message = "提示词不能为空!") - @Size(max = 5000, message = "提示词最大5000个字符!") - @Schema(description = "填入固定值,1 issues, 2 pr") - private String prompt; - - @Schema(description = "用于控制随机性和多样性的温度参数") - private Double temperature; - - @Schema(description = "生成时,核采样方法的概率阈值。例如,取值为0.8时,仅保留累计概率之和大于等于0.8的概率分布中的token,\n" + - " * 作为随机采样的候选集。取值范围为(0,1.0),取值越大,生成的随机性越高;取值越低,生成的随机性越低。\n" + - " * 默认值为0.8。注意,取值不要大于等于1\n") - private Double topP; - - @Schema(description = "在生成消息时采用的Top-K采样大小,表示模型生成回复时考虑的候选项集合的大小") - private Double topK; - -} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatRoleAddReq.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatRoleAddReq.java deleted file mode 100644 index 2c83bc5..0000000 --- a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatRoleAddReq.java +++ /dev/null @@ -1,54 +0,0 @@ -package cn.iocoder.yudao.module.ai.vo; - -import cn.iocoder.yudao.framework.common.pojo.PageParam; -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotNull; -import lombok.Data; -import lombok.experimental.Accessors; - -/** - * chat 角色列表 - * - * @fansili - * @since v1.0 - */ -@Data -@Accessors(chain = true) -public class ChatRoleAddReq extends PageParam { - - @NotNull - @Schema(description = "模型编号,关联到角色使用的特定模型") - private String modelId; - - @NotNull - @Schema(description = "角色名,角色的显示名称") - private String roleName; - - @NotNull - @Schema(description = "角色介绍,详细描述角色的功能或用途") - private String roleIntroduce; - - @NotNull - @Schema(description = "角色来源,如 system(系统预置)、customer(用户自定义)") - private String roleSource; - - @NotNull - @Schema(description = "分类,角色所属的类别,如娱乐、创作等") - private String classify; - - @NotNull - @Schema(description = "发布状态,private 表示仅自己可见,public表示公开,disable表示禁用\n") - private String visibility; - - @NotNull - @Schema(description = "生成时的Top-K采样候选集大小") - private Double topK; - - @NotNull - @Schema(description = "生成时使用的核采样方法的概率阈值") - private Double topP; - - @NotNull - @Schema(description = "用于控制随机性和多样性的温度参数") - private Double temperature; -} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatRoleListReq.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatRoleListReq.java deleted file mode 100644 index 32a028b..0000000 --- a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatRoleListReq.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.iocoder.yudao.module.ai.vo; - -import cn.iocoder.yudao.framework.common.pojo.PageParam; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; - -/** - * chat 角色列表 - * - * @fansili - * @since v1.0 - */ -@Data -@Accessors(chain = true) -public class ChatRoleListReq extends PageParam { - - @Schema(description = "查询") - private String search; -} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatRoleListRes.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatRoleListRes.java deleted file mode 100644 index 5babda5..0000000 --- a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatRoleListRes.java +++ /dev/null @@ -1,52 +0,0 @@ -package cn.iocoder.yudao.module.ai.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; - -/** - * chat 角色列表 - * - * @fansili - * @since v1.0 - */ -@Data -@Accessors(chain = true) -public class ChatRoleListRes { - - @Schema(description = "id") - private Long id; - - @Schema(description = "用户id") - private Long userId; - - @Schema(description = "模型id") - private String modelId; - - @Schema(description = "角色名字") - private String roleName; - - @Schema(description = "角色介绍,详细描述角色的功能或用途") - private String roleIntroduce; - - @Schema(description = "角色来源,如 system(系统预置)、customer(用户自定义)") - private String roleSource; - - @Schema(description = "分类,角色所属的类别,如娱乐、创作等") - private String classify; - - @Schema(description = "发布状态,0表示仅自己可见,1表示公开,2表示禁用") - private String visibility; - - @Schema(description = "生成时的Top-K采样候选集大小") - private Double topK; - - @Schema(description = "生成时使用的核采样方法的概率阈值") - private Double topP; - - @Schema(description = "用于控制随机性和多样性的温度参数") - private Double temperature; - - @Schema(description = "角色的使用次数统计") - private Integer useCount; -} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatRoleUpdateReq.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatRoleUpdateReq.java deleted file mode 100644 index 6ec165e..0000000 --- a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatRoleUpdateReq.java +++ /dev/null @@ -1,54 +0,0 @@ -package cn.iocoder.yudao.module.ai.vo; - -import cn.iocoder.yudao.framework.common.pojo.PageParam; -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotNull; -import lombok.Data; -import lombok.experimental.Accessors; - -/** - * chat 角色 - 更新 - * - * @fansili - * @since v1.0 - */ -@Data -@Accessors(chain = true) -public class ChatRoleUpdateReq extends PageParam { - - @NotNull - @Schema(description = "模型编号,关联到角色使用的特定模型") - private String modelId; - - @NotNull - @Schema(description = "角色名,角色的显示名称") - private String roleName; - - @NotNull - @Schema(description = "角色介绍,详细描述角色的功能或用途") - private String roleIntroduce; - - @NotNull - @Schema(description = "角色来源,如 system(系统预置)、customer(用户自定义)") - private String roleSource; - - @NotNull - @Schema(description = "分类,角色所属的类别,如娱乐、创作等") - private String classify; - - @NotNull - @Schema(description = "发布状态,0表示仅自己可见,1表示公开,2表示禁用") - private String visibility; - - @NotNull - @Schema(description = "生成时的Top-K采样候选集大小") - private Double topK; - - @NotNull - @Schema(description = "生成时使用的核采样方法的概率阈值") - private Double topP; - - @NotNull - @Schema(description = "用于控制随机性和多样性的温度参数") - private Double temperature; -} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatRoleUpdateVisibilityReq.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatRoleUpdateVisibilityReq.java deleted file mode 100644 index 764972f..0000000 --- a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatRoleUpdateVisibilityReq.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.iocoder.yudao.module.ai.vo; - -import cn.iocoder.yudao.framework.common.pojo.PageParam; -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotNull; -import lombok.Data; -import lombok.experimental.Accessors; - -/** - * chat 角色 - 修改可见性 - * - * @fansili - * @since v1.0 - */ -@Data -@Accessors(chain = true) -public class ChatRoleUpdateVisibilityReq extends PageParam { - - @NotNull - @Schema(description = "发布状态,0表示仅自己可见,1表示公开,2表示禁用") - private String visibility; -} -- libgit2 0.21.4