ComfyUI/pyproject.toml

659 lines
18 KiB
TOML

[project]
name = "comfyui"
version = "0.6.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.35.9",
"comfyui-workflow-templates>=0.7.64",
"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.3b7",
]
[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"]