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 32 /**
33 33 * 模版
34 34 */
35   - private final String template;
  35 + private final String prompt;
36 36  
37 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 63 // 1.1 获取写作模型 尝试获取写作助手角色,如果没有则使用默认模型
64 64 AiChatRoleDO writeRole = selectOneWriteRole();
65 65 AiChatModelDO model;
  66 + // TODO @xin:writeRole.getModelId 可能为空。所以,最好是先通过 chatRole 拿。如果它没拿到,通过 getRequiredDefaultChatModel 再拿。
66 67 if (Objects.nonNull(writeRole)) {
67 68 model = chatModalService.getChatModel(writeRole.getModelId());
68 69 } else {
69 70 model = chatModalService.getRequiredDefaultChatModel();
70 71 }
71   -
  72 + // 1.2 校验平台
72 73 AiPlatformEnum platform = AiPlatformEnum.validatePlatform(model.getPlatform());
73   -
74 74 StreamingChatModel chatModel = apiKeyService.getChatModel(model.getKeyId());
75 75  
76   - // 1.2 插入写作信息
  76 + // 2. 插入写作信息
77 77 AiWriteDO writeDO = BeanUtils.toBean(generateReqVO, AiWriteDO.class, e -> e.setUserId(userId).setModel(model.getModel()).setPlatform(platform.getPlatform()));
78 78 writeMapper.insert(writeDO);
79 79  
80   - // 2.1 构建提示词
  80 + // 3.1 构建提示词
81 81 ChatOptions chatOptions = AiUtils.buildChatOptions(platform, model.getModel(), model.getTemperature(), model.getMaxTokens());
82 82 Prompt prompt = new Prompt(buildWritingPrompt(generateReqVO), chatOptions);
83 83 Flux<ChatResponse> streamResponse = chatModel.stream(prompt);
84 84  
85   - // 2.2 流式返回
  85 + // 3.2 流式返回
86 86 StringBuffer contentBuffer = new StringBuffer();
87 87 return streamResponse.map(chunk -> {
88 88 String newContent = chunk.getResult() != null ? chunk.getResult().getOutput().getContent() : null;
... ... @@ -102,10 +102,13 @@ public class AiWriteServiceImpl implements AiWriteService {
102 102 }).onErrorResume(error -> Flux.just(error(ErrorCodeConstants.WRITE_STREAM_ERROR)));
103 103 }
104 104  
  105 + // TODO @xin:chatRoleService 增加一个 getChatRoleListByName;
105 106 private AiChatRoleDO selectOneWriteRole() {
106 107 AiChatRoleDO chatRoleDO = null;
  108 + // TODO @xin:"写作助手" 枚举下。
107 109 PageResult<AiChatRoleDO> writeRolePage = chatRoleService.getChatRolePage(new AiChatRolePageReqVO().setName("写作助手"));
108 110 List<AiChatRoleDO> list = writeRolePage.getList();
  111 + // TODO @xin:CollUtil.getFirst 简化下
109 112 if (CollUtil.isNotEmpty(list)) {
110 113 chatRoleDO = list.get(0);
111 114 }
... ... @@ -113,19 +116,19 @@ public class AiWriteServiceImpl implements AiWriteService {
113 116 }
114 117  
115 118 private String buildWritingPrompt(AiWriteGenerateReqVO generateReqVO) {
  119 + // 校验写作类型是否合法
116 120 Integer type = generateReqVO.getType();
  121 + // TODO @xin:这里可以搞到 validator 的校验。InEnum
  122 + AiWriteTypeEnum.validateType(type);
117 123 String format = dictDataApi.getDictDataLabel(DictTypeConstants.AI_WRITE_FORMAT, generateReqVO.getFormat());
118 124 String tone = dictDataApi.getDictDataLabel(DictTypeConstants.AI_WRITE_TONE, generateReqVO.getTone());
119 125 String language = dictDataApi.getDictDataLabel(DictTypeConstants.AI_WRITE_LANGUAGE, generateReqVO.getLanguage());
120 126 String length = dictDataApi.getDictDataLabel(DictTypeConstants.AI_WRITE_LENGTH, generateReqVO.getLength());
121 127 String prompt = generateReqVO.getPrompt();
122   - // 校验写作类型是否合法
123   - AiWriteTypeEnum.validateType(type);
124   -
125 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 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 +}
... ...