File size: 12,233 Bytes
9c98083
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
import traceback

NODE_CLASS_MAPPINGS = {}
NODE_DISPLAY_NAME_MAPPINGS = {}
WEB_DIRECTORY = "./web"


def register_node(class_name, node_class, display_name):
    NODE_CLASS_MAPPINGS[class_name] = node_class
    NODE_DISPLAY_NAME_MAPPINGS[class_name] = display_name


# 1. Wan Native Resize (์ด๋ฏธ์ง€ -> WAN ํ•ด์ƒ๋„ ๋ฆฌ์‚ฌ์ด์ฆˆ, ๋น„์œจ ์œ ์ง€ + ์ •๋ ฌ)
try:
    from .wan_resizer import WanNativeResize_Dolphin
    register_node("WanNativeResize_Dolphin", WanNativeResize_Dolphin,
                  "๐Ÿฌ Wan Native Resize (Dolphin)")
except Exception:
    print(f"\nโŒ [Dolphin] Wan Resize ๋กœ๋“œ ์‹คํŒจ:\n{traceback.format_exc()}")

# 2. Story Splitter V32 (ํ…์ŠคํŠธ ์„œ์‚ฌ -> 4์ƒท ํ”„๋กฌํ”„ํŠธ ๋ถ„๋ฐฐ)
try:
    from .promp_logic_v32_story import DolphinMultiActionPromptNode_V32
    register_node("DolphinMultiActionPromptNode_V32", DolphinMultiActionPromptNode_V32,
                  "๐Ÿฌ Dolphin Story Splitter V32")
except Exception:
    print(f"\nโŒ [Dolphin] V32 Story Splitter ๋กœ๋“œ ์‹คํŒจ:\n{traceback.format_exc()}")

# 3. Architect V16 (ํด๋ฆฝ๋ณ„ LoRA -> TripleKSampler, model-only)
try:
    from .arch_logic_v16 import DolphinTripleLoraMatrix as DolphinArchitectV16
    register_node("DolphinArchitectV16", DolphinArchitectV16,
                  "๐Ÿฌ Dolphin Architect V16")
except Exception:
    print(f"\nโŒ [Dolphin] Architect V16 ๋กœ๋“œ ์‹คํŒจ:\n{traceback.format_exc()}")

# 4. Cinematic Director (์˜ฌ์ธ์›: ์Šคํ† ๋ฆฌ ๋ถ„๋ฐฐ + ํด๋ฆฝ๋ณ„ ๋กœ๋ผ + ํŠธ๋ฆฌ๊ฑฐ ์ฃผ์ž…)
try:
    from .dolphin_director import DolphinCinematicDirector
    register_node("DolphinCinematicDirector", DolphinCinematicDirector,
                  "๐ŸŽฌ Dolphin Cinematic Director (All-in-One)")
except Exception:
    print(f"\nโŒ [Dolphin] Cinematic Director ๋กœ๋“œ ์‹คํŒจ:\n{traceback.format_exc()}")

# 5. Vision Director (์ด๋ฏธ์ง€ ์ธ์‹ + ํ•„์ˆ˜๋™์ž‘ + ํด๋ฆฝ๋‹น ๋กœ๋ผ 4๊ฐœ)
try:
    from .dolphin_vision_director import DolphinVisionDirector
    register_node("DolphinVisionDirector", DolphinVisionDirector,
                  "๐ŸŽฌ๐Ÿ‘ Dolphin Vision Director (Imageโ†’4Clips)")
except Exception:
    print(f"\nโŒ [Dolphin] Vision Director ๋กœ๋“œ ์‹คํŒจ:\n{traceback.format_exc()}")

# 6. Architect V15 (arch_logic_v16 ์ด์ „ ๊ตฌ๋ฒ„์ „, model_base/high/low + clip ๊ฐœ๋ณ„ ์ž…๋ ฅ)
try:
    from .arch_logic import DolphinArchitectV15
    register_node("DolphinArchitectV15", DolphinArchitectV15,
                  "๐Ÿฌ Dolphin Architect V15 (legacy)")
except Exception:
    print(f"\nโŒ [Dolphin] Architect V15 ๋กœ๋“œ ์‹คํŒจ:\n{traceback.format_exc()}")

