숨겨진 입력
클라이언트 측에서 해당 입력이나 위젯을 생성하는 required 및 optional 입력과 함께,
커스텀 노드가 서버로부터 특정 정보를 요청할 수 있도록 하는 세 가지 hidden 입력 옵션이 있습니다.
이러한 옵션은 INPUT_TYPES 딕셔너리에 hidden 값을 반환하여 접근하며, 시그니처는 dict[str,str]로, PROMPT, EXTRA_PNGINFO, 또는 UNIQUE_ID 중 하나 이상을 포함합니다.
@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는 임의의 파이썬 객체일 수 있습니다.
유의할 점은 Comfy 클라이언트가 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 참조.) 노드가 전달된 데이터를 이해하는 것은 노드의 몫입니다.
동적으로 생성된 입력
클라이언트 측에서 입력이 동적으로 생성되는 경우, 이를 파이썬 소스 코드에서 정의할 수 없습니다. 이러한 데이터에 접근하려면 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에 들어갑니다
rgthree님께 이 파이썬 트릭에 대해 감사드립니다!