Commit 6e3f34b0dbfc57d448c535d05fb12857e94dcc74

Authored by cherishsince
1 parent 55796201

【优化】重新适配 dall2和dall3

yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/image/AiImageController.java
1 1 package cn.iocoder.yudao.module.ai.controller.admin.image;
2 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4   -import cn.iocoder.yudao.module.ai.controller.admin.image.vo.AiImageDallDrawingReq;
  4 +import cn.iocoder.yudao.module.ai.controller.admin.image.vo.AiImageDallDrawingReqVO;
  5 +import cn.iocoder.yudao.module.ai.controller.admin.image.vo.AiImageDallDrawingRespVO;
5 6 import cn.iocoder.yudao.module.ai.controller.admin.image.vo.AiImageMidjourneyReq;
6 7 import cn.iocoder.yudao.module.ai.service.AiImageService;
7 8 import io.swagger.v3.oas.annotations.Operation;
... ... @@ -14,6 +15,8 @@ import org.springframework.web.bind.annotation.RequestBody;
14 15 import org.springframework.web.bind.annotation.RequestMapping;
15 16 import org.springframework.web.bind.annotation.RestController;
16 17  
  18 +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  19 +
17 20 // TODO @芋艿:整理接口定义
18 21 /**
19 22 * ai作图
... ... @@ -33,17 +36,14 @@ public class AiImageController {
33 36  
34 37 @Operation(summary = "dall2/dall3绘画", description = "openAi dall3是付费的!")
35 38 @PostMapping("/dallDrawing")
36   - public void dallDrawing(@Validated @RequestBody AiImageDallDrawingReq req) {
37   -// Utf8SseEmitter sseEmitter = new Utf8SseEmitter();
38   -// aiImageService.dallDrawing(req, sseEmitter);
39   -// return sseEmitter;
40   -
  39 + public AiImageDallDrawingRespVO dallDrawing(@Validated @RequestBody AiImageDallDrawingReqVO req) {
  40 + return aiImageService.dallDrawing(req);
41 41 }
42 42  
43 43 @Operation(summary = "midjourney", description = "midjourney图片绘画流程:1、提交任务 2、获取完成的任务 3、选择对应功能 4、获取最终结果")
44 44 @PostMapping("/midjourney")
45 45 public CommonResult<Void> midjourney(@Validated @RequestBody AiImageMidjourneyReq req) {
46 46 aiImageService.midjourney(req);
47   - return CommonResult.success(null);
  47 + return success(null);
48 48 }
49 49 }
... ...
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/image/vo/AiImageDallDrawingReq.java renamed to yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/image/vo/AiImageDallDrawingReqVO.java
... ... @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.ai.controller.admin.image.vo;
2 2  
3 3 import io.swagger.v3.oas.annotations.media.Schema;
4 4 import jakarta.validation.constraints.NotNull;
  5 +import jakarta.validation.constraints.Size;
5 6 import lombok.Data;
6 7 import lombok.experimental.Accessors;
7 8  
... ... @@ -14,10 +15,11 @@ import lombok.experimental.Accessors;
14 15 */
15 16 @Data
16 17 @Accessors(chain = true)
17   -public class AiImageDallDrawingReq {
  18 +public class AiImageDallDrawingReqVO {
18 19  
19 20 @Schema(description = "提示词")
20 21 @NotNull(message = "提示词不能为空!")
  22 + @Size(max = 1200, message = "提示词最大1200")
21 23 private String prompt;
22 24  
23 25 @Schema(description = "模型")
... ...
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/image/vo/AiImageDallDrawingRespVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.ai.controller.admin.image.vo;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import jakarta.validation.constraints.NotNull;
  5 +import jakarta.validation.constraints.Size;
  6 +import lombok.Data;
  7 +import lombok.experimental.Accessors;
  8 +
  9 +/**
  10 + * dall2/dall2 绘画
  11 + *
  12 + * @author fansili
  13 + * @time 2024/4/25 16:24
  14 + * @since 1.0
  15 + */
  16 +@Data
  17 +@Accessors(chain = true)
  18 +public class AiImageDallDrawingRespVO {
  19 +
  20 +
  21 + @Schema(description = "提示词")
  22 + @NotNull(message = "提示词不能为空!")
  23 + @Size(max = 1200, message = "提示词最大1200")
  24 + private String prompt;
  25 +
  26 + @Schema(description = "模型")
  27 + @NotNull(message = "模型不能为空")
  28 + private String modal;
  29 +
  30 + @Schema(description = "风格")
  31 + private String style;
  32 +
  33 + @Schema(description = "图片size 1024x1024 ...")
  34 + private String size;
  35 +
  36 + @Schema(description = "可以访问图像的URL。")
  37 + private String url;
  38 +
  39 + @Schema(description = "图片base64。")
  40 + private String base64;
  41 +
  42 + @Schema(description = "错误信息。")
  43 + private String errorMessage;
  44 +
  45 +}
... ...
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/convert/AiImageConvert.java 0 → 100644
  1 +package cn.iocoder.yudao.module.ai.convert;
  2 +
  3 +import cn.iocoder.yudao.module.ai.controller.admin.image.vo.AiImageDallDrawingReqVO;
  4 +import cn.iocoder.yudao.module.ai.controller.admin.image.vo.AiImageDallDrawingRespVO;
  5 +import org.mapstruct.Mapper;
  6 +import org.mapstruct.factory.Mappers;
  7 +
  8 +/**
  9 + * ai image convert
  10 + *
  11 + * @author fansili
  12 + * @time 2024/4/18 16:39
  13 + * @since 1.0
  14 + */
  15 +@Mapper
  16 +public interface AiImageConvert {
  17 +
  18 + AiImageConvert INSTANCE = Mappers.getMapper(AiImageConvert.class);
  19 +
  20 + /**
  21 + * 转换 - AiImageDallDrawingRespVO
  22 + *
  23 + * @param req
  24 + * @return
  25 + */
  26 + AiImageDallDrawingRespVO convertAiImageDallDrawingRespVO(AiImageDallDrawingReqVO req);
  27 +}
... ...
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/AiImageService.java
1 1 package cn.iocoder.yudao.module.ai.service;
2 2  
3   -import cn.iocoder.yudao.module.ai.controller.admin.image.vo.AiImageDallDrawingReq;
  3 +import cn.iocoder.yudao.module.ai.controller.admin.image.vo.AiImageDallDrawingReqVO;
  4 +import cn.iocoder.yudao.module.ai.controller.admin.image.vo.AiImageDallDrawingRespVO;
4 5 import cn.iocoder.yudao.module.ai.controller.admin.image.vo.AiImageMidjourneyReq;
5 6  
6 7 /**
... ... @@ -17,7 +18,7 @@ public interface AiImageService {
17 18 *
18 19 * @param req
19 20 */
20   - void dallDrawing(AiImageDallDrawingReq req);
  21 + AiImageDallDrawingRespVO dallDrawing(AiImageDallDrawingReqVO req);
21 22  
22 23 /**
23 24 * midjourney 图片生成
... ...
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/AiImageServiceImpl.java
... ... @@ -14,8 +14,10 @@ import cn.iocoder.yudao.framework.ai.midjourney.webSocket.WssNotify;
14 14 import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil;
15 15 import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
16 16 import cn.iocoder.yudao.module.ai.ErrorCodeConstants;
17   -import cn.iocoder.yudao.module.ai.controller.admin.image.vo.AiImageDallDrawingReq;
  17 +import cn.iocoder.yudao.module.ai.controller.admin.image.vo.AiImageDallDrawingReqVO;
  18 +import cn.iocoder.yudao.module.ai.controller.admin.image.vo.AiImageDallDrawingRespVO;
18 19 import cn.iocoder.yudao.module.ai.controller.admin.image.vo.AiImageMidjourneyReq;
  20 +import cn.iocoder.yudao.module.ai.convert.AiImageConvert;
19 21 import cn.iocoder.yudao.module.ai.dal.dataobject.image.AiImageDO;
20 22 import cn.iocoder.yudao.module.ai.dal.mysql.AiImageMapper;
21 23 import cn.iocoder.yudao.module.ai.enums.AiChatDrawingStatusEnum;
... ... @@ -60,31 +62,35 @@ public class AiImageServiceImpl implements AiImageService {
60 62 }
61 63  
62 64 @Override
63   - public void dallDrawing(AiImageDallDrawingReq req) {
  65 + public AiImageDallDrawingRespVO dallDrawing(AiImageDallDrawingReqVO req) {
64 66 // 获取 model
65 67 OpenAiImageModelEnum openAiImageModelEnum = OpenAiImageModelEnum.valueOfModel(req.getModal());
66 68 OpenAiImageStyleEnum openAiImageStyleEnum = OpenAiImageStyleEnum.valueOfStyle(req.getStyle());
67   - //
68   - OpenAiImageOptions openAiImageOptions = new OpenAiImageOptions();
69   - openAiImageOptions.setModel(openAiImageModelEnum);
70   - openAiImageOptions.setStyle(openAiImageStyleEnum);
71   - openAiImageOptions.setSize(req.getSize());
72   - ImageResponse imageResponse;
  69 + // 转换 AiImageDallDrawingRespVO
  70 + AiImageDallDrawingRespVO respVO = AiImageConvert.INSTANCE.convertAiImageDallDrawingRespVO(req);
73 71 try {
74   - imageResponse = openAiImageClient.call(new ImagePrompt(req.getPrompt(), openAiImageOptions));
  72 + // 转换openai 参数
  73 + OpenAiImageOptions openAiImageOptions = new OpenAiImageOptions();
  74 + openAiImageOptions.setModel(openAiImageModelEnum);
  75 + openAiImageOptions.setStyle(openAiImageStyleEnum);
  76 + openAiImageOptions.setSize(req.getSize());
  77 + ImageResponse imageResponse = openAiImageClient.call(new ImagePrompt(req.getPrompt(), openAiImageOptions));
75 78 // 发送
76 79 ImageGeneration imageGeneration = imageResponse.getResult();
77   - // 发送信息
78   -// sendSseEmitter(sseEmitter, imageGeneration);
79 80 // 保存数据库
80 81 doSave(req.getPrompt(), req.getSize(), req.getModal(),
81 82 imageGeneration.getOutput().getUrl(), AiChatDrawingStatusEnum.COMPLETE, null);
  83 + // 返回 flex
  84 + respVO.setUrl(imageGeneration.getOutput().getUrl());
  85 + respVO.setBase64(imageGeneration.getOutput().getB64Json());
  86 + return respVO;
82 87 } catch (AiException aiException) {
83 88 // 保存数据库
84 89 doSave(req.getPrompt(), req.getSize(), req.getModal(),
85 90 null, AiChatDrawingStatusEnum.FAIL, aiException.getMessage());
86 91 // 发送错误信息
87   -// sendSseEmitter(sseEmitter, aiException.getMessage());
  92 + respVO.setErrorMessage(aiException.getMessage());
  93 + return respVO;
88 94 }
89 95 }
90 96  
... ...
yudao-module-ai/yudao-module-ai-biz/src/main/resources/http/image.http
1 1  
2 2 ### chat dallDrawing
3 3  
4   -POST {{baseUrl}}/ai/image/dallDrawing
  4 +POST {{baseUrl}}/admin-api/ai/image/dallDrawing
5 5 Content-Type: application/json
6 6 Authorization: {{token}}
7 7  
... ...