# 7. Story Splitter V28 (V32 ์ด์ „ ๊ตฌ๋ฒ„์ „, stitch ๋ฐฉ์‹)
try:
    from .promp_logic_v28_stitch import DolphinMultiActionPromptNode_V28
    register_node("DolphinMultiActionPromptNode_V28", DolphinMultiActionPromptNode_V28,
                  "๐Ÿฌ Dolphin Story Splitter V28 (legacy)")
except Exception:
    print(f"\nโŒ [Dolphin] V28 Story Splitter ๋กœ๋“œ ์‹คํŒจ:\n{traceback.format_exc()}")

# 8. Story Splitter V30 (V32 ์ด์ „ ๊ตฌ๋ฒ„์ „)
try:
    from .promp_logic_v30_story import DolphinMultiActionPromptNode_V30
    register_node("DolphinMultiActionPromptNode_V30", DolphinMultiActionPromptNode_V30,
                  "๐Ÿฌ Dolphin Story Splitter V30 (legacy)")
except Exception:
    print(f"\nโŒ [Dolphin] V30 Story Splitter ๋กœ๋“œ ์‹คํŒจ:\n{traceback.format_exc()}")

# 9. Prompt V32 Vision (promp_logic_v32_story.py์˜ DolphinMultiActionPromptNode_V32์™€
#    ํด๋ž˜์Šค๋ช…์ด ๋™์ผํ•ด์„œ ์ถฉ๋Œ โ€” ๋“ฑ๋ก ํ‚ค/ํด๋ž˜์Šค๋ช…์„ _Vision์œผ๋กœ ๊ตฌ๋ถ„ํ•ด์„œ ๋‘˜ ๋‹ค ์‚ด๋ฆผ)
try:
    from .promp_logic_v32_vision import DolphinMultiActionPromptNode_V32 as DolphinMultiActionPromptNode_V32_Vision
    register_node("DolphinMultiActionPromptNode_V32_Vision", DolphinMultiActionPromptNode_V32_Vision,
                  "๐Ÿฌ Dolphin Prompt V32 Vision (legacy)")
except Exception:
    print(f"\nโŒ [Dolphin] V32 Vision ๋กœ๋“œ ์‹คํŒจ:\n{traceback.format_exc()}")


# 10. Match Image & Mask Size (์ธํŽ˜์ธํŠธ ๋ธ”๋ Œ๋“œ์šฉ: ์ด๋ฏธ์ง€/๋งˆ์Šคํฌ๋ฅผ ์ฐธ์กฐ ์ด๋ฏธ์ง€ ์‹ค์ œ ํฌ๊ธฐ์— ๋งž์ถค)
try:
    from .match_size import MatchImageAndMaskSize_Dolphin
    register_node("MatchImageAndMaskSize_Dolphin", MatchImageAndMaskSize_Dolphin,
                  "๐Ÿฌ Match Image & Mask Size (Dolphin)")
except Exception:
    print(f"\nโŒ [Dolphin] Match Image & Mask Size ๋กœ๋“œ ์‹คํŒจ:\n{traceback.format_exc()}")


# 11. Mask-Region Color Match (์ธํŽ˜์ธํŠธ ๋งˆ์Šคํฌ ์˜์—ญ๋งŒ ๊ตญ์†Œ์ ์œผ๋กœ ์ƒ‰๋ณด์ •)
try:
    from .mask_region_color_match import MaskRegionColorMatch_Dolphin
    register_node("MaskRegionColorMatch_Dolphin", MaskRegionColorMatch_Dolphin,
                  "๐Ÿฌ Mask-Region Color Match (Dolphin)")
except Exception:
    print(f"\nโŒ [Dolphin] Mask-Region Color Match ๋กœ๋“œ ์‹คํŒจ:\n{traceback.format_exc()}")


