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 | 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