This commit is contained in:
Benjamin Berman 2023-08-02 17:59:10 -07:00
parent 82d0edf121
commit 3d3c5ae344
13 changed files with 60 additions and 65 deletions

View File

@ -7,7 +7,7 @@ supported_pt_extensions = set(['.ckpt', '.pt', '.bin', '.pth', '.safetensors'])
folder_names_and_paths = {} folder_names_and_paths = {}
base_path = os.path.dirname(os.path.realpath(__file__)) base_path = os.path.dirname(os.path.realpath(__file__))
models_dir = os.path.join(base_path, "models") models_dir = os.path.join(base_path, "../../models")
folder_names_and_paths["checkpoints"] = ([os.path.join(models_dir, "checkpoints")], supported_ckpt_extensions) folder_names_and_paths["checkpoints"] = ([os.path.join(models_dir, "checkpoints")], supported_ckpt_extensions)
folder_names_and_paths["configs"] = ([os.path.join(models_dir, "configs")], [".yaml"]) folder_names_and_paths["configs"] = ([os.path.join(models_dir, "configs")], [".yaml"])
@ -26,13 +26,13 @@ folder_names_and_paths["gligen"] = ([os.path.join(models_dir, "gligen")], suppor
folder_names_and_paths["upscale_models"] = ([os.path.join(models_dir, "upscale_models")], supported_pt_extensions) folder_names_and_paths["upscale_models"] = ([os.path.join(models_dir, "upscale_models")], supported_pt_extensions)
folder_names_and_paths["custom_nodes"] = ([os.path.join(base_path, "custom_nodes")], []) folder_names_and_paths["custom_nodes"] = ([os.path.join(base_path, "../../custom_nodes")], [])
folder_names_and_paths["hypernetworks"] = ([os.path.join(models_dir, "hypernetworks")], supported_pt_extensions) folder_names_and_paths["hypernetworks"] = ([os.path.join(models_dir, "hypernetworks")], supported_pt_extensions)
output_directory = os.path.join(os.path.dirname(os.path.realpath(__file__)), "output") output_directory = os.path.realpath(os.path.join(os.path.dirname(os.path.realpath(__file__)), "../../output"))
temp_directory = os.path.join(os.path.dirname(os.path.realpath(__file__)), "temp") temp_directory = os.path.join(os.path.dirname(os.path.realpath(__file__)), "temp")
input_directory = os.path.join(os.path.dirname(os.path.realpath(__file__)), "input") input_directory = os.path.realpath(os.path.join(os.path.dirname(os.path.realpath(__file__)), "../../input"))
filename_list_cache = {} filename_list_cache = {}

View File

@ -1,10 +1,9 @@
import torch import torch
from PIL import Image from PIL import Image
import struct
import numpy as np import numpy as np
from comfy.cli_args import args, LatentPreviewMethod from comfy.cli_args import args, LatentPreviewMethod
from comfy.taesd.taesd import TAESD from comfy.taesd.taesd import TAESD
import folder_paths from ..cmd import folder_paths
MAX_PREVIEW_RESOLUTION = 512 MAX_PREVIEW_RESOLUTION = 512

View File

@ -1,6 +1,6 @@
import os import os
import importlib.util import importlib.util
import folder_paths from ..cmd import folder_paths
import time import time
def execute_prestartup_script(): def execute_prestartup_script():
@ -56,23 +56,21 @@ if os.name == "nt":
import logging import logging
logging.getLogger("xformers").addFilter(lambda record: 'A matching Triton is not available' not in record.getMessage()) logging.getLogger("xformers").addFilter(lambda record: 'A matching Triton is not available' not in record.getMessage())
if __name__ == "__main__":
if args.cuda_device is not None:
os.environ['CUDA_VISIBLE_DEVICES'] = str(args.cuda_device)
print("Set cuda device to:", args.cuda_device)
import cuda_malloc if args.cuda_device is not None:
os.environ['CUDA_VISIBLE_DEVICES'] = str(args.cuda_device)
print("Set cuda device to:", args.cuda_device)
import comfy.utils import comfy.utils
import yaml import yaml
import execution from ..cmd import execution
import server from ..cmd import server as server_module
from server import BinaryEventTypes from .server import BinaryEventTypes
import comfy.model_management import comfy.model_management
def prompt_worker(q: execution.PromptQueue, _server: server.PromptServer): def prompt_worker(q: execution.PromptQueue, _server: server_module.PromptServer):
e = execution.PromptExecutor(_server) e = execution.PromptExecutor(_server)
while True: while True:
item, item_id = q.get() item, item_id = q.get()
@ -80,8 +78,8 @@ def prompt_worker(q: execution.PromptQueue, _server: server.PromptServer):
prompt_id = item[1] prompt_id = item[1]
e.execute(item[2], prompt_id, item[3], item[4]) e.execute(item[2], prompt_id, item[3], item[4])
q.task_done(item_id, e.outputs_ui) q.task_done(item_id, e.outputs_ui)
if server.client_id is not None: if _server.client_id is not None:
server.send_sync("executing", { "node": None, "prompt_id": prompt_id }, server.client_id) _server.send_sync("executing", { "node": None, "prompt_id": prompt_id }, _server.client_id)
print("Prompt executed in {:.2f} seconds".format(time.perf_counter() - execution_start_time)) print("Prompt executed in {:.2f} seconds".format(time.perf_counter() - execution_start_time))
gc.collect() gc.collect()
@ -126,12 +124,12 @@ def load_extra_path_config(yaml_path):
folder_paths.add_model_folder_path(x, full_path) folder_paths.add_model_folder_path(x, full_path)
if __name__ == "__main__": def main():
cleanup_temp() cleanup_temp()
loop = asyncio.new_event_loop() loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop) asyncio.set_event_loop(loop)
server = server.PromptServer(loop) server = server_module.PromptServer(loop)
q = execution.PromptQueue(server) q = execution.PromptQueue(server)
extra_model_paths_config_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), "extra_model_paths.yaml") extra_model_paths_config_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), "extra_model_paths.yaml")