# 12. Prompt Director (Vision Director์™€ ๋™์ผํ•œ ๋น„์ „+LLM ์—”์ง„, MODEL/LoRA ์ „๋ถ€ ์ œ๊ฑฐ -
#     ํ”„๋กฌํ”„ํŠธ ๋ถ„๋ฐฐ๋งŒ. ๋กœ๋ผ/๋ชจ๋ธ์€ Architect V16 ๋“ฑ ๋ณ„๋„ ๋…ธ๋“œ์—์„œ ์ฒ˜๋ฆฌํ•œ๋‹ค๋Š” ์ „์ œ)
try:
    from .dolphin_prompt_director import (
        DolphinPromptDirector, DolphinPromptDirectorSingle, DolphinActionSplitter,
    )
    register_node("DolphinPromptDirector", DolphinPromptDirector,
                  "๐ŸŽฌ๐Ÿ“ Dolphin Prompt Director (Imageโ†’N Prompts, no model/LoRA)")
    register_node("DolphinPromptDirectorSingle", DolphinPromptDirectorSingle,
                  "๐ŸŽฌ๐Ÿ“ Dolphin Prompt Director (Single, Imageโ†’1 Prompt)")
    register_node("DolphinActionSplitter", DolphinActionSplitter,
                  "โœ‚๏ธ Dolphin Action Splitter (deterministic, no LLM)")
except Exception:
    print(f"\nโŒ [Dolphin] Prompt Director ๋กœ๋“œ ์‹คํŒจ:\n{traceback.format_exc()}")


# 13. WanImageToVideoSVIPro mask ๋ฒ„๊ทธ ์ˆ˜์ •ํŒ (comfyui-kjnodes ์›๋ณธ์€ motion_latent_count๋กœ
#     ์ด์–ด๋ถ™์ธ ๋ชจ์…˜ ์ปจํ…์ŠคํŠธ ํ”„๋ ˆ์ž„์„ concat_mask์—์„œ "known"์œผ๋กœ ํ‘œ์‹œํ•˜์ง€ ์•Š์•„์„œ, ํด๋ฆฝ
#     ๊ฒฝ๊ณ„์—์„œ ๋ช‡ ํ”„๋ ˆ์ž„ ๋ฐ˜๋ณต ํ›„ ์ „ํ˜€ ๋‹ค๋ฅธ ์˜์ƒ์œผ๋กœ ํŠ€๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Œ. anchor+motion ํ”„๋ ˆ์ž„
#     ์ „์ฒด๋ฅผ known(0.0)์œผ๋กœ ๋งˆ์Šคํ‚นํ•˜๋„๋ก ์ˆ˜์ •.)
try:
    from .wan_svipro_fixed import WanImageToVideoSVIProFixed_Dolphin
    register_node("WanImageToVideoSVIProFixed_Dolphin", WanImageToVideoSVIProFixed_Dolphin,
                  "๐Ÿฌ Wan I2V SVIPro (motion-mask fix)")
except Exception:
    print(f"\nโŒ [Dolphin] SVIPro Fixed ๋กœ๋“œ ์‹คํŒจ:\n{traceback.format_exc()}")


# 14. Wan I2V Continuity (์ฝ”์–ด WanImageToVideo ๋ฐฉ์‹ = known ํ”„๋ ˆ์ž„ ์—ฌ๋Ÿฌ ์žฅ์„ ํšŒ์ƒ‰ filler์™€
#     ํ•จ๊ป˜ ํ•œ ๋ฒˆ์— ํ†ต์งœ VAE ์ธ์ฝ”๋”ฉ โ†’ latent ๋ฌธ๋งฅ ์ผ๊ด€์„ฑ ๋ณด์žฅ. SVIPro์‹ raw latent ์Šคํ”Œ๋ผ์ด์‹ฑ์˜
#     ํ™”์งˆ ํА/๋ถˆ์—ฐ์† ๋ฌธ์ œ๋ฅผ ํšŒํ”ผ. PainterI2V์˜ motion_amplitude(์Šฌ๋กœ์šฐ๋ชจ์…˜ ๋ฐฉ์ง€) ์ด์‹.)
try:
    from .wan_i2v_continuity import WanI2VContinuity_Dolphin
    register_node("WanI2VContinuity_Dolphin", WanI2VContinuity_Dolphin,
                  "๐Ÿฌ Wan I2V Continuity (multi-frame + amplitude)")
