Skip to content

Commit ad427f5

Browse files
Code2Collapseclaude
andcommitted
fix(preview): defeat the per-queue override (PR #11261) that wiped previews (main)
Port from feat. Toggle drives native Comfy.Execution.PreviewMethod + guard overrides latent_preview.default_preview_method to TAESD, so the per-prompt reset (execution.py set_preview_method(extra_data['preview_method'])) no longer falls back to NoPreviews. Fixes "preview never shows" on core + Kijai/Wan. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
1 parent dc36d24 commit ad427f5

2 files changed

Lines changed: 40 additions & 27 deletions

File tree

js/c2c_preview_toggle.js

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,24 @@ import { api } from "../../scripts/api.js";
1313
const SETTING_ID = "c2c.preview.method";
1414

1515
async function applyMethod(method) {
16+
// 1) Drive ComfyUI's NATIVE per-queue preview setting. This is the
17+
// authoritative path on current ComfyUI (PR #11261): the value is sent as
18+
// extra_data.preview_method on every prompt and overrides args.preview_method.
19+
// "default" (the stock value) means "use the CLI flag" = --preview-method
20+
// none = no preview, which is why nothing showed. Force a real method here.
21+
try {
22+
const native = (method === "off") ? "none" : method; // taesd | latent2rgb | none
23+
app.ui?.settings?.setSettingValue?.("Comfy.Execution.PreviewMethod", native);
24+
} catch (_) { /* older ComfyUI without the per-queue setting */ }
25+
// 2) Also hit our backend route (sets args + default_preview_method) — covers
26+
// older ComfyUI without the per-queue override, and keeps both in sync.
1627
try {
1728
await api.fetchApi("/c2c/preview_method", {
1829
method: "POST",
1930
headers: { "Content-Type": "application/json" },
2031
body: JSON.stringify({ method }),
2132
});
22-
} catch (_) { /* server route missing / older ComfyUI — native default applies */ }
33+
} catch (_) { /* server route missing / older ComfyUI */ }
2334
}
2435

2536
app.registerExtension({

nodes/_c2c_preview_guard.py

Lines changed: 28 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -54,27 +54,28 @@ def ensure_previews_enabled() -> str:
5454
log.debug("[c2c.preview] cli_args unavailable: %s", exc)
5555
return PREVIEW_GUARD_STATUS
5656
try:
57-
cur = getattr(args, "preview_method", None)
58-
if cur == LatentPreviewMethod.NoPreviews:
59-
# Force TAESD, not Auto. TAESD is the universal method: core samplers
60-
# use the taesd decoder (or fall back to Latent2RGB), and — crucially —
61-
# Kijai's WanVideoSampler routes TAESD to its OWN video previewer
62-
# (taehv / Wan-factor Latent2RGB), so Wan/video previews actually show.
63-
# Auto resolves to core Latent2RGB, which is BLANK for Wan latents.
57+
import latent_preview # noqa: F401
58+
# THE PR #11261 GOTCHA: newer ComfyUI resets args.preview_method on EVERY
59+
# prompt (execution.py: set_preview_method(extra_data['preview_method'])).
60+
# When the frontend sends "default"/None, set_preview_method falls back to
61+
# latent_preview.default_preview_method — which is whatever --preview-method
62+
# was (NoPreviews here). So setting args.preview_method alone is WIPED every
63+
# run; we must override default_preview_method itself. TAESD is universal:
64+
# core samplers use the taesd decoder / Latent2RGB, and Kijai's WanVideoSampler
65+
# routes TAESD to its OWN video previewer (Auto/Latent2RGB are blank for Wan).
66+
dflt = getattr(latent_preview, "default_preview_method", None)
67+
if dflt == LatentPreviewMethod.NoPreviews:
68+
latent_preview.default_preview_method = LatentPreviewMethod.TAESD
69+
# Also set it live for the current run.
70+
if getattr(args, "preview_method", None) == LatentPreviewMethod.NoPreviews:
6471
try:
65-
import latent_preview # noqa: F401
66-
if hasattr(latent_preview, "set_preview_method"):
67-
latent_preview.set_preview_method("taesd")
68-
else:
69-
args.preview_method = LatentPreviewMethod.TAESD
72+
latent_preview.set_preview_method("taesd")
7073
except Exception:
7174
args.preview_method = LatentPreviewMethod.TAESD
72-
PREVIEW_GUARD_STATUS = "forced_taesd (was none)"
73-
log.info("[c2c.preview] previews were OFF (--preview-method none) -> forced to TAESD "
74-
"(works for core AND Kijai/Wan samplers). Set C2C_NO_FORCE_PREVIEW=1 to opt out.")
75-
else:
76-
PREVIEW_GUARD_STATUS = f"already_on ({getattr(cur, 'value', cur)})"
77-
log.debug("[c2c.preview] previews already enabled: %s", cur)
75+
PREVIEW_GUARD_STATUS = "forced_taesd (+per-queue default override)"
76+
log.info("[c2c.preview] forced live preview to TAESD AND overrode the per-queue "
77+
"'default' fallback (PR #11261) so it survives every prompt — works for "
78+
"core AND Kijai/Wan samplers. Set C2C_NO_FORCE_PREVIEW=1 to opt out.")
7879
except Exception as exc:
7980
PREVIEW_GUARD_STATUS = f"error ({type(exc).__name__})"
8081
log.warning("[c2c.preview] could not ensure previews: %s", exc)
@@ -146,14 +147,15 @@ def set_preview_method(method: str) -> dict:
146147
except Exception as exc: # noqa: BLE001
147148
return {"ok": False, "error": f"cli_args/latent_preview unavailable: {exc!r}"}
148149
try:
149-
if method in ("off", "none"):
150-
args.preview_method = LatentPreviewMethod.NoPreviews
151-
elif hasattr(latent_preview, "set_preview_method"):
152-
# Core's own setter understands "auto"/"latent2rgb"/"taesd".
153-
latent_preview.set_preview_method(method)
154-
else:
155-
args.preview_method = LatentPreviewMethod.Auto
156-
log.info("[c2c.preview] preview method set to %r by user.", method)
150+
# Resolve the target enum (enum values are "none"/"auto"/"latent2rgb"/"taesd").
151+
target = LatentPreviewMethod.NoPreviews if method in ("off", "none") \
152+
else LatentPreviewMethod(method if method in ("auto", "latent2rgb", "taesd") else "taesd")
153+
args.preview_method = target
154+
# CRUCIAL: also set default_preview_method — the value the per-queue override
155+
# (PR #11261) RESETS to every prompt. Without this the choice is wiped on the
156+
# next queue and the preview silently stops.
157+
latent_preview.default_preview_method = target
158+
log.info("[c2c.preview] preview method set to %r (+per-queue default) by user.", method)
157159
return {"ok": True, "method": method}
158160
except Exception as exc: # noqa: BLE001
159161
return {"ok": False, "error": repr(exc)}

0 commit comments

Comments
 (0)