Commit 78bb2d1dc8ae0bff30c18f14a99133e53d642c0d
1 parent
69fa9879
【新增】AI:聊天对话的更新标题
Showing
3 changed files
with
35 additions
and
16 deletions
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 |