Commit 0cdd3423e5050f2745aeb99a9a65d048bc62dd51
1 parent
3afb3089
【优化】AI Image 调整字段
Showing
9 changed files
with
58 additions
and
53 deletions
yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/AiImageDrawingStatusEnum.java renamed to yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/AiImageStatusEnum.java
| ... | ... | @@ -12,7 +12,7 @@ import lombok.Getter; |
| 12 | 12 | */ |
| 13 | 13 | @AllArgsConstructor |
| 14 | 14 | @Getter |
| 15 | -public enum AiImageDrawingStatusEnum { | |
| 15 | +public enum AiImageStatusEnum { | |
| 16 | 16 | |
| 17 | 17 | SUBMIT("submit", "提交任务"), |
| 18 | 18 | WAITING("waiting", "等待"), |
| ... | ... | @@ -27,8 +27,8 @@ public enum AiImageDrawingStatusEnum { |
| 27 | 27 | private String name; |
| 28 | 28 | |
| 29 | 29 | |
| 30 | - public static AiImageDrawingStatusEnum valueOfStatus(String status) { | |
| 31 | - for (AiImageDrawingStatusEnum itemEnum : AiImageDrawingStatusEnum.values()) { | |
| 30 | + public static AiImageStatusEnum valueOfStatus(String status) { | |
| 31 | + for (AiImageStatusEnum itemEnum : AiImageStatusEnum.values()) { | |
| 32 | 32 | if (itemEnum.getStatus().equals(status)) { |
| 33 | 33 | return itemEnum; |
| 34 | 34 | } | ... | ... |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/image/AiImageController.java
| ... | ... | @@ -37,8 +37,8 @@ public class AiImageController { |
| 37 | 37 | } |
| 38 | 38 | |
| 39 | 39 | @Operation(summary = "dall2/dall3绘画", description = "openAi dall3是付费的!") |
| 40 | - @PostMapping("/dallDrawing") | |
| 41 | - public AiImageDallDrawingRespVO dallDrawing(@Validated @RequestBody AiImageDallDrawingReqVO req) { | |
| 40 | + @PostMapping("/dall") | |
| 41 | + public AiImageDallRespVO dallDrawing(@Validated @RequestBody AiImageDallReqVO req) { | |
| 42 | 42 | return aiImageService.dallDrawing(req); |
| 43 | 43 | } |
| 44 | 44 | ... | ... |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/image/vo/AiImageDallDrawingReqVO.java renamed to yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/image/vo/AiImageDallReqVO.java
| ... | ... | @@ -15,19 +15,18 @@ import lombok.experimental.Accessors; |
| 15 | 15 | */ |
| 16 | 16 | @Data |
| 17 | 17 | @Accessors(chain = true) |
| 18 | -public class AiImageDallDrawingReqVO { | |
| 18 | +public class AiImageDallReqVO { | |
| 19 | 19 | |
| 20 | 20 | @Schema(description = "提示词") |
| 21 | 21 | @NotNull(message = "提示词不能为空!") |
| 22 | 22 | @Size(max = 1200, message = "提示词最大1200") |
| 23 | 23 | private String prompt; |
| 24 | 24 | |
| 25 | - @Schema(description = "模型") | |
| 25 | + @Schema(description = "模型(dall2、dall3)") | |
| 26 | 26 | @NotNull(message = "模型不能为空") |
| 27 | - private String modal; | |
| 27 | + private String model; | |
| 28 | 28 | |
| 29 | 29 | @Schema(description = "图像生成的风格。可为vivid(生动)或natural(自然)") |
| 30 | - @NotNull(message = "图像生成的风格,不能为空!") | |
| 31 | 30 | private String style; |
| 32 | 31 | |
| 33 | 32 | @Schema(description = "生成图像的尺寸大小。对于dall-e-2模型,尺寸可为256x256, 512x512, 或 1024x1024。对于dall-e-3模型,尺寸可为1024x1024, 1792x1024, 或 1024x1792。") | ... | ... |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/image/vo/AiImageDallDrawingRespVO.java renamed to yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/image/vo/AiImageDallRespVO.java
| ... | ... | @@ -15,8 +15,7 @@ import lombok.experimental.Accessors; |
| 15 | 15 | */ |
| 16 | 16 | @Data |
| 17 | 17 | @Accessors(chain = true) |
| 18 | -public class AiImageDallDrawingRespVO { | |
| 19 | - | |
| 18 | +public class AiImageDallRespVO { | |
| 20 | 19 | |
| 21 | 20 | @Schema(description = "提示词") |
| 22 | 21 | @NotNull(message = "提示词不能为空!") |
| ... | ... | @@ -25,7 +24,7 @@ public class AiImageDallDrawingRespVO { |
| 25 | 24 | |
| 26 | 25 | @Schema(description = "模型") |
| 27 | 26 | @NotNull(message = "模型不能为空") |
| 28 | - private String modal; | |
| 27 | + private String model; | |
| 29 | 28 | |
| 30 | 29 | @Schema(description = "风格") |
| 31 | 30 | private String style; |
| ... | ... | @@ -33,8 +32,11 @@ public class AiImageDallDrawingRespVO { |
| 33 | 32 | @Schema(description = "图片size 1024x1024 ...") |
| 34 | 33 | private String size; |
| 35 | 34 | |
| 35 | + @Schema(description = "图片地址(自己服务器)") | |
| 36 | + private String picUrl; | |
| 37 | + | |
| 36 | 38 | @Schema(description = "可以访问图像的URL。") |
| 37 | - private String url; | |
| 39 | + private String originalPicUrl; | |
| 38 | 40 | |
| 39 | 41 | @Schema(description = "图片base64。") |
| 40 | 42 | private String base64; | ... | ... |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/convert/AiImageConvert.java
| 1 | 1 | package cn.iocoder.yudao.module.ai.convert; |
| 2 | 2 | |
| 3 | 3 | import org.springframework.ai.models.midjourney.MidjourneyMessage; |
| 4 | -import cn.iocoder.yudao.module.ai.controller.admin.image.vo.AiImageDallDrawingReqVO; | |
| 5 | -import cn.iocoder.yudao.module.ai.controller.admin.image.vo.AiImageDallDrawingRespVO; | |
| 4 | +import cn.iocoder.yudao.module.ai.controller.admin.image.vo.AiImageDallReqVO; | |
| 5 | +import cn.iocoder.yudao.module.ai.controller.admin.image.vo.AiImageDallRespVO; | |
| 6 | 6 | import cn.iocoder.yudao.module.ai.controller.admin.image.vo.AiImageListRespVO; |
| 7 | 7 | import cn.iocoder.yudao.module.ai.controller.admin.image.vo.AiImageMidjourneyOperationsVO; |
| 8 | 8 | import cn.iocoder.yudao.module.ai.dal.dataobject.image.AiImageDO; |
| ... | ... | @@ -29,7 +29,7 @@ public interface AiImageConvert { |
| 29 | 29 | * @param req |
| 30 | 30 | * @return |
| 31 | 31 | */ |
| 32 | - AiImageDallDrawingRespVO convertAiImageDallDrawingRespVO(AiImageDallDrawingReqVO req); | |
| 32 | + AiImageDallRespVO convertAiImageDallDrawingRespVO(AiImageDallReqVO req); | |
| 33 | 33 | |
| 34 | 34 | /** |
| 35 | 35 | * 转换 - AiImageListRespVO | ... | ... |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/image/AiImageDO.java
| ... | ... | @@ -30,22 +30,28 @@ public class AiImageDO extends BaseDO { |
| 30 | 30 | private String prompt; |
| 31 | 31 | |
| 32 | 32 | @Schema(description = "模型 dall2/dall3、MJ、NIJI") |
| 33 | - private String modal; | |
| 33 | + private String model; | |
| 34 | 34 | |
| 35 | 35 | @Schema(description = "生成图像的尺寸大小。对于dall-e-2模型,尺寸可为256x256, 512x512, 或 1024x1024。对于dall-e-3模型,尺寸可为1024x1024, 1792x1024, 或 1024x1792。") |
| 36 | 36 | private String size; |
| 37 | 37 | |
| 38 | + @Schema(description = "风格") | |
| 39 | + private String style; | |
| 40 | + | |
| 38 | 41 | @Schema(description = "图片地址(自己服务器)") |
| 39 | - private String imageUrl; | |
| 42 | + private String picUrl; | |
| 40 | 43 | |
| 41 | 44 | @Schema(description = "绘画状态:提交、排队、绘画中、绘画完成、绘画失败") |
| 42 | - private String drawingStatus; | |
| 45 | + private String status; | |
| 43 | 46 | |
| 44 | 47 | @Schema(description = "绘画图片地址(绘画好的服务器)") |
| 45 | - private String drawingImageUrl; | |
| 48 | + private String originalPicUrl; | |
| 46 | 49 | |
| 47 | 50 | @Schema(description = "绘画错误信息") |
| 48 | - private String drawingErrorMessage; | |
| 51 | + private String errorMessage; | |
| 52 | + | |
| 53 | + @Schema(description = "是否发布") | |
| 54 | + private String publicStatus; | |
| 49 | 55 | |
| 50 | 56 | // ============ mj 需要字段 |
| 51 | 57 | ... | ... |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/image/AiImageService.java
| ... | ... | @@ -3,8 +3,6 @@ package cn.iocoder.yudao.module.ai.service.image; |
| 3 | 3 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 4 | 4 | import cn.iocoder.yudao.module.ai.controller.admin.image.vo.*; |
| 5 | 5 | |
| 6 | -import java.util.List; | |
| 7 | - | |
| 8 | 6 | /** |
| 9 | 7 | * ai 作图 |
| 10 | 8 | * |
| ... | ... | @@ -27,7 +25,7 @@ public interface AiImageService { |
| 27 | 25 | * |
| 28 | 26 | * @param req |
| 29 | 27 | */ |
| 30 | - AiImageDallDrawingRespVO dallDrawing(AiImageDallDrawingReqVO req); | |
| 28 | + AiImageDallRespVO dallDrawing(AiImageDallReqVO req); | |
| 31 | 29 | |
| 32 | 30 | /** |
| 33 | 31 | * midjourney 图片生成 | ... | ... |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/image/AiImageServiceImpl.java
| ... | ... | @@ -22,7 +22,7 @@ import cn.iocoder.yudao.module.ai.controller.admin.image.vo.*; |
| 22 | 22 | import cn.iocoder.yudao.module.ai.convert.AiImageConvert; |
| 23 | 23 | import cn.iocoder.yudao.module.ai.dal.dataobject.image.AiImageDO; |
| 24 | 24 | import cn.iocoder.yudao.module.ai.dal.mysql.image.AiImageMapper; |
| 25 | -import cn.iocoder.yudao.module.ai.enums.AiImageDrawingStatusEnum; | |
| 25 | +import cn.iocoder.yudao.module.ai.enums.AiImageStatusEnum; | |
| 26 | 26 | import jakarta.annotation.PostConstruct; |
| 27 | 27 | import lombok.AllArgsConstructor; |
| 28 | 28 | import lombok.extern.slf4j.Slf4j; |
| ... | ... | @@ -85,12 +85,12 @@ public class AiImageServiceImpl implements AiImageService { |
| 85 | 85 | } |
| 86 | 86 | |
| 87 | 87 | @Override |
| 88 | - public AiImageDallDrawingRespVO dallDrawing(AiImageDallDrawingReqVO req) { | |
| 88 | + public AiImageDallRespVO dallDrawing(AiImageDallReqVO req) { | |
| 89 | 89 | // 获取 model |
| 90 | - OpenAiImageModelEnum openAiImageModelEnum = OpenAiImageModelEnum.valueOfModel(req.getModal()); | |
| 90 | + OpenAiImageModelEnum openAiImageModelEnum = OpenAiImageModelEnum.valueOfModel(req.getModel()); | |
| 91 | 91 | OpenAiImageStyleEnum openAiImageStyleEnum = OpenAiImageStyleEnum.valueOfStyle(req.getStyle()); |
| 92 | 92 | // 转换 AiImageDallDrawingRespVO |
| 93 | - AiImageDallDrawingRespVO respVO = AiImageConvert.INSTANCE.convertAiImageDallDrawingRespVO(req); | |
| 93 | + AiImageDallRespVO respVO = AiImageConvert.INSTANCE.convertAiImageDallDrawingRespVO(req); | |
| 94 | 94 | try { |
| 95 | 95 | // 转换openai 参数 |
| 96 | 96 | OpenAiImageOptions openAiImageOptions = new OpenAiImageOptions(); |
| ... | ... | @@ -101,17 +101,17 @@ public class AiImageServiceImpl implements AiImageService { |
| 101 | 101 | // 发送 |
| 102 | 102 | ImageGeneration imageGeneration = imageResponse.getResult(); |
| 103 | 103 | // 保存数据库 |
| 104 | - doSave(req.getPrompt(), req.getSize(), req.getModal(), | |
| 105 | - imageGeneration.getOutput().getUrl(), AiImageDrawingStatusEnum.COMPLETE, null, | |
| 104 | + doSave(req.getPrompt(), req.getSize(), req.getModel(), | |
| 105 | + imageGeneration.getOutput().getUrl(), AiImageStatusEnum.COMPLETE, null, | |
| 106 | 106 | null, null, null); |
| 107 | 107 | // 返回 flex |
| 108 | - respVO.setUrl(imageGeneration.getOutput().getUrl()); | |
| 108 | + respVO.setOriginalPicUrl(imageGeneration.getOutput().getUrl()); | |
| 109 | 109 | respVO.setBase64(imageGeneration.getOutput().getB64Json()); |
| 110 | 110 | return respVO; |
| 111 | 111 | } catch (AiException aiException) { |
| 112 | 112 | // 保存数据库 |
| 113 | - doSave(req.getPrompt(), req.getSize(), req.getModal(), | |
| 114 | - null, AiImageDrawingStatusEnum.FAIL, aiException.getMessage(), | |
| 113 | + doSave(req.getPrompt(), req.getSize(), req.getModel(), | |
| 114 | + null, AiImageStatusEnum.FAIL, aiException.getMessage(), | |
| 115 | 115 | null, null, null); |
| 116 | 116 | // 发送错误信息 |
| 117 | 117 | respVO.setErrorMessage(aiException.getMessage()); |
| ... | ... | @@ -125,7 +125,7 @@ public class AiImageServiceImpl implements AiImageService { |
| 125 | 125 | // 保存数据库 |
| 126 | 126 | String messageId = String.valueOf(IdUtil.getSnowflakeNextId()); |
| 127 | 127 | AiImageDO aiImageDO = doSave(req.getPrompt(), null, "midjoureny", |
| 128 | - null, AiImageDrawingStatusEnum.SUBMIT, null, | |
| 128 | + null, AiImageStatusEnum.SUBMIT, null, | |
| 129 | 129 | messageId, null, null); |
| 130 | 130 | // 提交 midjourney 任务 |
| 131 | 131 | Boolean imagine = midjourneyInteractionsApi.imagine(messageId, req.getPrompt()); |
| ... | ... | @@ -148,8 +148,8 @@ public class AiImageServiceImpl implements AiImageService { |
| 148 | 148 | // 获取 mjOperationName |
| 149 | 149 | String mjOperationName = midjourneyOperationsVO.getLabel(); |
| 150 | 150 | // 保存一个 image 任务记录 |
| 151 | - doSave(aiImageDO.getPrompt(), aiImageDO.getSize(), aiImageDO.getModal(), | |
| 152 | - null, AiImageDrawingStatusEnum.SUBMIT, null, | |
| 151 | + doSave(aiImageDO.getPrompt(), aiImageDO.getSize(), aiImageDO.getModel(), | |
| 152 | + null, AiImageStatusEnum.SUBMIT, null, | |
| 153 | 153 | req.getMessageId(), req.getOperateId(), mjOperationName); |
| 154 | 154 | // 提交操作 |
| 155 | 155 | midjourneyInteractionsApi.reRoll( |
| ... | ... | @@ -201,9 +201,9 @@ public class AiImageServiceImpl implements AiImageService { |
| 201 | 201 | private AiImageDO doSave(String prompt, |
| 202 | 202 | String size, |
| 203 | 203 | String model, |
| 204 | - String drawingImageUrl, | |
| 205 | - AiImageDrawingStatusEnum drawingStatusEnum, | |
| 206 | - String drawingErrorMessage, | |
| 204 | + String originalPicUrl, | |
| 205 | + AiImageStatusEnum statusEnum, | |
| 206 | + String errorMessage, | |
| 207 | 207 | String mjMessageId, |
| 208 | 208 | String mjOperationId, |
| 209 | 209 | String mjOperationName) { |
| ... | ... | @@ -213,13 +213,13 @@ public class AiImageServiceImpl implements AiImageService { |
| 213 | 213 | aiImageDO.setId(null); |
| 214 | 214 | aiImageDO.setPrompt(prompt); |
| 215 | 215 | aiImageDO.setSize(size); |
| 216 | - aiImageDO.setModal(model); | |
| 216 | + aiImageDO.setModel(model); | |
| 217 | 217 | aiImageDO.setUserId(loginUserId); |
| 218 | 218 | // TODO @芋艿 如何上传到自己服务器 |
| 219 | - aiImageDO.setImageUrl(null); | |
| 220 | - aiImageDO.setDrawingStatus(drawingStatusEnum.getStatus()); | |
| 221 | - aiImageDO.setDrawingImageUrl(drawingImageUrl); | |
| 222 | - aiImageDO.setDrawingErrorMessage(drawingErrorMessage); | |
| 219 | + aiImageDO.setPicUrl(null); | |
| 220 | + aiImageDO.setStatus(statusEnum.getStatus()); | |
| 221 | + aiImageDO.setOriginalPicUrl(originalPicUrl); | |
| 222 | + aiImageDO.setErrorMessage(errorMessage); | |
| 223 | 223 | // |
| 224 | 224 | aiImageDO.setMjNonceId(mjMessageId); |
| 225 | 225 | aiImageDO.setMjOperationId(mjOperationId); | ... | ... |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/image/midjourneyHandler/YuDaoMidjourneyMessageHandler.java
| ... | ... | @@ -11,7 +11,7 @@ import cn.iocoder.yudao.module.ai.controller.admin.image.vo.AiImageMidjourneyOpe |
| 11 | 11 | import cn.iocoder.yudao.module.ai.convert.AiImageConvert; |
| 12 | 12 | import cn.iocoder.yudao.module.ai.dal.dataobject.image.AiImageDO; |
| 13 | 13 | import cn.iocoder.yudao.module.ai.dal.mysql.image.AiImageMapper; |
| 14 | -import cn.iocoder.yudao.module.ai.enums.AiImageDrawingStatusEnum; | |
| 14 | +import cn.iocoder.yudao.module.ai.enums.AiImageStatusEnum; | |
| 15 | 15 | import lombok.AllArgsConstructor; |
| 16 | 16 | import lombok.extern.slf4j.Slf4j; |
| 17 | 17 | import org.springframework.stereotype.Component; |
| ... | ... | @@ -67,8 +67,8 @@ public class YuDaoMidjourneyMessageHandler implements MidjourneyMessageHandler { |
| 67 | 67 | String errorMessage = getErrorMessage(midjourneyMessage); |
| 68 | 68 | aiImageMapper.updateByMjNonce(nonceId, |
| 69 | 69 | new AiImageDO() |
| 70 | - .setDrawingErrorMessage(errorMessage) | |
| 71 | - .setDrawingStatus(AiImageDrawingStatusEnum.FAIL.getStatus()) | |
| 70 | + .setErrorMessage(errorMessage) | |
| 71 | + .setStatus(AiImageStatusEnum.FAIL.getStatus()) | |
| 72 | 72 | ); |
| 73 | 73 | } |
| 74 | 74 | |
| ... | ... | @@ -90,22 +90,22 @@ public class YuDaoMidjourneyMessageHandler implements MidjourneyMessageHandler { |
| 90 | 90 | imageUrl = midjourneyMessage.getAttachments().get(0).getUrl(); |
| 91 | 91 | } |
| 92 | 92 | // 转换状态 |
| 93 | - AiImageDrawingStatusEnum drawingStatusEnum = null; | |
| 93 | + AiImageStatusEnum drawingStatusEnum = null; | |
| 94 | 94 | String generateStatus = midjourneyMessage.getGenerateStatus(); |
| 95 | 95 | if (MidjourneyGennerateStatusEnum.COMPLETED.getStatus().equals(generateStatus)) { |
| 96 | - drawingStatusEnum = AiImageDrawingStatusEnum.COMPLETE; | |
| 96 | + drawingStatusEnum = AiImageStatusEnum.COMPLETE; | |
| 97 | 97 | } else if (MidjourneyGennerateStatusEnum.IN_PROGRESS.getStatus().equals(generateStatus)) { |
| 98 | - drawingStatusEnum = AiImageDrawingStatusEnum.IN_PROGRESS; | |
| 98 | + drawingStatusEnum = AiImageStatusEnum.IN_PROGRESS; | |
| 99 | 99 | } else if (MidjourneyGennerateStatusEnum.WAITING.getStatus().equals(generateStatus)) { |
| 100 | - drawingStatusEnum = AiImageDrawingStatusEnum.WAITING; | |
| 100 | + drawingStatusEnum = AiImageStatusEnum.WAITING; | |
| 101 | 101 | } |
| 102 | 102 | // 获取 midjourneyOperations |
| 103 | 103 | List<AiImageMidjourneyOperationsVO> midjourneyOperations = getMidjourneyOperationsList(midjourneyMessage); |
| 104 | 104 | // 更新数据库 |
| 105 | 105 | aiImageMapper.updateByMjNonce(nonceId, |
| 106 | 106 | new AiImageDO() |
| 107 | - .setDrawingImageUrl(imageUrl) | |
| 108 | - .setDrawingStatus(drawingStatusEnum == null ? null : drawingStatusEnum.getStatus()) | |
| 107 | + .setOriginalPicUrl(imageUrl) | |
| 108 | + .setStatus(drawingStatusEnum == null ? null : drawingStatusEnum.getStatus()) | |
| 109 | 109 | .setMjNonceId(midjourneyMessage.getId()) |
| 110 | 110 | .setMjOperations(JsonUtils.toJsonString(midjourneyOperations)) |
| 111 | 111 | ); | ... | ... |