except Exception:
    print(f"\nโŒ [Dolphin] Wan I2V Continuity ๋กœ๋“œ ์‹คํŒจ:\n{traceback.format_exc()}")


# 15. SVIPro ๋“œ๋กญ์ธ ๊ต์ฒด (์Šฌ๋กœ์šฐ๋ชจ์…˜ ์ˆ˜์ •). ์›๋ณธ์€ filler๋ฅผ latent ๊ณต๊ฐ„์—์„œ
#     Wan21().process_out(zeros) = latents_mean ์ƒ์ˆ˜๋กœ ์ฑ„์›Œ์„œ "๋ณ€ํ™” ์—†์Œ" ์‹ ํ˜ธ๋ฅผ ์ฃผ๊ณ 
#     ๋ถ„ํฌ ๋ฐ– ์ž…๋ ฅ์ด ๋์Œ -> ์ฝ”์–ด WanImageToVideo/PainterI2V์ฒ˜๋Ÿผ ํšŒ์ƒ‰(0.5) ํ”ฝ์…€์„ VAE
#     ์ธ์ฝ”๋”ฉํ•œ filler๋กœ ๊ต์ฒด. ๋งˆ์Šคํฌ ๋ฒ„๊ทธ(anchor 1ํ”„๋ ˆ์ž„๋งŒ known)๋„ ํ•จ๊ป˜ ์ˆ˜์ •.
try:
    from .wan_svipro_gray import WanImageToVideoSVIProGray_Dolphin
    register_node("WanImageToVideoSVIProGray_Dolphin", WanImageToVideoSVIProGray_Dolphin,
                  "๐Ÿฌ Wan I2V SVIPro (gray filler, slow-motion fix)")
except Exception:
    print(f"\nโŒ [Dolphin] SVIPro Gray ๋กœ๋“œ ์‹คํŒจ:\n{traceback.format_exc()}")


# 16. SVIPro ๋“œ๋กญ์ธ ๊ต์ฒด (๋ชจ์…˜ ์ฆํญํŒ). 15๋ฒˆ(gray)๊ณผ ๋‹ฌ๋ฆฌ ํŒจ๋”ฉยท๋งˆ์Šคํฌ๋Š” ์ƒ๋ฅ˜ ์›๋ณธ ๊ทธ๋Œ€๋กœ ๋‘๊ณ 
#     PainterI2V์˜ diff ์ฆํญ๋งŒ ์–น๋Š”๋‹ค โ€” SVI Pro LoRA๊ฐ€ ์›๋ณธ ๊ทœ์•ฝ ์œ„์—์„œ ํ•™์Šต๋๊ธฐ ๋•Œ๋ฌธ.
#     high/low conditioning์„ ๋”ฐ๋กœ ๋ฝ‘์•„์„œ ๋ชจ์…˜ ์ฆํญ์€ high-noise ์Šคํ…Œ์ด์ง€์—๋งŒ ๋จน์ธ๋‹ค.
#     motion_amplitude=1.0์ด๋ฉด ์ƒ๋ฅ˜ ์›๋ณธ๊ณผ ์ถœ๋ ฅ์ด ๋™์ผ(ํšŒ๊ท€ ํ™•์ธ์šฉ).
try:
    from .wan_svipro_motion import WanImageToVideoSVIProMotion_Dolphin
    register_node("WanImageToVideoSVIProMotion_Dolphin", WanImageToVideoSVIProMotion_Dolphin,
                  "๐Ÿฌ Wan I2V SVIPro (motion amplitude, hi/lo split)")
except Exception:
    print(f"\nโŒ [Dolphin] SVIPro Motion ๋กœ๋“œ ์‹คํŒจ:\n{traceback.format_exc()}")


