隠蔽入力
クライアント側で対応する入力またはウィジェットを作成する required 入力および optional 入力に加えて、カスタムノードがサーバーから特定の情報を要求することを可能にする 3 つの hidden 入力オプションがあります。
これらは、INPUT_TYPES の dict 内で hidden の値を返すことでアクセスされ、署名は dict[str,str] であり、PROMPT、EXTRA_PNGINFO、または UNIQUE_ID の 1 つ以上を含みます。
@classmethod
def INPUT_TYPES(s):
return {
"required": {...},
"optional": {...},
"hidden": {
"unique_id": "UNIQUE_ID",
"prompt": "PROMPT",
"extra_pnginfo": "EXTRA_PNGINFO",
}
}
UNIQUE_ID
UNIQUE_ID はノードの一意の識別子であり、クライアント側のノードの id プロパティと一致します。これは通常、クライアント - サーバー間の通信で使用されます(メッセージ を参照)。
PROMPT
PROMPT はクライアントからサーバーに送信された完全なプロンプトです。詳細な説明については プロンプトオブジェクト を参照してください。
EXTRA_PNGINFO は、保存されるすべての .png ファイルのメタデータにコピーされる辞書です。カスタムノードは、保存用の追加情報をこの辞書に格納できます(または下流のノードとの通信手段として)。
Comfy が disable_metadata オプション付きで起動された場合、このデータは保存されないことに注意してください。
DYNPROMPT
DYNPROMPT は comfy_execution.graph.DynamicPrompt のインスタンスです。これは PROMPT と異なり、ノード拡張 に応じて実行中に変更される可能性があります。
DYNPROMPT は高度なケース(カスタムノード内にループを実装するなど)でのみ使用すべきです。
柔軟な入力
カスタムデータ型
カスタムノード間でデータを渡したい場合、カスタムデータ型を定義すると役立ちます。これは、CHEESE のような大文字の一意の文字列をデータ型の名前として選択するだけで(ほぼ)完了します。
次に、ノードの INPUT_TYPES と RETURN_TYPES で CHEESE を使用できます。Comfy クライアントは CHEESE 出力が CHEESE 入力に接続されることのみを許可します。CHEESE は任意の Python オブジェクトにできます。
注意すべき点は、Comfy クライアントは CHEESE について知らないため(CHEESE 用のカスタムウィジェットを定義しない限り、これは別の話題です)、それをウィジェットではなく入力として強制する必要があることです。これは、入力オプション辞書内の forceInput オプションで行えます:
@classmethod
def INPUT_TYPES(s):
return {
"required": { "my_cheese": ("CHEESE", {"forceInput":True}) }
}
ワイルドカード入力
@classmethod
def INPUT_TYPES(s):
return {
"required": { "anything": ("*",{})},
}
@classmethod
def VALIDATE_INPUTS(s, input_types):
return True
フロントエンドでは、入力を任意のソースに接続できることを示すために * を使用できます。これはバックエンドで正式にサポートされていないため、VALIDATE_INPUTS 関数で input_types という名前のパラメータを受け入れることで、型のバックエンド検証をスキップできます。(詳細については VALIDATE_INPUTS を参照。)
渡されたデータを解釈するのはノードの役割です。
動的に作成された入力
入力がクライアント側で動的に作成される場合、それらを Python ソースコードで定義することはできません。このデータにアクセスするには、Comfy が任意の名前でデータを渡せるようにする optional 辞書が必要です。Comfy サーバーは
class ContainsAnyDict(dict):
def __contains__(self, key):
return True
...
@classmethod
def INPUT_TYPES(s):
return {
"required": {},
"optional": ContainsAnyDict()
}
...
def main_method(self, **kwargs):
# 動的に作成された入力データは辞書 kwargs 内になります
この Python の小技巧について、rgthree さんに感謝します!