comfy-ui-api-workflow 0.0.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (176) hide show
  1. comfy_ui_api_workflow/__about__.py +1 -0
  2. comfy_ui_api_workflow/__init__.py +9 -0
  3. comfy_ui_api_workflow/_impl/__init__.py +0 -0
  4. comfy_ui_api_workflow/_impl/data_structure.py +182 -0
  5. comfy_ui_api_workflow/_impl/enums.py +13 -0
  6. comfy_ui_api_workflow/_impl/errors/__init__.py +3 -0
  7. comfy_ui_api_workflow/_impl/errors/data_structure.py +34 -0
  8. comfy_ui_api_workflow/_impl/errors/node.py +63 -0
  9. comfy_ui_api_workflow/_impl/errors/output.py +5 -0
  10. comfy_ui_api_workflow/_impl/errors/pipeline.py +14 -0
  11. comfy_ui_api_workflow/_impl/errors/workflow.py +13 -0
  12. comfy_ui_api_workflow/_impl/exceptions.py +22 -0
  13. comfy_ui_api_workflow/_impl/lazy.py +71 -0
  14. comfy_ui_api_workflow/_impl/nodes/__init__.py +3 -0
  15. comfy_ui_api_workflow/_impl/nodes/advanced/__init__.py +3 -0
  16. comfy_ui_api_workflow/_impl/nodes/advanced/debug.py +103 -0
  17. comfy_ui_api_workflow/_impl/nodes/advanced/guidance.py +281 -0
  18. comfy_ui_api_workflow/_impl/nodes/advanced/hooks/__init__.py +29 -0
  19. comfy_ui_api_workflow/_impl/nodes/advanced/hooks/clip.py +35 -0
  20. comfy_ui_api_workflow/_impl/nodes/advanced/hooks/combine.py +108 -0
  21. comfy_ui_api_workflow/_impl/nodes/advanced/hooks/cond_pair.py +203 -0
  22. comfy_ui_api_workflow/_impl/nodes/advanced/hooks/cond_single.py +143 -0
  23. comfy_ui_api_workflow/_impl/nodes/advanced/hooks/create.py +130 -0
  24. comfy_ui_api_workflow/_impl/nodes/advanced/hooks/scheduling.py +167 -0
  25. comfy_ui_api_workflow/_impl/nodes/advanced/multigpu.py +78 -0
  26. comfy_ui_api_workflow/_impl/nodes/audio.py +260 -0
  27. comfy_ui_api_workflow/_impl/nodes/base.py +214 -0
  28. comfy_ui_api_workflow/_impl/nodes/experimental/__init__.py +283 -0
  29. comfy_ui_api_workflow/_impl/nodes/experimental/attention_experiments.py +156 -0
  30. comfy_ui_api_workflow/_impl/nodes/experimental/stable_cascade.py +16 -0
  31. comfy_ui_api_workflow/_impl/nodes/image/__init__.py +601 -0
  32. comfy_ui_api_workflow/_impl/nodes/image/adjustments.py +46 -0
  33. comfy_ui_api_workflow/_impl/nodes/image/background_removal.py +16 -0
  34. comfy_ui_api_workflow/_impl/nodes/image/batch.py +236 -0
  35. comfy_ui_api_workflow/_impl/nodes/image/color.py +104 -0
  36. comfy_ui_api_workflow/_impl/nodes/image/compositing.py +128 -0
  37. comfy_ui_api_workflow/_impl/nodes/image/detection.py +689 -0
  38. comfy_ui_api_workflow/_impl/nodes/image/filters.py +215 -0
  39. comfy_ui_api_workflow/_impl/nodes/image/geometry_estimation.py +307 -0
  40. comfy_ui_api_workflow/_impl/nodes/image/mask.py +291 -0
  41. comfy_ui_api_workflow/_impl/nodes/image/post_processors.py +45 -0
  42. comfy_ui_api_workflow/_impl/nodes/image/pre_processors.py +13 -0
  43. comfy_ui_api_workflow/_impl/nodes/image/transform.py +385 -0
  44. comfy_ui_api_workflow/_impl/nodes/image/upscaling.py +188 -0
  45. comfy_ui_api_workflow/_impl/nodes/image/video.py +66 -0
  46. comfy_ui_api_workflow/_impl/nodes/model/__init__.py +3 -0
  47. comfy_ui_api_workflow/_impl/nodes/model/conditioning/__init__.py +395 -0
  48. comfy_ui_api_workflow/_impl/nodes/model/conditioning/ace.py +232 -0
  49. comfy_ui_api_workflow/_impl/nodes/model/conditioning/autoregressive.py +53 -0
  50. comfy_ui_api_workflow/_impl/nodes/model/conditioning/controlnet.py +153 -0
  51. comfy_ui_api_workflow/_impl/nodes/model/conditioning/cosmos.py +108 -0
  52. comfy_ui_api_workflow/_impl/nodes/model/conditioning/flux.py +121 -0
  53. comfy_ui_api_workflow/_impl/nodes/model/conditioning/gligen.py +57 -0
  54. comfy_ui_api_workflow/_impl/nodes/model/conditioning/hidream.py +31 -0
  55. comfy_ui_api_workflow/_impl/nodes/model/conditioning/hunyuan_3d.py +44 -0
  56. comfy_ui_api_workflow/_impl/nodes/model/conditioning/hunyuan_image.py +21 -0
  57. comfy_ui_api_workflow/_impl/nodes/model/conditioning/hunyuan_video.py +243 -0
  58. comfy_ui_api_workflow/_impl/nodes/model/conditioning/instructpix2pix.py +28 -0
  59. comfy_ui_api_workflow/_impl/nodes/model/conditioning/kandinsky.py +78 -0
  60. comfy_ui_api_workflow/_impl/nodes/model/conditioning/lotus.py +8 -0
  61. comfy_ui_api_workflow/_impl/nodes/model/conditioning/ltxv.py +504 -0
  62. comfy_ui_api_workflow/_impl/nodes/model/conditioning/lumina.py +39 -0
  63. comfy_ui_api_workflow/_impl/nodes/model/conditioning/minimax.py +110 -0
  64. comfy_ui_api_workflow/_impl/nodes/model/conditioning/minimax_music.py +53 -0
  65. comfy_ui_api_workflow/_impl/nodes/model/conditioning/photomaker.py +28 -0
  66. comfy_ui_api_workflow/_impl/nodes/model/conditioning/pixart.py +34 -0
  67. comfy_ui_api_workflow/_impl/nodes/model/conditioning/qwen_image.py +101 -0
  68. comfy_ui_api_workflow/_impl/nodes/model/conditioning/stable_audio.py +34 -0
  69. comfy_ui_api_workflow/_impl/nodes/model/conditioning/stable_cascade.py +16 -0
  70. comfy_ui_api_workflow/_impl/nodes/model/conditioning/stable_diffusion.py +141 -0
  71. comfy_ui_api_workflow/_impl/nodes/model/conditioning/stable_diffusion_upscaler.py +37 -0
  72. comfy_ui_api_workflow/_impl/nodes/model/conditioning/stable_video.py +63 -0
  73. comfy_ui_api_workflow/_impl/nodes/model/conditioning/stable_video_3d.py +53 -0
  74. comfy_ui_api_workflow/_impl/nodes/model/conditioning/stable_zero123.py +128 -0
  75. comfy_ui_api_workflow/_impl/nodes/model/conditioning/transform.py +341 -0
  76. comfy_ui_api_workflow/_impl/nodes/model/conditioning/trellis.py +168 -0
  77. comfy_ui_api_workflow/_impl/nodes/model/conditioning/triposplat.py +54 -0
  78. comfy_ui_api_workflow/_impl/nodes/model/conditioning/void.py +61 -0
  79. comfy_ui_api_workflow/_impl/nodes/model/conditioning/wan/__init__.py +184 -0
  80. comfy_ui_api_workflow/_impl/nodes/model/conditioning/wan/animate.py +255 -0
  81. comfy_ui_api_workflow/_impl/nodes/model/conditioning/wan/camera.py +150 -0
  82. comfy_ui_api_workflow/_impl/nodes/model/conditioning/wan/dancer.py +102 -0
  83. comfy_ui_api_workflow/_impl/nodes/model/conditioning/wan/fun_control.py +129 -0
  84. comfy_ui_api_workflow/_impl/nodes/model/conditioning/wan/fun_inpaint.py +68 -0
  85. comfy_ui_api_workflow/_impl/nodes/model/conditioning/wan/humo.py +63 -0
  86. comfy_ui_api_workflow/_impl/nodes/model/conditioning/wan/move.py +332 -0
  87. comfy_ui_api_workflow/_impl/nodes/model/conditioning/wan/phantom_subject.py +58 -0
  88. comfy_ui_api_workflow/_impl/nodes/model/conditioning/wan/scail.py +161 -0
  89. comfy_ui_api_workflow/_impl/nodes/model/conditioning/wan/sound.py +128 -0
  90. comfy_ui_api_workflow/_impl/nodes/model/conditioning/wan/vace.py +73 -0
  91. comfy_ui_api_workflow/_impl/nodes/model/conditioning/yue2.py +189 -0
  92. comfy_ui_api_workflow/_impl/nodes/model/conditioning/z_image.py +59 -0
  93. comfy_ui_api_workflow/_impl/nodes/model/latent/__init__.py +510 -0
  94. comfy_ui_api_workflow/_impl/nodes/model/latent/ace.py +49 -0
  95. comfy_ui_api_workflow/_impl/nodes/model/latent/advanced/__init__.py +210 -0
  96. comfy_ui_api_workflow/_impl/nodes/model/latent/advanced/operations.py +113 -0
  97. comfy_ui_api_workflow/_impl/nodes/model/latent/autoregressive.py +36 -0
  98. comfy_ui_api_workflow/_impl/nodes/model/latent/batch.py +93 -0
  99. comfy_ui_api_workflow/_impl/nodes/model/latent/chroma_radiance.py +28 -0
  100. comfy_ui_api_workflow/_impl/nodes/model/latent/cosmos.py +36 -0
  101. comfy_ui_api_workflow/_impl/nodes/model/latent/flux.py +28 -0
  102. comfy_ui_api_workflow/_impl/nodes/model/latent/hidream.py +28 -0
  103. comfy_ui_api_workflow/_impl/nodes/model/latent/hunyuan_3d.py +57 -0
  104. comfy_ui_api_workflow/_impl/nodes/model/latent/hunyuan_image.py +28 -0
  105. comfy_ui_api_workflow/_impl/nodes/model/latent/hunyuan_video.py +130 -0
  106. comfy_ui_api_workflow/_impl/nodes/model/latent/ltxv.py +162 -0
  107. comfy_ui_api_workflow/_impl/nodes/model/latent/minimax.py +28 -0
  108. comfy_ui_api_workflow/_impl/nodes/model/latent/minimax_music.py +25 -0
  109. comfy_ui_api_workflow/_impl/nodes/model/latent/mochi.py +36 -0
  110. comfy_ui_api_workflow/_impl/nodes/model/latent/qwen.py +36 -0
  111. comfy_ui_api_workflow/_impl/nodes/model/latent/seedvr.py +16 -0
  112. comfy_ui_api_workflow/_impl/nodes/model/latent/stable_cascade.py +60 -0
  113. comfy_ui_api_workflow/_impl/nodes/model/latent/stable_diffusion.py +28 -0
  114. comfy_ui_api_workflow/_impl/nodes/model/latent/transform.py +92 -0
  115. comfy_ui_api_workflow/_impl/nodes/model/latent/trellis.py +91 -0
  116. comfy_ui_api_workflow/_impl/nodes/model/latent/triposplat.py +86 -0
  117. comfy_ui_api_workflow/_impl/nodes/model/latent/void.py +54 -0
  118. comfy_ui_api_workflow/_impl/nodes/model/latent/yue2.py +25 -0
  119. comfy_ui_api_workflow/_impl/nodes/model/loaders.py +820 -0
  120. comfy_ui_api_workflow/_impl/nodes/model/merging/__init__.py +290 -0
  121. comfy_ui_api_workflow/_impl/nodes/model/merging/model_specific.py +4370 -0
  122. comfy_ui_api_workflow/_impl/nodes/model/patch/__init__.py +463 -0
  123. comfy_ui_api_workflow/_impl/nodes/model/patch/anima.py +53 -0
  124. comfy_ui_api_workflow/_impl/nodes/model/patch/chroma_radiance.py +50 -0
  125. comfy_ui_api_workflow/_impl/nodes/model/patch/flux.py +63 -0
  126. comfy_ui_api_workflow/_impl/nodes/model/patch/hidream.py +72 -0
  127. comfy_ui_api_workflow/_impl/nodes/model/patch/ltxv.py +125 -0
  128. comfy_ui_api_workflow/_impl/nodes/model/patch/minimax.py +92 -0
  129. comfy_ui_api_workflow/_impl/nodes/model/patch/qwen.py +57 -0
  130. comfy_ui_api_workflow/_impl/nodes/model/patch/sensenova.py +21 -0
  131. comfy_ui_api_workflow/_impl/nodes/model/patch/stable_cascade.py +21 -0
  132. comfy_ui_api_workflow/_impl/nodes/model/patch/stable_diffusion.py +21 -0
  133. comfy_ui_api_workflow/_impl/nodes/model/patch/supir.py +57 -0
  134. comfy_ui_api_workflow/_impl/nodes/model/patch/unet.py +281 -0
  135. comfy_ui_api_workflow/_impl/nodes/model/patch/wan.py +143 -0
  136. comfy_ui_api_workflow/_impl/nodes/model/sampling/__init__.py +228 -0
  137. comfy_ui_api_workflow/_impl/nodes/model/sampling/custom.py +123 -0
  138. comfy_ui_api_workflow/_impl/nodes/model/sampling/guiders.py +252 -0
  139. comfy_ui_api_workflow/_impl/nodes/model/sampling/noise.py +52 -0
  140. comfy_ui_api_workflow/_impl/nodes/model/sampling/samplers.py +531 -0
  141. comfy_ui_api_workflow/_impl/nodes/model/sampling/schedulers.py +462 -0
  142. comfy_ui_api_workflow/_impl/nodes/model/sampling/sigmas.py +163 -0
  143. comfy_ui_api_workflow/_impl/nodes/model/training.py +249 -0
  144. comfy_ui_api_workflow/_impl/nodes/partner/__init__.py +3 -0
  145. comfy_ui_api_workflow/_impl/nodes/partner/audio/__init__.py +3 -0
  146. comfy_ui_api_workflow/_impl/nodes/partner/audio/elevenlabs.py +47 -0
  147. comfy_ui_api_workflow/_impl/nodes/partner/image/__init__.py +3 -0
  148. comfy_ui_api_workflow/_impl/nodes/partner/image/bytedance.py +16 -0
  149. comfy_ui_api_workflow/_impl/nodes/partner/image/krea.py +31 -0
  150. comfy_ui_api_workflow/_impl/nodes/partner/image/luma.py +27 -0
  151. comfy_ui_api_workflow/_impl/nodes/partner/image/recraft.py +220 -0
  152. comfy_ui_api_workflow/_impl/nodes/partner/text/__init__.py +3 -0
  153. comfy_ui_api_workflow/_impl/nodes/partner/text/gemini.py +25 -0
  154. comfy_ui_api_workflow/_impl/nodes/partner/text/openai.py +77 -0
  155. comfy_ui_api_workflow/_impl/nodes/partner/video/__init__.py +3 -0
  156. comfy_ui_api_workflow/_impl/nodes/partner/video/bytedance.py +16 -0
  157. comfy_ui_api_workflow/_impl/nodes/partner/video/pixverse.py +27 -0
  158. comfy_ui_api_workflow/_impl/nodes/text.py +506 -0
  159. comfy_ui_api_workflow/_impl/nodes/three_d/__init__.py +563 -0
  160. comfy_ui_api_workflow/_impl/nodes/three_d/mesh.py +183 -0
  161. comfy_ui_api_workflow/_impl/nodes/three_d/splat.py +262 -0
  162. comfy_ui_api_workflow/_impl/nodes/three_d/texturing.py +254 -0
  163. comfy_ui_api_workflow/_impl/nodes/utilities/__init__.py +404 -0
  164. comfy_ui_api_workflow/_impl/nodes/utilities/logic.py +44 -0
  165. comfy_ui_api_workflow/_impl/nodes/utilities/primitive.py +107 -0
  166. comfy_ui_api_workflow/_impl/nodes/validation.py +126 -0
  167. comfy_ui_api_workflow/_impl/nodes/video/__init__.py +440 -0
  168. comfy_ui_api_workflow/_impl/nodes/video/batch.py +45 -0
  169. comfy_ui_api_workflow/_impl/nodes/video/preprocessors.py +24 -0
  170. comfy_ui_api_workflow/_impl/nodes/video/transform.py +52 -0
  171. comfy_ui_api_workflow/_impl/pipeline.py +67 -0
  172. comfy_ui_api_workflow/_impl/workflow.py +539 -0
  173. comfy_ui_api_workflow-0.0.1.dist-info/METADATA +123 -0
  174. comfy_ui_api_workflow-0.0.1.dist-info/RECORD +176 -0
  175. comfy_ui_api_workflow-0.0.1.dist-info/WHEEL +4 -0
  176. comfy_ui_api_workflow-0.0.1.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,283 @@
