ComfyUI の workflow は、見た目の複雑さに反して、基本的には一本道です。素材を入れると、加工されて出てくる。それだけです。

ただ、一度加工したものを、もう一度同じように加工したくなることがあります。

同じ workflow を直列につなげていけばできなくはありませんが、あまり美しくはないですね。

そんなときに使えるのが ループ処理 です。

基本のループ処理

Start LoopとEnd Loop

ループは Start LoopEnd Loop のペアで作ります。この 2 つに挟まれた部分が、繰り返し実行されます。

loop_simple.json
  • num_iterations:繰り返す回数。この 1 回ぶんの繰り返しを iteration と呼ぶ
  • iteration_index:今が何回目の iteration なのか、という値

この workflow なら、iteration_index は 0 から始まるので、0 * 101 * 10 … と進んで、最後の 3 * 10 の結果だけが出力される、といった具合です。

accumulateでループ中の結果をまとめて取得する

loop_simple_accumulate.json

通常、End Loop から出てくるのは、最後の iteration の output_value だけです。

accumulate を有効にすると、途中の iteration の分も捨てずに、すべてが List としてまとめて出力されます。

Simple / For / List

mode を切り替えると、繰り返し方を変えられます。

  • Simple:指定した回数だけ繰り返す
  • For:開始値、終了値、step を指定して繰り返す。iteration_index にはその値がそのまま出る
    • Simple は、開始 0、step 1 の For といえますね
  • List:List の要素数だけ繰り返す

言葉だと分かりにくいので、iteration_index をそのまま出力してみましょう。

loop_simple_for_list.json
  • Simple(4 回):0, 1, 2, 3
  • For(開始 2 / 終了 14 / step 3):2, 5, 8, 11
  • List(要素 3 つ):0, 1, 2

List だけ少し気をつける必要があります。iteration_index は何周目かを表すだけなので、List に何を入れようと 0, 1, 2 … です。

入れたものを使いたければ、list_item から取り出します。この例なら 11, 3, 8 ですね。

画像生成を4回繰り返してみる

数字ばかり眺めていても面白くないので、画像生成と組み合わせてみましょう。

iteration_index を、そのまま seed として使います。

loop_krea_2.json

Simple = 4 なので、seed 0 から seed 3 までの 4 枚が出てきます。

ただ、これだけならループを使う必要はあまりありません。List 処理や Queue の繰り返しでも、同じことはできます。

ループの本当の強みは、前回の結果を次の iteration へ戻せる ことにあります。


前の結果を次のループへ渡す

current_iteration_value と next_iteration_value

ループの中で作ったデータを next_iteration_value につなぐと、その値が Start Loop へ戻ります。次の iteration では、それを current_iteration_value から受け取れます。

一つ注意点で、一番最初の iteration では、戻してくれる前の結果がありません。

そこで使うのが initial_iteration_value です。名前のとおり、一番最初に使う値を決めておけます。

loop_iteration_value.json

最初の値 5 が 10 倍されて next_iteration_value に渡り、それが次の iteration でまた 10 倍され… というのが繰り返されます。

next_iteration_value は、値を次へ渡すだけのものです。ループの外へ結果を持ち出したいときは、output_value にも忘れずにつないでおきます。

複数の値をまとめて回す

色々と組んでいると、データを 2 つ 3 つまとめて次の iteration へ送りたくなってきますが、これもちゃんとできますよ。

Create List でひとまとめにして送り、受け取った側は Get Item From List で 1 つずつ取り出して使います。

loop_iteration_value_fibonacci.json

フィボナッチ数列を作ってみましょう。前の 2 つを足して次の数にする、というものですね。

[0, 1] から始めて、a + b を計算し、次の iteration へは [b, a + b] を渡します。

[0, 1] → [1, 1] → [1, 2] → [2, 3] → [3, 5] → …

ここでは INT 同士をひとまとめにしていますが、IMAGEBOOLEAN のように、型が違っていても大丈夫です。

Previewなどをループ内で実行する

Preview はその名の通り見るだけなので、以下のようにつなぎたくなります… が、残念ながらエラーになります。

loop_krea_2_preview_invalid.json

