Commit aa7c2cb251001dab4a35117b04d1097da1448f4b

Authored by cherishsince
1 parent 4d9dbeaa

【解决todo】使用 MidjourneyApi

Showing 15 changed files with 34 additions and 277 deletions
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/client/MidjourneyProxyClient.java deleted
1   -package cn.iocoder.yudao.module.ai.client;
2   -
3   -import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
4   -import cn.iocoder.yudao.module.ai.client.vo.MidjourneyActionReqVO;
5   -import cn.iocoder.yudao.module.ai.client.vo.MidjourneyImagineReqVO;
6   -import cn.iocoder.yudao.module.ai.client.vo.MidjourneyNotifyReqVO;
7   -import cn.iocoder.yudao.module.ai.client.vo.MidjourneySubmitRespVO;
8   -import cn.iocoder.yudao.module.ai.config.MidjourneyProperties;
9   -import com.google.common.collect.ImmutableMap;
10   -import jakarta.validation.constraints.NotNull;
11   -import org.springframework.beans.factory.annotation.Autowired;
12   -import org.springframework.http.*;
13   -import org.springframework.stereotype.Component;
14   -import org.springframework.validation.annotation.Validated;
15   -import org.springframework.web.client.RestTemplate;
16   -
17   -import java.util.Collection;
18   -import java.util.List;
19   -
20   -// 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 的风格写哈
21   -/**
22   - * Midjourney Proxy 客户端
23   - *
24   - * @author fansili
25   - * @time 2024/5/30 13:58
26   - * @since 1.0
27   - */
28   -@Component
29   -public class MidjourneyProxyClient {
30   -
31   - private static final String URI_IMAGINE = "/submit/imagine";
32   - private static final String URI_ACTON = "/submit/action";
33   - private static final String URI_LIST_BY_CONDITION = "/task/list-by-condition";
34   -
35   - @Autowired
36   - private MidjourneyProperties midjourneyProperties;
37   - @Autowired
38   - private RestTemplate restTemplate;
39   -
40   - /**
41   - * imagine - 根据提示词提交绘画任务
42   - *
43   - * @param imagineReqVO
44   - * @return
45   - */
46   - public MidjourneySubmitRespVO imagine(@Validated @NotNull MidjourneyImagineReqVO imagineReqVO) {
47   - // 1、发送 post 请求
48   - ResponseEntity<String> response = post(URI_IMAGINE, imagineReqVO);
49   - // 2、转换 resp
50   - return JsonUtils.parseObject(response.getBody(), MidjourneySubmitRespVO.class);
51   - }
52   -
53   - /**
54   - * action - 放大、缩小、U1、U2...
55   - *
56   - * @param actionReqVO
57   - */
58   - public MidjourneySubmitRespVO action(@Validated @NotNull MidjourneyActionReqVO actionReqVO) {
59   - // 1、发送 post 请求
60   - ResponseEntity<String> response = post(URI_ACTON, actionReqVO);
61   - // 2、转换 resp
62   - return JsonUtils.parseObject(response.getBody(), MidjourneySubmitRespVO.class);
63   - }
64   -
65   - /**
66   - * 批量查询 task 任务
67   - *
68   - * @param taskIds
69   - * @return
70   - */
71   - public List<MidjourneyNotifyReqVO> listByCondition(Collection<String> taskIds) {
72   - // 1、发送 post 请求
73   - ResponseEntity<String> res = post(URI_LIST_BY_CONDITION, ImmutableMap.of("ids", taskIds));
74   - // 2、转换 对象
75   - return JsonUtils.parseArray(res.getBody(), MidjourneyNotifyReqVO.class);
76   - }
77   -
78   - private ResponseEntity<String> post(String uri, Object body) {
79   - // 1、创建 HttpHeaders 对象
80   - HttpHeaders headers = new HttpHeaders();
81   - headers.setContentType(MediaType.APPLICATION_JSON);
82   - headers.set("Authorization", "Bearer ".concat(midjourneyProperties.getKey()));
83   - // 2、创建 HttpEntity 对象,将 HttpHeaders 和请求体传递给它
84   - HttpEntity<String> requestEntity = new HttpEntity<>(JsonUtils.toJsonString(body), headers);
85   - // 3、发送 post 请求
86   - return restTemplate.exchange(midjourneyProperties.getUrl().concat(uri), HttpMethod.POST, requestEntity, String.class);
87   - }
88   -
89   -}
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/client/enums/MidjourneyModelEnum.java deleted
1   -package cn.iocoder.yudao.module.ai.client.enums;
2   -
3   -
4   -import lombok.AllArgsConstructor;
5   -import lombok.Getter;
6   -
7   -/**
8   - * 来源于 midjourney-proxy
9   - */
10   -@Getter
11   -@AllArgsConstructor
12   -public enum MidjourneyModelEnum {
13   -
14   - MIDJOURNEY("midjourney", "midjourney"),
15   - NIJI("Niji", "Niji"),
16   -
17   - ;
18   -
19   - private String model;
20   - private String name;
21   -
22   - public static MidjourneyModelEnum valueOfModel(String model) {
23   - for (MidjourneyModelEnum itemEnum : MidjourneyModelEnum.values()) {
24   - if (itemEnum.getModel().equals(model)) {
25   - return itemEnum;
26   - }
27   - }
28   - throw new IllegalArgumentException("Invalid MessageType value: " + model);
29   - }
30   -}
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/client/enums/MidjourneySubmitCodeEnum.java deleted
1   -package cn.iocoder.yudao.module.ai.client.enums;
2   -
3   -import com.google.common.collect.Lists;
4   -import lombok.AllArgsConstructor;
5   -import lombok.Getter;
6   -
7   -import java.util.List;
8   -
9   -// TODO @fan:待定
10   -/**
11   - * Midjourney 提交任务 code 枚举
12   - *
13   - * @author fansili
14   - */
15   -@Getter
16   -@AllArgsConstructor
17   -public enum MidjourneySubmitCodeEnum {
18   -
19   - SUBMIT_SUCCESS("1", "提交成功"),
20   - ALREADY_EXISTS("21", "已存在"),
21   - QUEUING("22", "排队中"),
22   - ;
23   -
24   - public static final List<String> SUCCESS_CODES = Lists.newArrayList(
25   - SUBMIT_SUCCESS.code,
26   - ALREADY_EXISTS.code,
27   - QUEUING.code
28   - );
29   -
30   - private final String code;
31   - private final String name;
32   -
33   -}
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/client/enums/MidjourneyTaskActionEnum.java deleted
1   -package cn.iocoder.yudao.module.ai.client.enums;
2   -
3   -import lombok.Getter;
4   -
5   -/**
6   - * 来源于 midjourney-proxy
7   - */
8   -@Getter
9   -public enum MidjourneyTaskActionEnum {
10   - /**
11   - * 生成图片.
12   - */
13   - IMAGINE,
14   - /**
15   - * 选中放大.
16   - */
17   - UPSCALE,
18   - /**
19   - * 选中其中的一张图,生成四张相似的.
20   - */
21   - VARIATION,
22   - /**
23   - * 重新执行.
24   - */
25   - REROLL,
26   - /**
27   - * 图转prompt.
28   - */
29   - DESCRIBE,
30   - /**
31   - * 多图混合.
32   - */
33   - BLEND
34   -
35   -}
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/client/enums/MidjourneyTaskStatusEnum.java deleted
1   -package cn.iocoder.yudao.module.ai.client.enums;
2   -
3   -
4   -import lombok.Getter;
5   -
6   -/**
7   - * 来源于 midjourney-proxy
8   - */
9   -public enum MidjourneyTaskStatusEnum {
10   - /**
11   - * 未启动.
12   - */
13   - NOT_START(0),
14   - /**
15   - * 已提交.
16   - */
17   - SUBMITTED(1),
18   - /**
19   - * 执行中.
20   - */
21   - IN_PROGRESS(3),
22   - /**
23   - * 失败.
24   - */
25   - FAILURE(4),
26   - /**
27   - * 成功.
28   - */
29   - SUCCESS(4);
30   -
31   - @Getter
32   - private final int order;
33   -
34   - MidjourneyTaskStatusEnum(int order) {
35   - this.order = order;
36   - }
37   -
38   -}
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/image/AiImageController.java
... ... @@ -5,7 +5,7 @@ import cn.iocoder.yudao.framework.common.pojo.CommonResult;
5 5 import cn.iocoder.yudao.framework.common.pojo.PageParam;
6 6 import cn.iocoder.yudao.framework.common.pojo.PageResult;
7 7 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
8   -import cn.iocoder.yudao.module.ai.client.vo.MidjourneyNotifyReqVO;
  8 +import cn.iocoder.yudao.module.ai.controller.admin.image.vo.MidjourneyNotifyReqVO;