View File

@ -15,8 +15,8 @@ import aiofiles
import aiohttp import aiohttp
from aiohttp import web from aiohttp import web
import execution from ..cmd import execution
import folder_paths from ..cmd import folder_paths
import mimetypes import mimetypes
from comfy.digest import digest from comfy.digest import digest
@ -89,7 +89,7 @@ class PromptServer():
middlewares=middlewares) middlewares=middlewares)
self.sockets = dict() self.sockets = dict()
self.web_root = os.path.join(os.path.dirname( self.web_root = os.path.join(os.path.dirname(
os.path.realpath(__file__)), "web") os.path.realpath(__file__)), "../../web")
routes = web.RouteTableDef() routes = web.RouteTableDef()
self.routes = routes self.routes = routes
self.last_node_id = None self.last_node_id = None
@ -140,7 +140,7 @@ class PromptServer():
def get_dir_by_type(dir_type=None): def get_dir_by_type(dir_type=None):
type_dir = "" type_dir = ""
if dir_type is None: if dir_type is None:
dir_type = "input" dir_type = "../../input"
if dir_type == "input": if dir_type == "input":
type_dir = folder_paths.get_input_directory() type_dir = folder_paths.get_input_directory()
@ -732,7 +732,7 @@ class PromptServer():
@classmethod @classmethod
def get_upload_dir(cls) -> str: def get_upload_dir(cls) -> str:
upload_dir = os.path.join(os.path.dirname(os.path.realpath(__file__)), "input") upload_dir = os.path.join(os.path.dirname(os.path.realpath(__file__)), "../../input")
if not os.path.exists(upload_dir): if not os.path.exists(upload_dir):
os.makedirs(upload_dir) os.makedirs(upload_dir)

View File

@ -1,13 +1,11 @@
import json import json
import os
import yaml import yaml
import folder_paths from .cmd import folder_paths
from comfy.sd import load_checkpoint from comfy.sd import load_checkpoint
import os.path as osp import os.path as osp
import re
import torch import torch
from safetensors.torch import load_file, save_file from safetensors.torch import load_file
from . import diffusers_convert from . import diffusers_convert

View File

