mirror of
https://github.com/comfyanonymous/ComfyUI.git
synced 2026-03-29 21:13:33 +08:00
Track custom node startup errors and expose via API endpoint
Store import and prestartup errors in NODE_STARTUP_ERRORS dict (nodes.py, main.py) and add GET /custom_node_startup_errors endpoint (server.py) so the frontend/Manager can distinguish failed imports from missing nodes. Ref: ComfyUI-Launcher#303 Amp-Thread-ID: https://ampcode.com/threads/T-019d2346-6e6f-75e0-a97f-cdb6e26859f7 Co-authored-by: Amp <amp@ampcode.com>
This commit is contained in:
parent
b53b10ea61
commit
a145651cc0
9
main.py
9
main.py
@ -139,7 +139,16 @@ def execute_prestartup_script():
|
|||||||
spec.loader.exec_module(module)
|
spec.loader.exec_module(module)
|
||||||
return True
|
return True
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
import traceback
|
||||||
logging.error(f"Failed to execute startup-script: {script_path} / {e}")
|
logging.error(f"Failed to execute startup-script: {script_path} / {e}")
|
||||||
|
from nodes import NODE_STARTUP_ERRORS, get_module_name
|
||||||
|
node_module_name = get_module_name(os.path.dirname(script_path))
|
||||||
|
NODE_STARTUP_ERRORS[node_module_name] = {
|
||||||
|
"module_path": os.path.dirname(script_path),
|
||||||
|
"error": str(e),
|
||||||
|
"traceback": traceback.format_exc(),
|
||||||
|
"phase": "prestartup",
|
||||||
|
}
|
||||||
return False
|
return False
|
||||||
|
|
||||||
node_paths = folder_paths.get_folder_paths("custom_nodes")
|
node_paths = folder_paths.get_folder_paths("custom_nodes")
|
||||||
|
|||||||
10
nodes.py
10
nodes.py
@ -2181,6 +2181,9 @@ EXTENSION_WEB_DIRS = {}
|
|||||||
# Dictionary of successfully loaded module names and associated directories.
|
# Dictionary of successfully loaded module names and associated directories.
|
||||||
LOADED_MODULE_DIRS = {}
|
LOADED_MODULE_DIRS = {}
|
||||||
|
|
||||||
|
# Dictionary of custom node startup errors, keyed by module name.
|
||||||
|
NODE_STARTUP_ERRORS: dict[str, dict] = {}
|
||||||
|
|
||||||
|
|
||||||
def get_module_name(module_path: str) -> str:
|
def get_module_name(module_path: str) -> str:
|
||||||
"""
|
"""
|
||||||
@ -2298,6 +2301,13 @@ async def load_custom_node(module_path: str, ignore=set(), module_parent="custom
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
logging.warning(traceback.format_exc())
|
logging.warning(traceback.format_exc())
|
||||||
logging.warning(f"Cannot import {module_path} module for custom nodes: {e}")
|
logging.warning(f"Cannot import {module_path} module for custom nodes: {e}")
|
||||||
|
module_name = get_module_name(module_path)
|
||||||
|
NODE_STARTUP_ERRORS[module_name] = {
|
||||||
|
"module_path": module_path,
|
||||||
|
"error": str(e),
|
||||||
|
"traceback": traceback.format_exc(),
|
||||||
|
"phase": "import",
|
||||||
|
}
|
||||||
return False
|
return False
|
||||||
|
|
||||||
async def init_external_custom_nodes():
|
async def init_external_custom_nodes():
|
||||||
|
|||||||
@ -753,6 +753,10 @@ class PromptServer():
|
|||||||
out[node_class] = node_info(node_class)
|
out[node_class] = node_info(node_class)
|
||||||
return web.json_response(out)
|
return web.json_response(out)
|
||||||
|
|
||||||
|
@routes.get("/custom_node_startup_errors")
|
||||||
|
async def get_custom_node_startup_errors(request):
|
||||||
|
return web.json_response(nodes.NODE_STARTUP_ERRORS)
|
||||||
|
|
||||||
@routes.get("/api/jobs")
|
@routes.get("/api/jobs")
|
||||||
async def get_jobs(request):
|
async def get_jobs(request):
|
||||||
"""List all jobs with filtering, sorting, and pagination.
|
"""List all jobs with filtering, sorting, and pagination.
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user