概要
ComfyUI V3 スキーマは、ノードを定義するためのより整理された方法を導入しており、今後のノード機能の拡張は V3 スキーマでのみ追加されます。このガイドを使用して、既存の V1 ノードを新しい V3 スキーマに移行できます。核心概念
V3 スキーマは新しいバージョン管理された Comfy API 上に維持されており、将来のスキーマの改訂は下位互換性があります。comfy_api.latest は開発中の最新番号付き API を指し、latest の前のバージョンが「安定版」と見なせます。バージョン v0_0_2 は現在(かつ最初)の API バージョンであるため、警告なしに変更が行われる可能性があります。安定版と見なされると、latest が指すために新しいバージョン v0_0_3 が作成されます。
V1 対 V3 アーキテクチャ
V3 スキーマの主な変更点は以下の通りです:- 入力と出力が辞書ではなくオブジェクトで定義される。
- 実行メソッドは ‘execute’ という名前に固定され、クラスメソッドである。
def comfy_entrypoint()関数が ComfyExtension オブジェクトを返し、NODE_CLASS_MAPPINGS/NODE_DISPLAY_NAME_MAPPINGS の代わりに公開ノードを定義する。- ノードオブジェクトは ‘state’ を公開しない -
def __init__(self)はノードの関数で公開される内容に影響を与えない(すべてクラスメソッドであるため)。ノードクラスは実行前にもサニタイズされる。
V1 (レガシー)
V3 (モダン)
移行ステップ
V1 から V3 への移行は、ほとんどの場合単純で、構文の変更のみです。ステップ 1: ベースクラスの変更
すべての V3 スキーマノードはComfyNode から継承する必要があります。継承チェーンのトップに ComfyNode 親があれば、複数の継承層でも問題ありません。
V1:
ステップ 2: INPUT_TYPES を define_schema に変換
ノード ID、表示名、カテゴリなどのノードプロパティは、以前は辞書やクラスプロパティなどコードの異なる場所に割り当てられていましたが、現在はSchema クラスを介して一緒に管理されます。
define_schema(cls) 関数は、V1 の INPUT_TYPES(s) とほぼ同じ方法で Schema オブジェクトを返すことが期待されます。
サポートされているコア入力/出力型は comfy_api/{version} の _io.py に保存および文書化されており、デフォルトで io として名前空間化されています。入力/出力は辞書や文字列ではなくクラスで定義されるようになったため、カスタム型は独自のクラスを定義するか、io のヘルパー関数 Custom を使用することでサポートされます。
カスタム型については、以下のセクションで詳しく説明します。
型クラスには以下のプロパティがあります:
- 入力用の
class Input(例:Model.Input(...)) - 出力用の
class Output(例:Model.Output(...))。すべての型が出力としてサポートされているわけではないことに注意。 - 型の型ヒントを取得するための
Type(例:Model.Type)。一部の型ヒントは単にanyであり、将来更新される可能性があることに注意。これらの型ヒントは強制されず、有用なドキュメントとして機能するのみ。
ステップ 3: 実行メソッドの更新
V3 のすべての実行関数はexecute という名前で、クラスメソッドです。
V1:
ステップ 4: ノードプロパティの変換
以下にプロパティ名の例を示します。詳細はcomfy_api.latest._io のソースコードを参照してください。
| V1 プロパティ | V3 スキーマフィールド | 備考 |
|---|---|---|
RETURN_TYPES | Schema の outputs | Output オブジェクトのリスト |
RETURN_NAMES | Output の display_name | 出力ごとの表示名 |
FUNCTION | 常に execute | メソッド名が標準化 |
CATEGORY | Schema の category | 文字列値 |
OUTPUT_NODE | Schema の is_output_node | 布尔フラグ |
DEPRECATED | Schema の is_deprecated | 布尔フラグ |
EXPERIMENTAL | Schema の is_experimental | 布尔フラグ |
ステップ 5: 特殊メソッドの処理
V1 と同じ特殊メソッドがサポートされていますが、より明確にするために小文字化または完全に改名されています。使用方法は同じです。検証 (V1 → V3)
入力検証関数はvalidate_inputs に改名されました。
V1:
遅延評価 (V1 → V3)
check_lazy_status 関数はクラスメソッドになり、それ以外は同じです。
V1:
キャッシュ制御 (V1 → V3)
キャッシュ制御の機能は V1 と同じですが、元の関数名はどのように動作するかについて非常に誤解を招くものでした。 V1 のIS_CHANGED 関数は、戻り値がノードを前回実行したときと同じ場合、ノードの再実行をトリガーしないように信号を送ります。
したがって、関数 IS_CHANGED は fingerprint_inputs に改名されました。開発者による最も一般的な間違いの 1 つは、True を返すとノードが常に再実行されると考えることでした。True が常に返されるため、ノードを 1 回だけ実行してキャッシュ値を再利用するという逆の効果になります。
この関数を使用する例として、LoadImage ノードがあります。選択されたファイルのハッシュを返すため、ファイルが変更された場合、ノードは強制的に再実行されます。
V1:
ステップ 6: 拡張機能とエントリーポイントの作成
ノード ID をノードクラス/表示名にリンクするための辞書を定義する代わりに、ComfyExtension クラスと定義が期待される comfy_entrypoint 関数ができました。
将来、get_node_list を介してノード以外を登録するために、ComfyExtension により多くの関数が追加される可能性があります。
comfy_entrypoint は非同期でも同期でも構いませんが、get_node_list は非同期として定義する必要があります。
V1:
入力型リファレンス
ステップ 2 ですでに説明しましたが、ここに V1 対 V3 の型リファレンス比較をいくつか示します。完全な型宣言はcomfy_api.latest._io を参照してください。
基本型
| V1 型 | V3 型 | 例 |
|---|---|---|
"INT" | io.Int.Input() | io.Int.Input("count", default=1, min=0, max=100) |
"FLOAT" | io.Float.Input() | io.Float.Input("strength", default=1.0, min=0.0, max=10.0) |
"STRING" | io.String.Input() | io.String.Input("text", multiline=True) |
"BOOLEAN" | io.Boolean.Input() | io.Boolean.Input("enabled", default=True) |
control_after_generate
Int および Combo 入力は、各生成後に値を自動的に変更するための制御ウィジェットを追加するcontrol_after_generate パラメータをサポートします。V1 ではこれは単純な bool でしたが、V3 では明示的な制御のために io.ControlAfterGenerate 列挙型を使用できます。True を渡すことは io.ControlAfterGenerate.randomize と同等です。
| 値 | 動作 |
|---|---|
io.ControlAfterGenerate.fixed | 各生成後に値は同じまま。 |
io.ControlAfterGenerate.increment | 各生成後に値がステップ分増加。 |
io.ControlAfterGenerate.decrement | 各生成後に値がステップ分減少。 |
io.ControlAfterGenerate.randomize | 各生成後に値がランダム化。 |
ComfyUI 型
| V1 型 | V3 型 | 例 |
|---|---|---|
"IMAGE" | io.Image.Input() | io.Image.Input("image", tooltip="Input image") |
"MASK" | io.Mask.Input() | io.Mask.Input("mask", optional=True) |
"LATENT" | io.Latent.Input() | io.Latent.Input("latent") |
"CONDITIONING" | io.Conditioning.Input() | io.Conditioning.Input("positive") |
"MODEL" | io.Model.Input() | io.Model.Input("model") |
"VAE" | io.VAE.Input() | io.VAE.Input("vae") |
"CLIP" | io.CLIP.Input() | io.CLIP.Input("clip") |
Combo(ドロップダウン/選択リスト)
V3 の Combo 型には明示的なクラス定義が必要です。 V1:スキーマリファレンス
Schema データクラスは V3 ノードのすべてのプロパティを定義します。以下に利用可能なすべてのフィールドの完全なリファレンスを示します:
| フィールド | 型 | デフォルト | 説明 |
|---|---|---|---|
node_id | str | 必須 | ノードのグローバル一意 ID。カスタムノードは競合を避けるためにプレフィックス/サフィックスを追加すべき。 |
display_name | str | None | UI に表示される名前。設定されていない場合、node_id にフォールバック。 |
category | str | "sd" | 「ノードを追加」メニューのカテゴリ(例:"image/transform")。 |
description | str | "" | ノードにホバーしたときに表示されるツールチップ。 |
inputs | list[Input] | [] | 入力定義のリスト。 |
outputs | list[Output] | [] | 出力定義のリスト。 |
hidden | list[Hidden] | [] | 要求する隠し入力のリスト(隠し入力 を参照)。 |
search_aliases | list[str] | [] | 検索の代替名。同義語や改名後の旧名に有用。 |
is_output_node | bool | False | ノードを出力ノードとしてマークし、それとその依存関係を実行させる。 |
is_input_list | bool | False | True の場合、いくつのアイテムが渡されても、すべての入力が list[type] になる。 |
is_deprecated | bool | False | ノードを非推奨としてフラグ付けし、ユーザーに代替手段を探すよう通知。 |
is_experimental | bool | False | ノードを実験的としてフラグ付けし、変更される可能性があることをユーザーに警告。 |
is_dev_only | bool | False | 開発モードが有効でない限り、検索/メニューからノードを隠す。 |
is_api_node | bool | False | ノードを Comfy API サービスの API ノードとしてフラグ付け。 |
not_idempotent | bool | False | True の場合、ノードは常に再実行され、グラフ内の別の同一ノードからのキャッシュ出力を再利用しない。 |
enable_expand | bool | False | NodeOutput がノード拡張用の expand プロパティを含めることを許可。 |
accept_all_inputs | bool | False | True の場合、プロンプトからのすべての入力が schema で定義されていなくても kwargs として渡される。 |
共通入力パラメータ
すべての入力型はこれらの基本パラメータを共有します:| パラメータ | 型 | デフォルト | 説明 |
|---|---|---|---|
id | str | 必須 | 入力の一意識別子。execute での kwarg 名として使用。 |
display_name | str | None | UI に表示されるラベル。デフォルトは id。 |
optional | bool | False | 入力がオプションかどうか。 |
tooltip | str | None | ホバー時のツールチップテキスト。 |
lazy | bool | None | 入力を遅延評価としてマーク(遅延評価 を参照)。 |
raw_link | bool | None | True の場合、解決された値ではなく生のリンク情報を渡す。 |
advanced | bool | None | True の場合、入力は UI の「詳細」トグルの背後に隠される。 |
| パラメータ | 型 | デフォルト | 説明 |
|---|---|---|---|
default | 様々 | None | ウィジェットのデフォルト値。 |
socketless | bool | None | True の場合、入力ソケットを隠す(ウィジェットのみ、受信接続なし)。 |
force_input | bool | None | True の場合、ウィジェットをソケット入力として表示することを強制。 |
高度な機能
隠し入力
隠し入力は、プロンプトメタデータ、ノード ID、その他の内部値などの実行コンテキストへのアクセスを提供します。UI には表示されません。 V1 では、隠し入力はINPUT_TYPES の "hidden" キーとして宣言されました。V3 では、Schema の hidden パラメータを介して宣言され、その値は cls.hidden を介してアクセスされます。
V1:
| Hidden 列挙 | 説明 |
|---|---|
io.Hidden.unique_id | ノードの一意識別子。クライアント側の id と一致。 |
io.Hidden.prompt | クライアントから送信された完全なプロンプト。 |
io.Hidden.extra_pnginfo | 保存された .png ファイルのメタデータにコピーされる辞書。 |
io.Hidden.dynprompt | 実行中に変更される可能性のある DynamicPrompt インスタンス。 |
io.Hidden.auth_token_comfy_org | フロントエンドで ComfyOrg アカウントにサインインして取得したトークン。 |
io.Hidden.api_key_comfy_org | ComfyOrg によって生成された API キー。フロントエンドのサインインをスキップ可能。 |
一部の隠し値は Schema フラグに基づいて自動的に追加されます。出力ノード(
is_output_node=True)は自動的に prompt と extra_pnginfo を受け取ります。API ノード(is_api_node=True)は自動的に認証トークンを受け取ります。UI ヘルパー
V3 はui モジュールに組み込みの UI ヘルパーを提供し、プレビューやファイル保存などの一般的なパターンを処理します。これらを ui パラメータを介して io.NodeOutput に渡します。
プレビューヘルパー
プレビューヘルパーは一時的なファイルを保存し、ノード内表示用の UI データを返します。保存ヘルパー
保存ヘルパーは、適切なメタデータ埋め込みと共にファイルを出力ディレクトリに保存する方法を提供します。これらは通常、出力ノードで使用されます。生の UI 辞書を返す
ヘルパーがない UI データを返す必要がある場合、辞書を直接渡すことができます:出力ノード
副作用(ファイル保存など)を生成するノード用。V1 と同様、ノードを出力としてマークすると、ノードのコンテキストウィンドウにrun 再生ボタンが表示され、グラフの部分実行が可能になります。
カスタム型
クラス定義またはCustom ヘルパー関数のいずれかを介して、カスタム入力/出力型を作成します。
MultiType 入力
MultiType は、入力が複数の型を受け入れることを許可します。これは、ノードが同じ入力スロットを介して異なるデータ型で動作できる場合に有用です。
最初の引数(id)が文字列ではなく Input クラスのインスタンスである場合、その入力はオーバーライドされた値を持つウィジェットを作成するために使用されます。それ以外の場合、入力はソケットのみです。
MatchType(汎用型マッチング)
MatchType は型リンクされた入力と出力を作成します。ユーザーが特定の型を MatchType 入力に接続すると、同じテンプレートを共有するすべての他の入力と出力が自動的にその型に制約されます。これが、Switch や Create List などのノードが任意の型で動作する方法です。
動的入力
V3 は、ユーザーインタラクションに基づいて利用可能な入力を変更する動的入力型を導入します。これらの機能には V1 の同等物はありません。Autogrow
Autogrow は、ユーザーがより多く接続するにつれて自動的に増加する可変数の入力を作成します。2 つのテンプレートタイプがあります:
TemplatePrefix は番号付きプレフィックスを持つ入力を生成します(例:image0、image1、image2…):
DynamicCombo
DynamicCombo は、選択されたオプションに応じて異なる入力を表示/非表示にするドロップダウンを作成します。これは、異なるモードが異なるパラメータを必要とするノードに有用です。
非同期実行
V3 は非同期execute メソッドをサポートします。これは、I/O 操作、API 呼び出し、またはその他の非同期作業を実行するノードに有用です。execute を async として宣言するだけです:
ComfyAPI
ComfyAPI クラスは、進捗報告やノード置換登録などの ComfyUI ランタイムサービスへのアクセスを提供します。インポートしてインスタンスを作成します:
進捗報告
ノードのexecute メソッド内から実行進捗を報告します。進捗バーは ComfyUI インターフェースに表示されます。これは、V1 で comfy.utils.PROGRESS_BAR_HOOK を使用するパターンを置き換えます。
set_progress は preview_image パラメータとして PIL Image、ImageInput テンソル、または None を受け入れます。execute 内から呼び出されると、node_id は実行コンテキストから自動的に決定されます。