Nodes/SOYLAB Comfy Router/SOYLAB Comfy Router
ComfyUI Node

SOYLAB Comfy Router

150+ Cloud Models, One Node, Your Own Comfy API Key

By soylab-edu·Created 2 days ago·Updated 2 days ago· 2
SOYLAB Comfy Router
    • IMAGE
    • VIDEO
    • AUDIO
    • RAW JSON
    • COST
    ◄api_key►
    ◄model▾►
    ◄advanced_json►

    What this node is, and why you'd actually wire it in

    SOYLAB Comfy Router is a local custom node that runs nothing locally. You drop it on the canvas, pick from a model list that currently holds 156 entries, and it makes an HTTP call to Comfy's Router API on api.comfy.org with your own API key. Seedance 2.5, Nano Banana 2, GPT Image 2, Veo, Runway Gen-4 - they all come back as ordinary IMAGE, VIDEO or AUDIO tensors you wire into a Save node. Unlike the official Partner Nodes, it takes a workspace key you generate yourself instead of a UI login, which makes it easier to keep out of a workflow you intend to share.

    The honest framing: this is the "no open weights exist, so there is no local option" category. You can't download Seedance or Veo at any VRAM - ByteDance ships every flagship product API-only (kg/entities/bytedance.json), like the rest of the closed frontier (docs/knowledge/closed-source-models.md). If you want that model in your graph next to your local upscaler, this node is the only door, and you pay per call for it. That's the objection the community has been making since before this pack existed (docs/knowledge/external-api-nodes.md). If you're here, you've already decided.

    How it works under the hood

    There's no SDK and no dependency tree: pyproject.toml declares dependencies = [] and the Router client is pure urllib - no pip install, no requirements.txt. Unusual for an API wrapper, and it means the install can't break your Python environment.

    Mechanically: the node looks up the model's spec in web/router-data.json (slot limits, resolutions, durations, providers, prices), assembles the model-specific request body - Seedance wants a content array with first_frame/reference_image roles, Gemini image a generationConfig - then POSTs to /v2/models/{model}/requests, polls /status, and downloads the result the moment it's ready, uploading to Comfy's signed /customers/storage flow first when a route needs a fetchable URL. The available inputs change with the model, because model is a DynamicCombo: pick Seedance and you get duration and mode controls, pick GPT Image 2 and you get quality instead. That's a V3-schema feature, which is why the README insists on a recent ComfyUI (docs/knowledge/comfyui-ecosystem.md covers the new backend authoring API).

    The inputs and outputs that matter

    Three top-level inputs:

    • api_key - leave it blank and the node reads API KEY.INI next to the pack instead. That's the one you want for anything you'll share.
    • model - the DynamicCombo, and everything else lives inside it: prompt, resolution, ratio, duration, seed, and the reference sockets (reference_images, reference_videos, reference_audios, plus first_frame/last_frame on Seedance). Unsupported fields are hidden per model, and mismatched combos are rejected before you spend credits.
    • advanced_json - a free-form object merged into the request for the rare native parameter the UI doesn't expose. It can't override the model path.

    Outputs are IMAGE, VIDEO, AUDIO, RAW JSON and COST. Only the one matching the model's output gets populated - the others come back empty - so don't wire all three into three savers and expect a party. RAW JSON is the untouched provider response, which is what you read when a run came back weird.

    Install

    ComfyUI Manager, search the pack title ComfyUI-soylab-router, or do it by hand:

    cd ComfyUI/custom_nodes
    git clone https://github.com/soylab-edu/ComfyUI-soylab-router.git
    

    Restart ComfyUI fully, then refresh the browser. Get a key from the Comfy developer platform and top up the workspace credits - nothing here is free. Paste it into api_key, or use the node's INI button, which creates API KEY.INI, opens it in your OS text editor, and never sends the contents to the browser.

    Where people get burned

    A key typed into the node can end up in a shared workflow. If you exported a workflow with the key in the field, clear it, rotate the key, and move the replacement into API KEY.INI (gitignored) - the reason that INI exists.

    Korean UI text is not a bug. Labels, tooltips and errors follow ComfyUI's language setting (Comfy.Locale); the default when nothing is set is Korean. If your errors read 프롬프트를 입력하세요, set your language rather than filing an issue.

    504 deadline_exceeded on an older build may still have been billed. Long video jobs once went out synchronously, and a timeout doesn't prove the provider didn't generate and charge. Current versions give up rather than silently falling back for long video, which is the safer failure.

    A missing COST value is not zero. Credits only appear when Router sends the X-Comfy-Credits-Used header; if COST says it can't be confirmed, check Comfy's Credit History before assuming the run was free.

    Router 400s are almost always your own selection - wrong mode, an image where a video reference is required, or a resolution the serving route doesn't support. Copy the request ID from the error before you clear the console; that's what support wants.

    Last thing: if you write "10 seconds, 1080p" in the prompt, that's a suggestion. The duration and resolution values in the node are the actual request.

    CategorySoylab/Comfy Router

    Inputs (3)

    NameTypeDefaultDescription
    api_keySTRING비워두면 API KEY.INI에서 읽습니다. 노드에 입력한 키는 워크플로에 저장될 수 있습니다.
    modelCOMBO156 options: [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], +150
    advanced_jsonSTRING선택한 모델의 추가 네이티브 JSON 파라미터. model 필드는 URL에서 지정됩니다.

    Outputs (5)

    NameTypeDescription
    IMAGEIMAGE—
    VIDEOVIDEO—
    AUDIOAUDIO—
    RAW JSONSTRING—
    COSTSTRING—