From aa7c2cb251001dab4a35117b04d1097da1448f4b Mon Sep 17 00:00:00 2001 From: cherishsince Date: Thu, 13 Jun 2024 14:46:53 +0800 Subject: [PATCH] 【解决todo】使用 MidjourneyApi --- yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/client/MidjourneyProxyClient.java | 89 ----------------------------------------------------------------------------------------- yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/client/enums/MidjourneyModelEnum.java | 30 ------------------------------ yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/client/enums/MidjourneySubmitCodeEnum.java | 33 --------------------------------- yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/client/enums/MidjourneyTaskActionEnum.java | 35 ----------------------------------- yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/client/enums/MidjourneyTaskStatusEnum.java | 38 -------------------------------------- yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/client/vo/MidjourneyActionReqVO.java | 33 --------------------------------- yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/client/vo/MidjourneyImagineReqVO.java | 33 --------------------------------- yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/client/vo/MidjourneyNotifyReqVO.java | 75 --------------------------------------------------------------------------- yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/client/vo/MidjourneySubmitRespVO.java | 30 ------------------------------ yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/image/AiImageController.java | 2 +- yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/image/vo/AiImageRespVO.java | 1 - yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/image/vo/MidjourneyActionReqVO.java | 31 +++++++++++++++++++++++++++++++ yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/image/vo/MidjourneyImagineReqVO.java | 33 +++++++++++++++++++++++++++++++++ yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/image/vo/MidjourneyNotifyReqVO.java | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/image/vo/MidjourneySubmitRespVO.java | 30 ++++++++++++++++++++++++++++++ yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/image/AiImageDO.java | 2 +- yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/job/MidjourneyJob.java | 14 +++++++------- yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/image/AiImageService.java | 2 +- yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/image/AiImageServiceImpl.java | 55 ++++++++++++++++++++----------------------------------- 19 files changed, 199 insertions(+), 442 deletions(-) delete mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/client/MidjourneyProxyClient.java delete mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/client/enums/MidjourneyModelEnum.java delete mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/client/enums/MidjourneySubmitCodeEnum.java delete mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/client/enums/MidjourneyTaskActionEnum.java delete mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/client/enums/MidjourneyTaskStatusEnum.java delete mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/client/vo/MidjourneyActionReqVO.java delete mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/client/vo/MidjourneyImagineReqVO.java delete mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/client/vo/MidjourneyNotifyReqVO.java delete mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/client/vo/MidjourneySubmitRespVO.java create mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/image/vo/MidjourneyActionReqVO.java create mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/image/vo/MidjourneyImagineReqVO.java create mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/image/vo/MidjourneyNotifyReqVO.java create mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/image/vo/MidjourneySubmitRespVO.java diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/client/MidjourneyProxyClient.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/client/MidjourneyProxyClient.java deleted file mode 100644 index b85e228..0000000 --- a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/client/MidjourneyProxyClient.java +++ /dev/null @@ -1,89 +0,0 @@ -package cn.iocoder.yudao.module.ai.client; - -import cn.iocoder.yudao.framework.common.util.json.JsonUtils; -import cn.iocoder.yudao.module.ai.client.vo.MidjourneyActionReqVO; -import cn.iocoder.yudao.module.ai.client.vo.MidjourneyImagineReqVO; -import cn.iocoder.yudao.module.ai.client.vo.MidjourneyNotifyReqVO; -import cn.iocoder.yudao.module.ai.client.vo.MidjourneySubmitRespVO; -import cn.iocoder.yudao.module.ai.config.MidjourneyProperties; -import com.google.common.collect.ImmutableMap; -import jakarta.validation.constraints.NotNull; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.*; -import org.springframework.stereotype.Component; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.client.RestTemplate; - -import java.util.Collection; -import java.util.List; - -// TODO @fan:【高优】这个写到 starter-ai 里哈。搞个 MidjourneyApi,参考 https://github.com/spring-projects/spring-ai/blob/main/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/api/OpenAiApi.java 的风格写哈 -/** - * Midjourney Proxy 客户端 - * - * @author fansili - * @time 2024/5/30 13:58 - * @since 1.0 - */ -@Component -public class MidjourneyProxyClient { - - private static final String URI_IMAGINE = "/submit/imagine"; - private static final String URI_ACTON = "/submit/action"; - private static final String URI_LIST_BY_CONDITION = "/task/list-by-condition"; - - @Autowired - private MidjourneyProperties midjourneyProperties; - @Autowired - private RestTemplate restTemplate; - - /** - * imagine - 根据提示词提交绘画任务 - * - * @param imagineReqVO - * @return - */ - public MidjourneySubmitRespVO imagine(@Validated @NotNull MidjourneyImagineReqVO imagineReqVO) { - // 1、发送 post 请求 - ResponseEntity response = post(URI_IMAGINE, imagineReqVO); - // 2、转换 resp - return JsonUtils.parseObject(response.getBody(), MidjourneySubmitRespVO.class); - } - - /** - * action - 放大、缩小、U1、U2... - * - * @param actionReqVO - */ - public MidjourneySubmitRespVO action(@Validated @NotNull MidjourneyActionReqVO actionReqVO) { - // 1、发送 post 请求 - ResponseEntity response = post(URI_ACTON, actionReqVO); - // 2、转换 resp - return JsonUtils.parseObject(response.getBody(), MidjourneySubmitRespVO.class); - } - - /** - * 批量查询 task 任务 - * - * @param taskIds - * @return - */ - public List listByCondition(Collection taskIds) { - // 1、发送 post 请求 - ResponseEntity res = post(URI_LIST_BY_CONDITION, ImmutableMap.of("ids", taskIds)); - // 2、转换 对象 - return JsonUtils.parseArray(res.getBody(), MidjourneyNotifyReqVO.class); - } - - private ResponseEntity post(String uri, Object body) { - // 1、创建 HttpHeaders 对象 - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); - headers.set("Authorization", "Bearer ".concat(midjourneyProperties.getKey())); - // 2、创建 HttpEntity 对象,将 HttpHeaders 和请求体传递给它 - HttpEntity requestEntity = new HttpEntity<>(JsonUtils.toJsonString(body), headers); - // 3、发送 post 请求 - return restTemplate.exchange(midjourneyProperties.getUrl().concat(uri), HttpMethod.POST, requestEntity, String.class); - } - -} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/client/enums/MidjourneyModelEnum.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/client/enums/MidjourneyModelEnum.java deleted file mode 100644 index 6c53b92..0000000 --- a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/client/enums/MidjourneyModelEnum.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.iocoder.yudao.module.ai.client.enums; - - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 来源于 midjourney-proxy - */ -@Getter -@AllArgsConstructor -public enum MidjourneyModelEnum { - - MIDJOURNEY("midjourney", "midjourney"), - NIJI("Niji", "Niji"), - - ; - - private String model; - private String name; - - public static MidjourneyModelEnum valueOfModel(String model) { - for (MidjourneyModelEnum itemEnum : MidjourneyModelEnum.values()) { - if (itemEnum.getModel().equals(model)) { - return itemEnum; - } - } - throw new IllegalArgumentException("Invalid MessageType value: " + model); - } -} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/client/enums/MidjourneySubmitCodeEnum.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/client/enums/MidjourneySubmitCodeEnum.java deleted file mode 100644 index 2eddf37..0000000 --- a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/client/enums/MidjourneySubmitCodeEnum.java +++ /dev/null @@ -1,33 +0,0 @@ -package cn.iocoder.yudao.module.ai.client.enums; - -import com.google.common.collect.Lists; -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.List; - -// TODO @fan:待定 -/** - * Midjourney 提交任务 code 枚举 - * - * @author fansili - */ -@Getter -@AllArgsConstructor -public enum MidjourneySubmitCodeEnum { - - SUBMIT_SUCCESS("1", "提交成功"), - ALREADY_EXISTS("21", "已存在"), - QUEUING("22", "排队中"), - ; - - public static final List SUCCESS_CODES = Lists.newArrayList( - SUBMIT_SUCCESS.code, - ALREADY_EXISTS.code, - QUEUING.code - ); - - private final String code; - private final String name; - -} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/client/enums/MidjourneyTaskActionEnum.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/client/enums/MidjourneyTaskActionEnum.java deleted file mode 100644 index a845a47..0000000 --- a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/client/enums/MidjourneyTaskActionEnum.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.iocoder.yudao.module.ai.client.enums; - -import lombok.Getter; - -/** - * 来源于 midjourney-proxy - */ -@Getter -public enum MidjourneyTaskActionEnum { - /** - * 生成图片. - */ - IMAGINE, - /** - * 选中放大. - */ - UPSCALE, - /** - * 选中其中的一张图,生成四张相似的. - */ - VARIATION, - /** - * 重新执行. - */ - REROLL, - /** - * 图转prompt. - */ - DESCRIBE, - /** - * 多图混合. - */ - BLEND - -} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/client/enums/MidjourneyTaskStatusEnum.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/client/enums/MidjourneyTaskStatusEnum.java deleted file mode 100644 index b3af66e..0000000 --- a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/client/enums/MidjourneyTaskStatusEnum.java +++ /dev/null @@ -1,38 +0,0 @@ -package cn.iocoder.yudao.module.ai.client.enums; - - -import lombok.Getter; - -/** - * 来源于 midjourney-proxy - */ -public enum MidjourneyTaskStatusEnum { - /** - * 未启动. - */ - NOT_START(0), - /** - * 已提交. - */ - SUBMITTED(1), - /** - * 执行中. - */ - IN_PROGRESS(3), - /** - * 失败. - */ - FAILURE(4), - /** - * 成功. - */ - SUCCESS(4); - - @Getter - private final int order; - - MidjourneyTaskStatusEnum(int order) { - this.order = order; - } - -} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/client/vo/MidjourneyActionReqVO.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/client/vo/MidjourneyActionReqVO.java deleted file mode 100644 index a5e3e2a..0000000 --- a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/client/vo/MidjourneyActionReqVO.java +++ /dev/null @@ -1,33 +0,0 @@ -package cn.iocoder.yudao.module.ai.client.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotNull; -import lombok.Data; - -import java.util.List; - -/** - * Midjourney:action 请求 - * - * @author fansili - * @time 2024/5/30 14:02 - * @since 1.0 - */ -@Data -public class MidjourneyActionReqVO { - - @Schema(description = "操作按钮id", required = true) - @NotNull(message = "customId 不能为空!") - private String customId; - - @Schema(description = "操作按钮id", required = true) - @NotNull(message = "customId 不能为空!") - private String taskId; - - @Schema(description = "通知地址", required = false) - @NotNull(message = "回调地址不能为空!") - private String notifyHook; - - @Schema(description = "自定义参数", required = false) - private String state; -} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/client/vo/MidjourneyImagineReqVO.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/client/vo/MidjourneyImagineReqVO.java deleted file mode 100644 index 5f48747..0000000 --- a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/client/vo/MidjourneyImagineReqVO.java +++ /dev/null @@ -1,33 +0,0 @@ -package cn.iocoder.yudao.module.ai.client.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotNull; -import lombok.Data; - -import java.util.List; - -// TODO @fan:待定 -/** - * Midjourney:Imagine 请求 - * - * @author fansili - * @time 2024/5/30 14:02 - * @since 1.0 - */ -@Data -public class MidjourneyImagineReqVO { - - @Schema(description = "垫图(参考图)base64数组", required = false) - private List base64Array; - - @Schema(description = "通知地址", required = false) - @NotNull(message = "回调地址不能为空!") - private String notifyHook; - - @Schema(description = "提示词", required = true) - @NotNull(message = "提示词不能为空!") - private String prompt; - - @Schema(description = "自定义参数", required = false) - private String state; -} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/client/vo/MidjourneyNotifyReqVO.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/client/vo/MidjourneyNotifyReqVO.java deleted file mode 100644 index 2f8c280..0000000 --- a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/client/vo/MidjourneyNotifyReqVO.java +++ /dev/null @@ -1,75 +0,0 @@ -package cn.iocoder.yudao.module.ai.client.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.util.List; - -/** - * Midjourney Proxy 通知回调 - * - * - Midjourney Proxy:通知回调 bean 是 com.github.novicezk.midjourney.support.Task - * - 毫秒 api 通知回调文档地址:https://gpt-best.apifox.cn/doc-3530863 - * - * @author fansili - * @time 2024/5/31 10:37 - * @since 1.0 - */ -@Data -public class MidjourneyNotifyReqVO { - - @Schema(description = "job id") - private String id; - - @Schema(description = "任务类型 MidjourneyTaskActionEnum") - private String action; - @Schema(description = "任务状态 MidjourneyTaskStatusEnum") - private String status; - - @Schema(description = "提示词") - private String prompt; - @Schema(description = "提示词-英文") - private String promptEn; - - @Schema(description = "任务描述") - private String description; - @Schema(description = "自定义参数") - private String state; - - @Schema(description = "提交时间") - private Long submitTime; - @Schema(description = "开始执行时间") - private Long startTime; - @Schema(description = "结束时间") - private Long finishTime; - - @Schema(description = "图片url") - private String imageUrl; - - @Schema(description = "任务进度") - private String progress; - @Schema(description = "失败原因") - private String failReason; - - @Schema(description = "任务完成后的可执行按钮") - private List