Skip to content

Commit 2555721

Browse files
Add workflow templates version tracking to system_stats (#9089)
Adds installed and required workflow templates version information to the /system_stats endpoint, allowing the frontend to detect and notify users when their templates package is outdated. - Add get_installed_templates_version() and get_required_templates_version() methods to FrontendManager - Include templates version info in system_stats response - Add comprehensive unit tests for the new functionality
1 parent 0572029 commit 2555721

File tree

3 files changed

+108
-0
lines changed

3 files changed

+108
-0
lines changed

app/frontend_management.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ def get_installed_frontend_version():
4242
frontend_version_str = version("comfyui-frontend-package")
4343
return frontend_version_str
4444

45+
4546
def get_required_frontend_version():
4647
"""Get the required frontend version from requirements.txt."""
4748
try:
@@ -63,6 +64,7 @@ def get_required_frontend_version():
6364
logging.error(f"Error reading requirements.txt: {e}")
6465
return None
6566

67+
6668
def check_frontend_version():
6769
"""Check if the frontend version is up to date."""
6870

@@ -203,6 +205,37 @@ def get_required_frontend_version(cls) -> str:
203205
"""Get the required frontend package version."""
204206
return get_required_frontend_version()
205207

208+
@classmethod
209+
def get_installed_templates_version(cls) -> str:
210+
"""Get the currently installed workflow templates package version."""
211+
try:
212+
templates_version_str = version("comfyui-workflow-templates")
213+
return templates_version_str
214+
except Exception:
215+
return None
216+
217+
@classmethod
218+
def get_required_templates_version(cls) -> str:
219+
"""Get the required workflow templates version from requirements.txt."""
220+
try:
221+
with open(requirements_path, "r", encoding="utf-8") as f:
222+
for line in f:
223+
line = line.strip()
224+
if line.startswith("comfyui-workflow-templates=="):
225+
version_str = line.split("==")[-1]
226+
if not is_valid_version(version_str):
227+
logging.error(f"Invalid templates version format in requirements.txt: {version_str}")
228+
return None
229+
return version_str
230+
logging.error("comfyui-workflow-templates not found in requirements.txt")
231+
return None
232+
except FileNotFoundError:
233+
logging.error("requirements.txt not found. Cannot determine required templates version.")
234+
return None
235+
except Exception as e:
236+
logging.error(f"Error reading requirements.txt: {e}")
237+
return None
238+
206239
@classmethod
207240
def default_frontend_path(cls) -> str:
208241
try:

server.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -550,6 +550,8 @@ async def system_stats(request):
550550
vram_total, torch_vram_total = comfy.model_management.get_total_memory(device, torch_total_too=True)
551551
vram_free, torch_vram_free = comfy.model_management.get_free_memory(device, torch_free_too=True)
552552
required_frontend_version = FrontendManager.get_required_frontend_version()
553+
installed_templates_version = FrontendManager.get_installed_templates_version()
554+
required_templates_version = FrontendManager.get_required_templates_version()
553555

554556
system_stats = {
555557
"system": {
@@ -558,6 +560,8 @@ async def system_stats(request):
558560
"ram_free": ram_free,
559561
"comfyui_version": __version__,
560562
"required_frontend_version": required_frontend_version,
563+
"installed_templates_version": installed_templates_version,
564+
"required_templates_version": required_templates_version,
561565
"python_version": sys.version,
562566
"pytorch_version": comfy.model_management.torch_version,
563567
"embedded_python": os.path.split(os.path.split(sys.executable)[0])[1] == "python_embeded",

tests-unit/app_test/frontend_manager_test.py

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,3 +205,74 @@ def test_get_frontend_version_invalid_semver():
205205

206206
# Assert
207207
assert version is None
208+
209+
210+
def test_get_templates_version():
211+
# Arrange
212+
expected_version = "0.1.41"
213+
mock_requirements_content = """torch
214+
torchsde
215+
comfyui-frontend-package==1.25.0
216+
comfyui-workflow-templates==0.1.41
217+
other-package==1.0.0
218+
numpy"""
219+
220+
# Act
221+
with patch("builtins.open", mock_open(read_data=mock_requirements_content)):
222+
version = FrontendManager.get_required_templates_version()
223+
224+
# Assert
225+
assert version == expected_version
226+
227+
228+
def test_get_templates_version_not_found():
229+
# Arrange
230+
mock_requirements_content = """torch
231+
torchsde
232+
comfyui-frontend-package==1.25.0
233+
other-package==1.0.0
234+
numpy"""
235+
236+
# Act
237+
with patch("builtins.open", mock_open(read_data=mock_requirements_content)):
238+
version = FrontendManager.get_required_templates_version()
239+
240+
# Assert
241+
assert version is None
242+
243+
244+
def test_get_templates_version_invalid_semver():
245+
# Arrange
246+
mock_requirements_content = """torch
247+
torchsde
248+
comfyui-workflow-templates==1.0.0.beta
249+
other-package==1.0.0
250+
numpy"""
251+
252+
# Act
253+
with patch("builtins.open", mock_open(read_data=mock_requirements_content)):
254+
version = FrontendManager.get_required_templates_version()
255+
256+
# Assert
257+
assert version is None
258+
259+
260+
def test_get_installed_templates_version():
261+
# Arrange
262+
expected_version = "0.1.40"
263+
264+
# Act
265+
with patch("app.frontend_management.version", return_value=expected_version):
266+
version = FrontendManager.get_installed_templates_version()
267+
268+
# Assert
269+
assert version == expected_version
270+
271+
272+
def test_get_installed_templates_version_not_installed():
273+
# Act
274+
with patch("app.frontend_management.version", side_effect=Exception("Package not found")):
275+
version = FrontendManager.get_installed_templates_version()
276+
277+
# Assert
278+
assert version is None

0 commit comments

Comments
 (0)