# 17. ๋””์Šคํฌ ๋…ธ๋“œ ์บ์‹œ (๋…ธ๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ ComfyUI cache provider ๋“ฑ๋ก).
#     ์‹œ๋“œ/ํ”„๋กฌํ”„ํŠธ/์ด๋ฏธ์ง€๊ฐ€ ๊ฐ™์œผ๋ฉด ์žฌ์‹œ์ž‘ ํ›„์—๋„ JoyCaption~์ƒ˜ํ”Œ๋Ÿฌ ์ฒด์ธ์„ ์Šคํ‚ตํ•˜๊ณ 
#     ๋””์Šคํฌ์—์„œ ๊ฒฐ๊ณผ ๋ณต์›. RAM_PRESSURE ๋ชจ๋“œ์˜ ์บ์‹œ ์ฆ๋ฐœ๋„ ๋””์Šคํฌ์—์„œ ์ž๋™ ๋ณต๊ตฌ.
try:
    from . import disk_cache_provider
    disk_cache_provider.register()
except Exception:
    print(f"\nโŒ [Dolphin] ๋””์Šคํฌ ๋…ธ๋“œ ์บ์‹œ ๋กœ๋“œ ์‹คํŒจ (๊ตฌ๋ฒ„์ „ ComfyUI์—” provider API ์—†์Œ):\n{traceback.format_exc()}")


# 18. Batch Seed Controller (4ํด๋ฆฝ ์˜์ƒ ์ƒ˜ํ”Œ๋Ÿฌ ์‹œ๋“œ๋ฅผ ํ•œ ๋…ธ๋“œ์—์„œ ์Šค์œ„์นญ:
#     ๊ณ ์ •/์ „์ฒด๋žœ๋ค/ํŠน์ •ํด๋ฆฝ๋งŒ์žฌ์ƒ์„ฑ).
try:
    from .dolphin_seed_controller import DolphinBatchSeedController
    register_node("DolphinBatchSeedController", DolphinBatchSeedController,
                  "๐ŸŽฒ Dolphin Batch Seed Controller (random-all / regen-from-clip)")
except Exception:
    print(f"\nโŒ [Dolphin] Batch Seed Controller ๋กœ๋“œ ์‹คํŒจ:\n{traceback.format_exc()}")


# 19. LoRA Prompt Weaver (์™„์„ฑ๋œ ํด๋ฆฝ ํ”„๋กฌํ”„ํŠธ๋ฅผ "๊ทธ ํด๋ฆฝ์— ๊ฑธ๋ฆฌ๋Š” ๋กœ๋ผ๋“ค์ด ์ž˜ ๋ฐœํ™”ํ•˜๋„๋ก"
#     ๋‹ค์‹œ ์“ฐ๋Š” ํ›„์ฒ˜๋ฆฌ ๋…ธ๋“œ. ๋กœ๋ผ ์‚ฌ์ด๋“œ์นด(.metadata.json)์˜ ์„ค๋ช…/ํƒœ๊ทธ/ํ•™์Šต์บก์…˜์„ LLM์—
#     ๋จผ์ € ์ฃผ๊ณ , ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ๋ฌธ์žฅ ์•ˆ ํ•ด๋‹น ๋ถ€์œ„์— ๋ถ™์—ฌ์„œ ์žฌ์ž‘์„ฑํ•œ๋‹ค - ์˜ˆ์ „์ฒ˜๋Ÿผ ์ด๋ฆ„ ์˜†์—
#     ์ฝค๋งˆ๋กœ ๋‚˜์—ดํ•˜๋ฉด bounce/swing ๊ฐ™์€ ๋ฒ”์šฉ ๋™์‚ฌ๊ฐ€ ์ „์‹  ๋ชจ์…˜์œผ๋กœ ์ƒˆ๊ธฐ ๋•Œ๋ฌธ.
#     ๊ธฐ์กด ๋…ธ๋“œ๋Š” ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๊ณ  ๋’ค์— ๋ผ์›Œ ๋„ฃ๋Š” ๋ฐฉ์‹์ด๋ผ ์–ด๋–ค ํ”„๋กฌํ”„ํŠธ ์†Œ์Šค์—๋„ ๋ถ™๋Š”๋‹ค.)
try:
    from .dolphin_lora_prompt import DolphinLoraPromptWeaver
    register_node("DolphinLoraPromptWeaver", DolphinLoraPromptWeaver,
                  "๐Ÿงฌ Dolphin LoRA Prompt Weaver (ํ”„๋กฌํ”„ํŠธโ†’๋กœ๋ผ์— ๋งž๊ฒŒ ์žฌ์ž‘์„ฑ)")
