Commit 7cd16ffbf3ad6144ee66fe7b310a117309b5f586
Merge branch 'refs/heads/upstrem-master-jdk21-ai' into master-jdk21-ai
Showing
3 changed files
with
53 additions
and
11 deletions
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 | +} | ... | ... |