|
@@ -5,15 +5,14 @@ import cn.hutool.core.util.StrUtil;
|
|
|
import cn.iocoder.yudao.framework.ai.core.enums.AiPlatformEnum;
|
|
|
import cn.iocoder.yudao.framework.ai.core.util.AiUtils;
|
|
|
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
|
|
-import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
|
|
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
|
|
import cn.iocoder.yudao.framework.tenant.core.util.TenantUtils;
|
|
|
-import cn.iocoder.yudao.module.ai.controller.admin.model.vo.chatRole.AiChatRolePageReqVO;
|
|
|
import cn.iocoder.yudao.module.ai.controller.admin.write.vo.AiWriteGenerateReqVO;
|
|
|
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.write.AiWriteDO;
|
|
|
import cn.iocoder.yudao.module.ai.dal.mysql.write.AiWriteMapper;
|
|
|
+import cn.iocoder.yudao.module.ai.enums.AiChatRoleEnum;
|
|
|
import cn.iocoder.yudao.module.ai.enums.DictTypeConstants;
|
|
|
import cn.iocoder.yudao.module.ai.enums.ErrorCodeConstants;
|
|
|
import cn.iocoder.yudao.module.ai.enums.write.AiWriteTypeEnum;
|
|
@@ -23,6 +22,9 @@ import cn.iocoder.yudao.module.ai.service.model.AiChatRoleService;
|
|
|
import cn.iocoder.yudao.module.system.api.dict.DictDataApi;
|
|
|
import jakarta.annotation.Resource;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.springframework.ai.chat.messages.Message;
|
|
|
+import org.springframework.ai.chat.messages.SystemMessage;
|
|
|
+import org.springframework.ai.chat.messages.UserMessage;
|
|
|
import org.springframework.ai.chat.model.ChatResponse;
|
|
|
import org.springframework.ai.chat.model.StreamingChatModel;
|
|
|
import org.springframework.ai.chat.prompt.ChatOptions;
|
|
@@ -30,6 +32,7 @@ import org.springframework.ai.chat.prompt.Prompt;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import reactor.core.publisher.Flux;
|
|
|
|
|
|
+import java.util.ArrayList;
|
|
|
import java.util.List;
|
|
|
import java.util.Objects;
|
|
|
|
|
@@ -61,13 +64,15 @@ public class AiWriteServiceImpl implements AiWriteService {
|
|
|
@Override
|
|
|
public Flux<CommonResult<String>> generateWriteContent(AiWriteGenerateReqVO generateReqVO, Long userId) {
|
|
|
|
|
|
- AiChatRoleDO writeRole = selectOneWriteRole();
|
|
|
+ AiChatRoleDO writeRole = CollUtil.getFirst(chatRoleService.getChatRoleListByName(AiChatRoleEnum.AI_WRITE_ROLE.getName()));
|
|
|
AiChatModelDO model;
|
|
|
-
|
|
|
- if (Objects.nonNull(writeRole)) {
|
|
|
+ String systemMessage;
|
|
|
+ if (Objects.nonNull(writeRole) && Objects.nonNull(writeRole.getModelId())) {
|
|
|
model = chatModalService.getChatModel(writeRole.getModelId());
|
|
|
+ systemMessage = writeRole.getSystemMessage();
|
|
|
} else {
|
|
|
model = chatModalService.getRequiredDefaultChatModel();
|
|
|
+ systemMessage = AiChatRoleEnum.AI_WRITE_ROLE.getPrompt();
|
|
|
}
|
|
|
|
|
|
AiPlatformEnum platform = AiPlatformEnum.validatePlatform(model.getPlatform());
|
|
@@ -77,9 +82,16 @@ public class AiWriteServiceImpl implements AiWriteService {
|
|
|
AiWriteDO writeDO = BeanUtils.toBean(generateReqVO, AiWriteDO.class, e -> e.setUserId(userId).setModel(model.getModel()).setPlatform(platform.getPlatform()));
|
|
|
writeMapper.insert(writeDO);
|
|
|
|
|
|
-
|
|
|
ChatOptions chatOptions = AiUtils.buildChatOptions(platform, model.getModel(), model.getTemperature(), model.getMaxTokens());
|
|
|
- Prompt prompt = new Prompt(buildWritingPrompt(generateReqVO), chatOptions);
|
|
|
+
|
|
|
+ List<Message> chatMessages = new ArrayList<>();
|
|
|
+ if (StrUtil.isNotBlank(systemMessage)) {
|
|
|
+ chatMessages.add(new SystemMessage(systemMessage));
|
|
|
+ }
|
|
|
+
|
|
|
+ chatMessages.add(new UserMessage(buildWritingPrompt(generateReqVO)));
|
|
|
+
|
|
|
+ Prompt prompt = new Prompt(chatMessages, chatOptions);
|
|
|
Flux<ChatResponse> streamResponse = chatModel.stream(prompt);
|
|
|
|
|
|
|
|
@@ -102,24 +114,8 @@ public class AiWriteServiceImpl implements AiWriteService {
|
|
|
}).onErrorResume(error -> Flux.just(error(ErrorCodeConstants.WRITE_STREAM_ERROR)));
|
|
|
}
|
|
|
|
|
|
-
|
|
|
- private AiChatRoleDO selectOneWriteRole() {
|
|
|
- AiChatRoleDO chatRoleDO = null;
|
|
|
-
|
|
|
- PageResult<AiChatRoleDO> writeRolePage = chatRoleService.getChatRolePage(new AiChatRolePageReqVO().setName("写作助手"));
|
|
|
- List<AiChatRoleDO> list = writeRolePage.getList();
|
|
|
-
|
|
|
- if (CollUtil.isNotEmpty(list)) {
|
|
|
- chatRoleDO = list.get(0);
|
|
|
- }
|
|
|
- return chatRoleDO;
|
|
|
- }
|
|
|
-
|
|
|
private String buildWritingPrompt(AiWriteGenerateReqVO generateReqVO) {
|
|
|
-
|
|
|
Integer type = generateReqVO.getType();
|
|
|
-
|
|
|
- AiWriteTypeEnum.validateType(type);
|
|
|
String format = dictDataApi.getDictDataLabel(DictTypeConstants.AI_WRITE_FORMAT, generateReqVO.getFormat());
|
|
|
String tone = dictDataApi.getDictDataLabel(DictTypeConstants.AI_WRITE_TONE, generateReqVO.getTone());
|
|
|
String language = dictDataApi.getDictDataLabel(DictTypeConstants.AI_WRITE_LANGUAGE, generateReqVO.getLanguage());
|