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 package cn.iocoder.yudao.module.ai.controller.admin.image; 1 package cn.iocoder.yudao.module.ai.controller.admin.image;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.CommonResult; 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 import cn.iocoder.yudao.module.ai.controller.admin.image.vo.AiImageMidjourneyReq; 6 import cn.iocoder.yudao.module.ai.controller.admin.image.vo.AiImageMidjourneyReq;
6 import cn.iocoder.yudao.module.ai.service.AiImageService; 7 import cn.iocoder.yudao.module.ai.service.AiImageService;
7 import io.swagger.v3.oas.annotations.Operation; 8 import io.swagger.v3.oas.annotations.Operation;
@@ -14,6 +15,8 @@ import org.springframework.web.bind.annotation.RequestBody; @@ -14,6 +15,8 @@ import org.springframework.web.bind.annotation.RequestBody;
14 import org.springframework.web.bind.annotation.RequestMapping; 15 import org.springframework.web.bind.annotation.RequestMapping;
15 import org.springframework.web.bind.annotation.RestController; 16 import org.springframework.web.bind.annotation.RestController;
16 17
  18 +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  19 +
17 // TODO @芋艿:整理接口定义 20 // TODO @芋艿:整理接口定义
18 /** 21 /**
19 * ai作图 22 * ai作图
@@ -33,17 +36,14 @@ public class AiImageController { @@ -33,17 +36,14 @@ public class AiImageController {
33 36
34 @Operation(summary = "dall2/dall3绘画", description = "openAi dall3是付费的!") 37 @Operation(summary = "dall2/dall3绘画", description = "openAi dall3是付费的!")
35 @PostMapping("/dallDrawing") 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 @Operation(summary = "midjourney", description = "midjourney图片绘画流程:1、提交任务 2、获取完成的任务 3、选择对应功能 4、获取最终结果") 43 @Operation(summary = "midjourney", description = "midjourney图片绘画流程:1、提交任务 2、获取完成的任务 3、选择对应功能 4、获取最终结果")
44 @PostMapping("/midjourney") 44 @PostMapping("/midjourney")
45 public CommonResult<Void> midjourney(@Validated @RequestBody AiImageMidjourneyReq req) { 45 public CommonResult<Void> midjourney(@Validated @RequestBody AiImageMidjourneyReq req) {
46 aiImageService.midjourney(req); 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,6 +2,7 @@ package cn.iocoder.yudao.module.ai.controller.admin.image.vo;
2 2
3 import io.swagger.v3.oas.annotations.media.Schema; 3 import io.swagger.v3.oas.annotations.media.Schema;
4 import jakarta.validation.constraints.NotNull; 4 import jakarta.validation.constraints.NotNull;
  5 +import jakarta.validation.constraints.Size;
5 import lombok.Data; 6 import lombok.Data;
6 import lombok.experimental.Accessors; 7 import lombok.experimental.Accessors;
7 8
@@ -14,10 +15,11 @@ import lombok.experimental.Accessors; @@ -14,10 +15,11 @@ import lombok.experimental.Accessors;
14 */ 15 */
15 @Data 16 @Data
16 @Accessors(chain = true) 17 @Accessors(chain = true)
17 -public class AiImageDallDrawingReq { 18 +public class AiImageDallDrawingReqVO {
18 19
19 @Schema(description = "提示词") 20 @Schema(description = "提示词")
20 @NotNull(message = "提示词不能为空!") 21 @NotNull(message = "提示词不能为空!")
  22 + @Size(max = 1200, message = "提示词最大1200")
21 private String prompt; 23 private String prompt;
22 24
23 @Schema(description = "模型") 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 package cn.iocoder.yudao.module.ai.service; 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 import cn.iocoder.yudao.module.ai.controller.admin.image.vo.AiImageMidjourneyReq; 5 import cn.iocoder.yudao.module.ai.controller.admin.image.vo.AiImageMidjourneyReq;
5 6
6 /** 7 /**
@@ -17,7 +18,7 @@ public interface AiImageService { @@ -17,7 +18,7 @@ public interface AiImageService {
17 * 18 *
18 * @param req 19 * @param req
19 */ 20 */
20 - void dallDrawing(AiImageDallDrawingReq req); 21 + AiImageDallDrawingRespVO dallDrawing(AiImageDallDrawingReqVO req);
21 22
22 /** 23 /**
23 * midjourney 图片生成 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,8 +14,10 @@ import cn.iocoder.yudao.framework.ai.midjourney.webSocket.WssNotify;
14 import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; 14 import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil;
15 import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; 15 import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
16 import cn.iocoder.yudao.module.ai.ErrorCodeConstants; 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 import cn.iocoder.yudao.module.ai.controller.admin.image.vo.AiImageMidjourneyReq; 19 import cn.iocoder.yudao.module.ai.controller.admin.image.vo.AiImageMidjourneyReq;
  20 +import cn.iocoder.yudao.module.ai.convert.AiImageConvert;
19 import cn.iocoder.yudao.module.ai.dal.dataobject.image.AiImageDO; 21 import cn.iocoder.yudao.module.ai.dal.dataobject.image.AiImageDO;
20 import cn.iocoder.yudao.module.ai.dal.mysql.AiImageMapper; 22 import cn.iocoder.yudao.module.ai.dal.mysql.AiImageMapper;
21 import cn.iocoder.yudao.module.ai.enums.AiChatDrawingStatusEnum; 23 import cn.iocoder.yudao.module.ai.enums.AiChatDrawingStatusEnum;
@@ -60,31 +62,35 @@ public class AiImageServiceImpl implements AiImageService { @@ -60,31 +62,35 @@ public class AiImageServiceImpl implements AiImageService {
60 } 62 }
61 63
62 @Override 64 @Override
63 - public void dallDrawing(AiImageDallDrawingReq req) { 65 + public AiImageDallDrawingRespVO dallDrawing(AiImageDallDrawingReqVO req) {
64 // 获取 model 66 // 获取 model
65 OpenAiImageModelEnum openAiImageModelEnum = OpenAiImageModelEnum.valueOfModel(req.getModal()); 67 OpenAiImageModelEnum openAiImageModelEnum = OpenAiImageModelEnum.valueOfModel(req.getModal());
66 OpenAiImageStyleEnum openAiImageStyleEnum = OpenAiImageStyleEnum.valueOfStyle(req.getStyle()); 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 try { 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 ImageGeneration imageGeneration = imageResponse.getResult(); 79 ImageGeneration imageGeneration = imageResponse.getResult();
77 - // 发送信息  
78 -// sendSseEmitter(sseEmitter, imageGeneration);  
79 // 保存数据库 80 // 保存数据库
80 doSave(req.getPrompt(), req.getSize(), req.getModal(), 81 doSave(req.getPrompt(), req.getSize(), req.getModal(),
81 imageGeneration.getOutput().getUrl(), AiChatDrawingStatusEnum.COMPLETE, null); 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 } catch (AiException aiException) { 87 } catch (AiException aiException) {
83 // 保存数据库 88 // 保存数据库
84 doSave(req.getPrompt(), req.getSize(), req.getModal(), 89 doSave(req.getPrompt(), req.getSize(), req.getModal(),
85 null, AiChatDrawingStatusEnum.FAIL, aiException.getMessage()); 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 ### chat dallDrawing 2 ### chat dallDrawing
3 3
4 -POST {{baseUrl}}/ai/image/dallDrawing 4 +POST {{baseUrl}}/admin-api/ai/image/dallDrawing
5 Content-Type: application/json 5 Content-Type: application/json
6 Authorization: {{token}} 6 Authorization: {{token}}
7 7