PERF 修图节点改为生/修图节点

This commit is contained in:
kyj@bowong.ai 2025-07-21 18:42:38 +08:00
parent ed5ceae99c
commit d7c49f25c2
2 changed files with 31 additions and 16 deletions

View File

@ -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":"顺序合并视频"

View File

@ -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):