Browse Source

重构Comfyui服务

tsurumure 1 tháng trước cách đây
mục cha
commit
df2e2dcf02
21 tập tin đã thay đổi với 203 bổ sung211 xóa
  1. 8 21
      db/comfyui_task.sql
  2. 2 2
      db/crt_generate_image.sql
  3. 1 1
      db/sys_user_info.sql
  4. 0 24
      src/main/java/com/backendsys/modules/crt/entity/CrtDramaTask.java
  5. 35 37
      src/main/java/com/backendsys/modules/crt/service/impl/CrtGenerateServiceImpl.java
  6. 5 16
      src/main/java/com/backendsys/modules/sdk/comfyui/controller/ComfyuiDemoController.java
  7. 9 0
      src/main/java/com/backendsys/modules/sdk/comfyui/dao/ComfyuiTaskDao.java
  8. 1 1
      src/main/java/com/backendsys/modules/sdk/comfyui/entity/ComfyuiQueue.java
  9. 1 1
      src/main/java/com/backendsys/modules/sdk/comfyui/entity/ComfyuiRequest.java
  10. 1 1
      src/main/java/com/backendsys/modules/sdk/comfyui/entity/ComfyuiResponse.java
  11. 23 0
      src/main/java/com/backendsys/modules/sdk/comfyui/entity/ComfyuiTask.java
  12. 1 1
      src/main/java/com/backendsys/modules/sdk/comfyui/entity/ComfyuiText2Image.java
  13. 2 2
      src/main/java/com/backendsys/modules/sdk/comfyui/enums/TaskStatusEnums.java
  14. 0 17
      src/main/java/com/backendsys/modules/sdk/comfyui/service/ComfyUIService.java
  15. 16 0
      src/main/java/com/backendsys/modules/sdk/comfyui/service/ComfyuiService.java
  16. 3 3
      src/main/java/com/backendsys/modules/sdk/comfyui/service/ComfyuiSocketService.java
  17. 14 0
      src/main/java/com/backendsys/modules/sdk/comfyui/service/ComfyuiText2ImageService.java
  18. 0 15
      src/main/java/com/backendsys/modules/sdk/comfyui/service/Text2ImageService.java
  19. 11 11
      src/main/java/com/backendsys/modules/sdk/comfyui/service/impl/ComfyuiServiceImpl.java
  20. 38 29
      src/main/java/com/backendsys/modules/sdk/comfyui/service/impl/ComfyuiSocketServiceImpl.java
  21. 32 29
      src/main/java/com/backendsys/modules/sdk/comfyui/service/impl/ComfyuiText2ImageServiceImpl.java

+ 8 - 21
db/crt_drama_task.sql → db/comfyui_task.sql

@@ -4,36 +4,23 @@ Source Database: backendsys
 Date: 2025/06/03 10:09:22
 */
 