@ -1,12 +1,9 @@
import torch import torch
import os import os
import sys
import json import json
import hashlib import hashlib
import traceback
import math import math
import time
import random import random
from PIL import Image, ImageOps from PIL import Image, ImageOps
@ -25,10 +22,7 @@ import comfy.clip_vision
import comfy.model_management import comfy.model_management
from comfy.cli_args import args from comfy.cli_args import args
import importlib from comfy.cmd import folder_paths, latent_preview
import folder_paths
import latent_preview
from comfy.nodes.common import MAX_RESOLUTION from comfy.nodes.common import MAX_RESOLUTION
@ -410,8 +404,8 @@ class LoadLatent:
class CheckpointLoader: class CheckpointLoader:
@classmethod @classmethod
def INPUT_TYPES(s): def INPUT_TYPES(s):
return {"required": { "config_name": (folder_paths.get_filename_list("configs"), ), return {"required": { "config_name": (folder_paths.get_filename_list("configs"),),
"ckpt_name": (folder_paths.get_filename_list("checkpoints"), )}} "ckpt_name": (folder_paths.get_filename_list("checkpoints"),)}}
RETURN_TYPES = ("MODEL", "CLIP", "VAE") RETURN_TYPES = ("MODEL", "CLIP", "VAE")
FUNCTION = "load_checkpoint" FUNCTION = "load_checkpoint"
@ -425,7 +419,7 @@ class CheckpointLoader:
class CheckpointLoaderSimple: class CheckpointLoaderSimple:
@classmethod @classmethod
def INPUT_TYPES(s): def INPUT_TYPES(s):
return {"required": { "ckpt_name": (folder_paths.get_filename_list("checkpoints"), ), return {"required": { "ckpt_name": (folder_paths.get_filename_list("checkpoints"),),
}} }}
RETURN_TYPES = ("MODEL", "CLIP", "VAE") RETURN_TYPES = ("MODEL", "CLIP", "VAE")
FUNCTION = "load_checkpoint" FUNCTION = "load_checkpoint"
@ -467,7 +461,7 @@ class DiffusersLoader:
class unCLIPCheckpointLoader: class unCLIPCheckpointLoader:
@classmethod @classmethod
def INPUT_TYPES(s): def INPUT_TYPES(s):
return {"required": { "ckpt_name": (folder_paths.get_filename_list("checkpoints"), ), return {"required": { "ckpt_name": (folder_paths.get_filename_list("checkpoints"),),
}} }}
RETURN_TYPES = ("MODEL", "CLIP", "VAE", "CLIP_VISION") RETURN_TYPES = ("MODEL", "CLIP", "VAE", "CLIP_VISION")
FUNCTION = "load_checkpoint" FUNCTION = "load_checkpoint"
@ -503,7 +497,7 @@ class LoraLoader:
def INPUT_TYPES(s): def INPUT_TYPES(s):
return {"required": { "model": ("MODEL",), return {"required": { "model": ("MODEL",),
"clip": ("CLIP", ), "clip": ("CLIP", ),
"lora_name": (folder_paths.get_filename_list("loras"), ), "lora_name": (folder_paths.get_filename_list("loras"),),
"strength_model": ("FLOAT", {"default": 1.0, "min": -10.0, "max": 10.0, "step": 0.01}), "strength_model": ("FLOAT", {"default": 1.0, "min": -10.0, "max": 10.0, "step": 0.01}),
"strength_clip": ("FLOAT", {"default": 1.0, "min": -10.0, "max": 10.0, "step": 0.01}), "strength_clip": ("FLOAT", {"default": 1.0, "min": -10.0, "max": 10.0, "step": 0.01}),
}} }}
@ -536,7 +530,7 @@ class LoraLoader:
class VAELoader: class VAELoader:
@classmethod @classmethod
def INPUT_TYPES(s): def INPUT_TYPES(s):
return {"required": { "vae_name": (folder_paths.get_filename_list("vae"), )}} return {"required": { "vae_name": (folder_paths.get_filename_list("vae"),)}}
RETURN_TYPES = ("VAE",) RETURN_TYPES = ("VAE",)
FUNCTION = "load_vae" FUNCTION = "load_vae"
@ -551,7 +545,7 @@ class VAELoader:
class ControlNetLoader: class ControlNetLoader:
@classmethod @classmethod
def INPUT_TYPES(s): def INPUT_TYPES(s):
return {"required": { "control_net_name": (folder_paths.get_filename_list("controlnet"), )}} return {"required": { "control_net_name": (folder_paths.get_filename_list("controlnet"),)}}
RETURN_TYPES = ("CONTROL_NET",) RETURN_TYPES = ("CONTROL_NET",)
FUNCTION = "load_controlnet" FUNCTION = "load_controlnet"
@ -567,7 +561,7 @@ class DiffControlNetLoader:
@classmethod @classmethod
def INPUT_TYPES(s): def INPUT_TYPES(s):
return {"required": { "model": ("MODEL",), return {"required": { "model": ("MODEL",),
"control_net_name": (folder_paths.get_filename_list("controlnet"), )}} "control_net_name": (folder_paths.get_filename_list("controlnet"),)}}
RETURN_TYPES = ("CONTROL_NET",) RETURN_TYPES = ("CONTROL_NET",)
FUNCTION = "load_controlnet" FUNCTION = "load_controlnet"
@ -660,7 +654,7 @@ class ControlNetApplyAdvanced:
class UNETLoader: class UNETLoader:
@classmethod @classmethod
def INPUT_TYPES(s): def INPUT_TYPES(s):
return {"required": { "unet_name": (folder_paths.get_filename_list("unet"), ), return {"required": { "unet_name": (folder_paths.get_filename_list("unet"),),
}} }}
RETURN_TYPES = ("MODEL",) RETURN_TYPES = ("MODEL",)
FUNCTION = "load_unet" FUNCTION = "load_unet"
@ -675,7 +669,7 @@ class UNETLoader:
class CLIPLoader: class CLIPLoader:
@classmethod @classmethod
def INPUT_TYPES(s): def INPUT_TYPES(s):
return {"required": { "clip_name": (folder_paths.get_filename_list("clip"), ), return {"required": { "clip_name": (folder_paths.get_filename_list("clip"),),
}} }}
RETURN_TYPES = ("CLIP",) RETURN_TYPES = ("CLIP",)
FUNCTION = "load_clip" FUNCTION = "load_clip"
@ -690,8 +684,9 @@ class CLIPLoader:
class DualCLIPLoader: class DualCLIPLoader:
@classmethod @classmethod
def INPUT_TYPES(s): def INPUT_TYPES(s):
return {"required": { "clip_name1": (folder_paths.get_filename_list("clip"), ), "clip_name2": (folder_paths.get_filename_list("clip"), ), return {"required": { "clip_name1": (folder_paths.get_filename_list("clip"),), "clip_name2": (
}} folder_paths.get_filename_list("clip"),),
}}
RETURN_TYPES = ("CLIP",) RETURN_TYPES = ("CLIP",)
FUNCTION = "load_clip" FUNCTION = "load_clip"
@ -706,7 +701,7 @@ class DualCLIPLoader:
class CLIPVisionLoader: class CLIPVisionLoader:
@classmethod @classmethod
def INPUT_TYPES(s): def INPUT_TYPES(s):
return {"required": { "clip_name": (folder_paths.get_filename_list("clip_vision"), ), return {"required": { "clip_name": (folder_paths.get_filename_list("clip_vision"),),
}} }}
RETURN_TYPES = ("CLIP_VISION",) RETURN_TYPES = ("CLIP_VISION",)
FUNCTION = "load_clip" FUNCTION = "load_clip"
@ -736,7 +731,7 @@ class CLIPVisionEncode:
class StyleModelLoader: class StyleModelLoader:
@classmethod @classmethod
def INPUT_TYPES(s): def INPUT_TYPES(s):
return {"required": { "style_model_name": (folder_paths.get_filename_list("style_models"), )}} return {"required": { "style_model_name": (folder_paths.get_filename_list("style_models"),)}}
RETURN_TYPES = ("STYLE_MODEL",) RETURN_TYPES = ("STYLE_MODEL",)
FUNCTION = "load_style_model" FUNCTION = "load_style_model"
@ -801,7 +796,7 @@ class unCLIPConditioning:
class GLIGENLoader: class GLIGENLoader:
@classmethod @classmethod
def INPUT_TYPES(s): def INPUT_TYPES(s):
return {"required": { "gligen_name": (folder_paths.get_filename_list("gligen"), )}} return {"required": { "gligen_name": (folder_paths.get_filename_list("gligen"),)}}
RETURN_TYPES = ("GLIGEN",) RETURN_TYPES = ("GLIGEN",)
FUNCTION = "load_gligen" FUNCTION = "load_gligen"