except Exception:
    print(f"\nโŒ [Dolphin] LoRA Prompt Weaver ๋กœ๋“œ ์‹คํŒจ:\n{traceback.format_exc()}")


# 20. Minimax Director (MiniMax/Hailuo์šฉ ํ”„๋กฌํ”„ํŠธ ๋””๋ ‰ํ„ฐ. Wan์šฉ Prompt Director์™€ ๋‹ฌ๋ฆฌ
#     ํด๋ฆฝ ํ•˜๋‚˜๊ฐ€ 6/10์ดˆ๋ผ์„œ, ๊ทธ ์•ˆ์„ ์ดˆ ๋‹จ์œ„ ๋น„ํŠธ๋กœ ์ชผ๊ฐœ๊ณ  ๊ฐ ๊ตฌ๊ฐ„์— ๋™์ž‘ + MiniMax
#     ๊ณต์‹ ์นด๋ฉ”๋ผ ๋ฌด๋ธŒ ํƒœ๊ทธ๋ฅผ ๋ฐ•์•„์ค€๋‹ค.)
try:
    from .dolphin_minimax_director import DolphinMinimaxDirector
    register_node("DolphinMinimaxDirector", DolphinMinimaxDirector,
                  "๐ŸŽฌ๐Ÿ…œ Dolphin Minimax Director (์ดˆ ๋‹จ์œ„ ํƒ€์ž„๋ผ์ธ โ†’ Hailuo ํ”„๋กฌํ”„ํŠธ)")
except Exception:
    print(f"\nโŒ [Dolphin] Minimax Director ๋กœ๋“œ ์‹คํŒจ:\n{traceback.format_exc()}")


# 21. Wan Refine H3 (MiniMax H3 ์ถœ๋ ฅ โ†’ Wan 2.2 LOW noise ์ €-denoise ๋ฆฌํŒŒ์ธ ํŒจ์Šค ์˜ฌ์ธ์›).
#     H3(24fps / 17k+5 ํ”„๋ ˆ์ž„ ๊ทธ๋ฆฌ๋“œ / 768 short edge)์™€ Wan(16fps / 4n+1 / Wan2.1 VAE 16ch)
#     ์‚ฌ์ด์˜ ๋ฐฐ์„  ํ•จ์ •์„ ํ•œ ๋…ธ๋“œ์—์„œ ์ฒ˜๋ฆฌ: 4n+1 ์ •๋ ฌ, VAE ์˜ค๋ฐฐ์„  ์ฐจ๋‹จ, ์†Œ์Šค ๋ผํ…ํŠธ ์ธ์ฝ”๋”ฉ,
#     concat ์ปจ๋””์…”๋‹ ์žฌ๊ตฌ์„ฑ, sigma_shift ์ง์ ‘ ํŒจ์น˜, ์ƒ‰ ๋“œ๋ฆฌํ”„ํŠธ ๋ณต์›, ์˜ค๋””์˜ค ๊ธธ์ด ์ •๋ ฌ.
#     ๊ฐ™์ด ๋“ฑ๋ก๋˜๋Š” Frame Grid ๋…ธ๋“œ๋Š” ๋‘ ๊ทธ๋ฆฌ๋“œ๊ฐ€ ๊ฒน์น˜๋Š” length(5/73/141/209/277/345โ€ฆ)๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค.
try:
    from .wan_h3_refine import WanH3Refine_Dolphin, WanH3FrameGrid_Dolphin
    register_node("WanH3Refine_Dolphin", WanH3Refine_Dolphin,
                  "๐Ÿฌ๐Ÿ…œ Wan Refine H3 (low-denoise pass)")
    register_node("WanH3FrameGrid_Dolphin", WanH3FrameGrid_Dolphin,
                  "๐Ÿฌ๐Ÿ…œ H3โ†”Wan Frame Grid")
except Exception:
    print(f"\nโŒ [Dolphin] Wan Refine H3 ๋กœ๋“œ ์‹คํŒจ:\n{traceback.format_exc()}")


__all__ = ['NODE_CLASS_MAPPINGS', 'NODE_DISPLAY_NAME_MAPPINGS', 'WEB_DIRECTORY']