Commit 0cdd3423e5050f2745aeb99a9a65d048bc62dd51

Authored by cherishsince
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 );
... ...