Commit 4fddec5f0217b3aa4895f136a2066134942a3b10

Authored by YunaiV
1 parent 17afb14c

【优化】AI:调整 image 相关的包结构

Showing 21 changed files with 52 additions and 68 deletions
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/chat/AiChatMessageController.java
@@ -89,7 +89,7 @@ public class AiChatMessageController { @@ -89,7 +89,7 @@ public class AiChatMessageController {
89 @DeleteMapping("/delete") 89 @DeleteMapping("/delete")
90 @Parameter(name = "id", required = true, description = "消息编号", example = "1024") 90 @Parameter(name = "id", required = true, description = "消息编号", example = "1024")
91 public CommonResult<Boolean> deleteChatMessage(@RequestParam("id") Long id) { 91 public CommonResult<Boolean> deleteChatMessage(@RequestParam("id") Long id) {
92 - chatMessageService.deleteMessage(id, getLoginUserId()); 92 + chatMessageService.deleteChatMessage(id, getLoginUserId());
93 return success(true); 93 return success(true);
94 } 94 }
95 95
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/image/AiImageController.java
@@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.ai.controller.admin.image; @@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.ai.controller.admin.image;
3 import cn.iocoder.yudao.framework.common.pojo.CommonResult; 3 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4 import cn.iocoder.yudao.framework.common.pojo.PageResult; 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 import cn.iocoder.yudao.module.ai.controller.admin.image.vo.*; 5 import cn.iocoder.yudao.module.ai.controller.admin.image.vo.*;
6 -import cn.iocoder.yudao.module.ai.service.AiImageService; 6 +import cn.iocoder.yudao.module.ai.service.image.AiImageService;
7 import io.swagger.v3.oas.annotations.Operation; 7 import io.swagger.v3.oas.annotations.Operation;
8 import io.swagger.v3.oas.annotations.tags.Tag; 8 import io.swagger.v3.oas.annotations.tags.Tag;
9 import lombok.AllArgsConstructor; 9 import lombok.AllArgsConstructor;
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/model/AiChatModelController.java
@@ -18,7 +18,6 @@ import org.springframework.validation.annotation.Validated; @@ -18,7 +18,6 @@ import org.springframework.validation.annotation.Validated;
18 import org.springframework.web.bind.annotation.*; 18 import org.springframework.web.bind.annotation.*;
19 19
20 import java.util.List; 20 import java.util.List;
21 -import java.util.function.Function;  
22 21
23 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; 22 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
24 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; 23 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
@@ -77,7 +76,7 @@ public class AiChatModelController { @@ -77,7 +76,7 @@ public class AiChatModelController {
77 @Operation(summary = "获得聊天模型列表") 76 @Operation(summary = "获得聊天模型列表")
78 @Parameter(name = "status", description = "状态", required = true, example = "1") 77 @Parameter(name = "status", description = "状态", required = true, example = "1")
79 public CommonResult<List<AiChatModelRespVO>> getChatModelSimpleList(@RequestParam("status") Integer status) { 78 public CommonResult<List<AiChatModelRespVO>> getChatModelSimpleList(@RequestParam("status") Integer status) {
80 - List<AiChatModelDO> list = chatModelService.getChatModelList(status); 79 + List<AiChatModelDO> list = chatModelService.getChatModelListByStatus(status);
81 return success(convertList(list, model -> new AiChatModelRespVO().setId(model.getId()) 80 return success(convertList(list, model -> new AiChatModelRespVO().setId(model.getId())
82 .setName(model.getName()).setModel(model.getModel()))); 81 .setName(model.getName()).setModel(model.getModel())));
83 } 82 }
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/mysql/AiImageMapper.java renamed to yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/mysql/image/AiImageMapper.java
1 -package cn.iocoder.yudao.module.ai.dal.mysql; 1 +package cn.iocoder.yudao.module.ai.dal.mysql.image;
2 2
3 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; 3 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
4 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; 4 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
@@ -26,4 +26,5 @@ public interface AiImageMapper extends BaseMapperX&lt;AiImageDO&gt; { @@ -26,4 +26,5 @@ public interface AiImageMapper extends BaseMapperX&lt;AiImageDO&gt; {
26 default void updateByMjNonce(Long mjNonceId, AiImageDO aiImageDO) { 26 default void updateByMjNonce(Long mjNonceId, AiImageDO aiImageDO) {
27 this.update(aiImageDO, new LambdaQueryWrapperX<AiImageDO>().eq(AiImageDO::getMjNonceId, mjNonceId)); 27 this.update(aiImageDO, new LambdaQueryWrapperX<AiImageDO>().eq(AiImageDO::getMjNonceId, mjNonceId));
28 } 28 }
  29 +
29 } 30 }
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/mysql/AiChatModelMapper.java renamed to yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/mysql/model/AiChatModelMapper.java
1 -package cn.iocoder.yudao.module.ai.dal.mysql; 1 +package cn.iocoder.yudao.module.ai.dal.mysql.model;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; 4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
@@ -26,17 +26,6 @@ public interface AiChatModelMapper extends BaseMapperX&lt;AiChatModelDO&gt; { @@ -26,17 +26,6 @@ public interface AiChatModelMapper extends BaseMapperX&lt;AiChatModelDO&gt; {
26 .orderByAsc("sort")); 26 .orderByAsc("sort"));
27 } 27 }
28 28
29 - // TODO 芋艿:不需要哈  
30 - /**  
31 - * 查询 - 根据 ids  
32 - *  
33 - * @param modalIds  
34 - * @return  
35 - */  
36 - default List<AiChatModelDO> selectByIds(Collection<Long> modalIds) {  
37 - return this.selectList(new LambdaQueryWrapperX<AiChatModelDO>().eq(AiChatModelDO::getId, modalIds));  
38 - }  
39 -  
40 default PageResult<AiChatModelDO> selectPage(AiChatModelPageReqVO reqVO) { 29 default PageResult<AiChatModelDO> selectPage(AiChatModelPageReqVO reqVO) {
41 return selectPage(reqVO, new LambdaQueryWrapperX<AiChatModelDO>() 30 return selectPage(reqVO, new LambdaQueryWrapperX<AiChatModelDO>()
42 .likeIfPresent(AiChatModelDO::getName, reqVO.getName()) 31 .likeIfPresent(AiChatModelDO::getName, reqVO.getName())
@@ -50,4 +39,5 @@ public interface AiChatModelMapper extends BaseMapperX&lt;AiChatModelDO&gt; { @@ -50,4 +39,5 @@ public interface AiChatModelMapper extends BaseMapperX&lt;AiChatModelDO&gt; {
50 .eq(AiChatModelDO::getStatus, status) 39 .eq(AiChatModelDO::getStatus, status)
51 .orderByAsc(AiChatModelDO::getSort)); 40 .orderByAsc(AiChatModelDO::getSort));
52 } 41 }
  42 +
53 } 43 }
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/mysql/AiChatRoleMapper.java renamed to yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/mysql/model/AiChatRoleMapper.java
1 -package cn.iocoder.yudao.module.ai.dal.mysql; 1 +package cn.iocoder.yudao.module.ai.dal.mysql.model;
2 2
3 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; 3 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
4 import cn.iocoder.yudao.framework.common.pojo.PageResult; 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/chat/AiChatMessageService.java
@@ -45,7 +45,7 @@ public interface AiChatMessageService { @@ -45,7 +45,7 @@ public interface AiChatMessageService {
45 * @param id 消息编号 45 * @param id 消息编号
46 * @param userId 用户编号 46 * @param userId 用户编号
47 */ 47 */
48 - void deleteMessage(Long id, Long userId); 48 + void deleteChatMessage(Long id, Long userId);
49 49
50 /** 50 /**
51 * 删除指定会话的消息 51 * 删除指定会话的消息
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/chat/AiChatMessageServiceImpl.java
@@ -40,6 +40,8 @@ import java.time.LocalDateTime; @@ -40,6 +40,8 @@ import java.time.LocalDateTime;
40 import java.util.*; 40 import java.util.*;
41 41
42 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; 42 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
  43 +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.error;
  44 +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
43 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; 45 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
44 import static cn.iocoder.yudao.module.ai.ErrorCodeConstants.AI_CHAT_MESSAGE_NOT_EXIST; 46 import static cn.iocoder.yudao.module.ai.ErrorCodeConstants.AI_CHAT_MESSAGE_NOT_EXIST;
45 import static cn.iocoder.yudao.module.ai.ErrorCodeConstants.CHAT_CONVERSATION_NOT_EXISTS; 47 import static cn.iocoder.yudao.module.ai.ErrorCodeConstants.CHAT_CONVERSATION_NOT_EXISTS;
@@ -138,7 +140,7 @@ public class AiChatMessageServiceImpl implements AiChatMessageService { @@ -138,7 +140,7 @@ public class AiChatMessageServiceImpl implements AiChatMessageService {
138 Flux<ChatResponse> streamResponse = chatClient.stream(prompt); 140 Flux<ChatResponse> streamResponse = chatClient.stream(prompt);
139 141
140 // 3.3 流式返回 142 // 3.3 流式返回
141 - // 注意:Schedulers.immediate() 目的是,避免默认 Schedulers.parallel() 并发消费 chunk 导致 SSE 响应前端会乱序问题 143 + // TODO 注意:Schedulers.immediate() 目的是,避免默认 Schedulers.parallel() 并发消费 chunk 导致 SSE 响应前端会乱序问题
142 StringBuffer contentBuffer = new StringBuffer(); 144 StringBuffer contentBuffer = new StringBuffer();
143 return streamResponse.map(chunk -> { 145 return streamResponse.map(chunk -> {
144 String newContent = chunk.getResult() != null ? chunk.getResult().getOutput().getContent() : null; 146 String newContent = chunk.getResult() != null ? chunk.getResult().getOutput().getContent() : null;
@@ -149,14 +151,14 @@ public class AiChatMessageServiceImpl implements AiChatMessageService { @@ -149,14 +151,14 @@ public class AiChatMessageServiceImpl implements AiChatMessageService {
149 o -> o.setUserAvatar(user.getAvatar())); 151 o -> o.setUserAvatar(user.getAvatar()));
150 AiChatMessageSendRespVO.Message receive = BeanUtils.toBean(assistantMessage, AiChatMessageSendRespVO.Message.class, 152 AiChatMessageSendRespVO.Message receive = BeanUtils.toBean(assistantMessage, AiChatMessageSendRespVO.Message.class,
151 o -> o.setRoleAvatar(role != null ? role.getAvatar() : null)).setContent(newContent); 153 o -> o.setRoleAvatar(role != null ? role.getAvatar() : null)).setContent(newContent);
152 - return CommonResult.success(new AiChatMessageSendRespVO().setSend(send).setReceive(receive)); 154 + return success(new AiChatMessageSendRespVO().setSend(send).setReceive(receive));
153 }).doOnComplete(() -> { 155 }).doOnComplete(() -> {
154 chatMessageMapper.updateById(new AiChatMessageDO().setId(assistantMessage.getId()).setContent(contentBuffer.toString())); 156 chatMessageMapper.updateById(new AiChatMessageDO().setId(assistantMessage.getId()).setContent(contentBuffer.toString()));
155 }).doOnError(throwable -> { 157 }).doOnError(throwable -> {
156 log.error("[sendChatMessageStream][userId({}) sendReqVO({}) 发生异常]", userId, sendReqVO, throwable); 158 log.error("[sendChatMessageStream][userId({}) sendReqVO({}) 发生异常]", userId, sendReqVO, throwable);
157 chatMessageMapper.updateById(new AiChatMessageDO().setId(assistantMessage.getId()).setContent(throwable.getMessage())); 159 chatMessageMapper.updateById(new AiChatMessageDO().setId(assistantMessage.getId()).setContent(throwable.getMessage()));
158 - }).onErrorResume( error -> {  
159 - return Flux.just(CommonResult.error(ErrorCodeConstants.AI_CHAT_STREAM_ERROR)); 160 + }).onErrorResume(error -> {
  161 + return Flux.just(error(ErrorCodeConstants.AI_CHAT_STREAM_ERROR));
160 }); 162 });
161 } 163 }
162 164
@@ -235,7 +237,7 @@ public class AiChatMessageServiceImpl implements AiChatMessageService { @@ -235,7 +237,7 @@ public class AiChatMessageServiceImpl implements AiChatMessageService {
235 } 237 }
236 238
237 @Override 239 @Override
238 - public void deleteMessage(Long id, Long userId) { 240 + public void deleteChatMessage(Long id, Long userId) {
239 // 1. 校验消息存在 241 // 1. 校验消息存在
240 AiChatMessageDO message = chatMessageMapper.selectById(id); 242 AiChatMessageDO message = chatMessageMapper.selectById(id);
241 if (message == null || ObjUtil.notEqual(message.getUserId(), userId)) { 243 if (message == null || ObjUtil.notEqual(message.getUserId(), userId)) {
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/AiImageService.java renamed to yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/image/AiImageService.java
1 -package cn.iocoder.yudao.module.ai.service; 1 +package cn.iocoder.yudao.module.ai.service.image;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 import cn.iocoder.yudao.module.ai.controller.admin.image.vo.*; 4 import cn.iocoder.yudao.module.ai.controller.admin.image.vo.*;
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/AiImageServiceImpl.java renamed to yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/image/AiImageServiceImpl.java
1 -package cn.iocoder.yudao.module.ai.service.impl; 1 +package cn.iocoder.yudao.module.ai.service.image;
2 2
3 import cn.hutool.core.util.IdUtil; 3 import cn.hutool.core.util.IdUtil;
4 import cn.hutool.core.util.StrUtil; 4 import cn.hutool.core.util.StrUtil;
@@ -21,9 +21,8 @@ import cn.iocoder.yudao.module.ai.ErrorCodeConstants; @@ -21,9 +21,8 @@ import cn.iocoder.yudao.module.ai.ErrorCodeConstants;
21 import cn.iocoder.yudao.module.ai.controller.admin.image.vo.*; 21 import cn.iocoder.yudao.module.ai.controller.admin.image.vo.*;
22 import cn.iocoder.yudao.module.ai.convert.AiImageConvert; 22 import cn.iocoder.yudao.module.ai.convert.AiImageConvert;
23 import cn.iocoder.yudao.module.ai.dal.dataobject.image.AiImageDO; 23 import cn.iocoder.yudao.module.ai.dal.dataobject.image.AiImageDO;
24 -import cn.iocoder.yudao.module.ai.dal.mysql.AiImageMapper; 24 +import cn.iocoder.yudao.module.ai.dal.mysql.image.AiImageMapper;
25 import cn.iocoder.yudao.module.ai.enums.AiImageDrawingStatusEnum; 25 import cn.iocoder.yudao.module.ai.enums.AiImageDrawingStatusEnum;
26 -import cn.iocoder.yudao.module.ai.service.AiImageService;  
27 import jakarta.annotation.PostConstruct; 26 import jakarta.annotation.PostConstruct;
28 import lombok.AllArgsConstructor; 27 import lombok.AllArgsConstructor;
29 import lombok.extern.slf4j.Slf4j; 28 import lombok.extern.slf4j.Slf4j;
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/midjourneyHandler/YuDaoMidjourneyMessageHandler.java renamed to yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/image/midjourneyHandler/YuDaoMidjourneyMessageHandler.java
1 -package cn.iocoder.yudao.module.ai.service.midjourneyHandler; 1 +package cn.iocoder.yudao.module.ai.service.image.midjourneyHandler;
2 2
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
4 import cn.hutool.core.util.StrUtil; 4 import cn.hutool.core.util.StrUtil;
@@ -10,7 +10,7 @@ import cn.iocoder.yudao.framework.common.util.json.JsonUtils; @@ -10,7 +10,7 @@ import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
10 import cn.iocoder.yudao.module.ai.controller.admin.image.vo.AiImageMidjourneyOperationsVO; 10 import cn.iocoder.yudao.module.ai.controller.admin.image.vo.AiImageMidjourneyOperationsVO;
11 import cn.iocoder.yudao.module.ai.convert.AiImageConvert; 11 import cn.iocoder.yudao.module.ai.convert.AiImageConvert;
12 import cn.iocoder.yudao.module.ai.dal.dataobject.image.AiImageDO; 12 import cn.iocoder.yudao.module.ai.dal.dataobject.image.AiImageDO;
13 -import cn.iocoder.yudao.module.ai.dal.mysql.AiImageMapper; 13 +import cn.iocoder.yudao.module.ai.dal.mysql.image.AiImageMapper;
14 import cn.iocoder.yudao.module.ai.enums.AiImageDrawingStatusEnum; 14 import cn.iocoder.yudao.module.ai.enums.AiImageDrawingStatusEnum;
15 import lombok.AllArgsConstructor; 15 import lombok.AllArgsConstructor;
16 import lombok.extern.slf4j.Slf4j; 16 import lombok.extern.slf4j.Slf4j;
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/vo/typeHandler/AiChatModelConfigTypeHandler.java renamed to yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/image/midjourneyHandler/typeHandler/AiChatModelConfigTypeHandler.java
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/vo/AiChatModalChatConfigVO.java renamed to yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/image/midjourneyHandler/vo/AiChatModalChatConfigVO.java
1 -package cn.iocoder.yudao.module.ai.dal.vo; 1 +package cn.iocoder.yudao.module.ai.service.image.midjourneyHandler.vo;
2 2
3 import io.swagger.v3.oas.annotations.media.Schema; 3 import io.swagger.v3.oas.annotations.media.Schema;
4 import jakarta.validation.constraints.NotNull; 4 import jakarta.validation.constraints.NotNull;
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/vo/AiChatModalConfigVO.java renamed to yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/image/midjourneyHandler/vo/AiChatModalConfigVO.java
1 -package cn.iocoder.yudao.module.ai.dal.vo; 1 +package cn.iocoder.yudao.module.ai.service.image.midjourneyHandler.vo;
2 2
3 import cn.iocoder.yudao.framework.ai.core.enums.AiPlatformEnum; 3 import cn.iocoder.yudao.framework.ai.core.enums.AiPlatformEnum;
4 import lombok.Data; 4 import lombok.Data;
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/vo/AiChatModalDallConfigVO.java renamed to yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/image/midjourneyHandler/vo/AiChatModalDallConfigVO.java
1 -package cn.iocoder.yudao.module.ai.dal.vo; 1 +package cn.iocoder.yudao.module.ai.service.image.midjourneyHandler.vo;
2 2
3 import cn.iocoder.yudao.framework.ai.core.enums.OpenAiImageStyleEnum; 3 import cn.iocoder.yudao.framework.ai.core.enums.OpenAiImageStyleEnum;
4 import lombok.Data; 4 import lombok.Data;
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/vo/AiChatModalMidjourneyConfigVO.java renamed to yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/image/midjourneyHandler/vo/AiChatModalMidjourneyConfigVO.java
1 -package cn.iocoder.yudao.module.ai.dal.vo; 1 +package cn.iocoder.yudao.module.ai.service.image.midjourneyHandler.vo;
2 2
3 import lombok.Data; 3 import lombok.Data;
4 import lombok.experimental.Accessors; 4 import lombok.experimental.Accessors;
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/model/AiChatModelService.java
@@ -6,6 +6,7 @@ import cn.iocoder.yudao.module.ai.controller.admin.model.vo.chatModel.AiChatMode @@ -6,6 +6,7 @@ import cn.iocoder.yudao.module.ai.controller.admin.model.vo.chatModel.AiChatMode
6 import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatModelDO; 6 import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatModelDO;
7 import jakarta.validation.Valid; 7 import jakarta.validation.Valid;
8 8
  9 +import java.util.Collection;
9 import java.util.List; 10 import java.util.List;
10 11
11 import java.util.Set; 12 import java.util.Set;
@@ -79,13 +80,13 @@ public interface AiChatModelService { @@ -79,13 +80,13 @@ public interface AiChatModelService {
79 * @param status 状态 80 * @param status 状态
80 * @return 聊天模型列表 81 * @return 聊天模型列表
81 */ 82 */
82 - List<AiChatModelDO> getChatModelList(Integer status); 83 + List<AiChatModelDO> getChatModelListByStatus(Integer status);
83 84
84 /** 85 /**
85 - * 获取 - 根据多个 ids 获取 86 + * 获得聊天模型列表
86 * 87 *
87 - * @param modalIds  
88 - * @return 88 + * @param ids 编号数组
  89 + * @return 模型列表
89 */ 90 */
90 - List<AiChatModelDO> getModalByIds(Set<Long> modalIds); 91 + List<AiChatModelDO> getChatModelList(Collection<Long> ids);
91 } 92 }
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/model/AiChatModelServiceImpl.java
@@ -7,15 +7,14 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils; @@ -7,15 +7,14 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
7 import cn.iocoder.yudao.module.ai.controller.admin.model.vo.chatModel.AiChatModelPageReqVO; 7 import cn.iocoder.yudao.module.ai.controller.admin.model.vo.chatModel.AiChatModelPageReqVO;
8 import cn.iocoder.yudao.module.ai.controller.admin.model.vo.chatModel.AiChatModelSaveReqVO; 8 import cn.iocoder.yudao.module.ai.controller.admin.model.vo.chatModel.AiChatModelSaveReqVO;
9 import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatModelDO; 9 import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatModelDO;
10 -import cn.iocoder.yudao.module.ai.dal.mysql.AiChatModelMapper; 10 +import cn.iocoder.yudao.module.ai.dal.mysql.model.AiChatModelMapper;
11 import jakarta.annotation.Resource; 11 import jakarta.annotation.Resource;
12 import org.springframework.stereotype.Service; 12 import org.springframework.stereotype.Service;
13 import org.springframework.validation.annotation.Validated; 13 import org.springframework.validation.annotation.Validated;
14 14
  15 +import java.util.Collection;
15 import java.util.List; 16 import java.util.List;
16 17
17 -import java.util.Set;  
18 -  
19 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; 18 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
20 import static cn.iocoder.yudao.module.ai.ErrorCodeConstants.*; 19 import static cn.iocoder.yudao.module.ai.ErrorCodeConstants.*;
21 20
@@ -103,13 +102,13 @@ public class AiChatModelServiceImpl implements AiChatModelService { @@ -103,13 +102,13 @@ public class AiChatModelServiceImpl implements AiChatModelService {
103 } 102 }
104 103
105 @Override 104 @Override
106 - public List<AiChatModelDO> getChatModelList(Integer status) { 105 + public List<AiChatModelDO> getChatModelListByStatus(Integer status) {
107 return chatModelMapper.selectList(status); 106 return chatModelMapper.selectList(status);
108 } 107 }
109 108
110 @Override 109 @Override
111 - public List<AiChatModelDO> getModalByIds(Set<Long> modalIds) {  
112 - return chatModelMapper.selectByIds(modalIds); 110 + public List<AiChatModelDO> getChatModelList(Collection<Long> ids) {
  111 + return chatModelMapper.selectBatchIds(ids);
113 } 112 }
114 113
115 } 114 }
116 \ No newline at end of file 115 \ No newline at end of file
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/model/AiChatRoleServiceImpl.java
@@ -10,7 +10,7 @@ import cn.iocoder.yudao.module.ai.controller.admin.model.vo.chatRole.AiChatRoleP @@ -10,7 +10,7 @@ import cn.iocoder.yudao.module.ai.controller.admin.model.vo.chatRole.AiChatRoleP
10 import cn.iocoder.yudao.module.ai.controller.admin.model.vo.chatRole.AiChatRoleSaveMyReqVO; 10 import cn.iocoder.yudao.module.ai.controller.admin.model.vo.chatRole.AiChatRoleSaveMyReqVO;
11 import cn.iocoder.yudao.module.ai.controller.admin.model.vo.chatRole.AiChatRoleSaveReqVO; 11 import cn.iocoder.yudao.module.ai.controller.admin.model.vo.chatRole.AiChatRoleSaveReqVO;
12 import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatRoleDO; 12 import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatRoleDO;
13 -import cn.iocoder.yudao.module.ai.dal.mysql.AiChatRoleMapper; 13 +import cn.iocoder.yudao.module.ai.dal.mysql.model.AiChatRoleMapper;
14 import jakarta.annotation.Resource; 14 import jakarta.annotation.Resource;
15 import lombok.extern.slf4j.Slf4j; 15 import lombok.extern.slf4j.Slf4j;
16 import org.springframework.stereotype.Service; 16 import org.springframework.stereotype.Service;
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/cn/iocoder/yudao/framework/ai/core/factory/AiClientFactoryImpl.java
@@ -20,6 +20,7 @@ import cn.iocoder.yudao.framework.ai.core.model.xinghuo.api.XingHuoApi; @@ -20,6 +20,7 @@ import cn.iocoder.yudao.framework.ai.core.model.xinghuo.api.XingHuoApi;
20 import cn.iocoder.yudao.framework.ai.core.model.yiyan.YiYanChatClient; 20 import cn.iocoder.yudao.framework.ai.core.model.yiyan.YiYanChatClient;
21 import cn.iocoder.yudao.framework.ai.core.model.yiyan.YiYanChatOptions; 21 import cn.iocoder.yudao.framework.ai.core.model.yiyan.YiYanChatOptions;
22 import cn.iocoder.yudao.framework.ai.core.model.yiyan.api.YiYanApi; 22 import cn.iocoder.yudao.framework.ai.core.model.yiyan.api.YiYanApi;
  23 +import com.google.cloud.vertexai.VertexAI;
