An i2v model shown a sharp reference can satisfy the objective by barely moving. ALG low-passes the anchor while sigma is high, removing the detail that shortcut needs, and hands the sharp one back once the picture settles. It attaches to the model, so it applies to whatever sampler is wired, and it requires temporal_latent and nothing else -- not "for LTX", not "for H3". Any model with a time axis and a pinned anchor gets it, including ones nobody here has heard of. A module with no ComfyUI node of its own: settings and behaviour, which is what most modules should be. The packed-layout path is NOT ported. v4 reached into a model-specific arrangement of the latent to find the video stream; where the anchor is not a plain [B, C, T, H, W] tensor this stands aside and says so once, rather than reshaping something it is guessing about. Tested as far as a machine with no GPU can: the filter really low-passes, only the anchor frame changes, the choice follows sigma, and the whole thing runs through ComfyUI's real KSAMPLER with only the innermost loop stubbed -- so the anchor a denoiser sees differs between an early step and a late one. Whether it looks better needs the rental. Also guarded route registration. PromptServer.instance only exists once a server has been built, and importing `server` successfully is not the same as running inside one -- with ComfyUI on the path the unguarded attribute took the whole pack down. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
45 lines
1.3 KiB
Python
45 lines
1.3 KiB
Python
"""Shared test setup for the whole tree.
|
|
|
|
Kept at the root so `modules/**/tests` get the same fixtures as `core/tests`
|
|
without each one re-deriving the path to ComfyUI.
|
|
"""
|
|
|
|
import os
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
import pytest
|
|
|
|
ROOT = Path(__file__).resolve().parent
|
|
if str(ROOT) not in sys.path:
|
|
sys.path.insert(0, str(ROOT))
|
|
|
|
|
|
def _comfyui_root():
|
|
candidates = [os.environ.get("COMFYUI_ROOT"), str(Path.home() / "Documents" / "ComfyUI")]
|
|
for candidate in candidates:
|
|
if candidate and (Path(candidate) / "comfy" / "supported_models.py").is_file():
|
|
if candidate not in sys.path:
|
|
sys.path.append(candidate)
|
|
return candidate
|
|
return None
|
|
|
|
|
|
# Put ComfyUI on the path at IMPORT time, not only when a fixture asks. A module
|
|
# that ships a modifier imports comfy at module level -- as it must, since that is
|
|
# how it runs inside ComfyUI -- so collection touches comfy before any fixture has
|
|
# had a chance to run.
|
|
COMFYUI = _comfyui_root()
|
|
|
|
|
|
@pytest.fixture(scope="session")
|
|
def comfyui():
|
|
"""ComfyUI's source tree on sys.path, or skip.
|
|
|
|
Everything that touches a node schema needs it, because a schema is only
|
|
meaningful in terms of comfy_api's own types.
|
|
"""
|
|
if COMFYUI is None:
|
|
pytest.skip("no ComfyUI source on this machine")
|
|
return COMFYUI
|