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,26 +10,28 @@ import cn.iocoder.yudao.framework.common.exception.ErrorCode;
10 public interface ErrorCodeConstants { 10 public interface ErrorCodeConstants {
11 11
12 // ========== API 密钥 1-040-000-000 ========== 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 // ========== API 聊天模型 1-040-001-000 ========== 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 ErrorCode CHAT_MODEL_DEFAULT_NOT_EXISTS = new ErrorCode(1_040_001_002, "操作失败,找不到默认聊天模型"); 19 ErrorCode CHAT_MODEL_DEFAULT_NOT_EXISTS = new ErrorCode(1_040_001_002, "操作失败,找不到默认聊天模型");
20 20
21 // ========== API 聊天模型 1-040-002-000 ========== 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 ErrorCode CHAT_ROLE_DEFAULT_NOT_EXISTS = new ErrorCode(1_040_001_002, "操作失败,找不到默认聊天角色"); 24 ErrorCode CHAT_ROLE_DEFAULT_NOT_EXISTS = new ErrorCode(1_040_001_002, "操作失败,找不到默认聊天角色");
25 25
26 // ========== API 聊天会话 1-040-003-000 ========== 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 ErrorCode CHAT_CONVERSATION_MODEL_ERROR = new ErrorCode(1_040_003_001, "操作失败,该聊天模型的配置不完整"); 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 // chat 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 // midjourney 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,6 +9,9 @@ import com.baomidou.mybatisplus.annotation.TableId;
9 import com.baomidou.mybatisplus.annotation.TableName; 9 import com.baomidou.mybatisplus.annotation.TableName;
10 import lombok.*; 10 import lombok.*;
11 11
  12 +import java.time.LocalDateTime;
  13 +import java.util.Date;
  14 +
12 /** 15 /**
13 * AI Chat 会话 DO 16 * AI Chat 会话 DO
14 * 17 *
@@ -51,6 +54,10 @@ public class AiChatConversationDO extends BaseDO { @@ -51,6 +54,10 @@ public class AiChatConversationDO extends BaseDO {
51 * 是否置顶 54 * 是否置顶
52 */ 55 */
53 private Boolean pinned; 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,11 +20,11 @@ import lombok.extern.slf4j.Slf4j;
20 import org.springframework.stereotype.Service; 20 import org.springframework.stereotype.Service;
21 import org.springframework.validation.annotation.Validated; 21 import org.springframework.validation.annotation.Validated;
22 22
  23 +import java.time.LocalDateTime;
23 import java.util.List; 24 import java.util.List;
24 25
25 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.*; 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 * AI 聊天对话 Service 实现类 30 * AI 聊天对话 Service 实现类
@@ -72,16 +72,26 @@ public class AiChatConversationServiceImpl implements AiChatConversationService @@ -72,16 +72,26 @@ public class AiChatConversationServiceImpl implements AiChatConversationService
72 if (ObjUtil.notEqual(conversation.getUserId(), userId)) { 72 if (ObjUtil.notEqual(conversation.getUserId(), userId)) {
73 throw exception(CHAT_CONVERSATION_NOT_EXISTS); 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 Assert.notNull(model, "必须找到默认模型"); 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 @Override 97 @Override