Commit 78bb2d1dc8ae0bff30c18f14a99133e53d642c0d

Authored by YunaiV
1 parent 69fa9879

【新增】AI:聊天对话的更新标题

yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/ErrorCodeConstants.java
... ... @@ -10,26 +10,28 @@ import cn.iocoder.yudao.framework.common.exception.ErrorCode;
10 10 public interface ErrorCodeConstants {
11 11  
12 12 // ========== API 密钥 1-040-000-000 ==========
13   - ErrorCode API_KEY_NOT_EXISTS = new ErrorCode(1_040_000_000, "AI API 密钥不存在");
14   - ErrorCode API_KEY_DISABLE = new ErrorCode(1_040_000_001, "AI API 密钥已禁用!");
  13 + ErrorCode API_KEY_NOT_EXISTS = new ErrorCode(1_040_000_000, "API 密钥不存在");
  14 + ErrorCode API_KEY_DISABLE = new ErrorCode(1_040_000_001, "API 密钥已禁用!");
15 15  
16 16 // ========== API 聊天模型 1-040-001-000 ==========
17   - ErrorCode CHAT_MODEL_NOT_EXISTS = new ErrorCode(1_040_001_000, "AI 模型不存在!");
18   - ErrorCode CHAT_MODEL_DISABLE = new ErrorCode(1_040_001_001, "AI 模型({})已禁用!");
  17 + ErrorCode CHAT_MODEL_NOT_EXISTS = new ErrorCode(1_040_001_000, "模型不存在!");
  18 + ErrorCode CHAT_MODEL_DISABLE = new ErrorCode(1_040_001_001, "模型({})已禁用!");
19 19 ErrorCode CHAT_MODEL_DEFAULT_NOT_EXISTS = new ErrorCode(1_040_001_002, "操作失败,找不到默认聊天模型");
20 20  
21 21 // ========== API 聊天模型 1-040-002-000 ==========
22   - ErrorCode CHAT_ROLE_NOT_EXISTS = new ErrorCode(1_040_002_000, "AI 聊天角色不存在");
23   - ErrorCode CHAT_ROLE_DISABLE = new ErrorCode(1_040_001_001, "AI 聊天角色({})已禁用!");
  22 + ErrorCode CHAT_ROLE_NOT_EXISTS = new ErrorCode(1_040_002_000, "聊天角色不存在");
  23 + ErrorCode CHAT_ROLE_DISABLE = new ErrorCode(1_040_001_001, "聊天角色({})已禁用!");
24 24 ErrorCode CHAT_ROLE_DEFAULT_NOT_EXISTS = new ErrorCode(1_040_001_002, "操作失败,找不到默认聊天角色");
25 25  
26 26 // ========== API 聊天会话 1-040-003-000 ==========
27 27  
28   - ErrorCode CHAT_CONVERSATION_NOT_EXISTS = new ErrorCode(1_040_003_000, "AI 对话不存在!");
  28 + ErrorCode CHAT_CONVERSATION_NOT_EXISTS = new ErrorCode(1_040_003_000, "对话不存在!");
29 29 ErrorCode CHAT_CONVERSATION_MODEL_ERROR = new ErrorCode(1_040_003_001, "操作失败,该聊天模型的配置不完整");
  30 + ErrorCode CHAT_CONVERSATION_UPDATE_MAX_TOKENS_ERROR = new ErrorCode(1_040_003_002, "更新对话失败,最大 Token 超过上限");
  31 + ErrorCode CHAT_CONVERSATION_UPDATE_MAX_CONTEXTS_ERROR = new ErrorCode(1_040_003_002, "更新对话失败,最大 Context 超过上限");
30 32  
31 33 // chat
32   - ErrorCode AI_CHAT_MESSAGE_NOT_EXIST = new ErrorCode(1_022_000_100, "AI 提问的 MessageId 不存在!");
  34 + ErrorCode AI_CHAT_MESSAGE_NOT_EXIST = new ErrorCode(1_022_000_100, "提问的 MessageId 不存在!");
33 35  
34 36 // midjourney
35 37  
... ...
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/chat/AiChatConversationDO.java
... ... @@ -9,6 +9,9 @@ import com.baomidou.mybatisplus.annotation.TableId;
9 9 import com.baomidou.mybatisplus.annotation.TableName;
10 10 import lombok.*;
11 11  
  12 +import java.time.LocalDateTime;
  13 +import java.util.Date;
  14 +
12 15 /**
13 16 * AI Chat 会话 DO
14 17 *
... ... @@ -51,6 +54,10 @@ public class AiChatConversationDO extends BaseDO {
51 54 * 是否置顶
52 55 */
53 56 private Boolean pinned;
  57 + /**
  58 + * 置顶时间
  59 + */
  60 + private LocalDateTime pinnedTime;
54 61  
55 62 /**
56 63 * 角色编号
... ...
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/chat/AiChatConversationServiceImpl.java
... ... @@ -20,11 +20,11 @@ import lombok.extern.slf4j.Slf4j;
20 20 import org.springframework.stereotype.Service;
21 21 import org.springframework.validation.annotation.Validated;
22 22  
  23 +import java.time.LocalDateTime;
23 24 import java.util.List;
24 25  
25 26 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.*;
26   -import static cn.iocoder.yudao.module.ai.ErrorCodeConstants.CHAT_CONVERSATION_MODEL_ERROR;
27   -import static cn.iocoder.yudao.module.ai.ErrorCodeConstants.CHAT_CONVERSATION_NOT_EXISTS;
  27 +import static cn.iocoder.yudao.module.ai.ErrorCodeConstants.*;
28 28  
29 29 /**
30 30 * AI 聊天对话 Service 实现类
... ... @@ -72,16 +72,26 @@ public class AiChatConversationServiceImpl implements AiChatConversationService
72 72 if (ObjUtil.notEqual(conversation.getUserId(), userId)) {
73 73 throw exception(CHAT_CONVERSATION_NOT_EXISTS);
74 74 }
75   - // 1.2 校验模型是否存在
76   - AiChatModelDO model;
77   - if (updateReqVO.getModelId() != null) {
78   - model = chatModalService.validateChatModel(updateReqVO.getModelId());
  75 + // 1.2 校验模型是否存在(修改模型的情况)
  76 + if (!ObjectUtil.isAllEmpty(updateReqVO.getModelId(), updateReqVO.getMaxTokens(), updateReqVO.getMaxContexts())) {
  77 + AiChatModelDO model = chatModalService.validateChatModel(updateReqVO.getModelId());
79 78 Assert.notNull(model, "必须找到默认模型");
  79 + validateChatModel(model);
  80 + // 校验 Token 数量、上下文数量
  81 + if (updateReqVO.getMaxTokens() != null && updateReqVO.getMaxTokens() > model.getMaxTokens()) {
  82 + throw exception(CHAT_CONVERSATION_UPDATE_MAX_TOKENS_ERROR);
  83 + }
  84 + if (updateReqVO.getMaxContexts() != null && updateReqVO.getMaxContexts() > model.getMaxContexts()) {
  85 + throw exception(CHAT_CONVERSATION_UPDATE_MAX_CONTEXTS_ERROR);
  86 + }
80 87 }
81   - // 1.3 校验温度参数、Token 数量、消息数量 TODO
82 88  
83 89 // 更新对话信息
84   - chatConversationMapper.updateById(BeanUtils.toBean(updateReqVO, AiChatConversationDO.class));
  90 + AiChatConversationDO updateObj = BeanUtils.toBean(updateReqVO, AiChatConversationDO.class);
  91 + if (Boolean.TRUE.equals(updateReqVO.getPinned())) {
  92 + updateObj.setPinnedTime(LocalDateTime.now());
  93 + }
  94 + chatConversationMapper.updateById(updateObj);
85 95 }
86 96  
87 97 @Override
... ...