View File

@ -5,9 +5,13 @@ import pkgutil
import time import time
import types import types
import nodes as base_nodes from comfy.nodes import base_nodes as base_nodes
from comfy_extras import nodes as comfy_extras_nodes from comfy_extras import nodes as comfy_extras_nodes
import custom_nodes
try:
import custom_nodes
except:
custom_nodes = None
from comfy.nodes.package_typing import ExportedNodes from comfy.nodes.package_typing import ExportedNodes
from functools import reduce from functools import reduce
@ -68,11 +72,12 @@ def import_all_nodes_in_workspace() -> ExportedNodes:
comfy_extras_nodes comfy_extras_nodes
]), ]),
ExportedNodes()) ExportedNodes())
custom_nodes_mappings = ExportedNodes()
if custom_nodes is not None:
custom_nodes_mappings = _import_and_enumerate_nodes_in_module(custom_nodes, print_import_times=True)
custom_nodes_mappings = _import_and_enumerate_nodes_in_module(custom_nodes, print_import_times=True) # don't allow custom nodes to overwrite base nodes
custom_nodes_mappings -= base_and_extra
# don't allow custom nodes to overwrite base nodes
custom_nodes_mappings -= base_and_extra
_comfy_nodes.update(base_and_extra + custom_nodes_mappings) _comfy_nodes.update(base_and_extra + custom_nodes_mappings)
return _comfy_nodes return _comfy_nodes

