ComfyUI Custom Node 설정
ComfyUI Settings 페이지 쪽에 Custom Node의 행동을 조절하는 세팅을 넣고 싶어. (쓰레드 몇 개를 쓸 지 정수로 입력하게 하고 싶어) 가능할까?
가능해요. “Settings” 패널에 정수 입력을 하나 추가하고, 그 값을 커스텀 노드의 파라미터로 넘기면 됩니다. 흐름은 이렇게 잡으면 가장 단순합니다:
- 프론트엔드(웹 확장)에서 Settings 항목 추가
-
web/extensions/your_extension.js같은 파일에서 ComfyUI 확장을 등록하고type: "number"설정을 만듭니다. -
ComfyUI는 확장이 등록한
settings정의를 자동으로 설정 패널에 보여주고 값을 저장/로드합니다. 값은ComfyUI/user/default/comfy.settings.json에 저장됩니다. docs.comfy.org+1
js
// web/extensions/my_node_settings.js
import { app } from "../../scripts/app.js";
app.registerExtension({
name: "MyNode.Settings",
settings: [
{
id: "mynode.threads", // 고유 ID (카테고리.섹션 형태 권장)
name: "Threads for MyNode",
type: "number",
defaultValue: 4,
tooltip: "커스텀 노드가 사용할 스레드 수",
attrs: { min: 1, max: 128, showButtons: true } // PrimeVue props 전달 가능
},
],
});
- 어디서든 현재 값을 읽을 땐:
js
const threads = app.extensionManager.setting.get("mynode.threads");
(Settings 정의/읽기 API는 공식 문서에 명시되어 있습니다.) docs.comfy.org
- 노드 UI에 값 주입(선택)
가장 쉬운 연동법은 노드에 “숨김 입력(hidden)” 또는 “optional 위젯”을 하나 두고, 노드가 캔버스에 생길 때 Settings 값을 그 위젯에 밀어넣는 겁니다. 이렇게 하면 워크플로 저장/재실행 시 값이 함께 저장 되어 예측 가능해집니다.
js
// (같은 파일에서) 노드가 생성될 때 위젯 값 세팅
app.registerExtension({
name: "MyNode.ApplySettings",
async beforeRegisterNodeDef(nodeType, nodeData, appInstance) {
if (nodeData?.name !== "MyThreadedNode") return;
const orig = nodeType.prototype.onNodeCreated;
nodeType.prototype.onNodeCreated = function() {
orig?.apply(this, arguments);
const threads = app.extensionManager.setting.get("mynode.threads");
// 위젯 이름은 파이썬 INPUT_TYPES에 맞춰야 함 (아래 예시 기준 "threads")
const w = this.widgets?.find(w => w.name === "threads");
if (w && typeof threads === "number") w.value = threads;
};
// 설정이 바뀌면 캔버스 위 노드들의 위젯도 반영하고 싶다면:
app.extensionManager.setting.onChange?.(("mynode.threads"), (nv) => {
appInstance.graph._nodes
.filter(n => n.type === "MyThreadedNode")
.forEach(n => {
const w = n.widgets?.find(w => w.name === "threads");
if (w) { w.value = nv; n.setDirtyCanvas(true, true); }
});
});
}
});
- 파이썬(백엔드) 커스텀 노드에서 입력 선언 및 사용
ComfyUI는 입력 타입/제약을INPUT_TYPES로 선언하고 실행 시 해당 값을 함수 인자로 넣어줍니다. 숨김 입력도 지원합니다. docs.comfy.org
# custom_nodes/my_threaded_node.py
class MyThreadedNode:
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
# 다른 입력들...
},
"hidden": {
# Settings에서 꽂아줄 스레드 수
"threads": ("INT", {"default": 4, "min": 1, "max": 128}),
},
# 또는 optional 위젯으로 노출하고 싶다면 "required" 대신 "optional"에 넣어도 됨
}
RETURN_TYPES = ("IMAGE",)
FUNCTION = "run"
CATEGORY = "MyNodes"
# 필요하면 유효성 체크
@classmethod
def VALIDATE_INPUTS(cls, threads=4, **kwargs):
return 1 <= int(threads) <= 128 or "threads는 1~128 사이여야 합니다."
# 참고: VALIDATE_INPUTS 동작은 백엔드 섹션 문서에 설명되어 있습니다. :contentReference[oaicite:3]{index=3}
def run(self, threads=4, **kwargs):
threads = int(threads)
# 예: ThreadPoolExecutor로 병렬 처리
from concurrent.futures import ThreadPoolExecutor
with ThreadPoolExecutor(max_workers=threads) as ex:
# ex.submit(...) 병렬 작업들
pass
# 결과 리턴
return (some_image_tensor,)
- (대안) 커스텀 REST 라우트로 값 전달
위 방식이 아니라 “글로벌 설정 → 서버로 즉시 푸시 → 노드가 전역 상태에서 읽기”가 필요하다면, 간단한 커스텀 라우트 를 만들어 프론트에서 설정 변경 시 POST로 서버에 저장하고, 노드 실행 때 모듈 전역에서 그 값을 참조하는 식도 가능해요. 커스텀 라우트 추가/호출 방법은 서버 문서에 예시가 있습니다. docs.comfy.org
요약(스텝별)
-
JS 확장에서
type:"number"설정을 등록한다 → Settings 패널에 노출되고 자동 저장됨. docs.comfy.org+1 -
노드 생성 시 해당 설정값을 노드의
threads위젯(숨김/옵셔널)으로 주입한다. docs.comfy.org -
파이썬 노드는
INPUT_TYPES로threads를 받고 실행 로직에서 활용한다(필요 시VALIDATE_INPUTS로 체크). docs.comfy.org -
(특수 케이스) 전역 상태로 다루고 싶다면 커스텀 라우트로 서버에 보관/조회한다. docs.comfy.org
필요하시면 위 예시들을 실제 파일 구조에 맞춰 더 깔끔하게 정리해드릴게요. 원하는 노드 이름/폴더 구조가 있으면 바로 코드 맞춰 드릴게요!