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,531 @@
1
+ from typing import Literal, get_args
2
+
3
+ from ...base import BaseNode
4
+ from ...model.sampling import KSAMPLER_SAMPLER_NAMES, KSampler_Sampler_Names
5
+ from ...validation import validate_bool, validate_choice, validate_range
6
+
7
+
8
+ class KSamplerSelect(BaseNode):
9
+ __slots__ = ("sampler_name",)
10
+ CATEGORY = "model/sampling/samplers"
11
+ OUTPUTS = {"SAMPLER": 0}
12
+ RETURN_TYPES = ("SAMPLER",)
13
+ INPUT_SOCKET_TYPES = {"sampler_name": "COMBO"}
14
+
15
+ def __init__(
16
+ self, node_id: str, sampler_name: KSampler_Sampler_Names | tuple[str, int]
17
+ ) -> None:
18
+ super().__init__(node_id=node_id)
19
+ self.sampler_name = sampler_name
20
+ self.__validate()
21
+
22
+ def __validate(self) -> None:
23
+ validate_choice("sampler_name", self.sampler_name, KSAMPLER_SAMPLER_NAMES)
24
+
25
+
26
+ class SamplerEulerAncestral(BaseNode):
27
+ __slots__ = ("eta", "s_noise")
28
+ CATEGORY = "model/sampling/samplers"
29
+ OUTPUTS = {"SAMPLER": 0}
30
+ RETURN_TYPES = ("SAMPLER",)
31
+ INPUT_SOCKET_TYPES = {"eta": "FLOAT", "s_noise": "FLOAT"}
32
+
33
+ def __init__(
34
+ self,
35
+ node_id: str,
36
+ eta: float | tuple[str, int] = 1.0,
37
+ s_noise: float | tuple[str, int] = 1.0,
38
+ ) -> None:
39
+ super().__init__(node_id=node_id)
40
+ self.eta = eta
41
+ self.s_noise = s_noise
42
+ self.__validate()
43
+
44
+ def __validate(self) -> None:
45
+ validate_range("eta", self.eta, 0.0, 100.0)
46
+ validate_range("s_noise", self.s_noise, 0.0, 100.0)
47
+
48
+
49
+ class SamplerEulerAncestralCFGPP(BaseNode):
50
+ __slots__ = ("eta", "s_noise")
51
+ CATEGORY = "model/sampling/samplers"
52
+ OUTPUTS = {"SAMPLER": 0}
53
+ RETURN_TYPES = ("SAMPLER",)
54
+ INPUT_SOCKET_TYPES = {"eta": "FLOAT", "s_noise": "FLOAT"}
55
+
56
+ def __init__(
57
+ self,
58
+ node_id: str,
59
+ eta: float | tuple[str, int] = 1.0,
60
+ s_noise: float | tuple[str, int] = 1.0,
61
+ ) -> None:
62
+ super().__init__(node_id=node_id)
63
+ self.eta = eta
64
+ self.s_noise = s_noise
65
+ self.__validate()
66
+
67
+ def __validate(self) -> None:
68
+ validate_range("eta", self.eta, 0.0, 1.0)
69
+ validate_range("s_noise", self.s_noise, 0.0, 10.0)
70
+
71
+
72
+ class SamplerLMS(BaseNode):
73
+ __slots__ = ("order",)
74
+ CATEGORY = "model/sampling/samplers"
75
+ OUTPUTS = {"SAMPLER": 0}
76
+ RETURN_TYPES = ("SAMPLER",)
77
+ INPUT_SOCKET_TYPES = {"order": "INT"}
78
+
79
+ def __init__(self, node_id: str, order: int | tuple[str, int] = 4) -> None:
80
+ super().__init__(node_id=node_id)
81
+ self.order = order
82
+ self.__validate()
83
+
84
+ def __validate(self) -> None:
85
+ validate_range("order", self.order, 1, 100)
86
+
87
+
88
+ SamplerDPMPP_3M_SDE_Noise_Devices = Literal["gpu", "cpu"]
89
+ SAMPLERDPMPP_3M_SDE_NOISE_DEVICES = frozenset(
90
+ get_args(SamplerDPMPP_3M_SDE_Noise_Devices)
91
+ )
92
+
93
+
94
+ class SamplerDPMPP_3M_SDE(BaseNode):
95
+ __slots__ = ("noise_device", "eta", "s_noise")
96
+ CATEGORY = "model/sampling/samplers"
97
+ OUTPUTS = {"SAMPLER": 0}
98
+ RETURN_TYPES = ("SAMPLER",)
99
+ INPUT_SOCKET_TYPES = {"eta": "FLOAT", "s_noise": "FLOAT", "noise_device": "COMBO"}
100
+
101
+ def __init__(
102
+ self,
103
+ node_id: str,
104
+ noise_device: SamplerDPMPP_3M_SDE_Noise_Devices | tuple[str, int],
105
+ eta: float | tuple[str, int] = 1.0,
106
+ s_noise: float | tuple[str, int] = 1.0,
107
+ ) -> None:
108
+ super().__init__(node_id=node_id)
109
+ self.noise_device = noise_device
110
+ self.eta = eta
111
+ self.s_noise = s_noise
112
+ self.__validate()
113
+
114
+ def __validate(self) -> None:
115
+ validate_choice(
116
+ "noise_device", self.noise_device, SAMPLERDPMPP_3M_SDE_NOISE_DEVICES
117
+ )
118
+ validate_range("eta", self.eta, 0.0, 100.0)
119
+ validate_range("s_noise", self.s_noise, 0.0, 100.0)
120
+
121
+
122
+ SamplerDPMPP_2M_SDE_Solver_Types = Literal["midpoint", "heun"]
123
+ SamplerDPMPP_2M_SDE_Noise_Devices = Literal["gpu", "cpu"]
124
+ SAMPLERDPMPP_2M_SDE_SOLVER_TYPES = frozenset(get_args(SamplerDPMPP_2M_SDE_Solver_Types))
125
+ SAMPLERDPMPP_2M_SDE_NOISE_DEVICES = frozenset(
126
+ get_args(SamplerDPMPP_2M_SDE_Noise_Devices)
127
+ )
128
+
129
+
130
+ class SamplerDPMPP_2M_SDE(BaseNode):
131
+ __slots__ = ("solver_type", "noise_device", "eta", "s_noise")
132
+ CATEGORY = "model/sampling/samplers"
133
+ OUTPUTS = {"SAMPLER": 0}
134
+ RETURN_TYPES = ("SAMPLER",)
135
+ INPUT_SOCKET_TYPES = {
136
+ "solver_type": "COMBO",
137
+ "eta": "FLOAT",
138
+ "s_noise": "FLOAT",
139
+ "noise_device": "COMBO",
140
+ }
141
+
142
+ def __init__(
143
+ self,
144
+ node_id: str,
145
+ solver_type: SamplerDPMPP_2M_SDE_Solver_Types | tuple[str, int],
146
+ noise_device: SamplerDPMPP_2M_SDE_Noise_Devices | tuple[str, int],
147
+ eta: float | tuple[str, int] = 1.0,
148
+ s_noise: float | tuple[str, int] = 1.0,
149
+ ) -> None:
150
+ super().__init__(node_id=node_id)
151
+ self.solver_type = solver_type
152
+ self.noise_device = noise_device
153
+ self.eta = eta
154
+ self.s_noise = s_noise
155
+ self.__validate()
156
+
157
+ def __validate(self) -> None:
158
+ validate_choice(
159
+ "solver_type", self.solver_type, SAMPLERDPMPP_2M_SDE_SOLVER_TYPES
160
+ )
161
+ validate_choice(
162
+ "noise_device", self.noise_device, SAMPLERDPMPP_2M_SDE_NOISE_DEVICES
163
+ )
164
+ validate_range("eta", self.eta, 0.0, 100.0)
165
+ validate_range("s_noise", self.s_noise, 0.0, 100.0)
166
+
167
+
168
+ SamplerDPMPP_SDE_Noise_Devices = Literal["gpu", "cpu"]
169
+ SAMPLERDPMPP_SDE_NOISE_DEVICES = frozenset(get_args(SamplerDPMPP_SDE_Noise_Devices))
170
+
171
+
172
+ class SamplerDPMPP_SDE(BaseNode):
173
+ __slots__ = ("noise_device", "eta", "s_noise", "r")
174
+ CATEGORY = "model/sampling/samplers"
175
+ OUTPUTS = {"SAMPLER": 0}
176
+ RETURN_TYPES = ("SAMPLER",)
177
+ INPUT_SOCKET_TYPES = {
178
+ "eta": "FLOAT",
179
+ "s_noise": "FLOAT",
180
+ "r": "FLOAT",
181
+ "noise_device": "COMBO",
182
+ }
183
+
184
+ def __init__(
185
+ self,
186
+ node_id: str,
187
+ noise_device: SamplerDPMPP_SDE_Noise_Devices | tuple[str, int],
188
+ eta: float | tuple[str, int] = 1.0,
189
+ s_noise: float | tuple[str, int] = 1.0,
190
+ r: float | tuple[str, int] = 0.5,
191
+ ) -> None:
192
+ super().__init__(node_id=node_id)
193
+ self.noise_device = noise_device
194
+ self.eta = eta
195
+ self.s_noise = s_noise
196
+ self.r = r
197
+ self.__validate()
198
+
199
+ def __validate(self) -> None:
200
+ validate_choice(
201
+ "noise_device", self.noise_device, SAMPLERDPMPP_SDE_NOISE_DEVICES
202
+ )
203
+ validate_range("eta", self.eta, 0.0, 100.0)
204
+ validate_range("s_noise", self.s_noise, 0.0, 100.0)
205
+ validate_range("r", self.r, 0.0, 100.0)
206
+
207
+
208
+ class SamplerDPMPP_2S_Ancestral(BaseNode):
209
+ __slots__ = ("eta", "s_noise")
210
+ CATEGORY = "model/sampling/samplers"
211
+ OUTPUTS = {"SAMPLER": 0}
212
+ RETURN_TYPES = ("SAMPLER",)
213
+ INPUT_SOCKET_TYPES = {"eta": "FLOAT", "s_noise": "FLOAT"}
214
+
215
+ def __init__(
216
+ self,
217
+ node_id: str,
218
+ eta: float | tuple[str, int] = 1.0,
219
+ s_noise: float | tuple[str, int] = 1.0,
220
+ ) -> None:
221
+ super().__init__(node_id=node_id)
222
+ self.eta = eta
223
+ self.s_noise = s_noise
224
+ self.__validate()
225
+
226
+ def __validate(self) -> None:
227
+ validate_range("eta", self.eta, 0.0, 100.0)
228
+ validate_range("s_noise", self.s_noise, 0.0, 100.0)
229
+
230
+
231
+ class SamplerDPMAdaptative(BaseNode):
232
+ __slots__ = (
233
+ "order",
234
+ "rtol",
235
+ "atol",
236
+ "h_init",
237
+ "pcoeff",
238
+ "icoeff",
239
+ "dcoeff",
240
+ "accept_safety",
241
+ "eta",
242
+ "s_noise",
243
+ )
244
+ CATEGORY = "model/sampling/samplers"
245
+ OUTPUTS = {"SAMPLER": 0}
246
+ RETURN_TYPES = ("SAMPLER",)
247
+ INPUT_SOCKET_TYPES = {
248
+ "order": "INT",
249
+ "rtol": "FLOAT",
250
+ "atol": "FLOAT",
251
+ "h_init": "FLOAT",
252
+ "pcoeff": "FLOAT",
253
+ "icoeff": "FLOAT",
254
+ "dcoeff": "FLOAT",
255
+ "accept_safety": "FLOAT",
256
+ "eta": "FLOAT",
257
+ "s_noise": "FLOAT",
258
+ }
259
+
260
+ def __init__(
261
+ self,
262
+ node_id: str,
263
+ order: int | tuple[str, int] = 3,
264
+ rtol: float | tuple[str, int] = 0.05,
265
+ atol: float | tuple[str, int] = 0.0078,
266
+ h_init: float | tuple[str, int] = 0.05,
267
+ pcoeff: float | tuple[str, int] = 0.0,
268
+ icoeff: float | tuple[str, int] = 1.0,
269
+ dcoeff: float | tuple[str, int] = 0.0,
270
+ accept_safety: float | tuple[str, int] = 0.81,
271
+ eta: float | tuple[str, int] = 0.0,
272
+ s_noise: float | tuple[str, int] = 1.0,
273
+ ) -> None:
274
+ super().__init__(node_id=node_id)
275
+ self.order = order
276
+ self.rtol = rtol
277
+ self.atol = atol
278
+ self.h_init = h_init
279
+ self.pcoeff = pcoeff
280
+ self.icoeff = icoeff
281
+ self.dcoeff = dcoeff
282
+ self.accept_safety = accept_safety
283
+ self.eta = eta
284
+ self.s_noise = s_noise
285
+ self.__validate()
286
+
287
+ def __validate(self) -> None:
288
+ validate_range("order", self.order, 2, 3)
289
+ validate_range("rtol", self.rtol, 0.0, 100.0)
290
+ validate_range("atol", self.atol, 0.0, 100.0)
291
+ validate_range("h_init", self.h_init, 0.0, 100.0)
292
+ validate_range("pcoeff", self.pcoeff, 0.0, 100.0)
293
+ validate_range("icoeff", self.icoeff, 0.0, 100.0)
294
+ validate_range("dcoeff", self.dcoeff, 0.0, 100.0)
295
+ validate_range("accept_safety", self.accept_safety, 0.0, 100.0)
296
+ validate_range("eta", self.eta, 0.0, 100.0)
297
+ validate_range("s_noise", self.s_noise, 0.0, 100.0)
298
+
299
+
300
+ SamplerER_SDE_Solver_Types = Literal["ER-SDE", "Reverse-time SDE", "ODE"]
301
+ SAMPLERER_SDE_SOLVER_TYPES = frozenset(get_args(SamplerER_SDE_Solver_Types))
302
+
303
+
304
+ class SamplerER_SDE(BaseNode):
305
+ __slots__ = ("solver_type", "max_stage", "eta", "s_noise")
306
+ CATEGORY = "model/sampling/samplers"
307
+ OUTPUTS = {"SAMPLER": 0}
308
+ RETURN_TYPES = ("SAMPLER",)
309
+ INPUT_SOCKET_TYPES = {
310
+ "solver_type": "COMBO",
311
+ "max_stage": "INT",
312
+ "eta": "FLOAT",
313
+ "s_noise": "FLOAT",
314
+ }
315
+
316
+ def __init__(
317
+ self,
318
+ node_id: str,
319
+ solver_type: SamplerER_SDE_Solver_Types | tuple[str, int],
320
+ max_stage: int | tuple[str, int] = 3,
321
+ eta: float | tuple[str, int] = 1.0,
322
+ s_noise: float | tuple[str, int] = 1.0,
323
+ ) -> None:
324
+ super().__init__(node_id=node_id)
325
+ self.solver_type = solver_type
326
+ self.max_stage = max_stage
327
+ self.eta = eta
328
+ self.s_noise = s_noise
329
+ self.__validate()
330
+
331
+ def __validate(self) -> None:
332
+ validate_choice("solver_type", self.solver_type, SAMPLERER_SDE_SOLVER_TYPES)
333
+ validate_range("max_stage", self.max_stage, 1, 3)
334
+ validate_range("eta", self.eta, 0.0, 10.0)
335
+ validate_range("s_noise", self.s_noise, 0.0, 100.0)
336
+
337
+
338
+ class SamplerSASolver(BaseNode):
339
+ __slots__ = (
340
+ "model",
341
+ "use_pece",
342
+ "simple_order_2",
343
+ "eta",
344
+ "sde_start_percent",
345
+ "sde_end_percent",
346
+ "s_noise",
347
+ "predictor_order",
348
+ "corrector_order",
349
+ )
350
+ CATEGORY = "model/sampling/samplers"
351
+ OUTPUTS = {"SAMPLER": 0}
352
+ RETURN_TYPES = ("SAMPLER",)
353
+ INPUT_SOCKET_TYPES = {
354
+ "model": "MODEL",
355
+ "eta": "FLOAT",
356
+ "sde_start_percent": "FLOAT",
357
+ "sde_end_percent": "FLOAT",
358
+ "s_noise": "FLOAT",
359
+ "predictor_order": "INT",
360
+ "corrector_order": "INT",
361
+ "use_pece": "BOOLEAN",
362
+ "simple_order_2": "BOOLEAN",
363
+ }
364
+
365
+ def __init__(
366
+ self,
367
+ node_id: str,
368
+ model: tuple[str, int],
369
+ use_pece: bool | tuple[str, int],
370
+ simple_order_2: bool | tuple[str, int],
371
+ eta: float | tuple[str, int] = 1.0,
372
+ sde_start_percent: float | tuple[str, int] = 0.2,
373
+ sde_end_percent: float | tuple[str, int] = 0.8,
374
+ s_noise: float | tuple[str, int] = 1.0,
375
+ predictor_order: int | tuple[str, int] = 3,
376
+ corrector_order: int | tuple[str, int] = 4,
377
+ ) -> None:
378
+ super().__init__(node_id=node_id)
379
+ self.model = model
380
+ self.use_pece = use_pece
381
+ self.simple_order_2 = simple_order_2
382
+ self.eta = eta
383
+ self.sde_start_percent = sde_start_percent
384
+ self.sde_end_percent = sde_end_percent
385
+ self.s_noise = s_noise
386
+ self.predictor_order = predictor_order
387
+ self.corrector_order = corrector_order
388
+ self.__validate()
389
+
390
+ def __validate(self) -> None:
391
+ validate_bool("use_pece", self.use_pece)
392
+ validate_bool("simple_order_2", self.simple_order_2)
393
+ validate_range("eta", self.eta, 0.0, 10.0)
394
+ validate_range("sde_start_percent", self.sde_start_percent, 0.0, 1.0)
395
+ validate_range("sde_end_percent", self.sde_end_percent, 0.0, 1.0)
396
+ validate_range("s_noise", self.s_noise, 0.0, 100.0)
397
+ validate_range("predictor_order", self.predictor_order, 1, 6)
398
+ validate_range("corrector_order", self.corrector_order, 0, 6)
399
+
400
+
401
+ SamplerSEEDS2_Solver_Types = Literal["phi_1", "phi_2"]
402
+ SAMPLERSEEDS2_SOLVER_TYPES = frozenset(get_args(SamplerSEEDS2_Solver_Types))
403
+
404
+
405
+ class SamplerSEEDS2(BaseNode):
406
+ __slots__ = ("solver_type", "eta", "s_noise", "r")
407
+ CATEGORY = "model/sampling/samplers"
408
+ OUTPUTS = {"SAMPLER": 0}
409
+ RETURN_TYPES = ("SAMPLER",)
410
+ INPUT_SOCKET_TYPES = {
411
+ "solver_type": "COMBO",
412
+ "eta": "FLOAT",
413
+ "s_noise": "FLOAT",
414
+ "r": "FLOAT",
415
+ }
416
+
417
+ def __init__(
418
+ self,
419
+ node_id: str,
420
+ solver_type: SamplerSEEDS2_Solver_Types | tuple[str, int],
421
+ eta: float | tuple[str, int] = 1.0,
422
+ s_noise: float | tuple[str, int] = 1.0,
423
+ r: float | tuple[str, int] = 0.5,
424
+ ) -> None:
425
+ super().__init__(node_id=node_id)
426
+ self.solver_type = solver_type
427
+ self.eta = eta
428
+ self.s_noise = s_noise
429
+ self.r = r
430
+ self.__validate()
431
+
432
+ def __validate(self) -> None:
433
+ validate_choice("solver_type", self.solver_type, SAMPLERSEEDS2_SOLVER_TYPES)
434
+ validate_range("eta", self.eta, 0.0, 100.0)
435
+ validate_range("s_noise", self.s_noise, 0.0, 100.0)
436
+ validate_range("r", self.r, 0.01, 1.0)
437
+
438
+
439
+ SamplerLCMUpscale_Upscale_Methods = Literal[
440
+ "bislerp", "nearest-exact", "bilinear", "area", "bicubic"
441
+ ]
442
+ SAMPLERLCMUPSCALE_UPSCALE_METHODS = frozenset(
443
+ get_args(SamplerLCMUpscale_Upscale_Methods)
444
+ )
445
+
446
+
447
+ class SamplerLCMUpscale(BaseNode):
448
+ __slots__ = ("upscale_method", "scale_ratio", "scale_steps")
449
+ CATEGORY = "model/sampling/samplers"
450
+ OUTPUTS = {"SAMPLER": 0}
451
+ RETURN_TYPES = ("SAMPLER",)
452
+ INPUT_SOCKET_TYPES = {
453
+ "scale_ratio": "FLOAT",
454
+ "scale_steps": "INT",
455
+ "upscale_method": "COMBO",
456
+ }
457
+
458
+ def __init__(
459
+ self,
460
+ node_id: str,
461
+ upscale_method: SamplerLCMUpscale_Upscale_Methods | tuple[str, int],
462
+ scale_ratio: float | tuple[str, int] = 1.0,
463
+ scale_steps: int | tuple[str, int] = -1,
464
+ ) -> None:
465
+ super().__init__(node_id=node_id)
466
+ self.upscale_method = upscale_method
467
+ self.scale_ratio = scale_ratio
468
+ self.scale_steps = scale_steps
469
+ self.__validate()
470
+
471
+ def __validate(self) -> None:
472
+ validate_choice(
473
+ "upscale_method", self.upscale_method, SAMPLERLCMUPSCALE_UPSCALE_METHODS
474
+ )
475
+ validate_range("scale_ratio", self.scale_ratio, 0.1, 20.0)
476
+ validate_range("scale_steps", self.scale_steps, -1, 1000)
477
+
478
+
479
+ class SamplerLCM(BaseNode):
480
+ __slots__ = ("s_noise", "s_noise_end", "noise_clip_std")
481
+ CATEGORY = "model/sampling/samplers"
482
+ OUTPUTS = {"SAMPLER": 0}
483
+ RETURN_TYPES = ("SAMPLER",)
484
+ INPUT_SOCKET_TYPES = {
485
+ "s_noise": "FLOAT",
486
+ "s_noise_end": "FLOAT",
487
+ "noise_clip_std": "FLOAT",
488
+ }
489
+
490
+ def __init__(
491
+ self,
492
+ node_id: str,
493
+ s_noise: float | tuple[str, int] = 1.0,
494
+ s_noise_end: float | tuple[str, int] = 1.0,
495
+ noise_clip_std: float | tuple[str, int] = 0.0,
496
+ ) -> None:
497
+ super().__init__(node_id=node_id)
498
+ self.s_noise = s_noise
499
+ self.s_noise_end = s_noise_end
500
+ self.noise_clip_std = noise_clip_std
501
+ self.__validate()
502
+
503
+ def __validate(self) -> None:
504
+ validate_range("s_noise", self.s_noise, 0.0, 64.0)
505
+ validate_range("s_noise_end", self.s_noise_end, 0.0, 64.0)
506
+ validate_range("noise_clip_std", self.noise_clip_std, 0.0, 10.0)
507
+
508
+
509
+ class SamplerARVideo(BaseNode):
510
+ __slots__ = ("num_frame_per_block",)
511
+ CATEGORY = "model/sampling/samplers"
512
+ OUTPUTS = {"SAMPLER": 0}
513
+ RETURN_TYPES = ("SAMPLER",)
514
+ INPUT_SOCKET_TYPES = {"num_frame_per_block": "INT"}
515
+
516
+ def __init__(
517
+ self, node_id: str, num_frame_per_block: int | tuple[str, int] = 1
518
+ ) -> None:
519
+ super().__init__(node_id=node_id)
520
+ self.num_frame_per_block = num_frame_per_block
521
+ self.__validate()
522
+
523
+ def __validate(self) -> None:
524
+ validate_range("num_frame_per_block", self.num_frame_per_block, 1, 64)
525
+
526
+
527
+ class VOIDSampler(BaseNode):
528
+ __slots__ = ()
529
+ CATEGORY = "model/sampling/samplers"
530
+ OUTPUTS = {"SAMPLER": 0}
531
+ RETURN_TYPES = ("SAMPLER",)