9 9 import cn.iocoder.yudao.module.ai.controller.admin.image.vo.AiImageDrawReqVO;
10 10 import cn.iocoder.yudao.module.ai.controller.admin.image.vo.AiImageMidjourneyImagineReqVO;
11 11 import cn.iocoder.yudao.module.ai.controller.admin.image.vo.AiImageRespVO;
... ...
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/image/vo/AiImageRespVO.java
1 1 package cn.iocoder.yudao.module.ai.controller.admin.image.vo;
2 2  
3   -import cn.iocoder.yudao.module.ai.client.vo.MidjourneyNotifyReqVO;
4 3 import io.swagger.v3.oas.annotations.media.Schema;
5 4 import lombok.Data;
6 5  
... ...
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/client/vo/MidjourneyActionReqVO.java renamed to yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/image/vo/MidjourneyActionReqVO.java
1   -package cn.iocoder.yudao.module.ai.client.vo;
  1 +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 5 import lombok.Data;
6 6  
7   -import java.util.List;
8   -
9 7 /**
10 8 * Midjourney:action 请求
11 9 *
... ...
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/client/vo/MidjourneyImagineReqVO.java renamed to yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/image/vo/MidjourneyImagineReqVO.java
1   -package cn.iocoder.yudao.module.ai.client.vo;
  1 +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;
... ...
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/client/vo/MidjourneyNotifyReqVO.java renamed to yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/image/vo/MidjourneyNotifyReqVO.java
1   -package cn.iocoder.yudao.module.ai.client.vo;
  1 +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 lombok.Data;
... ...
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/client/vo/MidjourneySubmitRespVO.java renamed to yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/image/vo/MidjourneySubmitRespVO.java
1   -package cn.iocoder.yudao.module.ai.client.vo;
  1 +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 lombok.Data;
... ...
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/image/AiImageDO.java
... ... @@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.ai.dal.dataobject.image;
2 2  
3 3 import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
4 4 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
5   -import cn.iocoder.yudao.module.ai.client.vo.MidjourneyNotifyReqVO;
  5 +import cn.iocoder.yudao.module.ai.controller.admin.image.vo.MidjourneyNotifyReqVO;
6 6 import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatModelDO;
7 7 import cn.iocoder.yudao.module.ai.enums.image.AiImageStatusEnum;
8 8 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
... ...
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/job/MidjourneyJob.java
... ... @@ -2,9 +2,9 @@ package cn.iocoder.yudao.module.ai.job;
2 2  
3 3 import cn.hutool.core.collection.CollUtil;
4 4 import cn.iocoder.yudao.framework.ai.core.enums.AiPlatformEnum;
  5 +import cn.iocoder.yudao.framework.ai.core.model.midjourney.api.MidjourneyApi;
5 6 import cn.iocoder.yudao.framework.quartz.core.handler.JobHandler;
6   -import cn.iocoder.yudao.module.ai.client.MidjourneyProxyClient;
7   -import cn.iocoder.yudao.module.ai.client.vo.MidjourneyNotifyReqVO;
  7 +import cn.iocoder.yudao.module.ai.controller.admin.image.vo.MidjourneyNotifyReqVO;
8 8 import cn.iocoder.yudao.module.ai.dal.dataobject.image.AiImageDO;
9 9 import cn.iocoder.yudao.module.ai.dal.mysql.image.AiImageMapper;
10 10 import cn.iocoder.yudao.module.ai.enums.image.AiImageStatusEnum;
... ... @@ -32,7 +32,7 @@ public class MidjourneyJob implements JobHandler {
32 32  
33 33 // TODO @fan:@Resource
34 34 @Autowired
35   - private MidjourneyProxyClient midjourneyProxyClient;
  35 + private MidjourneyApi midjourneyApi;
36 36 @Autowired
37 37 private AiImageMapper imageMapper;
38 38 @Autowired
... ... @@ -57,10 +57,10 @@ public class MidjourneyJob implements JobHandler {
57 57 }
58 58 // 2、批量拉去 task 信息
59 59 // TODO @fan:imageList.stream().map(AiImageDO::getTaskId).collect(Collectors.toSet())),可以使用 CollectionUtils.convertSet 简化
60   - List<MidjourneyNotifyReqVO> taskList = midjourneyProxyClient
  60 + List<MidjourneyApi.NotifyRequest> taskList = midjourneyApi
61 61 .listByCondition(imageList.stream().map(AiImageDO::getTaskId).collect(Collectors.toSet()));
62 62 // TODO @fan:taskList.stream().collect(Collectors.toMap(MidjourneyNotifyReqVO::getId, o -> o)),也可以使用 CollectionUtils.convertMap;本质上,重用 set、map 转换,要 convert 简化
63   - Map<String, MidjourneyNotifyReqVO> taskIdMap = taskList.stream().collect(Collectors.toMap(MidjourneyNotifyReqVO::getId, o -> o));
  63 + Map<String, MidjourneyApi.NotifyRequest> taskIdMap = taskList.stream().collect(Collectors.toMap(MidjourneyApi.NotifyRequest::id, o -> o));
64 64 // 3、更新 image 状态
65 65 List<AiImageDO> updateImageList = new ArrayList<>();
66 66 for (AiImageDO aiImageDO : imageList) {
... ... @@ -71,10 +71,10 @@ public class MidjourneyJob implements JobHandler {
71 71 }
72 72 // TODO @ 3.1 和 3.2 是不是融合下;get,然后判空,continue;
73 73 // 3.2 获取通知对象
74   - MidjourneyNotifyReqVO notifyReqVO = taskIdMap.get(aiImageDO.getTaskId());
  74 +// MidjourneyNotifyReqVO notifyReqVO = taskIdMap.get(aiImageDO.getTaskId());
75 75 // 3.2 构建更新对象
76 76 // TODO @fan:建议 List<MidjourneyNotifyReqVO> 作为 imageService 去更新;
77   - updateImageList.add(imageService.buildUpdateImage(aiImageDO.getId(), notifyReqVO));
  77 +// updateImageList.add(imageService.buildUpdateImage(aiImageDO.getId(), notifyReqVO));
78 78 }
79 79 // 4、批了更新 updateImageList
80 80 imageMapper.updateBatch(updateImageList);
... ...
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/image/AiImageService.java
... ... @@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.ai.service.image;
2 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.PageParam;
4 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5   -import cn.iocoder.yudao.module.ai.client.vo.MidjourneyNotifyReqVO;
  5 +import cn.iocoder.yudao.module.ai.controller.admin.image.vo.MidjourneyNotifyReqVO;
6 6 import cn.iocoder.yudao.module.ai.controller.admin.image.vo.AiImageDrawReqVO;
7 7 import cn.iocoder.yudao.module.ai.controller.admin.image.vo.AiImageMidjourneyImagineReqVO;
8 8 import cn.iocoder.yudao.module.ai.dal.dataobject.image.AiImageDO;
... ...
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/image/AiImageServiceImpl.java
... ... @@ -9,19 +9,13 @@ import cn.hutool.core.util.StrUtil;
9 9 import cn.hutool.extra.spring.SpringUtil;
10 10 import cn.hutool.http.HttpUtil;
11 11 import cn.iocoder.yudao.framework.ai.core.enums.AiPlatformEnum;
  12 +import cn.iocoder.yudao.framework.ai.core.model.midjourney.api.MidjourneyApi;
12 13 import cn.iocoder.yudao.framework.common.pojo.PageParam;
13 14 import cn.iocoder.yudao.framework.common.pojo.PageResult;
14 15 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
15   -import cn.iocoder.yudao.module.ai.client.MidjourneyProxyClient;
16   -import cn.iocoder.yudao.module.ai.client.enums.MidjourneyModelEnum;
17   -import cn.iocoder.yudao.module.ai.client.enums.MidjourneySubmitCodeEnum;
18   -import cn.iocoder.yudao.module.ai.client.enums.MidjourneyTaskStatusEnum;
19   -import cn.iocoder.yudao.module.ai.client.vo.MidjourneyActionReqVO;
20   -import cn.iocoder.yudao.module.ai.client.vo.MidjourneyImagineReqVO;
21   -import cn.iocoder.yudao.module.ai.client.vo.MidjourneyNotifyReqVO;
22   -import cn.iocoder.yudao.module.ai.client.vo.MidjourneySubmitRespVO;
23 16 import cn.iocoder.yudao.module.ai.controller.admin.image.vo.AiImageDrawReqVO;
24 17 import cn.iocoder.yudao.module.ai.controller.admin.image.vo.AiImageMidjourneyImagineReqVO;
  18 +import cn.iocoder.yudao.module.ai.controller.admin.image.vo.MidjourneyNotifyReqVO;
25 19 import cn.iocoder.yudao.module.ai.dal.dataobject.image.AiImageDO;
26 20 import cn.iocoder.yudao.module.ai.dal.mysql.image.AiImageMapper;
27 21 import cn.iocoder.yudao.module.ai.enums.image.AiImageStatusEnum;
... ... @@ -57,16 +51,12 @@ public class AiImageServiceImpl implements AiImageService {
57 51  
58 52 @Resource
59 53 private AiImageMapper imageMapper;
60   -
61 54 @Resource
62 55 private FileApi fileApi;
63   -
64 56 @Resource
65 57 private AiApiKeyService apiKeyService;
66   -
67 58 @Autowired
68   - private MidjourneyProxyClient midjourneyProxyClient;
69   -
  59 + private MidjourneyApi midjourneyApi;
70 60 @Value("${ai.midjourney-proxy.notifyUrl:http://127.0.0.1:48080/admin-api/ai/image/midjourney-notify}")
71 61 private String midjourneyNotifyUrl;
72 62  
... ... @@ -148,22 +138,21 @@ public class AiImageServiceImpl implements AiImageService {
148 138 // 3、调用 MidjourneyProxy 提交任务
149 139  
150 140 // 3.1、设置 midjourney 扩展参数
151   - MidjourneyImagineReqVO imagineReqVO = BeanUtils.toBean(req, MidjourneyImagineReqVO.class);
152   - imagineReqVO.setNotifyHook(midjourneyNotifyUrl);
153   - imagineReqVO.setState(buildParams(req.getWidth(),
154   - req.getHeight(), req.getVersion(), MidjourneyModelEnum.valueOfModel(req.getModel())));
  141 + MidjourneyApi.ImagineRequest imagineRequest = new MidjourneyApi.ImagineRequest(null, midjourneyNotifyUrl, req.getPrompt(),
  142 + buildParams(req.getWidth(), req.getHeight(), req.getVersion(),
  143 + MidjourneyApi.ModelEnum.valueOfModel(req.getModel())));
155 144 // 3.2、提交绘画请求
156 145 // TODO @fan:5 这里,失败的情况,到底抛出异常,还是 RespVO,可以参考 OpenAI 的 API 封装
157   - MidjourneySubmitRespVO submitRespVO = midjourneyProxyClient.imagine(imagineReqVO);
  146 + MidjourneyApi.SubmitResponse submitResponse = midjourneyApi.imagine(imagineRequest);
158 147  
159 148 // 4、保存任务 id (状态码: 1(提交成功), 21(已存在), 22(排队中), other(错误))
160   - if (!MidjourneySubmitCodeEnum.SUCCESS_CODES.contains(submitRespVO.getCode())) {
161   - throw exception(AI_IMAGE_MIDJOURNEY_SUBMIT_FAIL, submitRespVO.getDescription());
  149 + if (!MidjourneyApi.SubmitCodeEnum.SUCCESS_CODES.contains(submitResponse.code())) {
  150 + throw exception(AI_IMAGE_MIDJOURNEY_SUBMIT_FAIL, submitResponse.description());
162 151 }
163 152 // 4.1、更新 taskId 和参数
164 153 imageMapper.updateById(new AiImageDO()
165 154 .setId(image.getId())
166   - .setTaskId(submitRespVO.getResult())
  155 + .setTaskId(submitResponse.result())
167 156 .setOptions(BeanUtil.beanToMap(req))
168 157 );
169 158 return image.getId();
... ... @@ -197,10 +186,10 @@ public class AiImageServiceImpl implements AiImageService {
197 186 public AiImageDO buildUpdateImage(Long imageId, MidjourneyNotifyReqVO notifyReqVO) {
198 187 // 1、转换状态
199 188 String imageStatus = null;
200   - MidjourneyTaskStatusEnum taskStatusEnum = MidjourneyTaskStatusEnum.valueOf(notifyReqVO.getStatus());
201   - if (MidjourneyTaskStatusEnum.SUCCESS == taskStatusEnum) {
  189 + MidjourneyApi.TaskStatusEnum taskStatusEnum = MidjourneyApi.TaskStatusEnum.valueOf(notifyReqVO.getStatus());
  190 + if (MidjourneyApi.TaskStatusEnum.SUCCESS == taskStatusEnum) {
202 191 imageStatus = AiImageStatusEnum.SUCCESS.getStatus();
203   - } else if (MidjourneyTaskStatusEnum.FAILURE == taskStatusEnum) {
  192 + } else if (MidjourneyApi.TaskStatusEnum.FAILURE == taskStatusEnum) {
204 193 imageStatus = AiImageStatusEnum.FAIL.getStatus();
205 194 }
206 195  
... ... @@ -233,15 +222,11 @@ public class AiImageServiceImpl implements AiImageService {
233 222 validateCustomId(customId, image.getButtons());
234 223  
235 224 // 3、调用 midjourney proxy
236   - MidjourneySubmitRespVO submitRespVO = midjourneyProxyClient.action(
237   - new MidjourneyActionReqVO()
238   - .setCustomId(customId)
239   - .setTaskId(image.getTaskId())
240   - .setNotifyHook(midjourneyNotifyUrl)
241   - );
  225 + MidjourneyApi.SubmitResponse submitResponse = midjourneyApi.action(
  226 + new MidjourneyApi.ActionRequest(customId, image.getTaskId(), midjourneyNotifyUrl));
242 227 // 4、检查错误 code (状态码: 1(提交成功), 21(已存在), 22(排队中), other(错误))
243   - if (!MidjourneySubmitCodeEnum.SUCCESS_CODES.contains(submitRespVO.getCode())) {
244   - throw exception(AI_IMAGE_MIDJOURNEY_SUBMIT_FAIL, submitRespVO.getDescription());
  228 + if (!MidjourneyApi.SubmitCodeEnum.SUCCESS_CODES.contains(submitResponse.code())) {
  229 + throw exception(AI_IMAGE_MIDJOURNEY_SUBMIT_FAIL, submitResponse.description());
245 230 }
246 231  
247 232 // 5、新增 image 记录(根据 image 新增一个)
... ... @@ -263,7 +248,7 @@ public class AiImageServiceImpl implements AiImageService {
263 248 newImage.setButtons(null);
264 249 newImage.setOptions(image.getOptions());
265 250 newImage.setResponse(image.getResponse());
266   - newImage.setTaskId(submitRespVO.getResult());
  251 + newImage.setTaskId(submitResponse.result());
267 252 newImage.setErrorMessage(null);
268 253 imageMapper.insert(newImage);
269 254 }
... ... @@ -309,14 +294,14 @@ public class AiImageServiceImpl implements AiImageService {
309 294 * @param model
310 295 * @return
311 296 */
312   - private String buildParams(Integer width, Integer height, String version, MidjourneyModelEnum model) {
  297 + private String buildParams(Integer width, Integer height, String version, MidjourneyApi.ModelEnum model) {
313 298 StringBuilder params = new StringBuilder();
314 299 // --ar 来设置尺寸
315 300 params.append(String.format(" --ar %s:%s ", width, height));
316 301 // --v 版本
317 302 params.append(String.format(" --v %s ", version));
318 303 // --niji 模型
319   - if (MidjourneyModelEnum.NIJI == model) {
  304 + if (MidjourneyApi.ModelEnum.NIJI == model) {
320 305 params.append(" --niji ");
321 306 }
322 307 return params.toString();
... ...