ComfyUI-QuickMode
Custom node pack for embedding draft and production modes within ComfyUI workflows using if-statement-like conditional branching. (Description by CC)
ComfyUI-QuickMode
draft(下書き・高速反復用)と production(本番・高品質用)を、if 文の分岐と同じ 考え方でワークフロー内に組み込むためのカスタムノードパック。
設計思想
1 つの boolean 条件(production かどうか)をグラフ内に流し、各所の分岐点で 「if ノード」が on_true / on_false のどちらを実行するかを選ぶ。lazy 評価により、 選ばれなかった側の上流サブグラフはスケジュールされず、実際に計算されない。
ノード
QuickMode Condition (QuickModeCondition)
グラフ全体で唯一のスイッチ。production の boolean ウィジェットを持ち、その値と
文字列表現を出力する。
- 入力:
production(BOOLEAN, default False, label_on="production", label_off="draft") - 出力:
production(BOOLEAN),mode(STRING, "production" または "draft")
production 出力を、分岐させたい箇所の数だけ QuickMode If ノードの condition
入力へ配線する(1 出力から複数入力への分岐配線)。
QuickMode If (QuickModeIf)
任意型を通せる 2 入力の lazy if ノード。condition が true なら on_true、
false なら on_false を出力する。選ばれなかった側の入力は評価されない
(未接続でもエラーにならない)。選ばれた側が未接続の場合はエラーを送出する。
- 入力:
condition(BOOLEAN, forceInput — ウィジェットではなくソケット),on_true(any, lazy, optional),on_false(any, lazy, optional) - 出力:
output
配線例
例1: 解像度の切り替え
QuickMode Conditionを 1 つ配置する。EmptyLatentImageを 2 つ用意する: draft 用 512x512、production 用 1024x1024。QuickMode Ifを 1 つ配置し、Condition.production→If.conditionに接続。If.on_trueに production 用(1024x1024)の latent、If.on_falseに draft 用(512x512)の latent を接続する。If.output→KSampler.latent_imageに接続する。
例2: steps の切り替え
steps のような数値も同様に、2 系統の値ソース(例えば Primitive ノードや整数を
出力するノード 2 個)を用意し、別の QuickMode If の on_true / on_false に
接続する。Condition.production をこの If の condition にも接続し、
If.output を KSampler の steps 入力(ウィジェットを右クリックして
「Convert widget to input」した後)に接続する。
同じ QuickMode Condition の production 出力を、必要な数だけ複数の
QuickMode If に配線して構わない(ファンアウト)。すべての If が同じ条件で
連動して切り替わる。
フロントエンド機能
- アクションバーボタン: キャンバス上部のツールバーにトグルボタンを追加。
クリックでグラフ内の全
QuickMode Conditionノードのproductionを 一括で反転(draft ⇄ production)。 - キーボードショートカット:
Alt+Qでトグル。 - トップメニュー:
QuickModeメニューからToggle/Set draft/Set productionを実行可能。
切り替えは「その時点のグラフの状態を読んでから反転する」方式(read-then-flip) のため、内部状態とグラフの実際の値がズレることはない。
制限事項
- トグル操作はルートグラフ (
app.graph._nodes) のみを走査する。 サブグラフ内のQuickMode Conditionノードは対象外。
QuickMode Size Preset (QuickModeSizePreset)
EmptyLatentImage を解像度違いで何個も並べる代わりに、GUI からプリセットを
選ぶだけで width / height / latent をまとめて出力する 1 ノード。
- 入力:
preset(プリセット名のドロップダウン、またはcustom),swap(BOOLEAN, default False, label_on="swap WxH", label_off="normal"。 true にすると width/height を入れ替える),custom_width/custom_height(presetがcustomのときに使用、 INT, 64〜8192, step 8),batch_size(INT, 1〜64) - 出力:
width(INT),height(INT),latent(LATENT)
プリセット一覧(1024系):
1024x1024 正方形896x1152 縦長1152x896 横長832x1216 縦長+1216x832 横長+768x1344 縦長++1344x768 横長++
プリセット一覧(512 / 1280系。総ピクセル数は約1.64Mで統一):
512x512 正方形1280x1280 正方形 (1:1)1040x1552 縦長 (2:3)1104x1472 縦長 (3:4)1136x1424 縦長 (4:5)1472x1104 横長 (4:3)1520x1056 IMAX (1.43:1)1616x992 黄金比 (1.618:1)1648x992 ワイド (1.66:1)1680x960 ワイド (1.75:1)1696x960 ワイド (16:9)1728x928 ワイド (1.85:1)1952x832 シネスコ (2.35:1)1968x816 アナモルフィック (2.39:1)
custom を選んだ場合は custom_width / custom_height の値がそのまま
使われる。それ以外の未知の文字列が渡された場合はエラーを送出する。
swap が true の場合、preset または custom から解決した width/height を
入れ替えてから latent を生成する。例えば 9:16 の縦長スマホサイズが欲しい
場合は 1696x960 ワイド (16:9) を選び swap を有効にすると 960x1696 になる。
内部では EmptyLatentImage に解決済み(swap 適用後)の
width/height/batch_size を渡して latent を生成しているだけなので、
KSampler 以降の挙動は EmptyLatentImage を直接使う場合と変わらない。
ノード上には全プリセット分のワンクリックボタン(ノード定義から自動生成、
custom を除く)と、swap ウィジェットの値を反転させる「反転 ↕」ボタンが
あり、押すとそれぞれ即座に値が切り替わる。custom を使う場合は
ドロップダウンから選択する。
配線: width / height は i2i やリサイズ処理のサイズ指定に、latent
は KSampler.latent_image にそのまま接続する。
QuickMode If との組み合わせ: draft 用に小さめのプリセット
(832x1216 縦長+ など)を選んだ QuickMode Size Preset、production 用に
大きめのプリセット(1216x832 横長+ など)を選んだ別の
QuickMode Size Preset を用意し、両方の latent 出力を QuickMode If の
on_true / on_false に接続すれば、QuickMode Condition の切り替えだけで
解像度も一括で切り替わる。
テスト
tests/test_nodes.py は torch/comfy 本体なしで nodes.py を直接ロードし、
ノードロジック(Condition の出力、If の lazy 判定・分岐選択・未接続エラー、
AnyType の等価性、Size Preset のプリセット解決・custom モード・不明プリセット
時のエラー・latent 生成への委譲・swap による width/height 入れ替え)を
検証する。