Commit 79bd78998d25dda9ab7f308c7ca8e9ee67912eed

Authored by cherishsince
1 parent 2734e54b

【增加】增加模型头像

yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/chat/vo/message/AiChatMessageRespVO.java
@@ -3,6 +3,8 @@ package cn.iocoder.yudao.module.ai.controller.admin.chat.vo.message; @@ -3,6 +3,8 @@ package cn.iocoder.yudao.module.ai.controller.admin.chat.vo.message;
3 import io.swagger.v3.oas.annotations.media.Schema; 3 import io.swagger.v3.oas.annotations.media.Schema;
4 import lombok.Data; 4 import lombok.Data;
5 5
  6 +import java.time.LocalDateTime;
  7 +
6 @Schema(description = "管理后台 - AI 聊天消息 Response VO") 8 @Schema(description = "管理后台 - AI 聊天消息 Response VO")
7 @Data 9 @Data
8 public class AiChatMessageRespVO { 10 public class AiChatMessageRespVO {
@@ -19,6 +21,9 @@ public class AiChatMessageRespVO { @@ -19,6 +21,9 @@ public class AiChatMessageRespVO {
19 @Schema(description = "用户编号", example = "4096") 21 @Schema(description = "用户编号", example = "4096")
20 private Long userId; // 仅当 user 发送时非空 22 private Long userId; // 仅当 user 发送时非空
21 23
  24 + @Schema(description = "用户头像", example = "http://xxx")
  25 + private Long avatarUrl; // 仅当 user 发送时非空
  26 +
22 @Schema(description = "角色编号", example = "888") 27 @Schema(description = "角色编号", example = "888")
23 private Long roleId; // 仅当 assistant 回复时非空 28 private Long roleId; // 仅当 assistant 回复时非空
24 29
@@ -28,10 +33,15 @@ public class AiChatMessageRespVO { @@ -28,10 +33,15 @@ public class AiChatMessageRespVO {
28 @Schema(description = "模型编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "123") 33 @Schema(description = "模型编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "123")
29 private Long modelId; 34 private Long modelId;
30 35
  36 + @Schema(description = "模型图片", requiredMode = Schema.RequiredMode.REQUIRED, example = "123")
  37 + private String modelImage;
  38 +
31 @Schema(description = "聊天内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "你好,你好啊") 39 @Schema(description = "聊天内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "你好,你好啊")
32 private String content; 40 private String content;
33 41
34 @Schema(description = "消耗 Token 数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "80") 42 @Schema(description = "消耗 Token 数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "80")
35 private Integer tokens; 43 private Integer tokens;
36 44
  45 + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "2024-05-12 12:51")
  46 + private LocalDateTime createTime;
37 } 47 }
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/mysql/AiChatModelMapper.java
@@ -9,6 +9,10 @@ import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatModelDO; @@ -9,6 +9,10 @@ import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatModelDO;
9 import org.apache.ibatis.annotations.Mapper; 9 import org.apache.ibatis.annotations.Mapper;
10 import org.springframework.stereotype.Repository; 10 import org.springframework.stereotype.Repository;
11 11
  12 +import java.util.Collection;
  13 +import java.util.List;
  14 +import java.util.Set;
  15 +
12 /** 16 /**
13 * chat modal 17 * chat modal
14 * 18 *
@@ -36,5 +40,11 @@ public interface AiChatModelMapper extends BaseMapperX<AiChatModelDO> { @@ -36,5 +40,11 @@ public interface AiChatModelMapper extends BaseMapperX<AiChatModelDO> {
36 return pageResult.getList().get(0); 40 return pageResult.getList().get(0);
37 } 41 }
38 42
39 - 43 + /**
  44 + * 查询 - 根据 ids
  45 + *
  46 + * @param modalIds
  47 + * @return
  48 + */
  49 + List<AiChatModelDO> selectByIds(Collection<Long> modalIds);
40 } 50 }
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/AiChatModelService.java
@@ -4,6 +4,9 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -4,6 +4,9 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 import cn.iocoder.yudao.module.ai.controller.admin.model.vo.model.*; 4 import cn.iocoder.yudao.module.ai.controller.admin.model.vo.model.*;
5 import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatModelDO; 5 import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatModelDO;
6 6
  7 +import java.util.List;
  8 +import java.util.Set;
  9 +
7 /** 10 /**
8 * ai modal 11 * ai modal
9 * 12 *
@@ -64,4 +67,13 @@ public interface AiChatModelService { @@ -64,4 +67,13 @@ public interface AiChatModelService {
64 * @param chatModal 67 * @param chatModal
65 */ 68 */
66 void validateAvailable(AiChatModalRespVO chatModal); 69 void validateAvailable(AiChatModalRespVO chatModal);
  70 +
  71 + /**
  72 + * 获取 - 根据 ids 批量获取
  73 + *
  74 + * @param modalIds
  75 + * @return
  76 + */
  77 + List<AiChatModelDO> getModalByIds(Set<Long> modalIds);
  78 +
67 } 79 }
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/AiChatModalServiceImpl.java
@@ -17,6 +17,7 @@ import cn.iocoder.yudao.module.ai.service.AiChatModelService; @@ -17,6 +17,7 @@ import cn.iocoder.yudao.module.ai.service.AiChatModelService;
17 import jakarta.validation.ConstraintViolation; 17 import jakarta.validation.ConstraintViolation;
18 import lombok.AllArgsConstructor; 18 import lombok.AllArgsConstructor;
19 import lombok.extern.slf4j.Slf4j; 19 import lombok.extern.slf4j.Slf4j;
  20 +import org.mybatis.spring.annotation.MapperScannerRegistrar;