View File

@ -1,5 +1,5 @@
import comfy.utils import comfy.utils
import folder_paths from comfy.cmd import folder_paths
import torch import torch
def load_hypernetwork_patch(path, strength): def load_hypernetwork_patch(path, strength):
@ -88,7 +88,7 @@ class HypernetworkLoader:
@classmethod @classmethod
def INPUT_TYPES(s): def INPUT_TYPES(s):
return {"required": { "model": ("MODEL",), return {"required": { "model": ("MODEL",),
"hypernetwork_name": (folder_paths.get_filename_list("hypernetworks"), ), "hypernetwork_name": (folder_paths.get_filename_list("hypernetworks"),),
"strength": ("FLOAT", {"default": 1.0, "min": -10.0, "max": 10.0, "step": 0.01}), "strength": ("FLOAT", {"default": 1.0, "min": -10.0, "max": 10.0, "step": 0.01}),
}} }}
RETURN_TYPES = ("MODEL",) RETURN_TYPES = ("MODEL",)

View File

@ -2,7 +2,7 @@ import comfy.sd
import comfy.utils import comfy.utils
import comfy.model_base import comfy.model_base
import folder_paths from comfy.cmd import folder_paths
import json import json
import os import os

View File

@ -1,14 +1,14 @@
import os
from comfy_extras.chainner_models import model_loading from comfy_extras.chainner_models import model_loading
from comfy import model_management from comfy import model_management
import torch import torch
import comfy.utils import comfy.utils
import folder_paths from comfy.cmd import folder_paths
class UpscaleModelLoader: class UpscaleModelLoader:
@classmethod @classmethod
def INPUT_TYPES(s): def INPUT_TYPES(s):
return {"required": { "model_name": (folder_paths.get_filename_list("upscale_models"), ), return {"required": { "model_name": (folder_paths.get_filename_list("upscale_models"),),
}} }}
RETURN_TYPES = ("UPSCALE_MODEL",) RETURN_TYPES = ("UPSCALE_MODEL",)
FUNCTION = "load_model" FUNCTION = "load_model"

View File

@ -151,8 +151,8 @@ setup(
setup_requires=["pip", "wheel"], setup_requires=["pip", "wheel"],
entry_points={ entry_points={
'console_scripts': [ 'console_scripts': [
# todo: eventually migrate main here 'comfyui-openapi-gen = comfy.cmd.openapi_gen:main',
'comfyui-openapi-gen = comfy.cmd.openapi_gen:main' 'comfyui = comfy.cmd.main:main'
], ],
}, },
) )