Fixed Impact Pack for new API of ComfyUI
何やら、恒例行事と化しつつあるトラブルです。
ComfyUI GITSScheduler エラー修正の解説
エラー概要
エラーメッセージ:
AttributeError: 'GITSScheduler' object has no attribute 'get_sigmas'発生場所:
ノード: `FaceDetailer` (comfyui-impact-pack)
使用スケジューラー: `GITSScheduler`
修正ファイル:
D:\USERFILES\ComfyUI\ComfyUI\custom_nodes\comfyui-impact-pack\modules\impact\special_samplers.py修正行: 667-671行目
エラーの理由
根本的な原因: APIの変更
ComfyUIは新しいバージョンでノードAPIの実装方法を大幅に変更しました。
旧API(従来の方式):
class SomeScheduler:
def get_sigmas(self, coeff, steps, denoise):
# 直接sigmasを返す
return [sigmas_tensor]新API(現在の方式):
class GITSScheduler(io.ComfyNode):
@classmethod
def execute(cls, coeff, steps, denoise):
# NodeOutputオブジェクトでラップして返す
return io.NodeOutput(torch.FloatTensor(sigmas))Impact Packの問題
Impact Pack(FaceDetailerノード)のコードは古いAPIを前提として書かれていたため、以下のコードが動作しませんでした。
エラー箇所(修正前):
# special_samplers.py 667行目
scheduler = nodes.NODE_CLASS_MAPPINGS['GITSScheduler']()
return scheduler.get_sigmas(coeff, steps, denoise)[0]
# ❌ GITSSchedulerにget_sigmasメソッドは存在しない修正したコードの詳細解説
修正ファイル:
D:\USERFILES\ComfyUI\ComfyUI\custom_nodes\comfyui-impact-pack\modules\impact\special_samplers.py修正箇所: 660-673行目
修正後のコード:
@staticmethod
def doit(coeff, denoise):
def f(model, sampler, steps):
if 'GITSScheduler' not in nodes.NODE_CLASS_MAPPINGS:
raise Exception("[Impact Pack] ComfyUI is an outdated version. Cannot use GITSScheduler.")
scheduler = nodes.NODE_CLASS_MAPPINGS['GITSScheduler']()
result = scheduler.execute(coeff, steps, denoise)
# Handle NodeOutput object from new API
if hasattr(result, 'args'):
return result.args[0]
return result[0]
return (f, )コードの各部分の説明
1. メソッド呼び出しの変更(667-668行目)
# 修正前
return scheduler.get_sigmas(coeff, steps, denoise)[0]
# 修正後
result = scheduler.execute(coeff, steps, denoise)`get_sigmas` → `execute` に変更
GITSSchedulerの実際のメソッドを呼び出す
2. NodeOutput対応(669-671行目)
if hasattr(result, 'args'):
return result.args[0]
return result[0]この処理が必要な理由:
新APIの`execute`メソッドは`NodeOutput`オブジェクトを返します。
GITSSchedulerのexecuteメソッド内部:
return io.NodeOutput(torch.FloatTensor(sigmas))NodeOutputの構造:
class NodeOutput:
def __init__(self, *args):
self.args = args # ← ここにsigmasが格納される処理の流れ:
`hasattr(result, 'args')`: NodeOutputオブジェクトか確認
新API → `True` → `result.args[0]`でsigmasを取得
旧API(互換性) → `False` → `result[0]`でアクセス
`result.args[0]`: NodeOutputから実際のテンソルを抽出
NodeOutput(torch.FloatTensor(sigmas))
└─ args = (torch.FloatTensor(sigmas),)
└─ args[0] = torch.FloatTensor(sigmas) ← これが欲しい値エラー発生から修正までの流れ
エラー発生時
FaceDetailer実行
↓
Impact Pack内部でGITSSchedulerを使用
↓
scheduler.get_sigmas() を呼び出し
↓
❌ AttributeError: 'GITSScheduler' object has no attribute 'get_sigmas'修正後
FaceDetailer実行
↓
Impact Pack内部でGITSSchedulerを使用
↓
scheduler.execute() を呼び出し
↓
NodeOutput(sigmas) を取得
↓
result.args[0] でsigmasを抽出
↓
✅ 正常に動作なぜこのようなエラーが起きたか
互換性の問題
ComfyUI本体: 新API(`io.ComfyNode`、`execute`メソッド)に移行
Impact Pack: 古いAPI(`get_sigmas`メソッド)を想定したまま
結果: メソッドが見つからずエラー
他のスケジューラーでは問題なかった理由
従来のスケジューラー(karras、exponentialなど)は古いAPI形式のままなので、Impact Packと互換性がありました。
GITSSchedulerは新APIで実装されたため、この問題が顕在化しました。
今後の注意点
ComfyUIを再起動してください(Pythonモジュールの変更を反映させるため)
他のカスタムノードでも同様の問題が発生する可能性があります
Impact Packの公式アップデートで正式に対応される可能性がありますが、それまではこの修正で動作します
修正の互換性
この修正は後方互換性を保っているため、他のスケジューラーにも影響しません。
# 新API(GITSScheduler)
if hasattr(result, 'args'): # ← True
return result.args[0]
# 旧API(その他のスケジューラー)
return result[0] # ← こちらが実行されるまとめ
修正ファイル:
D:\USERFILES\ComfyUI\ComfyUI\custom_nodes\comfyui-impact-pack\modules\impact\special_samplers.py問題: Impact PackがGITSSchedulerの古いメソッド(`get_sigmas`)を呼び出していた
解決: 新しいメソッド(`execute`)を呼び出し、NodeOutputから値を抽出するように修正
結果: FaceDetailerでGITSSchedulerが正常に使用可能になる
