ComfyUI Settings 페이지 쪽에 Custom Node의 행동을 조절하는 세팅을 넣고 싶어. (쓰레드 몇 개를 쓸 지 정수로 입력하게 하고 싶어) 가능할까?

가능해요. “Settings” 패널에 정수 입력을 하나 추가하고, 그 값을 커스텀 노드의 파라미터로 넘기면 됩니다. 흐름은 이렇게 잡으면 가장 단순합니다:

  1. 프론트엔드(웹 확장)에서 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

  1. 노드 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); }
        });
    });
  }
});
  1. 파이썬(백엔드) 커스텀 노드에서 입력 선언 및 사용
    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,)
  1. (대안) 커스텀 REST 라우트로 값 전달
    위 방식이 아니라 “글로벌 설정 → 서버로 즉시 푸시 → 노드가 전역 상태에서 읽기”가 필요하다면, 간단한 커스텀 라우트 를 만들어 프론트에서 설정 변경 시 POST로 서버에 저장하고, 노드 실행 때 모듈 전역에서 그 값을 참조하는 식도 가능해요. 커스텀 라우트 추가/호출 방법은 서버 문서에 예시가 있습니다. docs.comfy.org

요약(스텝별)

  1. JS 확장에서 type:"number" 설정을 등록한다 → Settings 패널에 노출되고 자동 저장됨. docs.comfy.org+1

  2. 노드 생성 시 해당 설정값을 노드의 threads 위젯(숨김/옵셔널)으로 주입한다. docs.comfy.org

  3. 파이썬 노드는 INPUT_TYPESthreads를 받고 실행 로직에서 활용한다(필요 시 VALIDATE_INPUTS로 체크). docs.comfy.org

  4. (특수 케이스) 전역 상태로 다루고 싶다면 커스텀 라우트로 서버에 보관/조회한다. docs.comfy.org

필요하시면 위 예시들을 실제 파일 구조에 맞춰 더 깔끔하게 정리해드릴게요. 원하는 노드 이름/폴더 구조가 있으면 바로 코드 맞춰 드릴게요!

Categories:

Updated: