mirror of
https://github.com/comfyanonymous/ComfyUI.git
synced 2026-01-27 06:40:16 +08:00
Merge branch 'comfyanonymous:master' into master
This commit is contained in:
commit
a6db9cc07a
@ -22,13 +22,21 @@ import app.logger
|
|||||||
# The path to the requirements.txt file
|
# The path to the requirements.txt file
|
||||||
req_path = Path(__file__).parents[1] / "requirements.txt"
|
req_path = Path(__file__).parents[1] / "requirements.txt"
|
||||||
|
|
||||||
|
|
||||||
def frontend_install_warning_message():
|
def frontend_install_warning_message():
|
||||||
"""The warning message to display when the frontend version is not up to date."""
|
"""The warning message to display when the frontend version is not up to date."""
|
||||||
|
|
||||||
extra = ""
|
extra = ""
|
||||||
if sys.flags.no_user_site:
|
if sys.flags.no_user_site:
|
||||||
extra = "-s "
|
extra = "-s "
|
||||||
return f"Please install the updated requirements.txt file by running:\n{sys.executable} {extra}-m pip install -r {req_path}\n\nThis error is happening because the ComfyUI frontend is no longer shipped as part of the main repo but as a pip package instead.\n\nIf you are on the portable package you can run: update\\update_comfyui.bat to solve this problem"
|
return f"""
|
||||||
|
Please install the updated requirements.txt file by running:
|
||||||
|
{sys.executable} {extra}-m pip install -r {req_path}
|
||||||
|
|
||||||
|
This error is happening because the ComfyUI frontend is no longer shipped as part of the main repo but as a pip package instead.
|
||||||
|
|
||||||
|
If you are on the portable package you can run: update\\update_comfyui.bat to solve this problem
|
||||||
|
""".strip()
|
||||||
|
|
||||||
|
|
||||||
def check_frontend_version():
|
def check_frontend_version():
|
||||||
@ -43,7 +51,17 @@ def check_frontend_version():
|
|||||||
with open(req_path, "r", encoding="utf-8") as f:
|
with open(req_path, "r", encoding="utf-8") as f:
|
||||||
required_frontend = parse_version(f.readline().split("=")[-1])
|
required_frontend = parse_version(f.readline().split("=")[-1])
|
||||||
if frontend_version < required_frontend:
|
if frontend_version < required_frontend:
|
||||||
app.logger.log_startup_warning("________________________________________________________________________\nWARNING WARNING WARNING WARNING WARNING\n\nInstalled frontend version {} is lower than the recommended version {}.\n\n{}\n________________________________________________________________________".format('.'.join(map(str, frontend_version)), '.'.join(map(str, required_frontend)), frontend_install_warning_message()))
|
app.logger.log_startup_warning(
|
||||||
|
f"""
|
||||||
|
________________________________________________________________________
|
||||||
|
WARNING WARNING WARNING WARNING WARNING
|
||||||
|
|
||||||
|
Installed frontend version {".".join(map(str, frontend_version))} is lower than the recommended version {".".join(map(str, required_frontend))}.
|
||||||
|
|
||||||
|
{frontend_install_warning_message()}
|
||||||
|
________________________________________________________________________
|
||||||
|
""".strip()
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
logging.info("ComfyUI frontend version: {}".format(frontend_version_str))
|
logging.info("ComfyUI frontend version: {}".format(frontend_version_str))
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
@ -150,9 +168,20 @@ class FrontendManager:
|
|||||||
def default_frontend_path(cls) -> str:
|
def default_frontend_path(cls) -> str:
|
||||||
try:
|
try:
|
||||||
import comfyui_frontend_package
|
import comfyui_frontend_package
|
||||||
|
|
||||||
return str(importlib.resources.files(comfyui_frontend_package) / "static")
|
return str(importlib.resources.files(comfyui_frontend_package) / "static")
|
||||||
except ImportError:
|
except ImportError:
|
||||||
logging.error(f"\n\n********** ERROR ***********\n\ncomfyui-frontend-package is not installed. {frontend_install_warning_message()}\n********** ERROR **********\n")
|
logging.error(
|
||||||
|
f"""
|
||||||
|
********** ERROR ***********
|
||||||
|
|
||||||
|
comfyui-frontend-package is not installed.
|
||||||
|
|
||||||
|
{frontend_install_warning_message()}
|
||||||
|
|
||||||
|
********** ERROR ***********
|
||||||
|
""".strip()
|
||||||
|
)
|
||||||
sys.exit(-1)
|
sys.exit(-1)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
@ -175,7 +204,9 @@ class FrontendManager:
|
|||||||
return match_result.group(1), match_result.group(2), match_result.group(3)
|
return match_result.group(1), match_result.group(2), match_result.group(3)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def init_frontend_unsafe(cls, version_string: str, provider: Optional[FrontEndProvider] = None) -> str:
|
def init_frontend_unsafe(
|
||||||
|
cls, version_string: str, provider: Optional[FrontEndProvider] = None
|
||||||
|
) -> str:
|
||||||
"""
|
"""
|
||||||
Initializes the frontend for the specified version.
|
Initializes the frontend for the specified version.
|
||||||
|
|
||||||
@ -197,12 +228,20 @@ class FrontendManager:
|
|||||||
repo_owner, repo_name, version = cls.parse_version_string(version_string)
|
repo_owner, repo_name, version = cls.parse_version_string(version_string)
|
||||||
|
|
||||||
if version.startswith("v"):
|
if version.startswith("v"):
|
||||||
expected_path = str(Path(cls.CUSTOM_FRONTENDS_ROOT) / f"{repo_owner}_{repo_name}" / version.lstrip("v"))
|
expected_path = str(
|
||||||
|
Path(cls.CUSTOM_FRONTENDS_ROOT)
|
||||||
|
/ f"{repo_owner}_{repo_name}"
|
||||||
|
/ version.lstrip("v")
|
||||||
|
)
|
||||||
if os.path.exists(expected_path):
|
if os.path.exists(expected_path):
|
||||||
logging.info(f"Using existing copy of specific frontend version tag: {repo_owner}/{repo_name}@{version}")
|
logging.info(
|
||||||
|
f"Using existing copy of specific frontend version tag: {repo_owner}/{repo_name}@{version}"
|
||||||
|
)
|
||||||
return expected_path
|
return expected_path
|
||||||
|
|
||||||
logging.info(f"Initializing frontend: {repo_owner}/{repo_name}@{version}, requesting version details from GitHub...")
|
logging.info(
|
||||||
|
f"Initializing frontend: {repo_owner}/{repo_name}@{version}, requesting version details from GitHub..."
|
||||||
|
)
|
||||||
|
|
||||||
provider = provider or FrontEndProvider(repo_owner, repo_name)
|
provider = provider or FrontEndProvider(repo_owner, repo_name)
|
||||||
release = provider.get_release(version)
|
release = provider.get_release(version)
|
||||||
|
|||||||
@ -59,6 +59,7 @@ class ModelType(Enum):
|
|||||||
FLOW = 6
|
FLOW = 6
|
||||||
V_PREDICTION_CONTINUOUS = 7
|
V_PREDICTION_CONTINUOUS = 7
|
||||||
FLUX = 8
|
FLUX = 8
|
||||||
|
IMG_TO_IMG = 9
|
||||||
|
|
||||||
|
|
||||||
from comfy.model_sampling import EPS, V_PREDICTION, EDM, ModelSamplingDiscrete, ModelSamplingContinuousEDM, StableCascadeSampling, ModelSamplingContinuousV
|
from comfy.model_sampling import EPS, V_PREDICTION, EDM, ModelSamplingDiscrete, ModelSamplingContinuousEDM, StableCascadeSampling, ModelSamplingContinuousV
|
||||||
@ -89,6 +90,8 @@ def model_sampling(model_config, model_type):
|
|||||||
elif model_type == ModelType.FLUX:
|
elif model_type == ModelType.FLUX:
|
||||||
c = comfy.model_sampling.CONST
|
c = comfy.model_sampling.CONST
|
||||||
s = comfy.model_sampling.ModelSamplingFlux
|
s = comfy.model_sampling.ModelSamplingFlux
|
||||||
|
elif model_type == ModelType.IMG_TO_IMG:
|
||||||
|
c = comfy.model_sampling.IMG_TO_IMG
|
||||||
|
|
||||||
class ModelSampling(s, c):
|
class ModelSampling(s, c):
|
||||||
pass
|
pass
|
||||||
@ -140,6 +143,7 @@ class BaseModel(torch.nn.Module):
|
|||||||
def _apply_model(self, x, t, c_concat=None, c_crossattn=None, control=None, transformer_options={}, **kwargs):
|
def _apply_model(self, x, t, c_concat=None, c_crossattn=None, control=None, transformer_options={}, **kwargs):
|
||||||
sigma = t
|
sigma = t
|
||||||
xc = self.model_sampling.calculate_input(sigma, x)
|
xc = self.model_sampling.calculate_input(sigma, x)
|
||||||
|
|
||||||
if c_concat is not None:
|
if c_concat is not None:
|
||||||
xc = torch.cat([xc] + [c_concat], dim=1)
|
xc = torch.cat([xc] + [c_concat], dim=1)
|
||||||
|
|
||||||
@ -601,6 +605,19 @@ class SDXL_instructpix2pix(IP2P, SDXL):
|
|||||||
else:
|
else:
|
||||||
self.process_ip2p_image_in = lambda image: image #diffusers ip2p
|
self.process_ip2p_image_in = lambda image: image #diffusers ip2p
|
||||||
|
|
||||||
|
class Lotus(BaseModel):
|
||||||
|
def extra_conds(self, **kwargs):
|
||||||
|
out = {}
|
||||||
|
cross_attn = kwargs.get("cross_attn", None)
|
||||||
|
out['c_crossattn'] = comfy.conds.CONDCrossAttn(cross_attn)
|
||||||
|
device = kwargs["device"]
|
||||||
|
task_emb = torch.tensor([1, 0]).float().to(device)
|
||||||
|
task_emb = torch.cat([torch.sin(task_emb), torch.cos(task_emb)]).unsqueeze(0)
|
||||||
|
out['y'] = comfy.conds.CONDRegular(task_emb)
|
||||||
|
return out
|
||||||
|
|
||||||
|
def __init__(self, model_config, model_type=ModelType.IMG_TO_IMG, device=None):
|
||||||
|
super().__init__(model_config, model_type, device=device)
|
||||||
|
|
||||||
class StableCascade_C(BaseModel):
|
class StableCascade_C(BaseModel):
|
||||||
def __init__(self, model_config, model_type=ModelType.STABLE_CASCADE, device=None):
|
def __init__(self, model_config, model_type=ModelType.STABLE_CASCADE, device=None):
|
||||||
|
|||||||
@ -682,8 +682,13 @@ def unet_config_from_diffusers_unet(state_dict, dtype=None):
|
|||||||
'transformer_depth_output': [1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0],
|
'transformer_depth_output': [1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0],
|
||||||
'use_temporal_attention': False, 'use_temporal_resblock': False}
|
'use_temporal_attention': False, 'use_temporal_resblock': False}
|
||||||
|
|
||||||
|
LotusD = {'use_checkpoint': False, 'image_size': 32, 'out_channels': 4, 'use_spatial_transformer': True, 'legacy': False, 'adm_in_channels': 4,
|
||||||
|
'dtype': dtype, 'in_channels': 4, 'model_channels': 320, 'num_res_blocks': [2, 2, 2, 2], 'transformer_depth': [1, 1, 1, 1, 1, 1, 0, 0],
|
||||||
|
'channel_mult': [1, 2, 4, 4], 'transformer_depth_middle': 1, 'use_linear_in_transformer': True, 'context_dim': 1024, 'num_heads': 8,
|
||||||
|
'transformer_depth_output': [1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0],
|
||||||
|
'use_temporal_attention': False, 'use_temporal_resblock': False}
|
||||||
|
|
||||||
supported_models = [SDXL, SDXL_refiner, SD21, SD15, SD21_uncliph, SD21_unclipl, SDXL_mid_cnet, SDXL_small_cnet, SDXL_diffusers_inpaint, SSD_1B, Segmind_Vega, KOALA_700M, KOALA_1B, SD09_XS, SD_XS, SDXL_diffusers_ip2p, SD15_diffusers_inpaint]
|
supported_models = [LotusD, SDXL, SDXL_refiner, SD21, SD15, SD21_uncliph, SD21_unclipl, SDXL_mid_cnet, SDXL_small_cnet, SDXL_diffusers_inpaint, SSD_1B, Segmind_Vega, KOALA_700M, KOALA_1B, SD09_XS, SD_XS, SDXL_diffusers_ip2p, SD15_diffusers_inpaint]
|
||||||
|
|
||||||
for unet_config in supported_models:
|
for unet_config in supported_models:
|
||||||
matches = True
|
matches = True
|
||||||
|
|||||||
@ -69,6 +69,15 @@ class CONST:
|
|||||||
sigma = sigma.view(sigma.shape[:1] + (1,) * (latent.ndim - 1))
|
sigma = sigma.view(sigma.shape[:1] + (1,) * (latent.ndim - 1))
|
||||||
return latent / (1.0 - sigma)
|
return latent / (1.0 - sigma)
|
||||||
|
|
||||||
|
class X0(EPS):
|
||||||
|
def calculate_denoised(self, sigma, model_output, model_input):
|
||||||
|
return model_output
|
||||||
|
|
||||||
|
class IMG_TO_IMG(X0):
|
||||||
|
def calculate_input(self, sigma, noise):
|
||||||
|
return noise
|
||||||
|
|
||||||
|
|
||||||
class ModelSamplingDiscrete(torch.nn.Module):
|
class ModelSamplingDiscrete(torch.nn.Module):
|
||||||
def __init__(self, model_config=None, zsnr=None):
|
def __init__(self, model_config=None, zsnr=None):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
|
|||||||
@ -506,6 +506,22 @@ class SDXL_instructpix2pix(SDXL):
|
|||||||
def get_model(self, state_dict, prefix="", device=None):
|
def get_model(self, state_dict, prefix="", device=None):
|
||||||
return model_base.SDXL_instructpix2pix(self, model_type=self.model_type(state_dict, prefix), device=device)
|
return model_base.SDXL_instructpix2pix(self, model_type=self.model_type(state_dict, prefix), device=device)
|
||||||
|
|
||||||
|
class LotusD(SD20):
|
||||||
|
unet_config = {
|
||||||
|
"model_channels": 320,
|
||||||
|
"use_linear_in_transformer": True,
|
||||||
|
"use_temporal_attention": False,
|
||||||
|
"adm_in_channels": 4,
|
||||||
|
"in_channels": 4,
|
||||||
|
}
|
||||||
|
|
||||||
|
unet_extra_config = {
|
||||||
|
"num_classes": 'sequential'
|
||||||
|
}
|
||||||
|
|
||||||
|
def get_model(self, state_dict, prefix="", device=None):
|
||||||
|
return model_base.Lotus(self, device=device)
|
||||||
|
|
||||||
class SD3(supported_models_base.BASE):
|
class SD3(supported_models_base.BASE):
|
||||||
unet_config = {
|
unet_config = {
|
||||||
"in_channels": 16,
|
"in_channels": 16,
|
||||||
@ -997,6 +1013,6 @@ class Hunyuan3Dv2mini(Hunyuan3Dv2):
|
|||||||
|
|
||||||
latent_format = latent_formats.Hunyuan3Dv2mini
|
latent_format = latent_formats.Hunyuan3Dv2mini
|
||||||
|
|
||||||
models = [Stable_Zero123, SD15_instructpix2pix, SD15, SD20, SD21UnclipL, SD21UnclipH, SDXL_instructpix2pix, SDXLRefiner, SDXL, SSD1B, KOALA_700M, KOALA_1B, Segmind_Vega, SD_X4Upscaler, Stable_Cascade_C, Stable_Cascade_B, SV3D_u, SV3D_p, SD3, StableAudio, AuraFlow, PixArtAlpha, PixArtSigma, HunyuanDiT, HunyuanDiT1, FluxInpaint, Flux, FluxSchnell, GenmoMochi, LTXV, HunyuanVideoSkyreelsI2V, HunyuanVideoI2V, HunyuanVideo, CosmosT2V, CosmosI2V, Lumina2, WAN21_T2V, WAN21_I2V, Hunyuan3Dv2mini, Hunyuan3Dv2]
|
models = [LotusD, Stable_Zero123, SD15_instructpix2pix, SD15, SD20, SD21UnclipL, SD21UnclipH, SDXL_instructpix2pix, SDXLRefiner, SDXL, SSD1B, KOALA_700M, KOALA_1B, Segmind_Vega, SD_X4Upscaler, Stable_Cascade_C, Stable_Cascade_B, SV3D_u, SV3D_p, SD3, StableAudio, AuraFlow, PixArtAlpha, PixArtSigma, HunyuanDiT, HunyuanDiT1, FluxInpaint, Flux, FluxSchnell, GenmoMochi, LTXV, HunyuanVideoSkyreelsI2V, HunyuanVideoI2V, HunyuanVideo, CosmosT2V, CosmosI2V, Lumina2, WAN21_T2V, WAN21_I2V, Hunyuan3Dv2mini, Hunyuan3Dv2]
|
||||||
|
|
||||||
models += [SVD_img2vid]
|
models += [SVD_img2vid]
|
||||||
|
|||||||
@ -21,8 +21,8 @@ class Load3D():
|
|||||||
"height": ("INT", {"default": 1024, "min": 1, "max": 4096, "step": 1}),
|
"height": ("INT", {"default": 1024, "min": 1, "max": 4096, "step": 1}),
|
||||||
}}
|
}}
|
||||||
|
|
||||||
RETURN_TYPES = ("IMAGE", "MASK", "STRING")
|
RETURN_TYPES = ("IMAGE", "MASK", "STRING", "IMAGE", "IMAGE")
|
||||||
RETURN_NAMES = ("image", "mask", "mesh_path")
|
RETURN_NAMES = ("image", "mask", "mesh_path", "normal", "lineart")
|
||||||
|
|
||||||
FUNCTION = "process"
|
FUNCTION = "process"
|
||||||
EXPERIMENTAL = True
|
EXPERIMENTAL = True
|
||||||
@ -32,12 +32,16 @@ class Load3D():
|
|||||||
def process(self, model_file, image, **kwargs):
|
def process(self, model_file, image, **kwargs):
|
||||||
image_path = folder_paths.get_annotated_filepath(image['image'])
|
image_path = folder_paths.get_annotated_filepath(image['image'])
|
||||||
mask_path = folder_paths.get_annotated_filepath(image['mask'])
|
mask_path = folder_paths.get_annotated_filepath(image['mask'])
|
||||||
|
normal_path = folder_paths.get_annotated_filepath(image['normal'])
|
||||||
|
lineart_path = folder_paths.get_annotated_filepath(image['lineart'])
|
||||||
|
|
||||||
load_image_node = nodes.LoadImage()
|
load_image_node = nodes.LoadImage()
|
||||||
output_image, ignore_mask = load_image_node.load_image(image=image_path)
|
output_image, ignore_mask = load_image_node.load_image(image=image_path)
|
||||||
ignore_image, output_mask = load_image_node.load_image(image=mask_path)
|
ignore_image, output_mask = load_image_node.load_image(image=mask_path)
|
||||||
|
normal_image, ignore_mask2 = load_image_node.load_image(image=normal_path)
|
||||||
|
lineart_image, ignore_mask3 = load_image_node.load_image(image=lineart_path)
|
||||||
|
|
||||||
return output_image, output_mask, model_file,
|
return output_image, output_mask, model_file, normal_image, lineart_image
|
||||||
|
|
||||||
class Load3DAnimation():
|
class Load3DAnimation():
|
||||||
@classmethod
|
@classmethod
|
||||||
@ -55,8 +59,8 @@ class Load3DAnimation():
|
|||||||
"height": ("INT", {"default": 1024, "min": 1, "max": 4096, "step": 1}),
|
"height": ("INT", {"default": 1024, "min": 1, "max": 4096, "step": 1}),
|
||||||
}}
|
}}
|
||||||
|
|
||||||
RETURN_TYPES = ("IMAGE", "MASK", "STRING")
|
RETURN_TYPES = ("IMAGE", "MASK", "STRING", "IMAGE")
|
||||||
RETURN_NAMES = ("image", "mask", "mesh_path")
|
RETURN_NAMES = ("image", "mask", "mesh_path", "normal")
|
||||||
|
|
||||||
FUNCTION = "process"
|
FUNCTION = "process"
|
||||||
EXPERIMENTAL = True
|
EXPERIMENTAL = True
|
||||||
@ -66,12 +70,14 @@ class Load3DAnimation():
|
|||||||
def process(self, model_file, image, **kwargs):
|
def process(self, model_file, image, **kwargs):
|
||||||
image_path = folder_paths.get_annotated_filepath(image['image'])
|
image_path = folder_paths.get_annotated_filepath(image['image'])
|
||||||
mask_path = folder_paths.get_annotated_filepath(image['mask'])
|
mask_path = folder_paths.get_annotated_filepath(image['mask'])
|
||||||
|
normal_path = folder_paths.get_annotated_filepath(image['normal'])
|
||||||
|
|
||||||
load_image_node = nodes.LoadImage()
|
load_image_node = nodes.LoadImage()
|
||||||
output_image, ignore_mask = load_image_node.load_image(image=image_path)
|
output_image, ignore_mask = load_image_node.load_image(image=image_path)
|
||||||
ignore_image, output_mask = load_image_node.load_image(image=mask_path)
|
ignore_image, output_mask = load_image_node.load_image(image=mask_path)
|
||||||
|
normal_image, ignore_mask2 = load_image_node.load_image(image=normal_path)
|
||||||
|
|
||||||
return output_image, output_mask, model_file,
|
return output_image, output_mask, model_file, normal_image
|
||||||
|
|
||||||
class Preview3D():
|
class Preview3D():
|
||||||
@classmethod
|
@classmethod
|
||||||
|
|||||||
29
comfy_extras/nodes_lotus.py
Normal file
29
comfy_extras/nodes_lotus.py
Normal file
File diff suppressed because one or more lines are too long
@ -20,10 +20,6 @@ class LCM(comfy.model_sampling.EPS):
|
|||||||
|
|
||||||
return c_out * x0 + c_skip * model_input
|
return c_out * x0 + c_skip * model_input
|
||||||
|
|
||||||
class X0(comfy.model_sampling.EPS):
|
|
||||||
def calculate_denoised(self, sigma, model_output, model_input):
|
|
||||||
return model_output
|
|
||||||
|
|
||||||
class ModelSamplingDiscreteDistilled(comfy.model_sampling.ModelSamplingDiscrete):
|
class ModelSamplingDiscreteDistilled(comfy.model_sampling.ModelSamplingDiscrete):
|
||||||
original_timesteps = 50
|
original_timesteps = 50
|
||||||
|
|
||||||
@ -56,7 +52,7 @@ class ModelSamplingDiscrete:
|
|||||||
@classmethod
|
@classmethod
|
||||||
def INPUT_TYPES(s):
|
def INPUT_TYPES(s):
|
||||||
return {"required": { "model": ("MODEL",),
|
return {"required": { "model": ("MODEL",),
|
||||||
"sampling": (["eps", "v_prediction", "lcm", "x0"],),
|
"sampling": (["eps", "v_prediction", "lcm", "x0", "img_to_img"],),
|
||||||
"zsnr": ("BOOLEAN", {"default": False}),
|
"zsnr": ("BOOLEAN", {"default": False}),
|
||||||
}}
|
}}
|
||||||
|
|
||||||
@ -77,7 +73,9 @@ class ModelSamplingDiscrete:
|
|||||||
sampling_type = LCM
|
sampling_type = LCM
|
||||||
sampling_base = ModelSamplingDiscreteDistilled
|
sampling_base = ModelSamplingDiscreteDistilled
|
||||||
elif sampling == "x0":
|
elif sampling == "x0":
|
||||||
sampling_type = X0
|
sampling_type = comfy.model_sampling.X0
|
||||||
|
elif sampling == "img_to_img":
|
||||||
|
sampling_type = comfy.model_sampling.IMG_TO_IMG
|
||||||
|
|
||||||
class ModelSamplingAdvanced(sampling_base, sampling_type):
|
class ModelSamplingAdvanced(sampling_base, sampling_type):
|
||||||
pass
|
pass
|
||||||
|
|||||||
@ -1,3 +1,3 @@
|
|||||||
# This file is automatically generated by the build process when version is
|
# This file is automatically generated by the build process when version is
|
||||||
# updated in pyproject.toml.
|
# updated in pyproject.toml.
|
||||||
__version__ = "0.3.26"
|
__version__ = "0.3.27"
|
||||||
|
|||||||
1
nodes.py
1
nodes.py
@ -2264,6 +2264,7 @@ def init_builtin_extra_nodes():
|
|||||||
"nodes_video.py",
|
"nodes_video.py",
|
||||||
"nodes_lumina2.py",
|
"nodes_lumina2.py",
|
||||||
"nodes_wan.py",
|
"nodes_wan.py",
|
||||||
|
"nodes_lotus.py",
|
||||||
"nodes_hunyuan3d.py",
|
"nodes_hunyuan3d.py",
|
||||||
"nodes_primitive.py",
|
"nodes_primitive.py",
|
||||||
]
|
]
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
[project]
|
[project]
|
||||||
name = "ComfyUI"
|
name = "ComfyUI"
|
||||||
version = "0.3.26"
|
version = "0.3.27"
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
license = { file = "LICENSE" }
|
license = { file = "LICENSE" }
|
||||||
requires-python = ">=3.9"
|
requires-python = ">=3.9"
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
comfyui-frontend-package==1.13.9
|
comfyui-frontend-package==1.14.5
|
||||||
torch
|
torch
|
||||||
torchsde
|
torchsde
|
||||||
torchvision
|
torchvision
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user