-DROP TABLE IF EXISTS `crt_drama_task`;
-CREATE TABLE `crt_drama_task` (
+DROP TABLE IF EXISTS `comfyui_task`;
+CREATE TABLE `comfyui_task` (
     PRIMARY KEY (`id`),
     `id` BIGINT AUTO_INCREMENT COMMENT 'ID',
     `user_id` BIGINT NOT NULL COMMENT '用户ID',
-    `drama_project_id` BIGINT NOT NULL COMMENT '项目ID',
-    `task_id` VARCHAR(255) NOT NULL COMMENT '任务ID',
-    `task_type` TINYINT NOT NULL COMMENT '任务类型 (1:图像, 2:视频)',
-    `task_status` TINYINT DEFAULT '-1' COMMENT '任务状态 (-1:未开始, 1:进行中, 2:成功, 3:失败)',
-    `task_status_msg` VARCHAR(500) COMMENT '任务状态信息,当任务失败时展示失败原因(如触发平台的内容风控等)',
-    `task_result` TEXT COMMENT '任务生成结果 (JSONString)(成功时,返回生成结果)',
+    `prompt_id` VARCHAR(255) NOT NULL COMMENT '任务ID',
+    `status` TINYINT DEFAULT '-1' COMMENT '任务状态 (-1:未开始, 1:进行中, 2:成功, 3:失败)',
+    `msg` VARCHAR(2000) COMMENT '任务状态信息,当任务失败时展示失败原因(如触发平台的内容风控等)',
+    `generate_request` TEXT COMMENT '任务请求原始参数 (JSONString)',
+    `generate_response` TEXT COMMENT '任务生成原始结果 (JSONString)',
     `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
     `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
     INDEX `idx_user_id` (`user_id`),
-    INDEX `idx_drama_project_id` (`drama_project_id`),
-    INDEX `idx_task_id` (`task_id`)
+    INDEX `idx_tprompt_id` (`prompt_id`)
 ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='短剧创作-生图任务表';
 
 /*
-    目前打算生图使用ComfyUI,生视频使用可灵。
-
-    可灵并发:5
-    ComfyUI并发:15
- */
-
-/*
-    [Comfyui] 生图结果
-    task_result:{
-
-    }
     [可灵] 生视频结果
     task_result:{
         "videos":[

+ 2 - 2
db/crt_generate_image.sql

@@ -11,11 +11,11 @@ CREATE TABLE `crt_generate_image` (
     `user_id` BIGINT COMMENT '用户ID',
     `drama_project_storyboard_id` BIGINT COMMENT '分镜ID',
     `prompt_id` VARCHAR(255) COMMENT '任务ID',
-    `prompt_json` TEXT COMMENT '任务原始JSON',
     `url_origin` VARCHAR(2000) NOT NULL COMMENT '原图',
     `url` VARCHAR(2000) COMMENT '转存图',
     `target` INT COMMENT '上传目标 (-1:本地, 1:腾讯云, 2:阿里云, 3.抖音云)',
     `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
     `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
-    INDEX `idx_user_id` (`user_id`)
+    INDEX `idx_user_id` (`user_id`),
+    INDEX `idx_prompt_id` (`prompt_id`)
 ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='短剧创作-生成图片记录表';

+ 1 - 1
db/sys_user_info.sql

@@ -52,7 +52,7 @@ CREATE TABLE `sys_user_info` (
 
 
 INSERT INTO sys_user_info(user_id, nickname, email, gender, is_super, audit_status, audit_note, status, avatar, invite_code, create_time) VALUES
-    (1, '超人', 'admin@qq.com', '1', '-1', '2', '同意通过备注', '1', null, '12c9dd17-b7f4-4483-a513-fbcc36512d8d', '2023-07-19 10:45:00'),
+    (1, '超人-local', 'admin@qq.com', '1', '-1', '2', '同意通过备注', '1', null, '12c9dd17-b7f4-4483-a513-fbcc36512d8d', '2023-07-19 10:45:00'),
     (2, '普通用户A', '1111@qq.com', '1', '-1', '2', '同意通过备注', '1', null, '12c9dd17-b7f4-4483-a513-fbcc36512d8d', '2023-07-19 10:45:01'),
     (3, '内容运营', '2222@qq.com', '2', '1', '2', '同意通过备注', '1', null, '12c9dd17-b7f4-4483-a513-fbcc36512d8d', '2023-07-19 10:45:02'),
     (4, 'aaa', 'aaa@qq.com', '2', '-1', '1', '', '1', null, '12c9dd17-b7f4-4483-a513-fbcc36512d8d', '2023-07-19 10:45:03'),

+ 0 - 24
src/main/java/com/backendsys/modules/crt/entity/CrtDramaTask.java

@@ -1,24 +0,0 @@
-package com.backendsys.modules.crt.entity;
-
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
-import lombok.Data;
-
-@Data
-@TableName("crt_drama_task")
-public class CrtDramaTask {
-
-    @TableId(type = IdType.AUTO)
-    private Long id;
-    private Long user_id;                       // 用户ID
-    private Long drama_project_id;              // 项目ID
-    private String task_id;                     // 任务ID
-    private Integer task_type;                  // 任务类型 (1:图像, 2:视频)
-    private Integer task_status;                // 任务状态 (-1:未开始, 1:进行中, 2:成功, 3:失败)
-    private String task_status_msg;             // 任务状态信息,当任务失败时展示失败原因(如触发平台的内容风控等)
-    private String task_result;                 // 任务生成结果 (JSONString)(成功时,返回生成结果)
-    private String create_time;
-    private String update_time;
-
-}

+ 35 - 37
src/main/java/com/backendsys/modules/crt/service/impl/CrtGenerateServiceImpl.java

@@ -2,8 +2,6 @@ package com.backendsys.modules.crt.service.impl;
 
 import cn.hutool.core.convert.Convert;
 import cn.hutool.core.date.DateUtil;
-import cn.hutool.json.JSONObject;
-import cn.hutool.json.JSONUtil;
 import com.backendsys.exception.CustException;
 import com.backendsys.modules.crt.dao.CrtDramaProjectSettingsDao;
 import com.backendsys.modules.crt.dao.CrtDramaProjectStoryboardDao;
@@ -15,12 +13,12 @@ import com.backendsys.modules.crt.entity.CrtGenerateImage;
 import com.backendsys.modules.crt.entity.CrtModel;
 import com.backendsys.modules.crt.enums.SamplerEnums;
 import com.backendsys.modules.crt.service.CrtGenerateService;
-import com.backendsys.modules.sdk.comfyui.entity.CFPromptResponse;
-import com.backendsys.modules.sdk.comfyui.entity.CFQueue;
-import com.backendsys.modules.sdk.comfyui.entity.Text2Image;
-import com.backendsys.modules.sdk.comfyui.service.ComfyUIService;
-import com.backendsys.modules.sdk.comfyui.service.ComfyUISocketService;
-import com.backendsys.modules.sdk.comfyui.service.Text2ImageService;
+import com.backendsys.modules.sdk.comfyui.entity.ComfyuiResponse;
+import com.backendsys.modules.sdk.comfyui.entity.ComfyuiQueue;
+import com.backendsys.modules.sdk.comfyui.entity.ComfyuiText2Image;
+import com.backendsys.modules.sdk.comfyui.service.ComfyuiService;
+import com.backendsys.modules.sdk.comfyui.service.ComfyuiSocketService;
+import com.backendsys.modules.sdk.comfyui.service.ComfyuiText2ImageService;
 import com.backendsys.modules.upload.enums.StyleEnums;
 import com.backendsys.modules.upload.utils.UploadUtil;
 import com.backendsys.utils.response.PageEntity;
@@ -41,12 +39,12 @@ import java.util.stream.Collectors;
 public class CrtGenerateServiceImpl implements CrtGenerateService {
 
     @Autowired
-    private ComfyUIService comfyUIService;
+    private ComfyuiService comfyUIService;
     @Autowired
-    private ComfyUISocketService comfyUISocketService;
+    private ComfyuiSocketService comfyUISocketService;
 
     @Autowired
-    private Text2ImageService text2ImageService;
+    private ComfyuiText2ImageService comfyuiText2ImageService;
 
     @Autowired
     private CrtModelDao crtModelDao;
@@ -63,8 +61,8 @@ public class CrtGenerateServiceImpl implements CrtGenerateService {
     @Override
     public Map<String, Object> getQueue() {
         // [ComfyUI] 执行任务
-        Mono<CFQueue> cfQueueMono = comfyUIService.getQueue();
-        CFQueue response = cfQueueMono.block();
+        Mono<ComfyuiQueue> cfQueueMono = comfyUIService.getQueue();
+        ComfyuiQueue response = cfQueueMono.block();
         System.out.println("结果: " + response);
 
         Map<String, Object> resp = new LinkedHashMap<>();
@@ -83,23 +81,22 @@ public class CrtGenerateServiceImpl implements CrtGenerateService {
 
         CrtDramaProjectStoryboard storyboardDetail = crtDramaProjectStoryboardDao.selectById(drama_project_storyboard_id);
         if (storyboardDetail == null) throw new CustException("分镜不存在");
-        System.out.println("- 分镜详情: " + JSONUtil.toJsonStr(storyboardDetail));
+        // System.out.println("- 分镜详情: " + JSONUtil.toJsonStr(storyboardDetail));
 
         Long drama_project_id = storyboardDetail.getDrama_project_id();
         LambdaQueryWrapper<CrtDramaProjectSettings> wrapperSettings = new LambdaQueryWrapper<>();
         wrapperSettings.eq(CrtDramaProjectSettings::getDrama_project_id, drama_project_id);
         List<CrtDramaProjectSettings> settingsDetail = crtDramaProjectSettingsDao.selectList(wrapperSettings);
         if (settingsDetail == null) throw new CustException("项目配置不存在");
-        System.out.println("- 项目配置: " + JSONUtil.toJsonStr(settingsDetail));
+        // System.out.println("- 项目配置: " + JSONUtil.toJsonStr(settingsDetail));
 
         // 项目配置类型 (1:生图配置, 2:生视频配置)
         CrtDramaProjectSettings settings_image = settingsDetail.stream().filter(item -> item.getDrama_project_setting_type() == 1).findFirst().orElse(null);
         CrtDramaProjectSettings settings_video = settingsDetail.stream().filter(item -> item.getDrama_project_setting_type() == 2).findFirst().orElse(null);
-        System.out.println("- 生图配置: " + JSONUtil.toJsonStr(settings_image));
-        System.out.println("- 生视频配置: " + JSONUtil.toJsonStr(settings_video));
+        // System.out.println("- 生图配置: " + JSONUtil.toJsonStr(settings_image));
+        // System.out.println("- 生视频配置: " + JSONUtil.toJsonStr(settings_video));
+
 
-        // 用于更新的参数实体类
-        CrtDramaProjectStoryboard entity = new CrtDramaProjectStoryboard();
 
 
 
@@ -119,10 +116,12 @@ public class CrtGenerateServiceImpl implements CrtGenerateService {
                 Convert.toStr(DateUtil.current()) :
                 storyboardDetail.getParam_seed();
 
+        // [分集详情] 实体类
+        CrtDramaProjectStoryboard entity = new CrtDramaProjectStoryboard();
         entity.setParam_seed(param_seed);
         entity.setText_to_image_prompt(prompt_text);
 
-        // [db] 更新分集记录 (种子值、提示词)
+        // [db] 更新分集详情记录 (种子值、提示词)
         LambdaQueryWrapper<CrtDramaProjectStoryboard> wrapper = new LambdaQueryWrapper<>();
         wrapper.eq(CrtDramaProjectStoryboard::getId, drama_project_storyboard_id);
         crtDramaProjectStoryboardDao.update(entity, wrapper);
@@ -135,8 +134,8 @@ public class CrtGenerateServiceImpl implements CrtGenerateService {
         CrtModel modelDetail = crtModelDao.selectById(model_id);
         String model_name = modelDetail.getModel_name();
 
-        // 风格 Lora
-        // 风格 Lora (阙值)
+        // 风格 Lora 待定
+        // 风格 Lora (阙值)待定
 
         // ===========================================================================================================
 
@@ -145,26 +144,25 @@ public class CrtGenerateServiceImpl implements CrtGenerateService {
         // -- [ComfyUI] 创建 WebSocket 监听连接 --------------------------
         Map<String, Object> params = new LinkedHashMap<>();
         params.put("drama_project_storyboard_id", drama_project_storyboard_id);
-        comfyUISocketService.connectToSse(client_id, 8000, params).subscribe();
+        // - is_save: 是否转存到 cos/tos
+        comfyUISocketService.connectToSse(client_id, 8000, false, params).subscribe();
 
         // -- [ComfyUI] 生图参数 ----------------------------------------
-        Text2Image text2Image = new Text2Image();
-        text2Image.setBatch_size(param_batch_size);
-        text2Image.setPrompt_flux_guidance(param_prompt_flux_guidance);
-        text2Image.setSampler(param_sampler);
-        text2Image.setStep(param_step);
-//        text2Image.setWidth(width);
-        text2Image.setWidth(400);
-//        text2Image.setHeight(height);
-        text2Image.setHeight(200);
-        text2Image.setModel_name(model_name);
-        text2Image.setPrompt_text(prompt_text);
-        text2Image.setSeed(param_seed);
+        ComfyuiText2Image comfyuiText2Image = new ComfyuiText2Image();
+        comfyuiText2Image.setBatch_size(param_batch_size);
+        comfyuiText2Image.setPrompt_flux_guidance(param_prompt_flux_guidance);
+        comfyuiText2Image.setSampler(param_sampler);
+        comfyuiText2Image.setStep(param_step);
+        comfyuiText2Image.setWidth(width);
+        comfyuiText2Image.setHeight(height);
+        comfyuiText2Image.setModel_name(model_name);
+        comfyuiText2Image.setPrompt_text(prompt_text);
+        comfyuiText2Image.setSeed(param_seed);
 
         // -- [ComfyUI] 生图 --------------------------------------------
-        CFPromptResponse response = text2ImageService.generateText2Image(client_id, text2Image);
+        ComfyuiResponse response = comfyuiText2ImageService.generateText2Image(client_id, comfyuiText2Image);
         System.out.println("结果: " + response);
-        // 结果: CFPromptResponse(client_id=1a8a2d01-5500-437f-bb11-7a986130da48, prompt_id=c74501ed-6755-48f8-a440-aef3474b523c, number=47, node_errors={}, error=null)
+        // 结果: ComfyuiResponse(client_id=1a8a2d01-5500-437f-bb11-7a986130da48, prompt_id=c74501ed-6755-48f8-a440-aef3474b523c, number=47, node_errors={}, error=null)
 
         Map<String, Object> resp = new LinkedHashMap<>();
         resp.put("drama_project_storyboard_id", drama_project_storyboard_id);

+ 5 - 16
src/main/java/com/backendsys/modules/sdk/comfyui/controller/ComfyUIDemoController.java → src/main/java/com/backendsys/modules/sdk/comfyui/controller/ComfyuiDemoController.java

@@ -1,36 +1,25 @@
 package com.backendsys.modules.sdk.comfyui.controller;
 
-import com.backendsys.exception.CustException;
 import com.backendsys.modules.common.config.security.annotations.Anonymous;
-import com.backendsys.modules.common.config.security.utils.SecurityUtil;
-import com.backendsys.modules.sdk.comfyui.service.ComfyUIService;
-import com.backendsys.modules.sdk.comfyui.service.ComfyUISocketService;
+import com.backendsys.modules.sdk.comfyui.service.ComfyuiService;
+import com.backendsys.modules.sdk.comfyui.service.ComfyuiSocketService;
 import com.backendsys.modules.sdk.tencentcloud.cos.service.TencentCosService;
 import com.backendsys.modules.upload.entity.SysFileResult;
-import com.tencentcloudapi.tione.v20211111.models.ChatCompletionResponse;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RestController;
-import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
-import reactor.core.publisher.Flux;
-
-import java.io.IOException;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
 
 @RestController
-public class ComfyUIDemoController {
+public class ComfyuiDemoController {
 
     @Autowired
     private TencentCosService tencentCosService;
 
     @Autowired
-    private ComfyUIService comfyUIService;
+    private ComfyuiService comfyUIService;
     @Autowired
-    private ComfyUISocketService comfyUISocketService;
+    private ComfyuiSocketService comfyUISocketService;
 
     /**
      * [ComfyUI] 创建 WebSocket 监听连接

+ 9 - 0
src/main/java/com/backendsys/modules/sdk/comfyui/dao/ComfyuiTaskDao.java

@@ -0,0 +1,9 @@
+package com.backendsys.modules.sdk.comfyui.dao;
+
+import com.backendsys.modules.sdk.comfyui.entity.ComfyuiTask;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface ComfyuiTaskDao extends BaseMapper<ComfyuiTask> {
+}

+ 1 - 1
src/main/java/com/backendsys/modules/sdk/comfyui/entity/CFQueue.java → src/main/java/com/backendsys/modules/sdk/comfyui/entity/ComfyuiQueue.java

@@ -4,7 +4,7 @@ import cn.hutool.json.JSONArray;
 import lombok.Data;
 
 @Data
-public class CFQueue {
+public class ComfyuiQueue {
     private JSONArray queue_running;
     private JSONArray queue_pending;
 }

+ 1 - 1
src/main/java/com/backendsys/modules/sdk/comfyui/entity/CFPromptRequest.java → src/main/java/com/backendsys/modules/sdk/comfyui/entity/ComfyuiRequest.java

@@ -4,7 +4,7 @@ import cn.hutool.json.JSONObject;
 import lombok.Data;
 
 @Data
-public class CFPromptRequest {
+public class ComfyuiRequest {
 
     private String client_id;
     private JSONObject prompt;

+ 1 - 1
src/main/java/com/backendsys/modules/sdk/comfyui/entity/CFPromptResponse.java → src/main/java/com/backendsys/modules/sdk/comfyui/entity/ComfyuiResponse.java

@@ -3,7 +3,7 @@ package com.backendsys.modules.sdk.comfyui.entity;
 import lombok.Data;
 
 @Data
-public class CFPromptResponse {
+public class ComfyuiResponse {
     private String client_id;       // 任务ID
     private String prompt_id;       // 任务ID
     private Integer number;         // 当前任务序号,可用于后续获取需要等待任务数的计算

+ 23 - 0
src/main/java/com/backendsys/modules/sdk/comfyui/entity/ComfyuiTask.java

@@ -0,0 +1,23 @@
+package com.backendsys.modules.sdk.comfyui.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+@Data
+@TableName("comfyui_task")
+public class ComfyuiTask {
+
+    @TableId(type = IdType.AUTO)
+    private Long id;
+    private Long user_id;                 // 用户ID
+    private String prompt_id;             // 任务ID
+    private Integer status;               // 任务状态 (-1:未开始, 1:进行中, 2:成功, 3:失败)
+    private String msg;                   // 任务状态信息,当任务失败时展示失败原因(如触发平台的内容风控等)
+    private String generate_request;      // 任务请求原始参数 (JSONString)
+    private String generate_response;     // 任务生成原始结果 (JSONString)
+    private String create_time;
+    private String update_time;
+
+}

+ 1 - 1
src/main/java/com/backendsys/modules/sdk/comfyui/entity/Text2Image.java → src/main/java/com/backendsys/modules/sdk/comfyui/entity/ComfyuiText2Image.java

@@ -3,7 +3,7 @@ package com.backendsys.modules.sdk.comfyui.entity;
 import lombok.Data;
 
 @Data
-public class Text2Image {
+public class ComfyuiText2Image {
     private Integer batch_size;           // 生成图片数量
     private Float prompt_flux_guidance;   // 提示词引导系数
     private String sampler;               // 采样器

+ 2 - 2
src/main/java/com/backendsys/modules/sdk/comfyui/enums/TypeEnums.java → src/main/java/com/backendsys/modules/sdk/comfyui/enums/TaskStatusEnums.java

@@ -1,6 +1,6 @@
 package com.backendsys.modules.sdk.comfyui.enums;
 
-public enum TypeEnums {
+public enum TaskStatusEnums {
 
     STATUS("status", "队列状态"),
     EXECUTION_START("execution_start", "任务开始执行"),
@@ -11,7 +11,7 @@ public enum TypeEnums {
 
     private final String value;
     private final String label;
-    TypeEnums(String value, String label) {
+    TaskStatusEnums(String value, String label) {
         this.value = value;
         this.label = label;
     }

+ 0 - 17
src/main/java/com/backendsys/modules/sdk/comfyui/service/ComfyUIService.java

@@ -1,17 +0,0 @@
-package com.backendsys.modules.sdk.comfyui.service;
-
-import cn.hutool.json.JSONObject;
-import com.backendsys.modules.sdk.comfyui.entity.CFPromptResponse;
-import com.backendsys.modules.sdk.comfyui.entity.CFQueue;
-import com.backendsys.modules.sdk.comfyui.entity.Text2Image;
-import reactor.core.publisher.Mono;
-
-public interface ComfyUIService {
-
-    // [ComfyUI] 查询任务队列
-    Mono<CFQueue> getQueue();
-
-    // [ComfyUI] 执行任务 (通用)
-    Mono<CFPromptResponse> prompt(String client_id, JSONObject prompt);
-
-}

+ 16 - 0
src/main/java/com/backendsys/modules/sdk/comfyui/service/ComfyuiService.java

@@ -0,0 +1,16 @@
+package com.backendsys.modules.sdk.comfyui.service;
+
+import cn.hutool.json.JSONObject;
+import com.backendsys.modules.sdk.comfyui.entity.ComfyuiResponse;
+import com.backendsys.modules.sdk.comfyui.entity.ComfyuiQueue;
+import reactor.core.publisher.Mono;
+
+public interface ComfyuiService {
+
+    // [ComfyUI] 查询任务队列
+    Mono<ComfyuiQueue> getQueue();
+
+    // [ComfyUI] 执行任务 (通用)
+    Mono<ComfyuiResponse> prompt(String client_id, JSONObject prompt);
+
+}

+ 3 - 3
src/main/java/com/backendsys/modules/sdk/comfyui/service/ComfyUISocketService.java → src/main/java/com/backendsys/modules/sdk/comfyui/service/ComfyuiSocketService.java

@@ -2,17 +2,17 @@ package com.backendsys.modules.sdk.comfyui.service;
 
 import reactor.core.publisher.Mono;
 
-import java.util.List;
 import java.util.Map;
 
-public interface ComfyUISocketService {
+public interface ComfyuiSocketService {
 
     // [ComfyUI] 创建 WebSocket 监听连接
     Mono<Void> connect(String clientId, Integer port);
 
     // [ComfyUI] 创建 WebSocket 监听连接 (转发到 SSE)
     Mono<Void> connectToSse(String clientId, Integer port);
-    Mono<Void> connectToSse(String clientId, Integer port, Map<String, Object> params);
+    Mono<Void> connectToSse(String clientId, Integer port, Boolean is_save);
+    Mono<Void> connectToSse(String clientId, Integer port, Boolean is_save, Map<String, Object> params);
 
     // [ComfyUI] 断开 WebSocket 监听连接
     Mono<Void> disconnect(String clientId);

+ 14 - 0
src/main/java/com/backendsys/modules/sdk/comfyui/service/ComfyuiText2ImageService.java

@@ -0,0 +1,14 @@
+package com.backendsys.modules.sdk.comfyui.service;
+
+import com.backendsys.modules.sdk.comfyui.entity.ComfyuiResponse;
+import com.backendsys.modules.sdk.comfyui.entity.ComfyuiText2Image;
+
+public interface ComfyuiText2ImageService {
+
+    // [ComfyUI] 文生图 (7.4生图.json)
+    ComfyuiResponse generateText2Image(String client_id, ComfyuiText2Image comfyuiText2Image);
+
+    // [ComfyUI] 文生图 (基础生图)
+    ComfyuiResponse generateText2ImageSimple(String client_id, ComfyuiText2Image comfyuiText2Image);
+
+}

+ 0 - 15
src/main/java/com/backendsys/modules/sdk/comfyui/service/Text2ImageService.java

@@ -1,15 +0,0 @@
-package com.backendsys.modules.sdk.comfyui.service;
-
-import com.backendsys.modules.sdk.comfyui.entity.CFPromptResponse;
-import com.backendsys.modules.sdk.comfyui.entity.Text2Image;
-import reactor.core.publisher.Mono;
-
-public interface Text2ImageService {
-
-    // [ComfyUI] 文生图 (7.4生图.json)
-    CFPromptResponse generateText2Image(String client_id, Text2Image text2Image);
-
-    // [ComfyUI] 文生图 (基础生图)
-    CFPromptResponse generateText2ImageSimple(String client_id, Text2Image text2Image);
-
-}

+ 11 - 11
src/main/java/com/backendsys/modules/sdk/comfyui/service/impl/ComfyuiServiceImpl.java

@@ -2,10 +2,10 @@ package com.backendsys.modules.sdk.comfyui.service.impl;
 
 import cn.hutool.json.JSONObject;
 import com.backendsys.modules.common.Filter.WebClientFilter;
-import com.backendsys.modules.sdk.comfyui.entity.CFPromptRequest;
-import com.backendsys.modules.sdk.comfyui.entity.CFPromptResponse;
-import com.backendsys.modules.sdk.comfyui.entity.CFQueue;
-import com.backendsys.modules.sdk.comfyui.service.ComfyUIService;
+import com.backendsys.modules.sdk.comfyui.entity.ComfyuiRequest;
+import com.backendsys.modules.sdk.comfyui.entity.ComfyuiResponse;
+import com.backendsys.modules.sdk.comfyui.entity.ComfyuiQueue;
+import com.backendsys.modules.sdk.comfyui.service.ComfyuiService;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.MediaType;
@@ -16,7 +16,7 @@ import reactor.core.publisher.Mono;
 import java.util.function.Consumer;
 
 @Service
-public class ComfyuiServiceImpl implements ComfyUIService {
+public class ComfyuiServiceImpl implements ComfyuiService {
 
     @Value("${comfyui.host}")
     private String COMFYUI_HOST;
@@ -45,23 +45,23 @@ public class ComfyuiServiceImpl implements ComfyUIService {
     /**
      * [ComfyUI] 查询任务队列
      */
-    public Mono<CFQueue> getQueue() {
+    public Mono<ComfyuiQueue> getQueue() {
         String url = "http://" + COMFYUI_HOST + ":8000/queue";
         WebClient webClient = getWebClient();
         return webClient.get()
                 .uri(url)
                 .headers(getHttpHeaders())
                 .accept(MediaType.APPLICATION_JSON)
-                .exchangeToMono(response -> response.bodyToMono(CFQueue.class));
+                .exchangeToMono(response -> response.bodyToMono(ComfyuiQueue.class));
     }
 
     /**
      * [ComfyUI] 执行任务
      */
     @Override
-    public Mono<CFPromptResponse> prompt(String client_id, JSONObject prompt) {
+    public Mono<ComfyuiResponse> prompt(String client_id, JSONObject prompt) {
 
-        CFPromptRequest bodyValue = new CFPromptRequest();
+        ComfyuiRequest bodyValue = new ComfyuiRequest();
         bodyValue.setClient_id(client_id);
         bodyValue.setPrompt(prompt);
 
@@ -73,10 +73,10 @@ public class ComfyuiServiceImpl implements ComfyUIService {
                 .headers(getHttpHeaders())
                 .accept(MediaType.APPLICATION_JSON)
                 .bodyValue(bodyValue)
-                .exchangeToMono(response -> response.bodyToMono(CFPromptResponse.class))
+                .exchangeToMono(response -> response.bodyToMono(ComfyuiResponse.class))
                 .onErrorResume(e -> {
                     // 捕获所有异常(包括上面抛出的 RuntimeException)
-                    CFPromptResponse response = new CFPromptResponse();
+                    ComfyuiResponse response = new ComfyuiResponse();
                     response.setNode_errors(e.getMessage());
                     return Mono.just(response);
                 });

+ 38 - 29
src/main/java/com/backendsys/modules/sdk/comfyui/service/impl/ComfyuiSocketServiceImpl.java

@@ -7,8 +7,8 @@ import cn.hutool.json.JSONUtil;
 import com.backendsys.modules.common.config.security.utils.SecurityUtil;
 import com.backendsys.modules.crt.dao.CrtGenerateImageDao;
 import com.backendsys.modules.crt.entity.CrtGenerateImage;
-import com.backendsys.modules.sdk.comfyui.enums.TypeEnums;
-import com.backendsys.modules.sdk.comfyui.service.ComfyUISocketService;
+import com.backendsys.modules.sdk.comfyui.enums.TaskStatusEnums;
+import com.backendsys.modules.sdk.comfyui.service.ComfyuiSocketService;
 import com.backendsys.modules.sse.entity.SseResponse;
 import com.backendsys.modules.sse.entity.SseResponseEnum;
 import com.backendsys.modules.sse.utils.SseUtil;
@@ -34,7 +34,7 @@ import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ConcurrentHashMap;
 
 @Service
-public class ComfyuiSocketServiceImpl implements ComfyUISocketService {
+public class ComfyuiSocketServiceImpl implements ComfyuiSocketService {
 
     @Autowired
     private SseUtil sseUtil;
@@ -102,13 +102,21 @@ public class ComfyuiSocketServiceImpl implements ComfyUISocketService {
 
     /**
      * [ComfyUI] 创建 WebSocket 监听连接 (转发到 SSE)
+     * - client_id: -
+     * - port:      端口 (comfyui)
+     * - is_save:   是否转存到 (cos/tos)
+     * - params:    额外参数
      */
     @Override
     public Mono<Void> connectToSse(String client_id, Integer port) {
-        return connectToSse(client_id, port, null);
+        return connectToSse(client_id, port, false, null);
     }
     @Override
-    public Mono<Void> connectToSse(String client_id, Integer port, Map<String, Object> params) {
+    public Mono<Void> connectToSse(String client_id, Integer port, Boolean is_save) {
+        return connectToSse(client_id, port, is_save, null);
+    }
+    @Override
+    public Mono<Void> connectToSse(String client_id, Integer port, Boolean is_save, Map<String, Object> params) {
 
         // 由于 Websocket 获取不到上下文信息,所以 user_id 不能在 socket 周期获取
         Long user_id = SecurityUtil.getUserId();
@@ -124,7 +132,6 @@ public class ComfyuiSocketServiceImpl implements ComfyUISocketService {
                 // 保存会话
                 sessions.put(client_id, session);
                 // 接收消息
-
                 System.out.println("------ wsUrl: " + wsUrl + " ------");
                 System.out.println("------ connectToSse client_id: " + client_id + ", user_id: " + user_id + " ------");
 
@@ -135,30 +142,32 @@ public class ComfyuiSocketServiceImpl implements ComfyUISocketService {
 
                             JSONObject data = JSONUtil.parseObj(message);
 
-                            // == [任务执行完成] =======================================================
-                            // { "type": "executed", .. }
-                            String type = Convert.toStr(data.get("type"));
-                            if (TypeEnums.EXECUTED.getValue().equals(type)) {
-
-                                JSONObject dataChildren = JSONUtil.parseObj(data.get("data"));
-                                JSONObject output = JSONUtil.parseObj(dataChildren.get("output"));
-
-                                // -- [生成图片 -> 转存图片 -> 新增记录] ------------------------------------------------------
-                                // 由于图片地址不是公开的,需要加 Token 访问,因此不能公开返回原始图片地址,比如:
-                                // http://43.128.1.201:8000/api/view?filename=fenjing_1_00012_.png&token=$2b$12$.MR4qGaFetN1FPQzbfyIrehsyjnPJ12xAZhR/l7KZpLkUPQTCG4gy
-                                // 因此,直接在 ComfyUI 的物理目录上构建 nginx 静态资源访问目录
-                                Object imagesObj = output.get("images");
-                                if (imagesObj != null) {
-                                    String prompt_id = Convert.toStr(dataChildren.get("prompt_id"));
-                                    Long drama_project_storyboard_id = Convert.toLong(params.get("drama_project_storyboard_id"));
-                                    List<String> images_path = imagesToRecord(user_id, prompt_id, port, imagesObj, drama_project_storyboard_id);
-                                    output.put("images_path", images_path);
-                                    dataChildren.put("output", output);
-                                    data.put("data", dataChildren);
-                                }
+                            if (is_save) {
+                                // == [任务执行完成] =======================================================
+                                // { "type": "executed", .. }
+                                String type = Convert.toStr(data.get("type"));
+                                if (TaskStatusEnums.EXECUTED.getValue().equals(type)) {
+
+                                    JSONObject dataChildren = JSONUtil.parseObj(data.get("data"));
+                                    JSONObject output = JSONUtil.parseObj(dataChildren.get("output"));
+
+                                    // -- [生成图片 -> 转存图片 -> 新增记录] ------------------------------------------------------
+                                    // 由于图片地址不是公开的,需要加 Token 访问,因此不能公开返回原始图片地址,比如:
+                                    // http://43.128.1.201:8000/api/view?filename=fenjing_1_00012_.png&token=$2b$12$.MR4qGaFetN1FPQzbfyIrehsyjnPJ12xAZhR/l7KZpLkUPQTCG4gy
+                                    // 因此,直接在 ComfyUI 的物理目录上构建 nginx 静态资源访问目录
+                                    Object imagesObj = output.get("images");
+                                    if (imagesObj != null) {
+                                        String prompt_id = Convert.toStr(dataChildren.get("prompt_id"));
+                                        Long drama_project_storyboard_id = Convert.toLong(params.get("drama_project_storyboard_id"));
+                                        List<String> images_path = imagesToStoryboard(user_id, prompt_id, port, imagesObj, drama_project_storyboard_id);
+                                        output.put("images_path", images_path);
+                                        dataChildren.put("output", output);
+                                        data.put("data", dataChildren);
+                                    }
 
+                                }
+                                // ========================================================================
                             }
-                            // ========================================================================
 
                             sseUtil.send(user_id, new SseResponse(SseResponseEnum.COMFYUI, data).toJsonStr());
                         })
@@ -210,7 +219,7 @@ public class ComfyuiSocketServiceImpl implements ComfyUISocketService {
     }
 
     // 转存图片
-    private List<String> imagesToRecord(Long user_id, String prompt_id, Integer port, Object imagesObj, Long drama_project_storyboard_id) {
+    private List<String> imagesToStoryboard(Long user_id, String prompt_id, Integer port, Object imagesObj, Long drama_project_storyboard_id) {
         JSONArray images = JSONUtil.parseArray(imagesObj);
         List<String> images_path = new ArrayList<>();
         if (images.size() > 0) {

+ 32 - 29
src/main/java/com/backendsys/modules/sdk/comfyui/service/impl/Text2ImageServiceImpl.java → src/main/java/com/backendsys/modules/sdk/comfyui/service/impl/ComfyuiText2ImageServiceImpl.java

@@ -2,25 +2,28 @@ package com.backendsys.modules.sdk.comfyui.service.impl;
 
 import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
-import com.backendsys.modules.sdk.comfyui.entity.CFPromptResponse;
-import com.backendsys.modules.sdk.comfyui.entity.Text2Image;
-import com.backendsys.modules.sdk.comfyui.service.ComfyUIService;
-import com.backendsys.modules.sdk.comfyui.service.Text2ImageService;
+import com.backendsys.modules.sdk.comfyui.dao.ComfyuiTaskDao;
+import com.backendsys.modules.sdk.comfyui.entity.ComfyuiResponse;
+import com.backendsys.modules.sdk.comfyui.entity.ComfyuiText2Image;
+import com.backendsys.modules.sdk.comfyui.service.ComfyuiService;
+import com.backendsys.modules.sdk.comfyui.service.ComfyuiText2ImageService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import reactor.core.publisher.Mono;
 
 @Service
-public class Text2ImageServiceImpl implements Text2ImageService {
+public class ComfyuiText2ImageServiceImpl implements ComfyuiText2ImageService {
 
     @Autowired
-    private ComfyUIService comfyUIService;
+    private ComfyuiService comfyUIService;
+    @Autowired
+    private ComfyuiTaskDao comfyuiTaskDao;
 
     /**
      * [ComfyUI] 文生图 (7.4生图.json)
      */
     @Override
-    public CFPromptResponse generateText2Image(String client_id, Text2Image text2Image) {
+    public ComfyuiResponse generateText2Image(String client_id, ComfyuiText2Image comfyuiText2Image) {
 
         String prompt = "{"+
                 "  \"3\": {"+
@@ -47,7 +50,7 @@ public class Text2ImageServiceImpl implements Text2ImageService {
                 "  },"+
                 "  \"13\": {"+
                 "    \"inputs\": {"+
-                "      \"guidance\": " + text2Image.getPrompt_flux_guidance() + ","+
+                "      \"guidance\": " + comfyuiText2Image.getPrompt_flux_guidance() + ","+
                 "      \"conditioning\": ["+
                 "        \"3\","+
                 "        0"+
@@ -120,7 +123,7 @@ public class Text2ImageServiceImpl implements Text2ImageService {
                 "  },"+
                 "  \"37\": {"+
                 "    \"inputs\": {"+
-                "      \"noise_seed\": " + text2Image.getSeed() +
+                "      \"noise_seed\": " + comfyuiText2Image.getSeed() +
                 "    },"+
                 "    \"class_type\": \"RandomNoise\","+
                 "    \"_meta\": {"+
@@ -159,7 +162,7 @@ public class Text2ImageServiceImpl implements Text2ImageService {
                 "  },"+
                 "  \"84\": {"+
                 "    \"inputs\": {"+
-                "      \"sampler_name\": \"" + text2Image.getSampler() + "\""+
+                "      \"sampler_name\": \"" + comfyuiText2Image.getSampler() + "\""+
                 "    },"+
                 "    \"class_type\": \"KSamplerSelect\","+
                 "    \"_meta\": {"+
@@ -176,7 +179,7 @@ public class Text2ImageServiceImpl implements Text2ImageService {
                 "        \"122\","+
                 "        0"+
                 "      ],"+
-                "      \"batch_size\": " + text2Image.getBatch_size() +
+                "      \"batch_size\": " + comfyuiText2Image.getBatch_size() +
                 "    },"+
                 "    \"class_type\": \"EmptySD3LatentImage\","+
                 "    \"_meta\": {"+
@@ -214,7 +217,7 @@ public class Text2ImageServiceImpl implements Text2ImageService {
                 "  },"+
                 "  \"121\": {"+
                 "    \"inputs\": {"+
-                "      \"value\": " + text2Image.getWidth() +
+                "      \"value\": " + comfyuiText2Image.getWidth() +
                 "    },"+
                 "    \"class_type\": \"easy int\","+
                 "    \"_meta\": {"+
@@ -223,7 +226,7 @@ public class Text2ImageServiceImpl implements Text2ImageService {
                 "  },"+
                 "  \"122\": {"+
                 "    \"inputs\": {"+
-                "      \"value\": " + text2Image.getHeight() +
+                "      \"value\": " + comfyuiText2Image.getHeight() +
                 "    },"+
                 "    \"class_type\": \"easy int\","+
                 "    \"_meta\": {"+
@@ -276,7 +279,7 @@ public class Text2ImageServiceImpl implements Text2ImageService {
                 "  \"150\": {"+
                 "    \"inputs\": {"+
                 "      \"scheduler\": \"normal\","+
-                "      \"steps\": " + text2Image.getStep() + ","+
+                "      \"steps\": " + comfyuiText2Image.getStep() + ","+
                 "      \"denoise\": 1,"+
                 "      \"model\": ["+
                 "        \"152\","+
@@ -290,7 +293,7 @@ public class Text2ImageServiceImpl implements Text2ImageService {
                 "  },"+
                 "  \"151\": {"+
                 "    \"inputs\": {"+
-                "      \"ckpt_name\": \"" + text2Image.getModel_name() + "\""+
+                "      \"ckpt_name\": \"" + comfyuiText2Image.getModel_name() + "\""+
                 "    },"+
                 "    \"class_type\": \"CheckpointLoaderSimple\","+
                 "    \"_meta\": {"+
@@ -313,7 +316,7 @@ public class Text2ImageServiceImpl implements Text2ImageService {
                 "  },"+
                 "  \"153\": {"+
                 "    \"inputs\": {"+
-                "      \"text\": \"" + text2Image.getPrompt_text() + "\","+
+                "      \"text\": \"" + comfyuiText2Image.getPrompt_text() + "\","+
                 "      \"speak_and_recognation\": {"+
                 "        \"__value__\": ["+
                 "          false,"+
@@ -331,8 +334,8 @@ public class Text2ImageServiceImpl implements Text2ImageService {
         JSONObject prompt_object = JSONUtil.parseObj(prompt);
 
         // [ComfyUI] 执行任务
-        Mono<CFPromptResponse> cfPromptResponseMono = comfyUIService.prompt(client_id, prompt_object);
-        CFPromptResponse response = cfPromptResponseMono.block();
+        Mono<ComfyuiResponse> cfPromptResponseMono = comfyUIService.prompt(client_id, prompt_object);
+        ComfyuiResponse response = cfPromptResponseMono.block();
         response.setClient_id(client_id);
         return response;
     }
@@ -342,19 +345,19 @@ public class Text2ImageServiceImpl implements Text2ImageService {
      * [ComfyUI] 文生图 (基础生图)
      */
     @Override
-    public CFPromptResponse generateText2ImageSimple(String client_id, Text2Image text2Image) {
+    public ComfyuiResponse generateText2ImageSimple(String client_id, ComfyuiText2Image comfyuiText2Image) {
 
         // [ComfyUI-基础生图]
         String prompt = "{" +
                     "\"3\": {" +
                         "\"inputs\": {" +
 //                            "\"seed\": 449753344472378," +
-                            "\"seed\": " + text2Image.getSeed() + "," +
+                            "\"seed\": " + comfyuiText2Image.getSeed() + "," +
 //                            "\"steps\": 20," +
-                            "\"steps\": " + text2Image.getStep() + "," +
+                            "\"steps\": " + comfyuiText2Image.getStep() + "," +
                             "\"cfg\": 8," +
 //                            "\"sampler_name\": \"euler\"," +
-                            "\"sampler_name\": \"" + text2Image.getSampler() + "\"," +
+                            "\"sampler_name\": \"" + comfyuiText2Image.getSampler() + "\"," +
                             "\"scheduler\": \"normal\", \"denoise\": 1," +
                             "\"model\": [\"4\", 0], \"positive\": [\"6\", 0]," +
                             "\"negative\": [\"7\", 0], \"latent_image\": [\"5\", 0]" +
@@ -364,7 +367,7 @@ public class Text2ImageServiceImpl implements Text2ImageService {
                     "\"4\": {" +
                         "\"inputs\": {" +
 //                            "\"ckpt_name\": \"v1-5-pruned-emaonly-fp16.safetensors\"" +
-                            "\"ckpt_name\": \"" + text2Image.getModel_name() + "\"" +
+                            "\"ckpt_name\": \"" + comfyuiText2Image.getModel_name() + "\"" +
                         "}," +
                         "\"class_type\": \"CheckpointLoaderSimple\"," +
                         "\"_meta\": { \"title\": \"Checkpoint加载器(简易)\" }" +
@@ -374,9 +377,9 @@ public class Text2ImageServiceImpl implements Text2ImageService {
 //                            "\"width\": 512," +
 //                            "\"height\": 512," +
 //                            "\"batch_size\": 1" +
-                            "\"width\": " + text2Image.getWidth() + "," +
-                            "\"height\": " + text2Image.getHeight() + "," +
-                            "\"batch_size\": " + text2Image.getBatch_size() +
+                            "\"width\": " + comfyuiText2Image.getWidth() + "," +
+                            "\"height\": " + comfyuiText2Image.getHeight() + "," +
+                            "\"batch_size\": " + comfyuiText2Image.getBatch_size() +
                         "}," +
                         "\"class_type\": \"EmptyLatentImage\"," +
                         "\"_meta\": { \"title\": \"空Latent图像\" }" +
@@ -384,7 +387,7 @@ public class Text2ImageServiceImpl implements Text2ImageService {
                     "\"6\": {" +
                         "\"inputs\": {" +
 //                            "\"text\": \"beautiful scenery nature glass bottle landscape, , purple galaxy bottle,\"," +
-                            "\"text\": \"" + text2Image.getPrompt_text() + "\"," +
+                            "\"text\": \"" + comfyuiText2Image.getPrompt_text() + "\"," +
                             "\"speak_and_recognation\": { \"__value__\": [false, true] }," +
                             "\"clip\": [\"4\", 1]" +
                         "}," +
@@ -415,8 +418,8 @@ public class Text2ImageServiceImpl implements Text2ImageService {
         JSONObject prompt_object = JSONUtil.parseObj(prompt);
 
         // [ComfyUI] 执行任务
-        Mono<CFPromptResponse> cfPromptResponseMono = comfyUIService.prompt(client_id, prompt_object);
-        CFPromptResponse response = cfPromptResponseMono.block();
+        Mono<ComfyuiResponse> cfPromptResponseMono = comfyUIService.prompt(client_id, prompt_object);
+        ComfyuiResponse response = cfPromptResponseMono.block();
         response.setClient_id(client_id);
         return response;
     }