[project] name = "comfyui" version = "0.5.0" description = "An installable version of ComfyUI" readme = "README.md" authors = [ { name = "Contributors_of_ComfyUI" }, ] requires-python = ">=3.10" license = { text = "GPL-3.0-or-later" } classifiers = [ "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Operating System :: OS Independent", ] dependencies = [ "comfyui-frontend-package>=1.33.13", "comfyui-workflow-templates>=0.7.54", "comfyui-embedded-docs>=0.3.1", "torch", "torchvision", "torchdiffeq>=0.2.3", "torchsde>=0.2.6", "einops>=0.6.0", "open-clip-torch>=2.24.0", "transformers>=4.57.3", "tokenizers>=0.13.3", "sentencepiece", "peft>=0.10.0", "torchinfo", "safetensors>=0.4.2", "aiohttp>=3.13.2", "yarl>=1.22.0", "accelerate>=0.25.0", "pyyaml>=6.0", "scikit-image>=0.20.0", "jsonmerge>=1.9.0", "clean-fid>=0.1.35", "resize-right>=0.0.2", "opencv-python-headless>=4.9.0.80", "albumentations>=1.3.0", "aiofiles>=23.1.0", "frozendict>=2.3.6", "python-dateutil>=2.8.2", "importlib_resources", "Pillow", "scipy", "tqdm", "protobuf>=3.20.0,<5.0.0", "psutil", "ConfigArgParse>=1.7.1", "aio-pika", "pyjwt[crypto]", "kornia>=0.7.0", "mpmath>=1.0,!=1.4.0a0", "huggingface_hub[hf_xet]>=0.32.0", "lazy-object-proxy", "lazy_loader>=0.3", "can_ada", "fsspec", "natsort", "OpenEXR", "opentelemetry-distro", "opentelemetry-sdk", "opentelemetry-exporter-otlp", "opentelemetry-propagator-jaeger", "opentelemetry-instrumentation", "opentelemetry-util-http", "opentelemetry-instrumentation-aio-pika", "opentelemetry-instrumentation-requests", "opentelemetry-instrumentation-aiohttp-server", "opentelemetry-instrumentation-aiohttp-client", "opentelemetry-instrumentation-asyncio", "opentelemetry-instrumentation-urllib3", "opentelemetry-processor-baggage", "opentelemetry-semantic-conventions", "wrapt>=1.16.0", "certifi", "spandrel>=0.3.4", # https://github.com/conda-forge/numba-feedstock/issues/158 until numba is released with support for a later version of numpy "numpy>=1.24.4,<2.3", "soundfile", "watchdog", "PySoundFile", "networkx>=2.6.3", "joblib", "jaxtyping", "spandrel_extra_arches", "ml_dtypes", "diffusers>=0.30.1", "vtracer", "skia-python", "pebble>=5.0.7", "openai", "anthropic", "humanize", "lightning", "flax", "jax", "colour", "av>=14.2.0,<16", "pydantic~=2.0", "pydantic-settings~=2.0", "typer", "ijson", "scikit-learn>=1.4.1", # everything that is a torch extension will need setuptools, so just include it "setuptools", "alembic", "SQLAlchemy", "gguf", "trimesh", # doesn't support linux correctly yet "stringzilla<4.2.0", "requests_cache", "universal_pathlib", # yanked propcache is omitted # we want this upgraded "propcache>=0.4.1", ] [build-system] requires = ["hatchling"] build-backend = "hatchling.build" [project.optional-dependencies] dev = [ "pytest", "pytest-asyncio", "pytest-mock", "pytest-aiohttp", "pytest-xdist", "websocket-client>=1.6.1", "PyInstaller", "testcontainers", "testcontainers-rabbitmq", "mypy>=1.6.0", "freezegun", "coverage", "pylint", "astroid", ] cpu = [ "torch", "torchvision", "torchaudio", ] cu126 = [ "torch", "torchvision", "triton ; sys_platform == 'Linux'", "triton-windows ; sys_platform == 'win32'", # "torchaudio", ] cu128 = [ "torch", "torchvision", "triton ; sys_platform == 'Linux'", "triton-windows ; sys_platform == 'win32'", # "torchaudio", ] rocm = [ "torch", "torchvision", # "torchaudio", "pytorch-triton-rocm", ] # todo: wip for rocm libraries with Windows and better RDNA support when installing with uv # you'll need to look at the github actions workflow to see how this is done for e.g. an RX 7600 # therock = [ # "rocm[libraries,devel] ; sys_platform != 'Darwin'", # ] mps = [ "torch", "torchvision", # "torchaudio", ] comfyui-manager = [ "GitPython", "PyGithub", "matrix-client==0.4.0", "rich", "typing-extensions", "toml", "uv", "chardet", "pip", # todo: bold move # "comfyui_manager==4.0.3b4", ] [project.scripts] comfyui = "comfy.cmd.main:entrypoint" comfyui-worker = "comfy.entrypoints.worker:entrypoint" comfyui-workflow = "comfy.entrypoints.workflow:entrypoint" [project.urls] Homepage = "https://github.com/comfyanonymous/ComfyUI" Repository = "https://github.com/comfyanonymous/ComfyUI" [tool.uv] conflicts = [ [{ extra = "cpu" }, { extra = "cu126" }, { extra = "cu128" }, { extra = "rocm" }, { extra = "mps" }], ] no-build-isolation-package = [] prerelease = "allow" [[tool.uv.index]] name = "pytorch-cpu" url = "https://download.pytorch.org/whl/cpu" explicit = true [[tool.uv.index]] name = "pytorch-cu126" url = "https://download.pytorch.org/whl/cu126" explicit = true [[tool.uv.index]] name = "pytorch-cu128" url = "https://download.pytorch.org/whl/cu128" explicit = true [[tool.uv.index]] name = "pytorch-rocm" url = "https://repo.radeon.com/rocm/manylinux/rocm-rel-7.0/" format = "flat" explicit = false [[tool.uv.index]] name = "pytorch-nightly-cpu" url = "https://download.pytorch.org/whl/nightly/cpu" explicit = true [tool.uv.sources] torch = [ { index = "pytorch-cpu", extra = "cpu" }, { index = "pytorch-cu126", extra = "cu126", marker = "sys_platform == 'Linux' or sys_platform == 'win32'" }, { index = "pytorch-cu128", extra = "cu128", marker = "sys_platform == 'Linux' or sys_platform == 'win32'" }, { index = "pytorch-rocm", extra = "rocm", marker = "sys_platform == 'Linux'" }, { index = "pytorch-nightly-cpu", extra = "mps", marker = "sys_platform == 'darwin'" }, ] torchvision = [ { index = "pytorch-cpu", extra = "cpu" }, { index = "pytorch-cu126", extra = "cu126", marker = "sys_platform == 'Linux' or sys_platform == 'win32'" }, { index = "pytorch-cu128", extra = "cu128", marker = "sys_platform == 'Linux' or sys_platform == 'win32'" }, { index = "pytorch-rocm", extra = "rocm", marker = "sys_platform == 'Linux'" }, { index = "pytorch-nightly-cpu", extra = "mps", marker = "sys_platform == 'darwin'" }, ] torchaudio = [ { index = "pytorch-cpu", extra = "cpu" }, # { index = "pytorch-cu126", extra = "cu126", marker = "sys_platform == 'Linux' or sys_platform == 'win32'" }, # { index = "pytorch-cu128", extra = "cu128", marker = "sys_platform == 'Linux' or sys_platform == 'win32'" }, # { index = "pytorch-rocm", extra = "rocm", marker = "sys_platform == 'Linux'" }, # { index = "pytorch-nightly-cpu", extra = "mps", marker = "sys_platform == 'darwin'" }, ] [tool.ruff] lint.select = [ "N805", # invalid-first-argument-name-for-method "S307", # suspicious-eval-usage "S102", # exec "T", # print-usage "W", # pycodestyle Warnings "F", # Pyflakes ] exclude = ["*.ipynb", "**/generated/*.pyi"] [tool.hatch.metadata] allow-direct-references = true [tool.hatch.build.targets.wheel] packages = ["comfy/", "comfy_extras/", "comfy_api/", "comfy_api_nodes/", "comfy_config/", "comfy_execution/", "comfy_compatibility/"] [tool.pylint.master] py-version = "3.10" extension-pkg-allow-list = ["pydantic", "cv2", "transformers"] ignore-paths = ["^comfy/api/.*$"] ignored-modules = ["sentencepiece.*", "comfy.api", "comfy.cmd.folder_paths"] init-hook = 'import sys; sys.path.insert(0, ".")' load-plugins = ["tests.absolute_import_checker", "tests.main_pre_import_checker", "tests.missing_init", "tests.sd_clip_model_init_checker"] persistent = true fail-under = 10 jobs = 1 limit-inference-results = 100 unsafe-load-any-extension = false [tool.pylint.messages_control] enable = [ "deprecated-module", "deprecated-method", "deprecated-argument", "deprecated-class", "deprecated-decorator", "deprecated-attribute", ] disable = [ "raw-checker-failed", "bad-inline-option", "locally-disabled", "file-ignored", "suppressed-message", "useless-suppression", "deprecated-pragma", "use-symbolic-message-instead", "use-implicit-booleaness-not-comparison-to-string", "use-implicit-booleaness-not-comparison-to-zero", "useless-option-value", "no-classmethod-decorator", "no-staticmethod-decorator", "useless-object-inheritance", "property-with-parameters", "cyclic-import", "consider-using-from-import", "consider-merging-isinstance", "too-many-nested-blocks", "simplifiable-if-statement", "redefined-argument-from-local", "no-else-return", "consider-using-ternary", "trailing-comma-tuple", "stop-iteration-return", "simplify-boolean-expression", "inconsistent-return-statements", "useless-return", "consider-swap-variables", "consider-using-join", "consider-using-in", "consider-using-get", "chained-comparison", "consider-using-dict-comprehension", "consider-using-set-comprehension", "simplifiable-if-expression", "no-else-raise", "unnecessary-comprehension", "consider-using-sys-exit", "no-else-break", "no-else-continue", "super-with-arguments", "simplifiable-condition", "condition-evals-to-constant", "consider-using-generator", "use-a-generator", "consider-using-min-builtin", "consider-using-max-builtin", "consider-using-with", "unnecessary-dict-index-lookup", "use-list-literal", "use-dict-literal", "unnecessary-list-index-lookup", "use-yield-from", "duplicate-code", "too-many-ancestors", "too-many-instance-attributes", "too-few-public-methods", "too-many-public-methods", "too-many-return-statements", "too-many-branches", "too-many-arguments", "too-many-positional-arguments", "too-many-locals", "too-many-statements", "too-many-boolean-expressions", "too-many-positional", "literal-comparison", "comparison-with-itself", "comparison-of-constants", "wrong-spelling-in-comment", "wrong-spelling-in-docstring", "invalid-characters-in-docstring", "unnecessary-dunder-call", "bad-file-encoding", "bad-classmethod-argument", "bad-mcs-method-argument", "bad-mcs-classmethod-argument", "single-string-used-for-slots", "unnecessary-lambda-assignment", "unnecessary-direct-lambda-call", "non-ascii-name", "non-ascii-module-import", "line-too-long", "too-many-lines", "trailing-whitespace", "missing-final-newline", "trailing-newlines", "multiple-statements", "superfluous-parens", "mixed-line-endings", "unexpected-line-ending-format", "multiple-imports", "wrong-import-order", "ungrouped-imports", "wrong-import-position", "useless-import-alias", "import-outside-toplevel", "unnecessary-negation", "consider-using-enumerate", "consider-iterating-dictionary", "consider-using-dict-items", "use-maxsplit-arg", "use-sequence-for-iteration", "consider-using-f-string", "use-implicit-booleaness-not-len", "use-implicit-booleaness-not-comparison", "invalid-name", "disallowed-name", "typevar-name-incorrect-variance", "typevar-double-variance", "typevar-name-mismatch", "empty-docstring", "missing-module-docstring", "missing-class-docstring", "missing-function-docstring", "singleton-comparison", "unidiomatic-typecheck", "unknown-option-value", "logging-not-lazy", "logging-format-interpolation", "logging-fstring-interpolation", "fixme", "keyword-arg-before-vararg", "arguments-out-of-order", "non-str-assignment-to-dunder-name", "isinstance-second-argument-not-valid-type", "kwarg-superseded-by-positional-arg", "modified-iterating-list", "attribute-defined-outside-init", "bad-staticmethod-argument", "protected-access", "implicit-flag-alias", "arguments-differ", "signature-differs", "abstract-method", "super-init-not-called", "non-parent-init-called", "invalid-overridden-method", "arguments-renamed", "unused-private-member", "overridden-final-method", "subclassed-final-class", "redefined-slots-in-subclass", "super-without-brackets", "useless-parent-delegation", "global-variable-undefined", "global-variable-not-assigned", "global-statement", "global-at-module-level", "unused-import", "unused-variable", "unused-argument", "unused-wildcard-import", "redefined-outer-name", "redefined-builtin", "undefined-loop-variable", "unbalanced-tuple-unpacking", "cell-var-from-loop", "possibly-unused-variable", "self-cls-assignment", "unbalanced-dict-unpacking", "using-f-string-in-unsupported-version", "using-final-decorator-in-unsupported-version", "unnecessary-ellipsis", "non-ascii-file-name", "unnecessary-semicolon", "bad-indentation", "wildcard-import", "reimported", "import-self", "preferred-module", "misplaced-future", "shadowed-import", "missing-timeout", "useless-with-lock", "bare-except", "duplicate-except", "try-except-raise", "raise-missing-from", "binary-op-exception", "raising-format-tuple", "wrong-exception-operation", "broad-exception-caught", "broad-exception-raised", "bad-open-mode", "boolean-datetime", "redundant-unittest-assert", "bad-thread-instantiation", "shallow-copy-environ", "invalid-envvar-default", "subprocess-popen-preexec-fn", "subprocess-run-check", "unspecified-encoding", "forgotten-debug-statement", "method-cache-max-size-none", "bad-format-string-key", "unused-format-string-key", "bad-format-string", "missing-format-argument-key", "unused-format-string-argument", "format-combined-specification", "missing-format-attribute", "invalid-format-index", "duplicate-string-formatting-argument", "f-string-without-interpolation", "format-string-without-interpolation", "anomalous-backslash-in-string", "anomalous-unicode-escape-in-string", "implicit-str-concat", "inconsistent-quotes", "redundant-u-string-prefix", "useless-else-on-loop", "unreachable", "dangerous-default-value", "pointless-statement", "pointless-string-statement", "expression-not-assigned", "unnecessary-lambda", "duplicate-key", "exec-used", "eval-used", "confusing-with-statement", "using-constant-test", "missing-parentheses-for-call-in-test", "self-assigning-variable", "redeclared-assigned-name", "assert-on-string-literal", "duplicate-value", "named-expr-without-context", "pointless-exception-statement", "return-in-finally", "lost-exception", "assert-on-tuple", "unnecessary-pass", "comparison-with-callable", "nan-comparison", "contextmanager-generator-missing-cleanup", "nested-min-max", "bad-chained-comparison", "not-callable", ] [tool.pylint.basic] argument-naming-style = "snake_case" attr-naming-style = "snake_case" bad-names = ["foo", "bar", "baz", "toto", "tutu", "tata"] class-attribute-naming-style = "any" class-const-naming-style = "UPPER_CASE" class-naming-style = "PascalCase" const-naming-style = "UPPER_CASE" docstring-min-length = -1 function-naming-style = "snake_case" good-names = ["i", "j", "k", "ex", "Run", "_"] include-naming-hint = false inlinevar-naming-style = "any" method-naming-style = "snake_case" module-naming-style = "snake_case" no-docstring-rgx = "^_" property-classes = ["abc.abstractproperty"] variable-naming-style = "snake_case" [tool.pylint.classes] check-protected-access-in-special-methods = false defining-attr-methods = ["__init__", "__new__", "setUp", "asyncSetUp", "__post_init__"] exclude-protected = ["_asdict", "_fields", "_replace", "_source", "_make", "os._exit"] valid-classmethod-first-arg = "cls" valid-metaclass-classmethod-first-arg = "mcs" [tool.pylint.design] max-args = 5 max-attributes = 7 max-bool-expr = 5 max-branches = 12 max-locals = 15 max-parents = 7 max-public-methods = 20 max-returns = 6 max-statements = 50 min-public-methods = 2 [tool.pylint.exceptions] overgeneral-exceptions = ["builtins.BaseException", "builtins.Exception"] [tool.pylint.format] indent-after-paren = 4 indent-string = " " max-line-length = 100 max-module-lines = 1000 single-line-class-stmt = false single-line-if-stmt = false [tool.pylint.imports] allow-reexport-from-package = false allow-wildcard-with-all = false known-third-party = ["enchant"] [tool.pylint.logging] logging-format-style = "old" logging-modules = ["logging"] [tool.pylint.miscellaneous] notes = ["FIXME", "XXX", "TODO"] [tool.pylint.refactoring] max-nested-blocks = 5 never-returning-functions = ["sys.exit", "argparse.parse_error"] suggest-join-with-non-empty-separator = true [tool.pylint.reports] evaluation = "max(0, 0 if fatal else 10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10))" score = true [tool.pylint.similarities] ignore-comments = true ignore-docstrings = true ignore-imports = true ignore-signatures = true min-similarity-lines = 4 [tool.pylint.spelling] max-spelling-suggestions = 4 spelling-ignore-comment-directives = "fmt: on,fmt: off,noqa:,noqa,nosec,isort:skip,mypy:" spelling-store-unknown-words = false [tool.pylint.string] check-quote-consistency = false check-str-concat-over-line-jumps = false [tool.pylint.typecheck] contextmanager-decorators = ["contextlib.contextmanager"] generated-members = ["cv2.*", "sentencepiece.*"] ignore-none = true ignore-on-opaque-inference = true ignored-checks-for-mixins = ["no-member", "not-async-context-manager", "not-context-manager", "attribute-defined-outside-init"] ignored-classes = ["optparse.Values", "thread._local", "_thread._local", "argparse.Namespace"] missing-member-hint = true missing-member-hint-distance = 1 missing-member-max-choices = 1 mixin-class-rgx = ".*[Mm]ixin" [tool.pylint.variables] allow-global-unused-variables = true callbacks = ["cb_", "_cb"] dummy-variables-rgx = "_+$|(_[a-zA-Z0-9_]*[a-zA-Z0-9]+?$)|dummy|^ignored_|^unused_" ignored-argument-names = "_.*|^ignored_|^unused_" init-import = false redefining-builtins-modules = ["six.moves", "past.builtins", "future.builtins", "builtins", "io"]