細かい理由は省きますが、ループの中のノードは、最終的にすべて End Loop へたどり着かないといけません。Preview Image がぶら下がったままだと、ループとして閉じないわけです。

とはいえ、その場で見たいだけで、出力するつもりはないこともあります。そんなときのために用意されているのが End Looptermination です。

loop_krea_2_preview_termination.json

とりあえずループとして成り立たせるためのゴミ箱、くらいに思ってもらえば大丈夫です。


少し複雑な処理の例

より実践的な workflow をいくつか組んでみましょう。なにか良い使い方が思いつくかもしれません。

Generate Textを使った柔軟なループ処理

ループ処理というと、同じような処理の繰り返しを思い浮かべてしまいますが、そこに創造性を足す方法があります。MLLM です。

MLLM と画像編集を組み合わせて、AI さんに次々と編集指示を考えてもらいましょう。

loop_flux_2_klein_9b_qwen3_5.json

ベースは FLUX.2 [klein] を使った画像編集の workflow です。

ただ、どんな編集をするか?は MLLM に考えてもらいます。今回は画像を見て、服装の中から一つ選び、別のアイテムに置き換えます。

少しこだわって、MLLM には画像だけでなく、過去に自分が作ったプロンプトの履歴も渡します。これで、同じような指示を繰り返す事故を防げます。

画像とプロンプト履歴をListに

編集する画像と、プロンプト履歴を List にまとめてループへ渡します。

とはいえ 1 回目に履歴はまだありません。ひとまず null という当たり障りのないテキストを入れておきます。

画像を取り出す

List の中身は [画像, 履歴] です。

Get Item From Listindex0 にすると画像が取り出せるので、Generate Text と FLUX.2 [klein] へ渡します。

MLLMへの指示文を作る

基本的には「画像の人物を見て、服装を一箇所変えるプロンプトを作れ」という内容を MLLM に送ります。

それに加えて、Format Text で、履歴と今が何ターン目なのかを教えます。

履歴に足して、またListに

今回 MLLM が作ったプロンプトを、これまでの履歴の後ろに足します。

それと編集後の画像を、また List にまとめて次の iteration へ送ります。

出力例

input
input
output1
output1
output2
output2
output3
output3
output4
output4

MiniMax H3でPrompt Listを使った連続I2V

最新の動画生成モデルであっても、5〜15 秒ほどの動画しか作れません。

そこでループ処理の登場です。5 秒の動画でも 12 回繰り返せば 1 分になりますからね!

loop_minimax_h3_i2va.json

MiniMax H3 の I2VA で 5 秒ずつ生成し、それを N 回繰り返します。

List モードでプロンプトを 1 つずつ流しつつ、生成した動画の最後のフレームを次の iteration へ渡します。

スタート画像

最初のフレームに使う画像は、initial_iteration_value に入れておきます。

プロンプト(List)

5 秒の動画を、List の要素数だけ繰り返します。

0〜5 秒、5〜10 秒 … といった具合に、1 本ずつ完結したプロンプトを N 個用意し、List にまとめて Start Loop へ入力します。

最後のフレームを次へ

出てきた動画の最後のフレームを、次の iteration の 1 枚目に使います。

出力動画

あとで全部つなげるので accumulate を有効にしておきます。

そのままだと次の動画の 1 枚目とダブってしまうため、最後の 1 フレームを捨ててから output_value へつなげます。

Concatenate Video

4 つのプロンプトで生成された動画が、List でまとめて出てきます。

これを一本にするのが Concatenate Video です。

video0 にしかつないでいないので変な感じがしますが、これでつながります。

出力例

output

正直にいうと、実践で使うにはこの workflow は力不足です。

I2VA が持っている手がかりは、1 フレーム目の画像だけです。ところが最後のフレームには、肝心の人物も背景も写っていないことがあります。実際、出力を見ると女性が途中で別人になっていますね。Ref2VA で女性の画像を渡したほうがよさそうです。

動画同士のつなぎ目も気になりますね。最初の数秒はのりしろとして前の動画のままにして、残りを生成する、いわゆる Extension 的な処理ができればいいんですが、シンプルなノードが見当たらないため少し妥協しています。