From 7ab2941420f2ce211a7fb82cfe4405d3e60a4d96 Mon Sep 17 00:00:00 2001 From: ComfyUI Dev Date: Fri, 8 May 2026 04:56:26 +0000 Subject: [PATCH] Generalize frontend version warning to all comfy* requirements.txt entries The frontend is itself a comfy* package, so check_frontend_version() is folded into check_comfy_packages_versions(), removing the duplication. /system_stats gains a comfy_package_versions list (purely additive). --- app/frontend_management.py | 58 +++++++++++++------- openapi.yaml | 18 ++++++ server.py | 2 + tests-unit/app_test/frontend_manager_test.py | 4 +- 4 files changed, 59 insertions(+), 23 deletions(-) diff --git a/app/frontend_management.py b/app/frontend_management.py index 7108bd35a..a0eb43ea3 100644 --- a/app/frontend_management.py +++ b/app/frontend_management.py @@ -38,40 +38,51 @@ def is_valid_version(version: str) -> bool: pattern = r"^(\d+)\.(\d+)\.(\d+)$" return bool(re.match(pattern, version)) -def get_installed_frontend_version(): - """Get the currently installed frontend package version.""" - frontend_version_str = version("comfyui-frontend-package") - return frontend_version_str - - def get_required_frontend_version(): return get_required_packages_versions().get("comfyui-frontend-package", None) -def check_frontend_version(): - """Check if the frontend version is up to date.""" +def get_comfy_package_versions(): + """List installed/required versions for every comfy* package in requirements.txt.""" + out = [] + for name, required in (get_required_packages_versions() or {}).items(): + if not name.startswith("comfy"): + continue + try: + installed = version(name) + except Exception: + installed = None + out.append({"name": name, "installed": installed, "required": required}) + return out - try: - frontend_version_str = get_installed_frontend_version() - frontend_version = parse_version(frontend_version_str) - required_frontend_str = get_required_frontend_version() - required_frontend = parse_version(required_frontend_str) - if frontend_version < required_frontend: + +def check_comfy_packages_versions(): + """Warn for every comfy* package whose installed version is below requirements.txt.""" + from packaging.version import InvalidVersion, parse as parse_pep440 + for pkg in get_comfy_package_versions(): + installed_str = pkg["installed"] + required_str = pkg["required"] + if not installed_str or not required_str: + continue + try: + outdated = parse_pep440(installed_str) < parse_pep440(required_str) + except InvalidVersion as e: + logging.error(f"Failed to check {pkg['name']} version: {e}") + continue + if outdated: 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))}. +Installed {pkg["name"]} version {installed_str} is lower than the recommended version {required_str}. -{frontend_install_warning_message()} +{get_missing_requirements_message()} ________________________________________________________________________ """.strip() ) else: - logging.info("ComfyUI frontend version: {}".format(frontend_version_str)) - except Exception as e: - logging.error(f"Failed to check frontend version: {e}") + logging.info("{} version: {}".format(pkg["name"], installed_str)) REQUEST_TIMEOUT = 10 # seconds @@ -201,6 +212,11 @@ class FrontendManager: def get_required_templates_version(cls) -> str: return get_required_packages_versions().get("comfyui-workflow-templates", None) + @classmethod + def get_comfy_package_versions(cls): + """List installed/required versions for every comfy* package in requirements.txt.""" + return get_comfy_package_versions() + @classmethod def default_frontend_path(cls) -> str: try: @@ -341,7 +357,7 @@ comfyui-workflow-templates is not installed. main error source might be request timeout or invalid URL. """ if version_string == DEFAULT_VERSION_STRING: - check_frontend_version() + check_comfy_packages_versions() return cls.default_frontend_path() repo_owner, repo_name, version = cls.parse_version_string(version_string) @@ -403,7 +419,7 @@ comfyui-workflow-templates is not installed. except Exception as e: logging.error("Failed to initialize frontend: %s", e) logging.info("Falling back to the default frontend.") - check_frontend_version() + check_comfy_packages_versions() return cls.default_frontend_path() @classmethod def template_asset_handler(cls): diff --git a/openapi.yaml b/openapi.yaml index 29b5f544b..eb257ff24 100644 --- a/openapi.yaml +++ b/openapi.yaml @@ -2542,6 +2542,24 @@ components: type: string nullable: true description: Minimum required workflow templates version for this ComfyUI build + comfy_package_versions: + type: array + description: Installed and required versions for every comfy* package pinned in requirements.txt + items: + type: object + required: + - name + - installed + - required + properties: + name: + type: string + installed: + type: string + nullable: true + required: + type: string + nullable: true devices: type: array items: diff --git a/server.py b/server.py index 2f3b438bb..44470b904 100644 --- a/server.py +++ b/server.py @@ -656,6 +656,7 @@ class PromptServer(): required_frontend_version = FrontendManager.get_required_frontend_version() installed_templates_version = FrontendManager.get_installed_templates_version() required_templates_version = FrontendManager.get_required_templates_version() + comfy_package_versions = FrontendManager.get_comfy_package_versions() system_stats = { "system": { @@ -666,6 +667,7 @@ class PromptServer(): "required_frontend_version": required_frontend_version, "installed_templates_version": installed_templates_version, "required_templates_version": required_templates_version, + "comfy_package_versions": comfy_package_versions, "python_version": sys.version, "pytorch_version": comfy.model_management.torch_version, "embedded_python": os.path.split(os.path.split(sys.executable)[0])[1] == "python_embeded", diff --git a/tests-unit/app_test/frontend_manager_test.py b/tests-unit/app_test/frontend_manager_test.py index 1d5a84b47..3bdc8b57d 100644 --- a/tests-unit/app_test/frontend_manager_test.py +++ b/tests-unit/app_test/frontend_manager_test.py @@ -147,7 +147,7 @@ def test_init_frontend_default_with_mocks(): # Act with ( - patch("app.frontend_management.check_frontend_version") as mock_check, + patch("app.frontend_management.check_comfy_packages_versions") as mock_check, patch.object( FrontendManager, "default_frontend_path", return_value="/mocked/path" ), @@ -168,7 +168,7 @@ def test_init_frontend_fallback_on_error(): patch.object( FrontendManager, "init_frontend_unsafe", side_effect=Exception("Test error") ), - patch("app.frontend_management.check_frontend_version") as mock_check, + patch("app.frontend_management.check_comfy_packages_versions") as mock_check, patch.object( FrontendManager, "default_frontend_path", return_value="/default/path" ),