20 import org.springframework.stereotype.Service; 21 import org.springframework.stereotype.Service;
21 22
22 import java.util.List; 23 import java.util.List;
@@ -35,6 +36,7 @@ import java.util.Set; @@ -35,6 +36,7 @@ import java.util.Set;
35 public class AiChatModalServiceImpl implements AiChatModelService { 36 public class AiChatModalServiceImpl implements AiChatModelService {
36 37
37 private final AiChatModelMapper aiChatModelMapper; 38 private final AiChatModelMapper aiChatModelMapper;
  39 + private final MapperScannerRegistrar mapperScannerRegistrar;
38 40
39 @Override 41 @Override
40 public PageResult<AiChatModelListRespVO> list(AiChatModelListReqVO req) { 42 public PageResult<AiChatModelListRespVO> list(AiChatModelListReqVO req) {
@@ -102,6 +104,11 @@ public class AiChatModalServiceImpl implements AiChatModelService { @@ -102,6 +104,11 @@ public class AiChatModalServiceImpl implements AiChatModelService {
102 } 104 }
103 } 105 }
104 106
  107 + @Override
  108 + public List<AiChatModelDO> getModalByIds(Set<Long> modalIds) {
  109 + return aiChatModelMapper.selectByIds(modalIds);
  110 + }
  111 +
105 public AiChatModelDO validateExists(Long id) { 112 public AiChatModelDO validateExists(Long id) {
106 AiChatModelDO aiChatModalDO = aiChatModelMapper.selectById(id); 113 AiChatModelDO aiChatModalDO = aiChatModelMapper.selectById(id);
107 if (aiChatModalDO == null) { 114 if (aiChatModalDO == null) {
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/AiChatServiceImpl.java
@@ -15,6 +15,7 @@ import cn.iocoder.yudao.module.ai.controller.admin.chat.vo.message.AiChatMessage @@ -15,6 +15,7 @@ import cn.iocoder.yudao.module.ai.controller.admin.chat.vo.message.AiChatMessage
15 import cn.iocoder.yudao.module.ai.controller.admin.model.vo.model.AiChatModalRespVO; 15 import cn.iocoder.yudao.module.ai.controller.admin.model.vo.model.AiChatModalRespVO;
16 import cn.iocoder.yudao.module.ai.convert.AiChatMessageConvert; 16 import cn.iocoder.yudao.module.ai.convert.AiChatMessageConvert;
17 import cn.iocoder.yudao.module.ai.dal.dataobject.chat.AiChatMessageDO; 17 import cn.iocoder.yudao.module.ai.dal.dataobject.chat.AiChatMessageDO;
  18 +import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatModelDO;
18 import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatRoleDO; 19 import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatRoleDO;
19 import cn.iocoder.yudao.module.ai.dal.mysql.AiChatConversationMapper; 20 import cn.iocoder.yudao.module.ai.dal.mysql.AiChatConversationMapper;
20 import cn.iocoder.yudao.module.ai.dal.mysql.AiChatMessageMapper; 21 import cn.iocoder.yudao.module.ai.dal.mysql.AiChatMessageMapper;
@@ -29,8 +30,11 @@ import org.springframework.transaction.annotation.Transactional; @@ -29,8 +30,11 @@ import org.springframework.transaction.annotation.Transactional;
29 import reactor.core.publisher.Flux; 30 import reactor.core.publisher.Flux;
30 31
31 import java.util.List; 32 import java.util.List;
  33 +import java.util.Map;
  34 +import java.util.Set;
32 import java.util.concurrent.atomic.AtomicInteger; 35 import java.util.concurrent.atomic.AtomicInteger;
33 import java.util.function.Consumer; 36 import java.util.function.Consumer;
  37 +import java.util.stream.Collectors;
34 38
35 /** 39 /**
36 * 聊天 service 40 * 聊天 service
@@ -188,8 +192,20 @@ public class AiChatServiceImpl implements AiChatService { @@ -188,8 +192,20 @@ public class AiChatServiceImpl implements AiChatService {
188 chatConversationService.validateExists(conversationId); 192 chatConversationService.validateExists(conversationId);
189 // 获取对话所有 message 193 // 获取对话所有 message
190 List<AiChatMessageDO> aiChatMessageDOList = aiChatMessageMapper.selectByConversationId(conversationId); 194 List<AiChatMessageDO> aiChatMessageDOList = aiChatMessageMapper.selectByConversationId(conversationId);
  195 + // 获取模型信息
  196 + Set<Long> modalIds = aiChatMessageDOList.stream().map(AiChatMessageDO::getModelId).collect(Collectors.toSet());
  197 + List<AiChatModelDO> modalList = aiChatModalService.getModalByIds(modalIds);
  198 + Map<Long, AiChatModelDO> modalIdMap = modalList.stream().collect(Collectors.toMap(AiChatModelDO::getId, o -> o));
191 // 转换 AiChatMessageRespVO 199 // 转换 AiChatMessageRespVO
192 - return AiChatMessageConvert.INSTANCE.convertAiChatMessageRespVOList(aiChatMessageDOList); 200 + List<AiChatMessageRespVO> aiChatMessageRespList = AiChatMessageConvert.INSTANCE.convertAiChatMessageRespVOList(aiChatMessageDOList);
  201 + // 设置用户头像 和 模型头像 todo @芋艿 这里需要转换 用户头像、模型头像
  202 + return aiChatMessageRespList.stream().map(item -> {
  203 + if (modalIdMap.containsKey(item.getModelId())) {
  204 +// modalIdMap.get(item.getModelId());
  205 +// item.setModelImage()
  206 + }
  207 + return item;
  208 + }).collect(Collectors.toList());
193 } 209 }
194 210
195 @Override 211 @Override