Commit 7467c241f360eaeeaddf340991ab747409c30a80

Authored by cherishsince
1 parent 844ae285

【增加】aiImage 增加 dall-e-2、dall-e-3

yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/AiImageController.java
@@ -34,6 +34,6 @@ public class AiImageController { @@ -34,6 +34,6 @@ public class AiImageController {
34 public SseEmitter dallDrawing(@Validated @ModelAttribute AiImageDallDrawingReq req) { 34 public SseEmitter dallDrawing(@Validated @ModelAttribute AiImageDallDrawingReq req) {
35 Utf8SseEmitter sseEmitter = new Utf8SseEmitter(); 35 Utf8SseEmitter sseEmitter = new Utf8SseEmitter();
36 aiImageService.dallDrawing(req, sseEmitter); 36 aiImageService.dallDrawing(req, sseEmitter);
37 - return null; 37 + return sseEmitter;
38 } 38 }
39 } 39 }
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/AiDrawingImageDO.java renamed to yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/AiImageDO.java
@@ -17,15 +17,24 @@ import lombok.experimental.Accessors; @@ -17,15 +17,24 @@ import lombok.experimental.Accessors;
17 */ 17 */
18 @Data 18 @Data
19 @Accessors(chain = true) 19 @Accessors(chain = true)
20 -@TableName("ai_drawing_image")  
21 -public class AiDrawingImageDO extends BaseDO { 20 +@TableName("ai_image")
  21 +public class AiImageDO extends BaseDO {
22 22
23 @TableId(type = IdType.AUTO) 23 @TableId(type = IdType.AUTO)
24 private Long id; 24 private Long id;
25 25
  26 + @Schema(description = "用户id")
  27 + private Long userId;
  28 +
26 @Schema(description = "提示词") 29 @Schema(description = "提示词")
27 private String prompt; 30 private String prompt;
28 31
  32 + @Schema(description = "模型")
  33 + private String modal;
  34 +
  35 + @Schema(description = "生成图像的尺寸大小。对于dall-e-2模型,尺寸可为256x256, 512x512, 或 1024x1024。对于dall-e-3模型,尺寸可为1024x1024, 1792x1024, 或 1024x1792。")
  36 + private String size;
  37 +
29 @Schema(description = "绘画状态:提交、排队、绘画中、绘画完成、绘画失败") 38 @Schema(description = "绘画状态:提交、排队、绘画中、绘画完成、绘画失败")
30 private String drawingStatus; 39 private String drawingStatus;
31 40
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/mapper/AiImageMapper.java 0 → 100644
  1 +package cn.iocoder.yudao.module.ai.mapper;
  2 +
  3 +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  4 +import cn.iocoder.yudao.module.ai.dal.dataobject.AiImageDO;
  5 +import org.apache.ibatis.annotations.Mapper;
  6 +import org.springframework.stereotype.Repository;
  7 +
  8 +/**
  9 + * ai image
  10 + *
  11 + * @author fansili
  12 + * @time 2024/4/28 14:01
  13 + * @since 1.0
  14 + */
  15 +@Repository
  16 +@Mapper
  17 +public interface AiImageMapper extends BaseMapperX<AiImageDO> {
  18 +
  19 +
  20 +}
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/AiImageServiceImpl.java
1 package cn.iocoder.yudao.module.ai.service.impl; 1 package cn.iocoder.yudao.module.ai.service.impl;
2 2
  3 +import cn.iocoder.yudao.framework.ai.image.Image;
  4 +import cn.iocoder.yudao.framework.ai.image.ImageGeneration;
  5 +import cn.iocoder.yudao.framework.ai.image.ImagePrompt;
  6 +import cn.iocoder.yudao.framework.ai.image.ImageResponse;
  7 +import cn.iocoder.yudao.framework.ai.imageopenai.OpenAiImageClient;
  8 +import cn.iocoder.yudao.framework.ai.imageopenai.OpenAiImageModelEnum;
  9 +import cn.iocoder.yudao.framework.ai.imageopenai.OpenAiImageOptions;
  10 +import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
3 import cn.iocoder.yudao.module.ai.controller.Utf8SseEmitter; 11 import cn.iocoder.yudao.module.ai.controller.Utf8SseEmitter;
  12 +import cn.iocoder.yudao.module.ai.dal.dataobject.AiImageDO;
  13 +import cn.iocoder.yudao.module.ai.mapper.AiImageMapper;
4 import cn.iocoder.yudao.module.ai.service.AiImageService; 14 import cn.iocoder.yudao.module.ai.service.AiImageService;
5 import cn.iocoder.yudao.module.ai.vo.AiImageDallDrawingReq; 15 import cn.iocoder.yudao.module.ai.vo.AiImageDallDrawingReq;
6 import lombok.AllArgsConstructor; 16 import lombok.AllArgsConstructor;
7 import lombok.extern.slf4j.Slf4j; 17 import lombok.extern.slf4j.Slf4j;
  18 +import org.springframework.http.MediaType;
8 import org.springframework.stereotype.Service; 19 import org.springframework.stereotype.Service;
9 20
  21 +import java.io.IOException;
  22 +
10 /** 23 /**
11 * ai 作图 24 * ai 作图
12 * 25 *
@@ -19,9 +32,39 @@ import org.springframework.stereotype.Service; @@ -19,9 +32,39 @@ import org.springframework.stereotype.Service;
19 @Slf4j 32 @Slf4j
20 public class AiImageServiceImpl implements AiImageService { 33 public class AiImageServiceImpl implements AiImageService {
21 34
  35 + private final AiImageMapper aiImageMapper;
  36 + private final OpenAiImageClient openAiImageClient;
22 37
23 @Override 38 @Override
24 public void dallDrawing(AiImageDallDrawingReq req, Utf8SseEmitter sseEmitter) { 39 public void dallDrawing(AiImageDallDrawingReq req, Utf8SseEmitter sseEmitter) {
25 - 40 + // 获取 model
  41 + OpenAiImageModelEnum openAiImageModelEnum = OpenAiImageModelEnum.valueOfModel(req.getModal());
  42 + //
  43 + OpenAiImageOptions openAiImageOptions = new OpenAiImageOptions();
  44 + openAiImageOptions.setModel(openAiImageModelEnum);
  45 + ImageResponse imageResponse = openAiImageClient.call(new ImagePrompt(req.getPrompt(), openAiImageOptions));
  46 + // 发送
  47 + ImageGeneration imageGeneration = imageResponse.getResult();
  48 + try {
  49 + sseEmitter.send(imageGeneration, MediaType.APPLICATION_JSON);
  50 + } catch (IOException e) {
  51 + throw new RuntimeException(e);
  52 + } finally {
  53 + // 发送 complete
  54 + sseEmitter.complete();
  55 + }
  56 + Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
  57 + //
  58 + // 保存数据库
  59 + Image output = imageGeneration.getOutput();
  60 + String imageUrl = output.getUrl();
  61 + AiImageDO aiImageDO = new AiImageDO();
  62 + aiImageDO.setId(null);
  63 + aiImageDO.setPrompt(req.getPrompt());
  64 + aiImageDO.setSize(req.getSize());
  65 + aiImageDO.setModal(req.getModal());
  66 + aiImageDO.setUserId(loginUserId);
  67 + aiImageDO.setDrawingImageUrl(imageUrl);
  68 + aiImageMapper.insert(aiImageDO);
26 } 69 }
27 } 70 }
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/AiImageDallDrawingReq.java
@@ -19,4 +19,13 @@ public class AiImageDallDrawingReq { @@ -19,4 +19,13 @@ public class AiImageDallDrawingReq {
19 @Schema(description = "提示词") 19 @Schema(description = "提示词")
20 @NotNull(message = "提示词不能为空!") 20 @NotNull(message = "提示词不能为空!")
21 private String prompt; 21 private String prompt;
  22 +
  23 + @Schema(description = "模型")
  24 + @NotNull(message = "模型不能为空")
  25 + private String modal;
  26 +
  27 + @Schema(description = "生成图像的尺寸大小。对于dall-e-2模型,尺寸可为256x256, 512x512, 或 1024x1024。对于dall-e-3模型,尺寸可为1024x1024, 1792x1024, 或 1024x1792。")
  28 + @NotNull(message = "size不能为空!")
  29 + private String size;
  30 +
22 } 31 }