Three coordinated changes to the WP_* node family. 1. New WP_SeedList node Emits a list of N derived seeds for a downstream loop (is_output_list). Three independent override toggles (override_seed / override_count / override_strategy) each mirror the wired Loop's base_seed / count / strategy. Connecting loop_config auto-flips override_count + override_strategy ON so the natural intent of wiring in a loop gets the defaults right; override_seed stays explicit opt-in. All emitted seeds are masked to 50 bits via the new MAX_SAFE_SEED constant in engine.seed_derive so values sit inside ComfyUI's frontend randomize range and copy-paste reproduces identically in a standalone sampler. 2. Context Loop type split + downstream Context seed widget lock Split WP_CONTEXT_LOOP_CONFIG (wire payload) from a new WP_CONTEXT_LOOP_WIDGET (DOM-widget-only TYPE). Loop's own widget mounts on the widget type; the wire type has no factory so consumers like WP_SeedList render their loop_config socket as a plain input instead of being hidden by a fallback-undefined widget. New graph walker hasUpstreamLoopOverridingSeed: WP_Context's widget glue greys out the local seed stock widget when an upstream Loop has override_seed ON, so users read "this value is dead while the Loop drives it" without inspecting the Loop config separately. 3. wp_ prefix sweep + tooltips across every WP_* node input Custom DOM widget input names now carry the wp_ prefix so canvas socket labels read as branded WP widgets: modules -> wp_modules, rows -> wp_rows, viewer -> wp_viewer, cleaner -> wp_cleaner, context_loop_config -> wp_context_loop_config. Every stock input across the node family gets a tooltip describing what it does and when to wire it from another node. Tests + comfy_api stub updated. CLAUDE.md notes the wp_ convention for future custom widgets. Bundle size budget bumped 388 -> 395 KB to fit the SeedList Vue chunk (~4.9 KB net gzip) + override lock UI; entry stays at ~4 KB gzipped.
74 lines
2.5 KiB
Python
74 lines
2.5 KiB
Python
"""ComfyUI-Wildcard-Pipeline — modular procedural prompt generation."""
|
|
|
|
import os
|
|
import sys
|
|
|
|
# Tells ComfyUI to serve files from this folder under
|
|
# /extensions/<package-name>/ and auto-load any `*.js` it finds.
|
|
WEB_DIRECTORY = "./js"
|
|
|
|
# Expose engine/ and wp_nodes/ as top-level packages so internal absolute imports
|
|
# (``from engine.X import ...``, ``from wp_nodes.X import ...``) resolve the same
|
|
# whether ComfyUI's custom-node loader or pytest invokes us. ComfyUI sets up
|
|
# ``submodule_search_locations`` on this package but does not add the package
|
|
# dir to ``sys.path``, so absolute imports to ``engine``/``wp_nodes`` would fail
|
|
# without this shim. ``wp_nodes`` (not ``nodes``) avoids collision with
|
|
# ComfyUI's top-level ``nodes.py`` module.
|
|
_PKG_DIR = os.path.dirname(os.path.abspath(__file__))
|
|
if _PKG_DIR not in sys.path:
|
|
sys.path.insert(0, _PKG_DIR)
|
|
|
|
# pyright: reportMissingImports=false
|
|
# ruff: noqa: E402 — imports must follow the sys.path shim above
|
|
from comfy_api.latest import ComfyExtension
|
|
|
|
from wp_nodes.assembler_node import WPPromptAssembler
|
|
from wp_nodes.context_loop import WPContextLoop
|
|
from wp_nodes.context_node import WPContext
|
|
from wp_nodes.debug_node import WPDebug
|
|
from wp_nodes.injector_node import WPContextInjector
|
|
from wp_nodes.prompt_cleaner import WPPromptCleaner
|
|
from wp_nodes.seed_list import WPSeedList
|
|
from wp_nodes.var_to_bool import WPVarToBool
|
|
from wp_nodes.var_to_float import WPVarToFloat
|
|
from wp_nodes.var_to_int import WPVarToInt
|
|
|
|
|
|
class WildcardPipelineExtension(ComfyExtension):
|
|
"""Registers all WP nodes with ComfyUI."""
|
|
|
|
async def get_node_list(self):
|
|
return [
|
|
WPContext,
|
|
WPContextLoop,
|
|
WPPromptAssembler,
|
|
WPDebug,
|
|
WPContextInjector,
|
|
WPPromptCleaner,
|
|
WPSeedList,
|
|
WPVarToInt,
|
|
WPVarToFloat,
|
|
WPVarToBool,
|
|
]
|
|
|
|
|
|
async def comfy_entrypoint() -> WildcardPipelineExtension:
|
|
return WildcardPipelineExtension()
|
|
|
|
|
|
# Register SPA + REST API routes on ComfyUI's aiohttp app.
|
|
# Imported lazily inside the try-block so static analysis tools that
|
|
# don't have ComfyUI's `server` module on the path don't fail.
|
|
try:
|
|
from server import PromptServer # type: ignore[import-not-found]
|
|
|
|
from wp_api import register_routes as _register_wp_routes
|
|
|
|
_register_wp_routes(PromptServer.instance.app)
|
|
except Exception: # noqa: BLE001 - never crash ComfyUI on route registration failure
|
|
import logging
|
|
|
|
logging.getLogger(__name__).exception(
|
|
"wildcard-pipeline: route registration failed",
|
|
)
|