Compare commits
No commits in common. "257e1c6c4008f6fdaf0df42363cc741eea64db23" and "f16b4474a03cacb28a4b0afdae3a449611f2584a" have entirely different histories.
257e1c6c40
...
f16b4474a0
|
|
@ -57,7 +57,7 @@ vol = modal.Volume.from_name("comfy_model", environment_name="dev", create_if_mi
|
||||||
)
|
)
|
||||||
@modal.web_server(8000, startup_timeout=120, label='image-video-agent-1')
|
@modal.web_server(8000, startup_timeout=120, label='image-video-agent-1')
|
||||||
def ui_1():
|
def ui_1():
|
||||||
process = subprocess.Popen("comfy launch -- --cpu --listen 0.0.0.0 --port 8001", shell=True)
|
process = subprocess.Popen("comfy launch -- --cpu --listen 0.0.0.0 --port 8000", shell=True)
|
||||||
process.wait()
|
process.wait()
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,7 @@ except ImportError:
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
|
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
|
||||||
logger = logging.getLogger("ImgSubmitNode")
|
logger = logging.getLogger("ImgSubmitNode_Final")
|
||||||
print("提示: loguru 未安装,使用内置logging。建议安装以获得更好的日志体验: pip install loguru")
|
print("提示: loguru 未安装,使用内置logging。建议安装以获得更好的日志体验: pip install loguru")
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -102,12 +102,6 @@ class ImgSubmitNode:
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def INPUT_TYPES(cls):
|
def INPUT_TYPES(cls):
|
||||||
# 从用户提供的截图中提取的尺寸选项
|
|
||||||
size_options = [
|
|
||||||
'2048x2048 (1:1)', '2394x1728 (4:3)', '1728x2394 (3:4)', '2560x1440 (16:9)',
|
|
||||||
'1440x2560 (9:16)', '2496x1664 (3:2)', '1664x2496 (2:3)', '3024x1296 (21:9)',
|
|
||||||
'1K', '2K', '4K'
|
|
||||||
]
|
|
||||||
return {
|
return {
|
||||||
"required": {
|
"required": {
|
||||||
"model_name_display": (cls.MODEL_DATA["full_display_list"],),
|
"model_name_display": (cls.MODEL_DATA["full_display_list"],),
|
||||||
|
|
@ -118,10 +112,6 @@ class ImgSubmitNode:
|
||||||
"optional": {
|
"optional": {
|
||||||
"image": ("IMAGE",),
|
"image": ("IMAGE",),
|
||||||
"image_filename": ("STRING", {"multiline": False, "default": ""}),
|
"image_filename": ("STRING", {"multiline": False, "default": ""}),
|
||||||
"image_urls": (
|
|
||||||
"STRING", {"multiline": True, "default": "", "placeholder": "单个或多个图片URL,用英文逗号隔开..."}),
|
|
||||||
"num_images": ("INT", {"default": 1, "min": 1, "max": 9, "step": 1}),
|
|
||||||
"image_size": (size_options, {"default": "2K"}),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -144,51 +134,9 @@ class ImgSubmitNode:
|
||||||
logger.info(f"环境: [{environment}], 模型: '{model_name_display}' -> '{tech_name}'")
|
logger.info(f"环境: [{environment}], 模型: '{model_name_display}' -> '{tech_name}'")
|
||||||
return base_url, tech_name
|
return base_url, tech_name
|
||||||
|
|
||||||
def submit_task(self, model_name_display, prompt, aspect_ratio, environment,
|
def submit_task(self, model_name_display, prompt, aspect_ratio, environment, image_filename=None, image=None):
|
||||||
image_filename=None, image=None, image_urls="", num_images=1, image_size="2K"):
|
|
||||||
file_obj = None
|
|
||||||
try:
|
try:
|
||||||
base_url, tech_name = self._get_base_url_and_tech_name(environment, model_name_display)
|
base_url, tech_name = self._get_base_url_and_tech_name(environment, model_name_display)
|
||||||
api_endpoint = f'{base_url}/api/custom/image/submit/task'
|
|
||||||
headers = {'accept': 'application/json'}
|
|
||||||
if "doubao-seedream-4-0" in tech_name:
|
|
||||||
logger.info(f"检测到豆包模型 '{tech_name}',启用特定提交逻辑。")
|
|
||||||
|
|
||||||
# 从尺寸选项中提取实际值(例如 '2048x2048 (1:1)' -> '2048x2048')
|
|
||||||
actual_size = image_size.split(' ')[0]
|
|
||||||
|
|
||||||
extra_params = {
|
|
||||||
"sequential_image_generation": "auto",
|
|
||||||
"size": actual_size,
|
|
||||||
"max_images": num_images
|
|
||||||
}
|
|
||||||
|
|
||||||
payload = {
|
|
||||||
'prompt': prompt,
|
|
||||||
'model_name': tech_name,
|
|
||||||
'aspect_ratio': aspect_ratio,
|
|
||||||
'mode': 'turbo',
|
|
||||||
'webhook_flag': 'false',
|
|
||||||
'watermark': 'false',
|
|
||||||
'extra': json.dumps(extra_params)
|
|
||||||
}
|
|
||||||
|
|
||||||
if image_urls and image_urls.strip():
|
|
||||||
logger.info(f"使用提供的图片URL: {image_urls.strip()}")
|
|
||||||
image_urls = image_urls.strip()
|
|
||||||
image_urls = image_urls.strip().replace('\n', ',')
|
|
||||||
payload['img_list'] = image_urls
|
|
||||||
else:
|
|
||||||
logger.info("未提供图片URL,将以文生图模式运行。")
|
|
||||||
|
|
||||||
logger.info(f"向豆包模型端点 {api_endpoint} 发送请求...")
|
|
||||||
response = requests.post(
|
|
||||||
api_endpoint, headers=headers, data=payload, timeout=60
|
|
||||||
)
|
|
||||||
|
|
||||||
else:
|
|
||||||
# 原始逻辑,适用于其他所有模型
|
|
||||||
logger.info(f"使用标准逻辑提交任务到模型 '{tech_name}'。")
|
|
||||||
model_config = self.MODEL_DATA["configs"].get(tech_name)
|
model_config = self.MODEL_DATA["configs"].get(tech_name)
|
||||||
if not model_config:
|
if not model_config:
|
||||||
raise ValueError(f"无法找到模型 '{tech_name}' 的配置。")
|
raise ValueError(f"无法找到模型 '{tech_name}' 的配置。")
|
||||||
|
|
@ -206,9 +154,11 @@ class ImgSubmitNode:
|
||||||
|
|
||||||
final_ar = validate_and_correct_parameter("宽高比", aspect_ratio, model_config.get("supported_ar", []))
|
final_ar = validate_and_correct_parameter("宽高比", aspect_ratio, model_config.get("supported_ar", []))
|
||||||
|
|
||||||
|
headers = {'accept': 'application/json'}
|
||||||
payload = {'prompt': prompt, 'model_name': tech_name, 'aspect_ratio': final_ar,
|
payload = {'prompt': prompt, 'model_name': tech_name, 'aspect_ratio': final_ar,
|
||||||
'mode': 'turbo', 'webhook_flag': 'false'}
|
'mode': 'turbo', 'webhook_flag': 'false'}
|
||||||
files_to_send = {}
|
files_to_send = {}
|
||||||
|
file_obj = None
|
||||||
|
|
||||||
if image is not None:
|
if image is not None:
|
||||||
logger.info(f"检测到 IMAGE (Tensor) 输入,优先处理。")
|
logger.info(f"检测到 IMAGE (Tensor) 输入,优先处理。")
|
||||||
|
|
@ -231,7 +181,9 @@ class ImgSubmitNode:
|
||||||
else:
|
else:
|
||||||
logger.info("未提供任何图像输入,以纯文本模式运行。")
|
logger.info("未提供任何图像输入,以纯文本模式运行。")
|
||||||
|
|
||||||
logger.info(f"向标准端点 {api_endpoint} 发送请求...")
|
api_endpoint = f'{base_url}/api/custom/image/submit/task'
|
||||||
|
logger.info(f"向端点 {api_endpoint} 发送请求...")
|
||||||
|
|
||||||
response = requests.post(
|
response = requests.post(
|
||||||
api_endpoint, headers=headers, data=payload, files=files_to_send, timeout=60
|
api_endpoint, headers=headers, data=payload, files=files_to_send, timeout=60
|
||||||
)
|
)
|
||||||
|
|
@ -251,11 +203,10 @@ class ImgSubmitNode:
|
||||||
if file_obj:
|
if file_obj:
|
||||||
file_obj.close()
|
file_obj.close()
|
||||||
|
|
||||||
|
# NODE_CLASS_MAPPINGS = {
|
||||||
NODE_CLASS_MAPPINGS = {
|
# "ImgSubmitNode": ImgSubmitNode
|
||||||
"ImgSubmitNode": ImgSubmitNode
|
# }
|
||||||
}
|
#
|
||||||
|
# NODE_DISPLAY_NAME_MAPPINGS = {
|
||||||
NODE_DISPLAY_NAME_MAPPINGS = {
|
# "ImgSubmitNode": "统一生图任务节点"
|
||||||
"ImgSubmitNode": "提交图片生成"
|
# }
|
||||||
}
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue