Skip to content

Commit d03ae07

Browse files
Added parameter required_frontend_version in the /system_stats API response (#8875)
* Added the parameter required_frontend_version in the /system_stats api response * Update server.py * Created a function get_required_frontend_version and wrote tests for it * Refactored the function to return currently installed frontend pacakage version * Moved required_frontend to a new function and imported that in server.py * Corrected test cases using mocking techniques * Corrected files to comply with ruff formatting
1 parent 0ccc88b commit d03ae07

File tree

3 files changed

+77
-7
lines changed

3 files changed

+77
-7
lines changed

app/frontend_management.py

Lines changed: 41 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,18 +29,48 @@ def frontend_install_warning_message():
2929
This error is happening because the ComfyUI frontend is no longer shipped as part of the main repo but as a pip package instead.
3030
""".strip()
3131

32+
def parse_version(version: str) -> tuple[int, int, int]:
33+
return tuple(map(int, version.split(".")))
34+
35+
def is_valid_version(version: str) -> bool:
36+
"""Validate if a string is a valid semantic version (X.Y.Z format)."""
37+
pattern = r"^(\d+)\.(\d+)\.(\d+)$"
38+
return bool(re.match(pattern, version))
39+
40+
def get_installed_frontend_version():
41+
"""Get the currently installed frontend package version."""
42+
frontend_version_str = version("comfyui-frontend-package")
43+
return frontend_version_str
44+
45+
def get_required_frontend_version():
46+
"""Get the required frontend version from requirements.txt."""
47+
try:
48+
with open(requirements_path, "r", encoding="utf-8") as f:
49+
for line in f:
50+
line = line.strip()
51+
if line.startswith("comfyui-frontend-package=="):
52+
version_str = line.split("==")[-1]
53+
if not is_valid_version(version_str):
54+
logging.error(f"Invalid version format in requirements.txt: {version_str}")
55+
return None
56+
return version_str
57+
logging.error("comfyui-frontend-package not found in requirements.txt")
58+
return None
59+
except FileNotFoundError:
60+
logging.error("requirements.txt not found. Cannot determine required frontend version.")
61+
return None
62+
except Exception as e:
63+
logging.error(f"Error reading requirements.txt: {e}")
64+
return None
3265

3366
def check_frontend_version():
3467
"""Check if the frontend version is up to date."""
3568

36-
def parse_version(version: str) -> tuple[int, int, int]:
37-
return tuple(map(int, version.split(".")))
38-
3969
try:
40-
frontend_version_str = version("comfyui-frontend-package")
70+
frontend_version_str = get_installed_frontend_version()
4171
frontend_version = parse_version(frontend_version_str)
42-
with open(requirements_path, "r", encoding="utf-8") as f:
43-
required_frontend = parse_version(f.readline().split("=")[-1])
72+
required_frontend_str = get_required_frontend_version()
73+
required_frontend = parse_version(required_frontend_str)
4474
if frontend_version < required_frontend:
4575
app.logger.log_startup_warning(
4676
f"""
@@ -168,6 +198,11 @@ def download_release_asset_zip(release: Release, destination_path: str) -> None:
168198
class FrontendManager:
169199
CUSTOM_FRONTENDS_ROOT = str(Path(__file__).parents[1] / "web_custom_versions")
170200

201+
@classmethod
202+
def get_required_frontend_version(cls) -> str:
203+
"""Get the required frontend package version."""
204+
return get_required_frontend_version()
205+
171206
@classmethod
172207
def default_frontend_path(cls) -> str:
173208
try:

server.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -553,13 +553,15 @@ async def system_stats(request):
553553
ram_free = comfy.model_management.get_free_memory(cpu_device)
554554
vram_total, torch_vram_total = comfy.model_management.get_total_memory(device, torch_total_too=True)
555555
vram_free, torch_vram_free = comfy.model_management.get_free_memory(device, torch_free_too=True)
556+
required_frontend_version = FrontendManager.get_required_frontend_version()
556557

557558
system_stats = {
558559
"system": {
559560
"os": os.name,
560561
"ram_total": ram_total,
561562
"ram_free": ram_free,
562563
"comfyui_version": __version__,
564+
"required_frontend_version": required_frontend_version,
563565
"python_version": sys.version,
564566
"pytorch_version": comfy.model_management.torch_version,
565567
"embedded_python": os.path.split(os.path.split(sys.executable)[0])[1] == "python_embeded",

tests-unit/app_test/frontend_manager_test.py

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import argparse
22
import pytest
33
from requests.exceptions import HTTPError
4-
from unittest.mock import patch
4+
from unittest.mock import patch, mock_open
55

66
from app.frontend_management import (
77
FrontendManager,
@@ -172,3 +172,36 @@ def test_init_frontend_fallback_on_error():
172172
# Assert
173173
assert frontend_path == "/default/path"
174174
mock_check.assert_called_once()
175+
176+
177+
def test_get_frontend_version():
178+
# Arrange
179+
expected_version = "1.25.0"
180+
mock_requirements_content = """torch
181+
torchsde
182+
comfyui-frontend-package==1.25.0
183+
other-package==1.0.0
184+
numpy"""
185+
186+
# Act
187+
with patch("builtins.open", mock_open(read_data=mock_requirements_content)):
188+
version = FrontendManager.get_required_frontend_version()
189+
190+
# Assert
191+
assert version == expected_version
192+
193+
194+
def test_get_frontend_version_invalid_semver():
195+
# Arrange
196+
mock_requirements_content = """torch
197+
torchsde
198+
comfyui-frontend-package==1.29.3.75
199+
other-package==1.0.0
200+
numpy"""
201+
202+
# Act
203+
with patch("builtins.open", mock_open(read_data=mock_requirements_content)):
204+
version = FrontendManager.get_required_frontend_version()
205+
206+
# Assert
207+
assert version is None

0 commit comments

Comments
 (0)