Commit 7cd16ffbf3ad6144ee66fe7b310a117309b5f586

Authored by xiaoxin
2 parents ababc914 4c21ae32

Merge branch 'refs/heads/upstrem-master-jdk21-ai' into master-jdk21-ai

yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/write/AiWriteTypeEnum.java
@@ -32,7 +32,7 @@ public enum AiWriteTypeEnum implements IntArrayValuable { @@ -32,7 +32,7 @@ public enum AiWriteTypeEnum implements IntArrayValuable {
32 /** 32 /**
33 * 模版 33 * 模版
34 */ 34 */
35 - private final String template; 35 + private final String prompt;
36 36
37 public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(AiWriteTypeEnum::getType).toArray(); 37 public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(AiWriteTypeEnum::getType).toArray();
38 38
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/write/AiWriteServiceImpl.java
@@ -63,26 +63,26 @@ public class AiWriteServiceImpl implements AiWriteService { @@ -63,26 +63,26 @@ public class AiWriteServiceImpl implements AiWriteService {
63 // 1.1 获取写作模型 尝试获取写作助手角色,如果没有则使用默认模型 63 // 1.1 获取写作模型 尝试获取写作助手角色,如果没有则使用默认模型
64 AiChatRoleDO writeRole = selectOneWriteRole(); 64 AiChatRoleDO writeRole = selectOneWriteRole();
65 AiChatModelDO model; 65 AiChatModelDO model;
  66 + // TODO @xin:writeRole.getModelId 可能为空。所以,最好是先通过 chatRole 拿。如果它没拿到,通过 getRequiredDefaultChatModel 再拿。
66 if (Objects.nonNull(writeRole)) { 67 if (Objects.nonNull(writeRole)) {
67 model = chatModalService.getChatModel(writeRole.getModelId()); 68 model = chatModalService.getChatModel(writeRole.getModelId());
68 } else { 69 } else {
69 model = chatModalService.getRequiredDefaultChatModel(); 70 model = chatModalService.getRequiredDefaultChatModel();
70 } 71 }
71 - 72 + // 1.2 校验平台
72 AiPlatformEnum platform = AiPlatformEnum.validatePlatform(model.getPlatform()); 73 AiPlatformEnum platform = AiPlatformEnum.validatePlatform(model.getPlatform());
73 -  
74 StreamingChatModel chatModel = apiKeyService.getChatModel(model.getKeyId()); 74 StreamingChatModel chatModel = apiKeyService.getChatModel(model.getKeyId());
75 75
76 - // 1.2 插入写作信息 76 + // 2. 插入写作信息
77 AiWriteDO writeDO = BeanUtils.toBean(generateReqVO, AiWriteDO.class, e -> e.setUserId(userId).setModel(model.getModel()).setPlatform(platform.getPlatform())); 77 AiWriteDO writeDO = BeanUtils.toBean(generateReqVO, AiWriteDO.class, e -> e.setUserId(userId).setModel(model.getModel()).setPlatform(platform.getPlatform()));
78 writeMapper.insert(writeDO); 78 writeMapper.insert(writeDO);
79 79
80 - // 2.1 构建提示词 80 + // 3.1 构建提示词
81 ChatOptions chatOptions = AiUtils.buildChatOptions(platform, model.getModel(), model.getTemperature(), model.getMaxTokens()); 81 ChatOptions chatOptions = AiUtils.buildChatOptions(platform, model.getModel(), model.getTemperature(), model.getMaxTokens());
82 Prompt prompt = new Prompt(buildWritingPrompt(generateReqVO), chatOptions); 82 Prompt prompt = new Prompt(buildWritingPrompt(generateReqVO), chatOptions);
83 Flux<ChatResponse> streamResponse = chatModel.stream(prompt); 83 Flux<ChatResponse> streamResponse = chatModel.stream(prompt);
84 84
85 - // 2.2 流式返回 85 + // 3.2 流式返回
86 StringBuffer contentBuffer = new StringBuffer(); 86 StringBuffer contentBuffer = new StringBuffer();
87 return streamResponse.map(chunk -> { 87 return streamResponse.map(chunk -> {
88 String newContent = chunk.getResult() != null ? chunk.getResult().getOutput().getContent() : null; 88 String newContent = chunk.getResult() != null ? chunk.getResult().getOutput().getContent() : null;
@@ -102,10 +102,13 @@ public class AiWriteServiceImpl implements AiWriteService { @@ -102,10 +102,13 @@ public class AiWriteServiceImpl implements AiWriteService {
102 }).onErrorResume(error -> Flux.just(error(ErrorCodeConstants.WRITE_STREAM_ERROR))); 102 }).onErrorResume(error -> Flux.just(error(ErrorCodeConstants.WRITE_STREAM_ERROR)));
103 } 103 }
104 104
  105 + // TODO @xin:chatRoleService 增加一个 getChatRoleListByName;
105 private AiChatRoleDO selectOneWriteRole() { 106 private AiChatRoleDO selectOneWriteRole() {
106 AiChatRoleDO chatRoleDO = null; 107 AiChatRoleDO chatRoleDO = null;
  108 + // TODO @xin:"写作助手" 枚举下。
107 PageResult<AiChatRoleDO> writeRolePage = chatRoleService.getChatRolePage(new AiChatRolePageReqVO().setName("写作助手")); 109 PageResult<AiChatRoleDO> writeRolePage = chatRoleService.getChatRolePage(new AiChatRolePageReqVO().setName("写作助手"));
108 List<AiChatRoleDO> list = writeRolePage.getList(); 110 List<AiChatRoleDO> list = writeRolePage.getList();
  111 + // TODO @xin:CollUtil.getFirst 简化下
109 if (CollUtil.isNotEmpty(list)) { 112 if (CollUtil.isNotEmpty(list)) {
110 chatRoleDO = list.get(0); 113 chatRoleDO = list.get(0);
111 } 114 }
@@ -113,19 +116,19 @@ public class AiWriteServiceImpl implements AiWriteService { @@ -113,19 +116,19 @@ public class AiWriteServiceImpl implements AiWriteService {
113 } 116 }
114 117
115 private String buildWritingPrompt(AiWriteGenerateReqVO generateReqVO) { 118 private String buildWritingPrompt(AiWriteGenerateReqVO generateReqVO) {
  119 + // 校验写作类型是否合法
116 Integer type = generateReqVO.getType(); 120 Integer type = generateReqVO.getType();
  121 + // TODO @xin:这里可以搞到 validator 的校验。InEnum
  122 + AiWriteTypeEnum.validateType(type);
117 String format = dictDataApi.getDictDataLabel(DictTypeConstants.AI_WRITE_FORMAT, generateReqVO.getFormat()); 123 String format = dictDataApi.getDictDataLabel(DictTypeConstants.AI_WRITE_FORMAT, generateReqVO.getFormat());
118 String tone = dictDataApi.getDictDataLabel(DictTypeConstants.AI_WRITE_TONE, generateReqVO.getTone()); 124 String tone = dictDataApi.getDictDataLabel(DictTypeConstants.AI_WRITE_TONE, generateReqVO.getTone());
119 String language = dictDataApi.getDictDataLabel(DictTypeConstants.AI_WRITE_LANGUAGE, generateReqVO.getLanguage()); 125 String language = dictDataApi.getDictDataLabel(DictTypeConstants.AI_WRITE_LANGUAGE, generateReqVO.getLanguage());
120 String length = dictDataApi.getDictDataLabel(DictTypeConstants.AI_WRITE_LENGTH, generateReqVO.getLength()); 126 String length = dictDataApi.getDictDataLabel(DictTypeConstants.AI_WRITE_LENGTH, generateReqVO.getLength());
121 String prompt = generateReqVO.getPrompt(); 127 String prompt = generateReqVO.getPrompt();
122 - // 校验写作类型是否合法  
123 - AiWriteTypeEnum.validateType(type);  
124 -  
125 if (Objects.equals(type, AiWriteTypeEnum.WRITING.getType())) { 128 if (Objects.equals(type, AiWriteTypeEnum.WRITING.getType())) {
126 - return StrUtil.format(AiWriteTypeEnum.WRITING.getTemplate(), prompt, format, tone, language, length); 129 + return StrUtil.format(AiWriteTypeEnum.WRITING.getPrompt(), prompt, format, tone, language, length);
127 } else { 130 } else {
128 - return StrUtil.format(AiWriteTypeEnum.REPLY.getTemplate(), generateReqVO.getOriginalContent(), prompt, format, tone, language, length); 131 + return StrUtil.format(AiWriteTypeEnum.REPLY.getPrompt(), generateReqVO.getOriginalContent(), prompt, format, tone, language, length);
129 } 132 }
130 } 133 }
131 134
yudao-module-ai/yudao-spring-boot-starter-ai/src/test/java/cn/iocoder/yudao/framework/ai/image/TongYiImagesModelTests.java 0 → 100644
  1 +package cn.iocoder.yudao.framework.ai.image;
  2 +
  3 +import com.alibaba.dashscope.aigc.imagesynthesis.ImageSynthesis;
  4 +import com.alibaba.dashscope.aigc.imagesynthesis.ImageSynthesisParam;
  5 +import com.alibaba.dashscope.aigc.imagesynthesis.ImageSynthesisResult;
  6 +import com.alibaba.dashscope.exception.NoApiKeyException;
  7 +import com.alibaba.dashscope.utils.Constants;
  8 +import com.alibaba.fastjson.JSON;
  9 +import org.junit.jupiter.api.Test;
  10 +
  11 +import java.util.Map;
  12 +
  13 +// TODO @fan:改成 TongYiImagesModel 哈
  14 +/**
  15 + * 通义万象
  16 + */
  17 +public class TongYiImagesModelTests {
  18 +
  19 + @Test
  20 + public void imageCallTest() throws NoApiKeyException {
  21 + // 设置 api key
  22 + Constants.apiKey = "sk-Zsd81gZYg7";
  23 + ImageSynthesisParam param =
  24 + ImageSynthesisParam.builder()
  25 + .model(ImageSynthesis.Models.WANX_V1)
  26 + .n(4)
  27 + .size("1024*1024")
  28 + .prompt("雄鹰自由自在的在蓝天白云下飞翔")
  29 + .build();
  30 + // 创建 ImageSynthesis
  31 + ImageSynthesis is = new ImageSynthesis();
  32 + // 调用 call 生成 image
  33 + ImageSynthesisResult call = is.call(param);
  34 + System.err.println(JSON.toJSON(call));
  35 + for (Map<String, String> result : call.getOutput().getResults()) {
  36 + System.err.println("地址: " + result.get("url"));
  37 + }
  38 + }
  39 +}