1
+ from typing import Literal, get_args
2
+
3
+ from ..base import BaseNode
4
+ from ..validation import validate_bool, validate_choice, validate_range
5
+ from ...lazy import submodules_of
6
+
7
+
8
+ class LatentBlend(BaseNode):
9
+ __slots__ = ("samples1", "samples2", "blend_factor")
10
+ CATEGORY = "experimental"
11
+ OUTPUTS = {"LATENT": 0}
12
+ RETURN_TYPES = ("LATENT",)
13
+ INPUT_SOCKET_TYPES = {
14
+ "samples1": "LATENT",
15
+ "samples2": "LATENT",
16
+ "blend_factor": "FLOAT",
17
+ }
18
+
19
+ def __init__(
20
+ self,
21
+ node_id: str,
22
+ samples1: tuple[str, int],
23
+ samples2: tuple[str, int],
24
+ blend_factor: float | tuple[str, int] = 0.5,
25
+ ) -> None:
26
+ super().__init__(node_id=node_id)
27
+ self.samples1 = samples1
28
+ self.samples2 = samples2
29
+ self.blend_factor = blend_factor
30
+ self.__validate()
31
+
32
+ def __validate(self) -> None:
33
+ validate_range("blend_factor", self.blend_factor, 0, 1)
34
+
35
+
36
+ class SelfAttentionGuidance(BaseNode):
37
+ __slots__ = ("model", "scale", "blur_sigma")
38
+ CATEGORY = "experimental"
39
+ OUTPUTS = {"MODEL": 0}
40
+ RETURN_TYPES = ("MODEL",)
41
+ INPUT_SOCKET_TYPES = {"model": "MODEL", "scale": "FLOAT", "blur_sigma": "FLOAT"}
42
+
43
+ def __init__(
44
+ self,
45
+ node_id: str,
46
+ model: tuple[str, int],
47
+ scale: float | tuple[str, int] = 0.5,
48
+ blur_sigma: float | tuple[str, int] = 2.0,
49
+ ) -> None:
50
+ super().__init__(node_id=node_id)
51
+ self.model = model
52
+ self.scale = scale
53
+ self.blur_sigma = blur_sigma
54
+ self.__validate()
55
+
56
+ def __validate(self) -> None:
57
+ validate_range("scale", self.scale, -2.0, 5.0)
58
+ validate_range("blur_sigma", self.blur_sigma, 0.0, 10.0)
59
+
60
+
61
+ class PerpNegGuider(BaseNode):
62
+ __slots__ = (
63
+ "model",
64
+ "positive",
65
+ "negative",
66
+ "empty_conditioning",
67
+ "cfg",
68
+ "neg_scale",
69
+ )
70
+ CATEGORY = "experimental"
71
+ OUTPUTS = {"GUIDER": 0}
72
+ RETURN_TYPES = ("GUIDER",)
73
+ INPUT_SOCKET_TYPES = {
74
+ "model": "MODEL",
75
+ "positive": "CONDITIONING",
76
+ "negative": "CONDITIONING",
77
+ "empty_conditioning": "CONDITIONING",
78
+ "cfg": "FLOAT",
79
+ "neg_scale": "FLOAT",
80
+ }
81
+
82
+ def __init__(
83
+ self,
84
+ node_id: str,
85
+ model: tuple[str, int],
86
+ positive: tuple[str, int],
87
+ negative: tuple[str, int],
88
+ empty_conditioning: tuple[str, int],
89
+ cfg: float | tuple[str, int] = 8.0,
90
+ neg_scale: float | tuple[str, int] = 1.0,
91
+ ) -> None:
92
+ super().__init__(node_id=node_id)
93
+ self.model = model
94
+ self.positive = positive
95
+ self.negative = negative
96
+ self.empty_conditioning = empty_conditioning
97
+ self.cfg = cfg
98
+ self.neg_scale = neg_scale
99
+ self.__validate()
100
+
101
+ def __validate(self) -> None:
102
+ validate_range("cfg", self.cfg, 0.0, 100.0)
103
+ validate_range("neg_scale", self.neg_scale, 0.0, 100.0)
104
+
105
+
106
+ class DifferentialDiffusion(BaseNode):
107
+ __slots__ = ("model", "strength")
108
+ CATEGORY = "experimental"
109
+ OUTPUTS = {"MODEL": 0}
110
+ RETURN_TYPES = ("MODEL",)
111
+ INPUT_SOCKET_TYPES = {"model": "MODEL", "strength": "FLOAT"}
112
+
113
+ def __init__(
114
+ self,
115
+ node_id: str,
116
+ model: tuple[str, int],
117
+ strength: float | tuple[str, int] = 1.0,
118
+ ) -> None:
119
+ super().__init__(node_id=node_id)
120
+ self.model = model
121
+ self.strength = strength
122
+ self.__validate()
123
+
124
+ def __validate(self) -> None:
125
+ validate_range("strength", self.strength, 0.0, 1.0)
126
+
127
+
128
+ SamplerEulerCFGpp_Versions = Literal["regular", "alternative"]
129
+ SAMPLEREULERCFGPP_VERSIONS = frozenset(get_args(SamplerEulerCFGpp_Versions))
130
+
131
+
132
+ class SamplerEulerCFGpp(BaseNode):
133
+ __slots__ = ("version",)
134
+ CATEGORY = "experimental"
135
+ OUTPUTS = {"SAMPLER": 0}
136
+ RETURN_TYPES = ("SAMPLER",)
137
+ INPUT_SOCKET_TYPES = {"version": "COMBO"}
138
+
139
+ def __init__(
140
+ self, node_id: str, version: SamplerEulerCFGpp_Versions | tuple[str, int]
141
+ ) -> None:
142
+ super().__init__(node_id=node_id)
143
+ self.version = version
144
+ self.__validate()
145
+
146
+ def __validate(self) -> None:
147
+ validate_choice("version", self.version, SAMPLEREULERCFGPP_VERSIONS)
148
+
149
+
150
+ class FluxKVCache(BaseNode):
151
+ __slots__ = ("model",)
152
+ CATEGORY = "experimental"
153
+ OUTPUTS = {"MODEL": 0}
154
+ RETURN_TYPES = ("MODEL",)
155
+ INPUT_SOCKET_TYPES = {"model": "MODEL"}
156
+
157
+ def __init__(self, node_id: str, model: tuple[str, int]) -> None:
158
+ super().__init__(node_id=node_id)
159
+ self.model = model
160
+
161
+
162
+ LoraSave_Lora_Types = Literal["standard", "full_diff"]
163
+ LORASAVE_LORA_TYPES = frozenset(get_args(LoraSave_Lora_Types))
164
+
165
+
166
+ class LoraSave(BaseNode):
167
+ __slots__ = (
168
+ "lora_type",
169
+ "filename_prefix",
170
+ "rank",
171
+ "bias_diff",
172
+ "model_diff",
173
+ "text_encoder_diff",
174
+ )
175
+ CATEGORY = "experimental"
176
+ INPUT_SOCKET_TYPES = {
177
+ "filename_prefix": "STRING",
178
+ "rank": "INT",
179
+ "lora_type": "COMBO",
180
+ "bias_diff": "BOOLEAN",
181
+ "model_diff": "MODEL",
182
+ "text_encoder_diff": "CLIP",
183
+ }
184
+
185
+ def __init__(
186
+ self,
187
+ node_id: str,
188
+ lora_type: LoraSave_Lora_Types | tuple[str, int],
189
+ filename_prefix: str | tuple[str, int] = "loras/ComfyUI_extracted_lora",
190
+ rank: int | tuple[str, int] = 8,
191
+ bias_diff: bool | tuple[str, int] = True,
192
+ model_diff: tuple[str, int] | None = None,
193
+ text_encoder_diff: tuple[str, int] | None = None,
194
+ ) -> None:
195
+ super().__init__(node_id=node_id)
196
+ self.lora_type = lora_type
197
+ self.filename_prefix = filename_prefix
198
+ self.rank = rank
199
+ self.bias_diff = bias_diff
200
+ if model_diff is not None:
201
+ self.model_diff = model_diff
202
+ if text_encoder_diff is not None:
203
+ self.text_encoder_diff = text_encoder_diff
204
+ self.__validate()
205
+
206
+ def __validate(self) -> None:
207
+ validate_choice("lora_type", self.lora_type, LORASAVE_LORA_TYPES)
208
+ validate_range("rank", self.rank, 1, 4096)
209
+ validate_bool("bias_diff", self.bias_diff)
210
+
211
+
212
+ TorchCompileModel_Backends = Literal["inductor", "cudagraphs"]
213
+ TORCHCOMPILEMODEL_BACKENDS = frozenset(get_args(TorchCompileModel_Backends))
214
+
215
+
216
+ class TorchCompileModel(BaseNode):
217
+ __slots__ = ("model", "backend")
218
+ CATEGORY = "experimental"
219
+ OUTPUTS = {"MODEL": 0}
220
+ RETURN_TYPES = ("MODEL",)
221
+ INPUT_SOCKET_TYPES = {"model": "MODEL", "backend": "COMBO"}
222
+
223
+ def __init__(
224
+ self,
225
+ node_id: str,
226
+ model: tuple[str, int],
227
+ backend: TorchCompileModel_Backends | tuple[str, int],
228
+ ) -> None:
229
+ super().__init__(node_id=node_id)
230
+ self.model = model
231
+ self.backend = backend
232
+ self.__validate()
233
+
234
+ def __validate(self) -> None:
235
+ validate_choice("backend", self.backend, TORCHCOMPILEMODEL_BACKENDS)
236
+
237
+
238
+ class Mahiro(BaseNode):
239
+ __slots__ = ("model",)
240
+ CATEGORY = "experimental"
241
+ OUTPUTS = {"patched_model": 0}
242
+ RETURN_TYPES = ("MODEL",)
243
+ INPUT_SOCKET_TYPES = {"model": "MODEL"}
244
+
245
+ def __init__(self, node_id: str, model: tuple[str, int]) -> None:
246
+ super().__init__(node_id=node_id)
247
+ self.model = model
248
+
249
+
250
+ class FreSca(BaseNode):
251
+ __slots__ = ("model", "scale_low", "scale_high", "freq_cutoff")
252
+ CATEGORY = "experimental"
253
+ OUTPUTS = {"MODEL": 0}
254
+ RETURN_TYPES = ("MODEL",)
255
+ INPUT_SOCKET_TYPES = {
256
+ "model": "MODEL",
257
+ "scale_low": "FLOAT",
258
+ "scale_high": "FLOAT",
259
+ "freq_cutoff": "INT",
260
+ }
261
+
262
+ def __init__(
263
+ self,
264
+ node_id: str,
265
+ model: tuple[str, int],
266
+ scale_low: float | tuple[str, int] = 1.0,
267
+ scale_high: float | tuple[str, int] = 1.25,
268
+ freq_cutoff: int | tuple[str, int] = 20,
269
+ ) -> None:
270
+ super().__init__(node_id=node_id)
271
+ self.model = model
272
+ self.scale_low = scale_low
273
+ self.scale_high = scale_high
274
+ self.freq_cutoff = freq_cutoff
275
+ self.__validate()
276
+
277
+ def __validate(self) -> None:
278
+ validate_range("scale_low", self.scale_low, 0, 10)
279
+ validate_range("scale_high", self.scale_high, 0, 10)
280
+ validate_range("freq_cutoff", self.freq_cutoff, 1, 10_000)
281
+
282
+
283
+ __getattr__ = submodules_of(__name__)
@@ -0,0 +1,156 @@
1
+ from ..base import BaseNode
2
+ from ..validation import validate_range
3
+
4
+
5
+ class UNetSelfAttentionMultiply(BaseNode):
6
+ __slots__ = ("model", "q", "k", "v", "out")
7
+ CATEGORY = "experimental/attention_experiments"
8
+ OUTPUTS = {"MODEL": 0}
9
+ RETURN_TYPES = ("MODEL",)
10
+ INPUT_SOCKET_TYPES = {
11
+ "model": "MODEL",
12
+ "q": "FLOAT",
13
+ "k": "FLOAT",
14
+ "v": "FLOAT",
15
+ "out": "FLOAT",
16
+ }
17
+
18
+ def __init__(
19
+ self,
20
+ node_id: str,
21
+ model: tuple[str, int],
22
+ q: float | tuple[str, int] = 1.0,
23
+ k: float | tuple[str, int] = 1.0,
24
+ v: float | tuple[str, int] = 1.0,
25
+ out: float | tuple[str, int] = 1.0,
26
+ ) -> None:
27
+ super().__init__(node_id=node_id)
28
+ self.model = model
29
+ self.q = q
30
+ self.k = k
31
+ self.v = v
32
+ self.out = out
33
+ self.__validate()
34
+
35
+ def __validate(self) -> None:
36
+ validate_range("q", self.q, 0.0, 10.0)
37
+ validate_range("k", self.k, 0.0, 10.0)
38
+ validate_range("v", self.v, 0.0, 10.0)
39
+ validate_range("out", self.out, 0.0, 10.0)
40
+
41
+
42
+ class UNetCrossAttentionMultiply(BaseNode):
43
+ __slots__ = ("model", "q", "k", "v", "out")
44
+ CATEGORY = "experimental/attention_experiments"
45
+ OUTPUTS = {"MODEL": 0}
46
+ RETURN_TYPES = ("MODEL",)
47
+ INPUT_SOCKET_TYPES = {
48
+ "model": "MODEL",
49
+ "q": "FLOAT",
50
+ "k": "FLOAT",
51
+ "v": "FLOAT",
52
+ "out": "FLOAT",
53
+ }
54
+
55
+ def __init__(
56
+ self,
57
+ node_id: str,
58
+ model: tuple[str, int],
59
+ q: float | tuple[str, int] = 1.0,
60
+ k: float | tuple[str, int] = 1.0,
61
+ v: float | tuple[str, int] = 1.0,
62
+ out: float | tuple[str, int] = 1.0,
63
+ ) -> None:
64
+ super().__init__(node_id=node_id)
65
+ self.model = model
66
+ self.q = q
67
+ self.k = k
68
+ self.v = v
69
+ self.out = out
70
+ self.__validate()
71
+
72
+ def __validate(self) -> None:
73
+ validate_range("q", self.q, 0.0, 10.0)
74
+ validate_range("k", self.k, 0.0, 10.0)
75
+ validate_range("v", self.v, 0.0, 10.0)
76
+ validate_range("out", self.out, 0.0, 10.0)
77
+
78
+
79
+ class CLIPAttentionMultiply(BaseNode):
80
+ __slots__ = ("clip", "q", "k", "v", "out")
81
+ CATEGORY = "experimental/attention_experiments"
82
+ OUTPUTS = {"CLIP": 0}
83
+ RETURN_TYPES = ("CLIP",)
84
+ INPUT_SOCKET_TYPES = {
85
+ "clip": "CLIP",
86
+ "q": "FLOAT",
87
+ "k": "FLOAT",
88
+ "v": "FLOAT",
89
+ "out": "FLOAT",
90
+ }
91
+
92
+ def __init__(
93
+ self,
94
+ node_id: str,
95
+ clip: tuple[str, int],
96
+ q: float | tuple[str, int] = 1.0,
97
+ k: float | tuple[str, int] = 1.0,
98
+ v: float | tuple[str, int] = 1.0,
99
+ out: float | tuple[str, int] = 1.0,
100
+ ) -> None:
101
+ super().__init__(node_id=node_id)
102
+ self.clip = clip
103
+ self.q = q
104
+ self.k = k
105
+ self.v = v
106
+ self.out = out
107
+ self.__validate()
108
+
109
+ def __validate(self) -> None:
110
+ validate_range("q", self.q, 0.0, 10.0)
111
+ validate_range("k", self.k, 0.0, 10.0)
112
+ validate_range("v", self.v, 0.0, 10.0)
113
+ validate_range("out", self.out, 0.0, 10.0)
114
+
115
+
116
+ class UNetTemporalAttentionMultiply(BaseNode):
117
+ __slots__ = (
118
+ "model",
119
+ "self_structural",
120
+ "self_temporal",
121
+ "cross_structural",
122
+ "cross_temporal",
123
+ )
124
+ CATEGORY = "experimental/attention_experiments"
125
+ OUTPUTS = {"MODEL": 0}
126
+ RETURN_TYPES = ("MODEL",)
127
+ INPUT_SOCKET_TYPES = {
128
+ "model": "MODEL",
129
+ "self_structural": "FLOAT",
130
+ "self_temporal": "FLOAT",
131
+ "cross_structural": "FLOAT",
132
+ "cross_temporal": "FLOAT",
133
+ }
134
+
135
+ def __init__(
136
+ self,
137
+ node_id: str,
138
+ model: tuple[str, int],
139
+ self_structural: float | tuple[str, int] = 1.0,
140
+ self_temporal: float | tuple[str, int] = 1.0,
141
+ cross_structural: float | tuple[str, int] = 1.0,
142
+ cross_temporal: float | tuple[str, int] = 1.0,
143
+ ) -> None:
144
+ super().__init__(node_id=node_id)
145
+ self.model = model
146
+ self.self_structural = self_structural
147
+ self.self_temporal = self_temporal
148
+ self.cross_structural = cross_structural
149
+ self.cross_temporal = cross_temporal
150
+ self.__validate()
151
+
152
+ def __validate(self) -> None:
153
+ validate_range("self_structural", self.self_structural, 0.0, 10.0)
154
+ validate_range("self_temporal", self.self_temporal, 0.0, 10.0)
155
+ validate_range("cross_structural", self.cross_structural, 0.0, 10.0)
156
+ validate_range("cross_temporal", self.cross_temporal, 0.0, 10.0)
@@ -0,0 +1,16 @@
1
+ from ..base import BaseNode
2
+
3
+
4
+ class StableCascade_SuperResolutionControlnet(BaseNode):
5
+ __slots__ = ("image", "vae")
6
+ CATEGORY = "experimental/stable cascade"
7
+ OUTPUTS = {"controlnet_input": 0, "stage_c": 1, "stage_b": 2}
8
+ RETURN_TYPES = ("IMAGE", "LATENT", "LATENT")
9
+ INPUT_SOCKET_TYPES = {"image": "IMAGE", "vae": "VAE"}
10
+
11
+ def __init__(
12
+ self, node_id: str, image: tuple[str, int], vae: tuple[str, int]
13
+ ) -> None:
14
+ super().__init__(node_id=node_id)
15
+ self.image = image
16
+ self.vae = vae