Commit f05f5408658266d3eb349eab76f605aaa9a38f89

Authored by xiaoxin
1 parent 77ead485

【增加】AI 写作:支持回复

yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/write/AiWriteTypeEnum.java
@@ -15,8 +15,8 @@ import java.util.Arrays; @@ -15,8 +15,8 @@ import java.util.Arrays;
15 @Getter 15 @Getter
16 public enum AiWriteTypeEnum implements IntArrayValuable { 16 public enum AiWriteTypeEnum implements IntArrayValuable {
17 17
18 - DESCRIPTION(1, "撰写"),  
19 - LYRIC(2, "回复"); 18 + WRITING(1, "撰写"),
  19 + REPLY(2, "回复");
20 20
21 /** 21 /**
22 * 类型 22 * 类型
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/write/vo/AiWriteGenerateReqVO.java
@@ -14,9 +14,6 @@ public class AiWriteGenerateReqVO { @@ -14,9 +14,6 @@ public class AiWriteGenerateReqVO {
14 @Schema(description = "原文", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "领导我要辞职") 14 @Schema(description = "原文", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "领导我要辞职")
15 private String originalContent; 15 private String originalContent;
16 16
17 - @Schema(description = "回复内容", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "准了")  
18 - private String replyContentPrompt;  
19 -  
20 @Schema(description = "长度", requiredMode = Schema.RequiredMode.REQUIRED, example = "中等") 17 @Schema(description = "长度", requiredMode = Schema.RequiredMode.REQUIRED, example = "中等")
21 @NotBlank(message = "长度不能为空") 18 @NotBlank(message = "长度不能为空")
22 private String length; 19 private String length;
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/write/AiWriteDO.java
@@ -35,12 +35,12 @@ public class AiWriteDO extends BaseDO { @@ -35,12 +35,12 @@ public class AiWriteDO extends BaseDO {
35 private Integer writeType; 35 private Integer writeType;
36 36
37 /** 37 /**
38 - * 撰写内容提示 38 + * 生成内容提示
39 */ 39 */
40 private String contentPrompt; 40 private String contentPrompt;
41 41
42 /** 42 /**
43 - * 生成的撰写内容 43 + * 生成的内容
44 */ 44 */
45 private String generatedContent; 45 private String generatedContent;
46 46
@@ -50,16 +50,6 @@ public class AiWriteDO extends BaseDO { @@ -50,16 +50,6 @@ public class AiWriteDO extends BaseDO {
50 private String originalContent; 50 private String originalContent;
51 51
52 /** 52 /**
53 - * 回复内容提示  
54 - */  
55 - private String replyContentPrompt;  
56 -  
57 - /**  
58 - * 生成的回复内容  
59 - */  
60 - private String generatedReplyContent;  
61 -  
62 - /**  
63 * 长度提示词 53 * 长度提示词
64 */ 54 */
65 private String length; 55 private String length;
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/write/AiWriteServiceImpl.java
@@ -11,6 +11,7 @@ import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatModelDO; @@ -11,6 +11,7 @@ import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatModelDO;
11 import cn.iocoder.yudao.module.ai.dal.dataobject.write.AiWriteDO; 11 import cn.iocoder.yudao.module.ai.dal.dataobject.write.AiWriteDO;
12 import cn.iocoder.yudao.module.ai.dal.mysql.write.AiWriteMapper; 12 import cn.iocoder.yudao.module.ai.dal.mysql.write.AiWriteMapper;
13 import cn.iocoder.yudao.module.ai.enums.ErrorCodeConstants; 13 import cn.iocoder.yudao.module.ai.enums.ErrorCodeConstants;
  14 +import cn.iocoder.yudao.module.ai.enums.write.AiWriteTypeEnum;
14 import cn.iocoder.yudao.module.ai.service.model.AiApiKeyService; 15 import cn.iocoder.yudao.module.ai.service.model.AiApiKeyService;
15 import cn.iocoder.yudao.module.ai.service.model.AiChatModelService; 16 import cn.iocoder.yudao.module.ai.service.model.AiChatModelService;
16 import com.alibaba.cloud.ai.tongyi.chat.TongYiChatOptions; 17 import com.alibaba.cloud.ai.tongyi.chat.TongYiChatOptions;
@@ -26,6 +27,8 @@ import org.springframework.ai.qianfan.QianFanChatOptions; @@ -26,6 +27,8 @@ import org.springframework.ai.qianfan.QianFanChatOptions;
26 import org.springframework.stereotype.Service; 27 import org.springframework.stereotype.Service;
27 import reactor.core.publisher.Flux; 28 import reactor.core.publisher.Flux;
28 29
  30 +import java.util.Objects;
  31 +
29 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.error; 32 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.error;
30 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; 33 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
31 34
@@ -80,13 +83,21 @@ public class AiWriteServiceImpl implements AiWriteService { @@ -80,13 +83,21 @@ public class AiWriteServiceImpl implements AiWriteService {
80 83
81 84
82 private String buildWritingPrompt(AiWriteGenerateReqVO generateReqVO) { 85 private String buildWritingPrompt(AiWriteGenerateReqVO generateReqVO) {
83 - String template = "请直接写一篇关于 [{}] 的文章,格式为:{},语气为:{},语言为:{},长度为:{}。请确保涵盖主要内容,不需要除了正文内容外的其他回复,如标题、额外的解释或道歉。";  
84 - String content = generateReqVO.getContentPrompt(); 86 + String template;
  87 + Integer writeType = generateReqVO.getWriteType();
85 String format = generateReqVO.getFormat(); 88 String format = generateReqVO.getFormat();
86 String tone = generateReqVO.getTone(); 89 String tone = generateReqVO.getTone();
87 String language = generateReqVO.getLanguage(); 90 String language = generateReqVO.getLanguage();
88 String length = generateReqVO.getLength(); 91 String length = generateReqVO.getLength();
89 - return StrUtil.format(template, content, format, tone, language, length); 92 + if (Objects.equals(writeType, AiWriteTypeEnum.WRITING.getType())) {
  93 + template = "请撰写一篇关于 [{}] 的文章。文章的内容格式为:[{}],语气为:[{}],语言为:[{}],长度为:[{}]。请确保涵盖主要内容,不需要除了正文内容外的其他回复,如标题、额外的解释或道歉。";
  94 + return StrUtil.format(template, generateReqVO.getContentPrompt(), format, tone, language, length);
  95 + } else if (Objects.equals(writeType, AiWriteTypeEnum.REPLY.getType())) {
  96 + template = "请针对如下内容:[{}] 做个回复。回复内容参考:[{}], 回复的内容格式为:[{}],语气为:[{}],语言为:[{}],长度为:[{}]。不需要除了正文内容外的其他回复,如标题、额外的解释或道歉。";
  97 + return StrUtil.format(template, generateReqVO.getOriginalContent(), generateReqVO.getContentPrompt(), format, tone, language, length);
  98 + } else {
  99 + throw new IllegalArgumentException(StrUtil.format("未知写作类型({})", writeType));
  100 + }
90 } 101 }
91 102
92 // TODO 芋艿:复用 103 // TODO 芋艿:复用