23 import org.springframework.ai.autoconfigure.ollama.OllamaAutoConfiguration; 24 import org.springframework.ai.autoconfigure.ollama.OllamaAutoConfiguration;
24 import org.springframework.ai.autoconfigure.openai.OpenAiAutoConfiguration; 25 import org.springframework.ai.autoconfigure.openai.OpenAiAutoConfiguration;
25 import org.springframework.ai.chat.StreamingChatClient; 26 import org.springframework.ai.chat.StreamingChatClient;
@@ -31,6 +32,8 @@ import org.springframework.ai.openai.OpenAiChatClient; @@ -31,6 +32,8 @@ import org.springframework.ai.openai.OpenAiChatClient;
31 import org.springframework.ai.openai.OpenAiChatOptions; 32 import org.springframework.ai.openai.OpenAiChatOptions;
32 import org.springframework.ai.openai.api.ApiUtils; 33 import org.springframework.ai.openai.api.ApiUtils;
33 import org.springframework.ai.openai.api.OpenAiApi; 34 import org.springframework.ai.openai.api.OpenAiApi;
  35 +import org.springframework.ai.vertexai.gemini.VertexAiGeminiChatClient;
  36 +import org.springframework.ai.vertexai.gemini.VertexAiGeminiChatOptions;
34 37
35 import java.util.List; 38 import java.util.List;
36 39
@@ -57,8 +60,8 @@ public class AiClientFactoryImpl implements AiClientFactory { @@ -57,8 +60,8 @@ public class AiClientFactoryImpl implements AiClientFactory {
57 return buildXingHuoChatClient(apiKey); 60 return buildXingHuoChatClient(apiKey);
58 case QIAN_WEN: 61 case QIAN_WEN:
59 return buildQianWenChatClient(apiKey); 62 return buildQianWenChatClient(apiKey);
60 -// case GEMIR:  
61 -// return buildGoogleGemir(apiKey); 63 + case GEMIR:
  64 + return buildGoogleGemir(apiKey);
62 default: 65 default:
63 throw new IllegalArgumentException(StrUtil.format("未知平台({})", platform)); 66 throw new IllegalArgumentException(StrUtil.format("未知平台({})", platform));
64 } 67 }
@@ -165,24 +168,13 @@ public class AiClientFactoryImpl implements AiClientFactory { @@ -165,24 +168,13 @@ public class AiClientFactoryImpl implements AiClientFactory {
165 QianWenApi qianWenApi = new QianWenApi(key, QianWenChatModal.QWEN_72B_CHAT); 168 QianWenApi qianWenApi = new QianWenApi(key, QianWenChatModal.QWEN_72B_CHAT);
166 return new QianWenChatClient(qianWenApi); 169 return new QianWenChatClient(qianWenApi);
167 } 170 }
168 -//  
169 -// private static VertexAiGeminiChatClient buildGoogleGemir(String key) {  
170 -// List<String> keys = StrUtil.split(key, '|');  
171 -// Assert.equals(keys.size(), 2, "VertexAiGeminiChatClient 的密钥需要 (projectId|location) 格式");  
172 -//// VertexAiGeminiConnectionProperties connectionProperties = new VertexAiGeminiConnectionProperties();  
173 -//// connectionProperties.setApiKey("AIzaSyBpe376HTA8uPKJN_OJTh7MEO3v6LMqfXU");  
174 -////  
175 -//// GoogleCredentials credentials = GoogleCredentials.fromStream(connectionProperties.getCredentialsUri().getInputStream());  
176 -// // todo @芋艿 google gemini 没找到对于初始化 client 方式,文档中说是用过 GoogleCredentials 来初始化凭证  
177 -// // api-key: AIzaSyBpe376HTA8uPKJN_OJTh7MEO3v6LMqfXU  
178 -// VertexAI vertexApi = new VertexAI(  
179 -// "skilled-snow-409401",  
180 -// "us-central1"  
181 -// );  
182 -// return new VertexAiGeminiChatClient(vertexApi,  
183 -// VertexAiGeminiChatOptions.builder()  
184 -// .withTemperature(0.4F)  
185 -// .withModel(VertexAiGeminiChatClient.ChatModel.GEMINI_PRO.getValue())  
186 -// .build());  
187 -// } 171 +
  172 +
  173 + private static VertexAiGeminiChatClient buildGoogleGemir(String key) {
  174 + List<String> keys = StrUtil.split(key, '|');
  175 + Assert.equals(keys.size(), 2, "VertexAiGeminiChatClient 的密钥需要 (projectId|location) 格式");
  176 + VertexAI vertexApi = new VertexAI(keys.get(0), keys.get(1));
  177 + return new VertexAiGeminiChatClient(vertexApi);
  178 + }
  179 +
188 } 180 }
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/cn/iocoder/yudao/framework/ai/core/model/tongyi/QianWenChatClient.java
1 package cn.iocoder.yudao.framework.ai.core.model.tongyi; 1 package cn.iocoder.yudao.framework.ai.core.model.tongyi;
2 2
  3 +import cn.hutool.core.util.NumberUtil;
3 import cn.iocoder.yudao.framework.ai.core.exception.ChatException; 4 import cn.iocoder.yudao.framework.ai.core.exception.ChatException;
4 import cn.iocoder.yudao.framework.ai.core.model.tongyi.api.QianWenApi; 5 import cn.iocoder.yudao.framework.ai.core.model.tongyi.api.QianWenApi;
5 import org.springframework.ai.chat.*; 6 import org.springframework.ai.chat.*;