Commit 6e3f34b0dbfc57d448c535d05fb12857e94dcc74
1 parent
55796201
【优化】重新适配 dall2和dall3
Showing
7 changed files
with
104 additions
and
23 deletions
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 | ... | ... |