From 99d477ac0a4196eaa37cf5a6f6cfe12a862359be Mon Sep 17 00:00:00 2001 From: cherishsince Date: Sun, 28 Apr 2024 17:26:31 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E5=A2=9E=E5=8A=A0=E3=80=91=E5=9B=BE?= =?UTF-8?q?=E7=89=87=E7=BB=98=E7=94=BB=E5=A2=9E=E5=8A=A0=20=E7=BB=98?= =?UTF-8?q?=E7=94=BB=E5=A4=B1=E8=B4=A5=E7=8A=B6=E6=80=81=EF=BC=8C=E5=B9=B6?= =?UTF-8?q?=E4=BF=9D=E5=AD=98=E7=BB=98=E7=94=BB=E9=94=99=E8=AF=AF=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=EF=BC=8C=E5=90=8C=E6=97=B6=E5=8F=AF=E4=BB=A5=E5=B0=86?= =?UTF-8?q?=E9=94=99=E8=AF=AF=E4=BF=A1=E6=81=AF=E8=BF=94=E5=9B=9E=E7=BB=99?= =?UTF-8?q?=E5=89=8D=E7=AB=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ai/enums/AiChatDrawingStatusEnum.java | 35 ++++++++++++++++ .../module/ai/dal/dataobject/AiImageDO.java | 3 ++ .../ai/service/impl/AiImageServiceImpl.java | 40 ++++++++++++++----- .../module/ai/vo/AiImageDallDrawingReq.java | 4 ++ 4 files changed, 73 insertions(+), 9 deletions(-) create mode 100644 yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/AiChatDrawingStatusEnum.java diff --git a/yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/AiChatDrawingStatusEnum.java b/yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/AiChatDrawingStatusEnum.java new file mode 100644 index 000000000..fef37e13d --- /dev/null +++ b/yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/AiChatDrawingStatusEnum.java @@ -0,0 +1,35 @@ +package cn.iocoder.yudao.module.ai.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * ai绘画状态 + * + * @author fansili + * @time 2024/4/28 17:05 + * @since 1.0 + */ +@AllArgsConstructor +@Getter +public enum AiChatDrawingStatusEnum { + + COMPLETE("complete", "完成"), + FAIL("fail", "失败"), + + ; + + private String status; + + private String name; + + + public static AiChatDrawingStatusEnum valueOfStatus(String status) { + for (AiChatDrawingStatusEnum itemEnum : AiChatDrawingStatusEnum.values()) { + if (itemEnum.getStatus().equals(status)) { + return itemEnum; + } + } + throw new IllegalArgumentException("Invalid MessageType value: " + status); + } +} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/AiImageDO.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/AiImageDO.java index c83cdc742..cba6e2800 100644 --- a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/AiImageDO.java +++ b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/AiImageDO.java @@ -41,5 +41,8 @@ public class AiImageDO extends BaseDO { @Schema(description = "绘画图片地址") private String drawingImageUrl; + @Schema(description = "绘画错误信息") + private String drawingError; + } diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/AiImageServiceImpl.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/AiImageServiceImpl.java index cfa1bf4b8..cdb95c78c 100644 --- a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/AiImageServiceImpl.java +++ b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/AiImageServiceImpl.java @@ -1,15 +1,17 @@ package cn.iocoder.yudao.module.ai.service.impl; -import cn.iocoder.yudao.framework.ai.image.Image; +import cn.iocoder.yudao.framework.ai.exception.AiException; import cn.iocoder.yudao.framework.ai.image.ImageGeneration; import cn.iocoder.yudao.framework.ai.image.ImagePrompt; import cn.iocoder.yudao.framework.ai.image.ImageResponse; import cn.iocoder.yudao.framework.ai.imageopenai.OpenAiImageClient; import cn.iocoder.yudao.framework.ai.imageopenai.OpenAiImageModelEnum; import cn.iocoder.yudao.framework.ai.imageopenai.OpenAiImageOptions; +import cn.iocoder.yudao.framework.ai.imageopenai.OpenAiImageStyleEnum; import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; import cn.iocoder.yudao.module.ai.controller.Utf8SseEmitter; import cn.iocoder.yudao.module.ai.dal.dataobject.AiImageDO; +import cn.iocoder.yudao.module.ai.enums.AiChatDrawingStatusEnum; import cn.iocoder.yudao.module.ai.mapper.AiImageMapper; import cn.iocoder.yudao.module.ai.service.AiImageService; import cn.iocoder.yudao.module.ai.vo.AiImageDallDrawingReq; @@ -39,25 +41,43 @@ public class AiImageServiceImpl implements AiImageService { public void dallDrawing(AiImageDallDrawingReq req, Utf8SseEmitter sseEmitter) { // 获取 model OpenAiImageModelEnum openAiImageModelEnum = OpenAiImageModelEnum.valueOfModel(req.getModal()); + OpenAiImageStyleEnum openAiImageStyleEnum = OpenAiImageStyleEnum.valueOfStyle(req.getStyle()); // OpenAiImageOptions openAiImageOptions = new OpenAiImageOptions(); openAiImageOptions.setModel(openAiImageModelEnum); - ImageResponse imageResponse = openAiImageClient.call(new ImagePrompt(req.getPrompt(), openAiImageOptions)); - // 发送 - ImageGeneration imageGeneration = imageResponse.getResult(); + openAiImageOptions.setStyle(openAiImageStyleEnum); + openAiImageOptions.setSize(req.getSize()); + ImageResponse imageResponse; try { - sseEmitter.send(imageGeneration, MediaType.APPLICATION_JSON); + imageResponse = openAiImageClient.call(new ImagePrompt(req.getPrompt(), openAiImageOptions)); + // 发送 + ImageGeneration imageGeneration = imageResponse.getResult(); + // 发送信息 + sendSseEmitter(sseEmitter, imageGeneration); + // 保存数据库 + doSave(req, imageGeneration.getOutput().getUrl(), AiChatDrawingStatusEnum.COMPLETE, null); + } catch (AiException aiException) { + // 保存数据库 + doSave(req, null, AiChatDrawingStatusEnum.FAIL, aiException.getMessage()); + // 发送错误信息 + sendSseEmitter(sseEmitter, aiException.getMessage()); + } + } + + private static void sendSseEmitter(Utf8SseEmitter sseEmitter, Object object) { + try { + sseEmitter.send(object, MediaType.APPLICATION_JSON); } catch (IOException e) { throw new RuntimeException(e); } finally { // 发送 complete sseEmitter.complete(); } - Long loginUserId = SecurityFrameworkUtils.getLoginUserId(); - // + } + + private void doSave(AiImageDallDrawingReq req, String imageUrl, AiChatDrawingStatusEnum drawingStatusEnum, String drawingError) { // 保存数据库 - Image output = imageGeneration.getOutput(); - String imageUrl = output.getUrl(); + Long loginUserId = SecurityFrameworkUtils.getLoginUserId(); AiImageDO aiImageDO = new AiImageDO(); aiImageDO.setId(null); aiImageDO.setPrompt(req.getPrompt()); @@ -65,6 +85,8 @@ public class AiImageServiceImpl implements AiImageService { aiImageDO.setModal(req.getModal()); aiImageDO.setUserId(loginUserId); aiImageDO.setDrawingImageUrl(imageUrl); + aiImageDO.setDrawingStatus(drawingStatusEnum.getStatus()); + aiImageDO.setDrawingError(drawingError); aiImageMapper.insert(aiImageDO); } } diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiImageDallDrawingReq.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiImageDallDrawingReq.java index c52589c8f..fb62f2082 100644 --- a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiImageDallDrawingReq.java +++ b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiImageDallDrawingReq.java @@ -24,6 +24,10 @@ public class AiImageDallDrawingReq { @NotNull(message = "模型不能为空") private String modal; + @Schema(description = "图像生成的风格。可为vivid(生动)或natural(自然)") + @NotNull(message = "图像生成的风格,不能为空!") + private String style; + @Schema(description = "生成图像的尺寸大小。对于dall-e-2模型,尺寸可为256x256, 512x512, 或 1024x1024。对于dall-e-3模型,尺寸可为1024x1024, 1792x1024, 或 1024x1792。") @NotNull(message = "size不能为空!") private String size;