mirror of
				https://github.com/YunaiV/ruoyi-vue-pro.git
				synced 2025-10-31 02:28:03 +08:00 
			
		
		
		
	【增加】增加模型头像
This commit is contained in:
		| @ -3,6 +3,8 @@ package cn.iocoder.yudao.module.ai.controller.admin.chat.vo.message; | |||||||
| import io.swagger.v3.oas.annotations.media.Schema; | import io.swagger.v3.oas.annotations.media.Schema; | ||||||
| import lombok.Data; | import lombok.Data; | ||||||
|  |  | ||||||
|  | import java.time.LocalDateTime; | ||||||
|  |  | ||||||
| @Schema(description = "管理后台 - AI 聊天消息 Response VO") | @Schema(description = "管理后台 - AI 聊天消息 Response VO") | ||||||
| @Data | @Data | ||||||
| public class AiChatMessageRespVO { | public class AiChatMessageRespVO { | ||||||
| @ -19,6 +21,9 @@ public class AiChatMessageRespVO { | |||||||
|     @Schema(description = "用户编号", example = "4096") |     @Schema(description = "用户编号", example = "4096") | ||||||
|     private Long userId; // 仅当 user 发送时非空 |     private Long userId; // 仅当 user 发送时非空 | ||||||
|  |  | ||||||
|  |     @Schema(description = "用户头像", example = "http://xxx") | ||||||
|  |     private Long avatarUrl; // 仅当 user 发送时非空 | ||||||
|  |  | ||||||
|     @Schema(description = "角色编号", example = "888") |     @Schema(description = "角色编号", example = "888") | ||||||
|     private Long roleId; // 仅当 assistant 回复时非空 |     private Long roleId; // 仅当 assistant 回复时非空 | ||||||
|  |  | ||||||
| @ -28,10 +33,15 @@ public class AiChatMessageRespVO { | |||||||
|     @Schema(description = "模型编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "123") |     @Schema(description = "模型编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "123") | ||||||
|     private Long modelId; |     private Long modelId; | ||||||
|  |  | ||||||
|  |     @Schema(description = "模型图片", requiredMode = Schema.RequiredMode.REQUIRED, example = "123") | ||||||
|  |     private String modelImage; | ||||||
|  |  | ||||||
|     @Schema(description = "聊天内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "你好,你好啊") |     @Schema(description = "聊天内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "你好,你好啊") | ||||||
|     private String content; |     private String content; | ||||||
|  |  | ||||||
|     @Schema(description = "消耗 Token 数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "80") |     @Schema(description = "消耗 Token 数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "80") | ||||||
|     private Integer tokens; |     private Integer tokens; | ||||||
|  |  | ||||||
|  |     @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "2024-05-12 12:51") | ||||||
|  |     private LocalDateTime createTime; | ||||||
| } | } | ||||||
|  | |||||||
| @ -9,6 +9,10 @@ import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatModelDO; | |||||||
| import org.apache.ibatis.annotations.Mapper; | import org.apache.ibatis.annotations.Mapper; | ||||||
| import org.springframework.stereotype.Repository; | import org.springframework.stereotype.Repository; | ||||||
|  |  | ||||||
|  | import java.util.Collection; | ||||||
|  | import java.util.List; | ||||||
|  | import java.util.Set; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * chat modal |  * chat modal | ||||||
|  * |  * | ||||||
| @ -36,5 +40,11 @@ public interface AiChatModelMapper extends BaseMapperX<AiChatModelDO> { | |||||||
|         return pageResult.getList().get(0); |         return pageResult.getList().get(0); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 查询 - 根据 ids | ||||||
|  |      * | ||||||
|  |      * @param modalIds | ||||||
|  |      * @return | ||||||
|  |      */ | ||||||
|  |     List<AiChatModelDO> selectByIds(Collection<Long> modalIds); | ||||||
| } | } | ||||||
|  | |||||||
| @ -4,6 +4,9 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; | |||||||
| import cn.iocoder.yudao.module.ai.controller.admin.model.vo.model.*; | import cn.iocoder.yudao.module.ai.controller.admin.model.vo.model.*; | ||||||
| import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatModelDO; | import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatModelDO; | ||||||
|  |  | ||||||
|  | import java.util.List; | ||||||
|  | import java.util.Set; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * ai modal |  * ai modal | ||||||
|  * |  * | ||||||
| @ -64,4 +67,13 @@ public interface AiChatModelService { | |||||||
|      * @param chatModal |      * @param chatModal | ||||||
|      */ |      */ | ||||||
|     void validateAvailable(AiChatModalRespVO chatModal); |     void validateAvailable(AiChatModalRespVO chatModal); | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 获取 - 根据 ids 批量获取 | ||||||
|  |      * | ||||||
|  |      * @param modalIds | ||||||
|  |      * @return | ||||||
|  |      */ | ||||||
|  |     List<AiChatModelDO> getModalByIds(Set<Long> modalIds); | ||||||
|  |  | ||||||
| } | } | ||||||
|  | |||||||
| @ -17,6 +17,7 @@ import cn.iocoder.yudao.module.ai.service.AiChatModelService; | |||||||
| import jakarta.validation.ConstraintViolation; | import jakarta.validation.ConstraintViolation; | ||||||
| import lombok.AllArgsConstructor; | import lombok.AllArgsConstructor; | ||||||
| import lombok.extern.slf4j.Slf4j; | import lombok.extern.slf4j.Slf4j; | ||||||
|  | import org.mybatis.spring.annotation.MapperScannerRegistrar; | ||||||
| import org.springframework.stereotype.Service; | import org.springframework.stereotype.Service; | ||||||
|  |  | ||||||
| import java.util.List; | import java.util.List; | ||||||
| @ -35,6 +36,7 @@ import java.util.Set; | |||||||
| public class AiChatModalServiceImpl implements AiChatModelService { | public class AiChatModalServiceImpl implements AiChatModelService { | ||||||
|  |  | ||||||
|     private final AiChatModelMapper aiChatModelMapper; |     private final AiChatModelMapper aiChatModelMapper; | ||||||
|  |     private final MapperScannerRegistrar mapperScannerRegistrar; | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public PageResult<AiChatModelListRespVO> list(AiChatModelListReqVO req) { |     public PageResult<AiChatModelListRespVO> list(AiChatModelListReqVO req) { | ||||||
| @ -102,6 +104,11 @@ public class AiChatModalServiceImpl implements AiChatModelService { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public List<AiChatModelDO> getModalByIds(Set<Long> modalIds) { | ||||||
|  |         return aiChatModelMapper.selectByIds(modalIds); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     public AiChatModelDO validateExists(Long id) { |     public AiChatModelDO validateExists(Long id) { | ||||||
|         AiChatModelDO aiChatModalDO = aiChatModelMapper.selectById(id); |         AiChatModelDO aiChatModalDO = aiChatModelMapper.selectById(id); | ||||||
|         if (aiChatModalDO == null) { |         if (aiChatModalDO == null) { | ||||||
|  | |||||||
| @ -15,6 +15,7 @@ import cn.iocoder.yudao.module.ai.controller.admin.chat.vo.message.AiChatMessage | |||||||
| import cn.iocoder.yudao.module.ai.controller.admin.model.vo.model.AiChatModalRespVO; | import cn.iocoder.yudao.module.ai.controller.admin.model.vo.model.AiChatModalRespVO; | ||||||
| import cn.iocoder.yudao.module.ai.convert.AiChatMessageConvert; | import cn.iocoder.yudao.module.ai.convert.AiChatMessageConvert; | ||||||
| import cn.iocoder.yudao.module.ai.dal.dataobject.chat.AiChatMessageDO; | import cn.iocoder.yudao.module.ai.dal.dataobject.chat.AiChatMessageDO; | ||||||
|  | import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatModelDO; | ||||||
| import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatRoleDO; | import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatRoleDO; | ||||||
| import cn.iocoder.yudao.module.ai.dal.mysql.AiChatConversationMapper; | import cn.iocoder.yudao.module.ai.dal.mysql.AiChatConversationMapper; | ||||||
| import cn.iocoder.yudao.module.ai.dal.mysql.AiChatMessageMapper; | import cn.iocoder.yudao.module.ai.dal.mysql.AiChatMessageMapper; | ||||||
| @ -29,8 +30,11 @@ import org.springframework.transaction.annotation.Transactional; | |||||||
| import reactor.core.publisher.Flux; | import reactor.core.publisher.Flux; | ||||||
|  |  | ||||||
| import java.util.List; | import java.util.List; | ||||||
|  | import java.util.Map; | ||||||
|  | import java.util.Set; | ||||||
| import java.util.concurrent.atomic.AtomicInteger; | import java.util.concurrent.atomic.AtomicInteger; | ||||||
| import java.util.function.Consumer; | import java.util.function.Consumer; | ||||||
|  | import java.util.stream.Collectors; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * 聊天 service |  * 聊天 service | ||||||
| @ -188,8 +192,20 @@ public class AiChatServiceImpl implements AiChatService { | |||||||
|         chatConversationService.validateExists(conversationId); |         chatConversationService.validateExists(conversationId); | ||||||
|         // 获取对话所有 message |         // 获取对话所有 message | ||||||
|         List<AiChatMessageDO> aiChatMessageDOList = aiChatMessageMapper.selectByConversationId(conversationId); |         List<AiChatMessageDO> aiChatMessageDOList = aiChatMessageMapper.selectByConversationId(conversationId); | ||||||
|  |         // 获取模型信息 | ||||||
|  |         Set<Long> modalIds = aiChatMessageDOList.stream().map(AiChatMessageDO::getModelId).collect(Collectors.toSet()); | ||||||
|  |         List<AiChatModelDO> modalList = aiChatModalService.getModalByIds(modalIds); | ||||||
|  |         Map<Long, AiChatModelDO> modalIdMap = modalList.stream().collect(Collectors.toMap(AiChatModelDO::getId, o -> o)); | ||||||
|         // 转换 AiChatMessageRespVO |         // 转换 AiChatMessageRespVO | ||||||
|         return AiChatMessageConvert.INSTANCE.convertAiChatMessageRespVOList(aiChatMessageDOList); |         List<AiChatMessageRespVO> aiChatMessageRespList = AiChatMessageConvert.INSTANCE.convertAiChatMessageRespVOList(aiChatMessageDOList); | ||||||
|  |         // 设置用户头像 和 模型头像 todo @芋艿 这里需要转换 用户头像、模型头像 | ||||||
|  |         return aiChatMessageRespList.stream().map(item -> { | ||||||
|  |             if (modalIdMap.containsKey(item.getModelId())) { | ||||||
|  | //                modalIdMap.get(item.getModelId()); | ||||||
|  | //                item.setModelImage() | ||||||
|  |             } | ||||||
|  |             return item; | ||||||
|  |         }).collect(Collectors.toList()); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user
	 cherishsince
					cherishsince