From d7c49f25c288073114d7f195ef827a85dcc65ea0 Mon Sep 17 00:00:00 2001 From: "kyj@bowong.ai" Date: Mon, 21 Jul 2025 18:42:38 +0800 Subject: [PATCH] =?UTF-8?q?PERF=20=E4=BF=AE=E5=9B=BE=E8=8A=82=E7=82=B9?= =?UTF-8?q?=E6=94=B9=E4=B8=BA=E7=94=9F/=E4=BF=AE=E5=9B=BE=E8=8A=82?= =?UTF-8?q?=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- __init__.py | 4 ++-- nodes/image_modal_nodes.py | 43 +++++++++++++++++++++++++------------- 2 files changed, 31 insertions(+), 16 deletions(-) diff --git a/__init__.py b/__init__.py index 08ddce7..8c65a6e 100644 --- a/__init__.py +++ b/__init__.py @@ -85,8 +85,8 @@ NODE_DISPLAY_NAME_MAPPINGS = { "Jinja2RenderTemplate": "Jinja2格式Prompt模板渲染", "JMGestureCorrect": "人物侧身图片转为正面图-即梦", "ModalClothesMask": "模特指定衣服替换为指定颜色", - "ModalEditCustom": "自定义Prompt修改图片", - "ModalMidJourneyGenerateImage": "Prompt修图", + "ModalEditCustom": "Prompt生/修图", + "ModalMidJourneyGenerateImage": "Prompt生/修图", "ModalMidJourneyDescribeImage": "反推生图提示词", "JMCustom": "Prompt生视频", "VideoMerge":"顺序合并视频" diff --git a/nodes/image_modal_nodes.py b/nodes/image_modal_nodes.py index 0d85528..4c08891 100644 --- a/nodes/image_modal_nodes.py +++ b/nodes/image_modal_nodes.py @@ -78,7 +78,7 @@ class ModalClothesMask: RETURN_NAMES = ("image",) FUNCTION = "process" OUTPUT_NODE = False - CATEGORY = "不忘科技-自定义节点🚩/图片/Gemini图像编辑" + CATEGORY = "不忘科技-自定义节点🚩/图片/Gemini" def process(self, image: torch.Tensor, mask_color: str, clothes_type: str, endpoint: str): try: @@ -133,21 +133,23 @@ class ModalEditCustom: def INPUT_TYPES(cls): return { "required": { - "image": ("IMAGE",), "prompt": ("STRING", {"default": "将背景去除,输出原尺寸图片", "multiline": True}), "temperature": ("FLOAT", {"default": 0.1, "min": 0, "max": 2}), "topP": ("FLOAT", {"default": 0.7, "min": 0, "max": 1}), "endpoint": ("STRING", {"default": "bowongai-dev--bowong-ai-video-gemini-fastapi-webapp.modal.run"}), }, + "optional": { + "image": ("IMAGE",), + } } RETURN_TYPES = ("IMAGE",) RETURN_NAMES = ("image",) FUNCTION = "process" OUTPUT_NODE = False - CATEGORY = "不忘科技-自定义节点🚩/图片/Gemini图像编辑" + CATEGORY = "不忘科技-自定义节点🚩/图片/Gemini" - def process(self, image: torch.Tensor, prompt: str, temperature: float, topP: float, endpoint: str): + def process(self, prompt: str, temperature: float, topP: float, endpoint: str, **kwargs): try: timeout = 60 logger.info("获取token") @@ -155,6 +157,13 @@ class ModalEditCustom: headers={'Authorization': 'Bearer bowong7777'}, timeout=timeout).json()[ "access_token"] format = "PNG" + if "image" in kwargs and kwargs["image"] is not None: + image = kwargs["image"] + files = {"origin_image": ( + 'image.' + format.lower(), tensor_to_image_bytes(image, format), + f'image/{format.lower()}')} + else: + files = None logger.info("请求图像编辑") job_resp = send_request("post", f"https://{endpoint}/google/image/edit_custom", headers={'x-google-api-key': api_key}, @@ -163,9 +172,7 @@ class ModalEditCustom: "temperature": temperature, "topP": topP }, - files={"origin_image": ( - 'image.' + format.lower(), tensor_to_image_bytes(image, format), - f'image/{format.lower()}')}, + files=files, timeout=timeout) job_resp.raise_for_status() job_resp = job_resp.json() @@ -202,10 +209,12 @@ class ModalMidJourneyGenerateImage: return { "required": { "prompt": ("STRING", {"default": "一幅宏大壮美的山川画卷", "multiline": True}), - "image": ("IMAGE",), "endpoint": ("STRING", {"default": "bowongai-dev--text-video-agent-fastapi-app.modal.run"}), "timeout": ("INT", {"default": 120, "min": 10, "max": 600}), }, + "optional": { + "image": ("IMAGE",), + } } RETURN_TYPES = ("IMAGE",) @@ -214,23 +223,28 @@ class ModalMidJourneyGenerateImage: OUTPUT_NODE = False CATEGORY = "不忘科技-自定义节点🚩/图片/Midjourney" - def process(self, prompt: str, image:torch.Tensor, endpoint: str, timeout: int): + def process(self, prompt: str, endpoint: str, timeout: int, **kwargs): try: logger.info("请求异步接口") interval = 2 format = "PNG" + if "image" in kwargs and kwargs["image"] is not None: + image = kwargs["image"] + files = {"img_file": ( + 'image.' + format.lower(), tensor_to_image_bytes(image, format), + f'image/{format.lower()}')} + else: + files = None job_resp = send_request("post", f"https://{endpoint}/api/mj/async/generate/image?prompt={prompt}", headers={'Authorization': 'Bearer bowong7777'}, - files={"img_file": ( - 'image.' + format.lower(), tensor_to_image_bytes(image, format), - f'image/{format.lower()}')}, + files=files, timeout=150) job_resp.raise_for_status() job_resp = job_resp.json() if "失败" in job_resp["msg"] or "fail" in job_resp["msg"] or "error" in job_resp["msg"]: raise Exception("生成失败") job_id = job_resp["data"] - for _ in range(0, timeout//interval, interval): + for _ in range(0, timeout // interval, interval): logger.info("查询结果") resp = send_request("get", f"https://{endpoint}/api/mj/async/query/status?task_id={job_id}", headers={'Authorization': 'Bearer bowong7777'}, timeout=30) @@ -242,7 +256,7 @@ class ModalMidJourneyGenerateImage: if isinstance(result_url, list): result_list = [] for url in result_url: - logger.success("img_url: "+url) + logger.success("img_url: " + url) result_list.append(url_to_tensor(url).squeeze(0)) result_list = torch.stack(result_list, dim=0) return (result_list,) @@ -253,6 +267,7 @@ class ModalMidJourneyGenerateImage: except Exception as e: raise e + class ModalMidJourneyDescribeImage: @classmethod def INPUT_TYPES(cls):