ComfyUI Model Batch Downloader

Hugging Face、Civitai、通常のHTTP URLから複数のモデルファイルをaria2cで取得し、同じComfyUIキュー内でロードするカスタムノードです。Illustrious、Anima、Krea 2で使うチェックポイント、diffusion model、text encoder、VAE、LoRAを対象にしています。

既存ファイルは上書きせず、チェックサム検証も行いません。.aria2サイドカーがある未完了ファイルは継続ダウンロードします。

必要なもの

  • ComfyUI
  • Python 3.10以上
  • aria2cコマンド(ComfyUIを起動する環境のPATHから実行できること)

aria2cはこのリポジトリには同梱せず、自動インストールもしません。

インストール

ComfyUIのディレクトリで実行します。

git clone <repository-url> custom_nodes/ComfyUI-Model-Batch-Downloader

その後、ComfyUIを再起動してください。追加のPythonパッケージはありません。

認証

トークンはノードやワークフローJSONに入力せず、ComfyUIを起動するプロセスの環境変数に設定します。

サービス 環境変数
Hugging Face HF_TOKEN
Civitai CIVITAI_API_TOKEN

PowerShellの例:

$env:HF_TOKEN = "hf_..."
$env:CIVITAI_API_TOKEN = "..."
python main.py

Linuxの例:

export HF_TOKEN='hf_...'
export CIVITAI_API_TOKEN='...'
python main.py

トークンは対応ドメインにだけ付与され、manifest、DOWNLOAD_RESULT、画面の状態には保存されません。

ノード

  • Model Download Batch: 追加・削除ボタンのある一覧UI。内部ではcanonical JSONを保持します。
  • Model Download Batch (JSON): 同じコアを使うJSON直接入力版です。
  • Load Checkpoint (Downloaded): Illustriousなどの一体型checkpointをロードします。
  • Load Diffusion Model (Downloaded): AnimaやKrea 2のdiffusion modelをロードします。
  • Load CLIP (Downloaded): ComfyUI標準のLoad CLIPと同じtypeの選択肢を使用します。krea2、ideogram4、flux2などを選択できます。
  • Load VAE (Downloaded): Qwen Image VAEなどをロードします。
  • Load LoRA (Downloaded): 対応LoRAをロードします。model-only LoRAではstrength_clipを0にできます。

2種類のdownload nodeは、任意型のpassthroughを入力と出力に持ちます。既存の接続途中に挿入できるほか、未接続でもoutput nodeとして実行できます。取得結果を使う場合はdownload_resultを対応するDownloaded Loaderへ接続し、manifestのidを指定します。

ダウンロード進捗

実行中のdownload nodeには、KSamplerと同じComfyUI標準の進捗バーが表示されます。複数ファイルの場合もバーはリセットせず、バッチ全体を0~100%として進みます。

ComfyUIのログには約1秒ごとに現在のID、進捗率、速度、ETAを表示します。

[Model Batch Downloader] anima_model 42%  18.3MiB  ETA 31s

認証トークンと認証済みURLはログへ出力しません。

Manifest

ルートは1件以上のJSON配列です。各項目で使えるフィールドは次のとおりです。

フィールド 必須 内容
url はい HTTP/HTTPS URL
model_type はい checkpoints, diffusion_models, text_encoders, vae, loras
subfolder いいえ 対応するComfyUI model root配下の保存先
filename いいえ 省略時はレスポンスまたはURLから解決
id いいえ 省略時はfilenameの最後の拡張子を除いた値
split いいえ 1~16、既定値16

Anima向けの例:

[
  {
    "url": "https://huggingface.co/owner/repo/resolve/main/anima-model.safetensors",
    "model_type": "diffusion_models",
    "subfolder": "anima",
    "id": "anima_model",
    "split": 16
  },
  {
    "url": "https://huggingface.co/owner/repo/resolve/main/qwen3-0.6b.safetensors",
    "model_type": "text_encoders",
    "subfolder": "anima",
    "id": "anima_encoder"
  },
  {
    "url": "https://huggingface.co/owner/repo/resolve/main/qwen-image-vae.safetensors",
    "model_type": "vae",
    "id": "qwen_vae"
  }
]

download_resultを3つの対応loaderへ接続し、それぞれanima_model、anima_encoder、qwen_vaeを指定します。

URLがmodel.fp16.safetensorsへ解決され、idが省略されていればIDはmodel.fp16です。URL末尾からfilenameを判断できないCivitai APIなどでは、一覧UIのResolve filename / IDで事前解決できます。JSON版で安定して参照したい場合は明示的なidを推奨します。

既存ファイルとエラー

  • 完成済みファイルがあれば、aria2を起動せずskippedにします。
  • <filename>.aria2があればaria2の継続モードで再開します。
  • 複数項目は順番に処理し、1件が失敗しても残りを試します。最後に失敗をまとめて報告します。
  • 保存先はComfyUIが設定している各model rootの配下だけに制限されます。
  • 同じIDや同じ保存先がmanifest内で重複するとエラーになります。

トラブルシューティング

  • aria2c is required: aria2c --versionがComfyUIと同じ環境で通るか確認し、ComfyUIを再起動してください。
  • Hugging Faceで401/403: HF_TOKENとリポジトリへのアクセス権を確認してください。
  • Civitaiで401/403: CIVITAI_API_TOKENを確認してください。
  • duplicate id: どちらかに一意のidを明示してください。
  • category mismatch: IDのmodel_typeに対応するDownloaded Loaderへ接続してください。

開発時の確認

uv run --with pytest --with aiohttp --no-project pytest tests -v
node --test tests-js/manifest_state.test.mjs
uvx ruff check .
S
Description
No description provided
Readme MIT
96 KiB
Languages
Python 91.3%
JavaScript 8.7%