bizyengine 0.4.2__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 (76) hide show
  1. bizyengine/__init__.py +35 -0
  2. bizyengine/bizy_server/__init__.py +7 -0
  3. bizyengine/bizy_server/api_client.py +763 -0
  4. bizyengine/bizy_server/errno.py +122 -0
  5. bizyengine/bizy_server/error_handler.py +3 -0
  6. bizyengine/bizy_server/execution.py +55 -0
  7. bizyengine/bizy_server/resp.py +24 -0
  8. bizyengine/bizy_server/server.py +898 -0
  9. bizyengine/bizy_server/utils.py +93 -0
  10. bizyengine/bizyair_extras/__init__.py +24 -0
  11. bizyengine/bizyair_extras/nodes_advanced_refluxcontrol.py +62 -0
  12. bizyengine/bizyair_extras/nodes_cogview4.py +31 -0
  13. bizyengine/bizyair_extras/nodes_comfyui_detail_daemon.py +180 -0
  14. bizyengine/bizyair_extras/nodes_comfyui_instantid.py +164 -0
  15. bizyengine/bizyair_extras/nodes_comfyui_layerstyle_advance.py +141 -0
  16. bizyengine/bizyair_extras/nodes_comfyui_pulid_flux.py +88 -0
  17. bizyengine/bizyair_extras/nodes_controlnet.py +50 -0
  18. bizyengine/bizyair_extras/nodes_custom_sampler.py +130 -0
  19. bizyengine/bizyair_extras/nodes_dataset.py +99 -0
  20. bizyengine/bizyair_extras/nodes_differential_diffusion.py +16 -0
  21. bizyengine/bizyair_extras/nodes_flux.py +69 -0
  22. bizyengine/bizyair_extras/nodes_image_utils.py +93 -0
  23. bizyengine/bizyair_extras/nodes_ip2p.py +20 -0
  24. bizyengine/bizyair_extras/nodes_ipadapter_plus/__init__.py +1 -0
  25. bizyengine/bizyair_extras/nodes_ipadapter_plus/nodes_ipadapter_plus.py +1598 -0
  26. bizyengine/bizyair_extras/nodes_janus_pro.py +81 -0
  27. bizyengine/bizyair_extras/nodes_kolors_mz/__init__.py +86 -0
  28. bizyengine/bizyair_extras/nodes_model_advanced.py +62 -0
  29. bizyengine/bizyair_extras/nodes_sd3.py +52 -0
  30. bizyengine/bizyair_extras/nodes_segment_anything.py +256 -0
  31. bizyengine/bizyair_extras/nodes_segment_anything_utils.py +134 -0
  32. bizyengine/bizyair_extras/nodes_testing_utils.py +139 -0
  33. bizyengine/bizyair_extras/nodes_trellis.py +199 -0
  34. bizyengine/bizyair_extras/nodes_ultimatesdupscale.py +137 -0
  35. bizyengine/bizyair_extras/nodes_upscale_model.py +32 -0
  36. bizyengine/bizyair_extras/nodes_wan_video.py +49 -0
  37. bizyengine/bizyair_extras/oauth_callback/main.py +118 -0
  38. bizyengine/core/__init__.py +8 -0
  39. bizyengine/core/commands/__init__.py +1 -0
  40. bizyengine/core/commands/base.py +27 -0
  41. bizyengine/core/commands/invoker.py +4 -0
  42. bizyengine/core/commands/processors/model_hosting_processor.py +0 -0
  43. bizyengine/core/commands/processors/prompt_processor.py +123 -0
  44. bizyengine/core/commands/servers/model_server.py +0 -0
  45. bizyengine/core/commands/servers/prompt_server.py +234 -0
  46. bizyengine/core/common/__init__.py +8 -0
  47. bizyengine/core/common/caching.py +198 -0
  48. bizyengine/core/common/client.py +262 -0
  49. bizyengine/core/common/env_var.py +101 -0
  50. bizyengine/core/common/utils.py +93 -0
  51. bizyengine/core/configs/conf.py +112 -0
  52. bizyengine/core/configs/models.json +101 -0
  53. bizyengine/core/configs/models.yaml +329 -0
  54. bizyengine/core/data_types.py +20 -0
  55. bizyengine/core/image_utils.py +288 -0
  56. bizyengine/core/nodes_base.py +159 -0
  57. bizyengine/core/nodes_io.py +97 -0
  58. bizyengine/core/path_utils/__init__.py +9 -0
  59. bizyengine/core/path_utils/path_manager.py +276 -0
  60. bizyengine/core/path_utils/utils.py +34 -0
  61. bizyengine/misc/__init__.py +0 -0
  62. bizyengine/misc/auth.py +83 -0
  63. bizyengine/misc/llm.py +431 -0
  64. bizyengine/misc/mzkolors.py +93 -0
  65. bizyengine/misc/nodes.py +1208 -0
  66. bizyengine/misc/nodes_controlnet_aux.py +491 -0
  67. bizyengine/misc/nodes_controlnet_union_sdxl.py +171 -0
  68. bizyengine/misc/route_sam.py +60 -0
  69. bizyengine/misc/segment_anything.py +276 -0
  70. bizyengine/misc/supernode.py +182 -0
  71. bizyengine/misc/utils.py +218 -0
  72. bizyengine/version.txt +1 -0
  73. bizyengine-0.4.2.dist-info/METADATA +12 -0
  74. bizyengine-0.4.2.dist-info/RECORD +76 -0
  75. bizyengine-0.4.2.dist-info/WHEEL +5 -0
  76. bizyengine-0.4.2.dist-info/top_level.txt +1 -0
@@ -0,0 +1,1208 @@
1
+ import os
2
+ from typing import List
3
+
4
+ import comfy
5
+ from bizyengine.core import BizyAirBaseNode, BizyAirNodeIO, create_node_data, data_types
6
+ from bizyengine.core.configs.conf import config_manager
7
+ from bizyengine.core.path_utils import path_manager as folder_paths
8
+
9
+ LOGO = "☁️"
10
+ PREFIX = f"{LOGO}BizyAir"
11
+
12
+ MAX_RESOLUTION = 16384 # https://github.com/comfyanonymous/ComfyUI/blob/7390ff3b1ec2e15017ba4a52d6eaabc4aa4636e3/nodes.py#L45
13
+
14
+
15
+ class ProgressCallback:
16
+ def __init__(self, total=None) -> None:
17
+ comfy.model_management.throw_exception_if_processing_interrupted()
18
+ self.pbar = comfy.utils.ProgressBar(None)
19
+
20
+ def __call__(self, value, total=None, preview=None):
21
+ self.pbar.update_absolute(value, total, preview)
22
+
23
+
24
+ class BizyAir_KSampler(BizyAirBaseNode):
25
+ @classmethod
26
+ def INPUT_TYPES(s):
27
+ return {
28
+ "required": {
29
+ "model": (data_types.MODEL,),
30
+ "seed": (
31
+ "INT",
32
+ {"default": 0, "min": 0, "max": 0xFFFFFFFFFFFFFFFF},
33
+ ),
34
+ "steps": ("INT", {"default": 20, "min": 1, "max": 50}),
35
+ "cfg": (
36
+ "FLOAT",
37
+ {
38
+ "default": 8.0,
39
+ "min": 0.0,
40
+ "max": 100.0,
41
+ "step": 0.1,
42
+ "round": 0.01,
43
+ },
44
+ ),
45
+ "sampler_name": (comfy.samplers.KSampler.SAMPLERS,),
46
+ "scheduler": (comfy.samplers.KSampler.SCHEDULERS,),
47
+ "positive": (data_types.CONDITIONING,),
48
+ "negative": (data_types.CONDITIONING,),
49
+ "latent_image": ("LATENT",),
50
+ "denoise": (
51
+ "FLOAT",
52
+ {"default": 1.0, "min": 0.0, "max": 1.0, "step": 0.01},
53
+ ),
54
+ }
55
+ }
56
+
57
+ RETURN_TYPES = ("LATENT",)
58
+ FUNCTION = "sample"
59
+ RETURN_NAMES = (f"LATENT",)
60
+ CATEGORY = f"{PREFIX}/sampling"
61
+
62
+ def sample(
63
+ self,
64
+ model,
65
+ seed,
66
+ steps,
67
+ cfg,
68
+ sampler_name,
69
+ scheduler,
70
+ positive,
71
+ negative,
72
+ latent_image,
73
+ denoise=1,
74
+ ):
75
+ new_model: BizyAirNodeIO = model.copy(self.assigned_id)
76
+ new_model.add_node_data(
77
+ class_type="KSampler",
78
+ inputs={
79
+ "model": model,
80
+ "seed": seed,
81
+ "steps": steps,
82
+ "cfg": cfg,
83
+ "sampler_name": sampler_name,
84
+ "scheduler": scheduler,
85
+ "positive": positive,
86
+ "negative": negative,
87
+ "latent_image": latent_image,
88
+ "denoise": denoise,
89
+ },
90
+ outputs={"slot_index": 0},
91
+ )
92
+ progress_callback = ProgressCallback()
93
+ return new_model.send_request(progress_callback=progress_callback)
94
+
95
+
96
+ class KSamplerAdvanced(BizyAirBaseNode):
97
+ @classmethod
98
+ def INPUT_TYPES(s):
99
+ return {
100
+ "required": {
101
+ "model": (data_types.MODEL,),
102
+ "add_noise": (["enable", "disable"],),
103
+ "noise_seed": (
104
+ "INT",
105
+ {"default": 0, "min": 0, "max": 0xFFFFFFFFFFFFFFFF},
106
+ ),
107
+ "steps": ("INT", {"default": 20, "min": 1, "max": 10000}),
108
+ "cfg": (
109
+ "FLOAT",
110
+ {
111
+ "default": 8.0,
112
+ "min": 0.0,
113
+ "max": 100.0,
114
+ "step": 0.1,
115
+ "round": 0.01,
116
+ },
117
+ ),
118
+ "sampler_name": (comfy.samplers.KSampler.SAMPLERS,),
119
+ "scheduler": (comfy.samplers.KSampler.SCHEDULERS,),
120
+ "positive": (data_types.CONDITIONING,),
121
+ "negative": (data_types.CONDITIONING,),
122
+ "latent_image": ("LATENT",),
123
+ "start_at_step": ("INT", {"default": 0, "min": 0, "max": 10000}),
124
+ "end_at_step": ("INT", {"default": 10000, "min": 0, "max": 10000}),
125
+ "return_with_leftover_noise": (["disable", "enable"],),
126
+ }
127
+ }
128
+
129
+ RETURN_TYPES = ("LATENT",)
130
+ FUNCTION = "sample"
131
+
132
+ CATEGORY = "sampling"
133
+
134
+ def sample(self, model, **kwargs):
135
+ new_model: BizyAirNodeIO = model.copy(self.assigned_id)
136
+ kwargs["model"] = model
137
+ new_model.add_node_data(class_type="KSamplerAdvanced", inputs=kwargs)
138
+ progress_callback = ProgressCallback()
139
+ return new_model.send_request(progress_callback=progress_callback)
140
+
141
+
142
+ class BizyAir_CheckpointLoaderSimple(BizyAirBaseNode):
143
+ @classmethod
144
+ def INPUT_TYPES(s):
145
+ return {
146
+ "required": {
147
+ "ckpt_name": (folder_paths.get_filename_list("checkpoints"),),
148
+ }
149
+ }
150
+
151
+ RETURN_TYPES = (data_types.MODEL, data_types.CLIP, data_types.VAE)
152
+ FUNCTION = "load_checkpoint"
153
+ CATEGORY = f"{PREFIX}/loaders"
154
+ RETURN_NAMES = (
155
+ f"model",
156
+ f"clip",
157
+ f"vae",
158
+ )
159
+
160
+ def load_checkpoint(self, ckpt_name):
161
+ node_datas = [
162
+ create_node_data(
163
+ class_type="CheckpointLoaderSimple",
164
+ inputs={"ckpt_name": ckpt_name},
165
+ outputs={"slot_index": slot_index},
166
+ )
167
+ for slot_index in range(3)
168
+ ]
169
+ config_file = folder_paths.guess_config(ckpt_name=ckpt_name)
170
+ assigned_id = self.assigned_id
171
+ outs = [
172
+ BizyAirNodeIO(
173
+ assigned_id,
174
+ {assigned_id: data},
175
+ config_file=config_file,
176
+ )
177
+ for data in node_datas
178
+ ]
179
+
180
+ return (
181
+ outs[0],
182
+ outs[1],
183
+ outs[2],
184
+ )
185
+
186
+
187
+ class BizyAir_CLIPTextEncode(BizyAirBaseNode):
188
+ @classmethod
189
+ def INPUT_TYPES(s):
190
+ return {
191
+ "required": {
192
+ "text": (
193
+ "STRING",
194
+ {"multiline": True, "dynamicPrompts": True},
195
+ ),
196
+ "clip": (data_types.CLIP,),
197
+ }
198
+ }
199
+
200
+ RETURN_TYPES = (data_types.CONDITIONING,)
201
+ RETURN_NAMES = ("CONDITIONING",)
202
+ FUNCTION = "encode"
203
+
204
+ CATEGORY = f"{PREFIX}/conditioning"
205
+
206
+ def encode(self, clip, text):
207
+ new_clip: BizyAirNodeIO = clip.copy(self.assigned_id)
208
+
209
+ new_clip.add_node_data(
210
+ class_type="CLIPTextEncode",
211
+ inputs={
212
+ "text": text,
213
+ "clip": clip,
214
+ },
215
+ outputs={"slot_index": 0},
216
+ )
217
+ return (new_clip,)
218
+
219
+
220
+ class BizyAir_VAEDecode(BizyAirBaseNode):
221
+ @classmethod
222
+ def INPUT_TYPES(s):
223
+ return {"required": {"samples": ("LATENT",), "vae": (data_types.VAE,)}}
224
+
225
+ RETURN_TYPES = ("IMAGE",)
226
+ RETURN_NAMES = (f"IMAGE",)
227
+ FUNCTION = "decode"
228
+
229
+ CATEGORY = f"{PREFIX}/latent"
230
+
231
+ def decode(self, vae, samples):
232
+ new_vae: BizyAirNodeIO = vae.copy(self.assigned_id)
233
+ new_vae.add_node_data(
234
+ class_type="VAEDecode",
235
+ inputs={
236
+ "samples": samples,
237
+ "vae": vae,
238
+ },
239
+ outputs={"slot_index": 0},
240
+ )
241
+ return new_vae.send_request()
242
+
243
+
244
+ class BizyAir_LoraLoader(BizyAirBaseNode):
245
+ @classmethod
246
+ def INPUT_TYPES(s):
247
+ return {
248
+ "required": {
249
+ "model": (data_types.MODEL,),
250
+ "clip": (data_types.CLIP,),
251
+ "lora_name": (
252
+ [
253
+ "to choose",
254
+ ],
255
+ ),
256
+ "strength_model": (
257
+ "FLOAT",
258
+ {"default": 1.0, "min": -100.0, "max": 100.0, "step": 0.01},
259
+ ),
260
+ "strength_clip": (
261
+ "FLOAT",
262
+ {"default": 1.0, "min": -100.0, "max": 100.0, "step": 0.01},
263
+ ),
264
+ "model_version_id": (
265
+ "STRING",
266
+ {
267
+ "default": "",
268
+ },
269
+ ),
270
+ }
271
+ }
272
+
273
+ RETURN_TYPES = (data_types.MODEL, data_types.CLIP)
274
+ RETURN_NAMES = ("MODEL", "CLIP")
275
+
276
+ FUNCTION = "load_lora"
277
+ CATEGORY = f"{PREFIX}/loaders"
278
+
279
+ def load_lora(
280
+ self,
281
+ model,
282
+ clip,
283
+ lora_name,
284
+ strength_model,
285
+ strength_clip,
286
+ model_version_id: str = None,
287
+ ):
288
+ assigned_id = self.assigned_id
289
+ new_model: BizyAirNodeIO = model.copy(assigned_id)
290
+ new_clip: BizyAirNodeIO = clip.copy(assigned_id)
291
+ instances: List[BizyAirNodeIO] = [new_model, new_clip]
292
+
293
+ if model_version_id is not None and model_version_id != "":
294
+ # use model version id as lora name
295
+ lora_name = (
296
+ f"{config_manager.get_model_version_id_prefix()}{model_version_id}"
297
+ )
298
+
299
+ for slot_index, ins in zip(range(2), instances):
300
+ ins.add_node_data(
301
+ class_type="LoraLoader",
302
+ inputs={
303
+ "model": model,
304
+ "clip": clip,
305
+ "lora_name": lora_name,
306
+ "strength_model": strength_model,
307
+ "strength_clip": strength_clip,
308
+ },
309
+ outputs={"slot_index": slot_index},
310
+ )
311
+ return (
312
+ new_model,
313
+ new_clip,
314
+ )
315
+
316
+ @classmethod
317
+ def VALIDATE_INPUTS(cls, lora_name):
318
+ if lora_name == "" or lora_name is None:
319
+ return False
320
+ return True
321
+
322
+
323
+ class BizyAir_LoraLoader_Legacy(BizyAirBaseNode):
324
+ @classmethod
325
+ def INPUT_TYPES(s):
326
+ return {
327
+ "required": {
328
+ "model": (data_types.MODEL,),
329
+ "clip": (data_types.CLIP,),
330
+ "lora_name": (folder_paths.get_filename_list("loras"),),
331
+ "strength_model": (
332
+ "FLOAT",
333
+ {"default": 1.0, "min": -100.0, "max": 100.0, "step": 0.01},
334
+ ),
335
+ "strength_clip": (
336
+ "FLOAT",
337
+ {"default": 1.0, "min": -100.0, "max": 100.0, "step": 0.01},
338
+ ),
339
+ }
340
+ }
341
+
342
+ RETURN_TYPES = (data_types.MODEL, data_types.CLIP)
343
+ RETURN_NAMES = ("MODEL", "CLIP")
344
+
345
+ FUNCTION = "load_lora"
346
+
347
+ CATEGORY = f"{PREFIX}/loaders"
348
+
349
+ def load_lora(self, model, clip, lora_name, strength_model, strength_clip):
350
+ assigned_id = self.assigned_id
351
+ new_model: BizyAirNodeIO = model.copy(assigned_id)
352
+ new_clip: BizyAirNodeIO = clip.copy(assigned_id)
353
+ instances: List[BizyAirNodeIO] = [new_model, new_clip]
354
+ for slot_index, ins in zip(range(2), instances):
355
+ ins.add_node_data(
356
+ class_type="LoraLoader",
357
+ inputs={
358
+ "model": model,
359
+ "clip": clip,
360
+ "lora_name": lora_name,
361
+ "strength_model": strength_model,
362
+ "strength_clip": strength_clip,
363
+ },
364
+ outputs={"slot_index": slot_index},
365
+ )
366
+ return (
367
+ new_model,
368
+ new_clip,
369
+ )
370
+
371
+
372
+ class BizyAir_VAEEncode(BizyAirBaseNode):
373
+ @classmethod
374
+ def INPUT_TYPES(s):
375
+ return {"required": {"pixels": ("IMAGE",), "vae": (data_types.VAE,)}}
376
+
377
+ RETURN_TYPES = ("LATENT",)
378
+ RETURN_NAMES = (f"LATENT",)
379
+ FUNCTION = "encode"
380
+ CATEGORY = f"{PREFIX}/latent"
381
+
382
+ def encode(self, vae, pixels):
383
+ new_vae: BizyAirNodeIO = vae.copy(self.assigned_id)
384
+ new_vae.add_node_data(
385
+ class_type="VAEEncode",
386
+ inputs={
387
+ "vae": vae,
388
+ "pixels": pixels,
389
+ },
390
+ outputs={"slot_index": 0},
391
+ )
392
+ return new_vae.send_request()
393
+
394
+
395
+ class BizyAir_VAEEncodeForInpaint(BizyAirBaseNode):
396
+ @classmethod
397
+ def INPUT_TYPES(s):
398
+ return {
399
+ "required": {
400
+ "pixels": ("IMAGE",),
401
+ "vae": (data_types.VAE,),
402
+ "mask": ("MASK",),
403
+ "grow_mask_by": ("INT", {"default": 6, "min": 0, "max": 64, "step": 1}),
404
+ }
405
+ }
406
+
407
+ RETURN_TYPES = (f"LATENT",)
408
+ RETURN_NAMES = (f"LATENT",)
409
+ FUNCTION = "encode"
410
+ CATEGORY = f"{PREFIX}/latent/inpaint"
411
+
412
+ def encode(self, vae, pixels, mask, grow_mask_by=6):
413
+ new_vae: BizyAirNodeIO = vae.copy(self.assigned_id)
414
+ new_vae.add_node_data(
415
+ class_type="VAEEncodeForInpaint",
416
+ inputs={
417
+ "vae": vae,
418
+ "pixels": pixels,
419
+ "mask": mask,
420
+ "grow_mask_by": grow_mask_by,
421
+ },
422
+ outputs={"slot_index": 0},
423
+ )
424
+ return new_vae.send_request()
425
+
426
+
427
+ class BizyAir_ControlNetLoader(BizyAirBaseNode):
428
+ @classmethod
429
+ def INPUT_TYPES(s):
430
+ return {
431
+ "required": {
432
+ "control_net_name": (
433
+ [
434
+ "to choose",
435
+ ],
436
+ ),
437
+ "model_version_id": ("STRING", {"default": "", "multiline": False}),
438
+ }
439
+ }
440
+
441
+ RETURN_TYPES = (data_types.CONTROL_NET,)
442
+ RETURN_NAMES = ("CONTROL_NET",)
443
+ FUNCTION = "load_controlnet"
444
+
445
+ CATEGORY = f"{PREFIX}/loaders"
446
+
447
+ @classmethod
448
+ def VALIDATE_INPUTS(cls, control_net_name, model_version_id):
449
+ if control_net_name == "to choose":
450
+ return False
451
+ if model_version_id is not None and model_version_id != "":
452
+ return True
453
+ return True
454
+
455
+ def load_controlnet(self, control_net_name, model_version_id):
456
+ if model_version_id is not None and model_version_id != "":
457
+ control_net_name = (
458
+ f"{config_manager.get_model_version_id_prefix()}{model_version_id}"
459
+ )
460
+
461
+ node_data = create_node_data(
462
+ class_type="ControlNetLoader",
463
+ inputs={
464
+ "control_net_name": control_net_name,
465
+ },
466
+ outputs={"slot_index": 0},
467
+ )
468
+ assigned_id = self.assigned_id
469
+ node = BizyAirNodeIO(assigned_id, {assigned_id: node_data})
470
+ return (node,)
471
+
472
+
473
+ class BizyAir_ControlNetLoader_Legacy(BizyAirBaseNode):
474
+ @classmethod
475
+ def INPUT_TYPES(s):
476
+ return {
477
+ "required": {
478
+ "control_net_name": (folder_paths.get_filename_list("controlnet"),)
479
+ }
480
+ }
481
+
482
+ RETURN_TYPES = (data_types.CONTROL_NET,)
483
+ RETURN_NAMES = ("CONTROL_NET",)
484
+ FUNCTION = "load_controlnet"
485
+
486
+ CATEGORY = f"{PREFIX}/loaders"
487
+
488
+ def load_controlnet(self, control_net_name):
489
+
490
+ node_data = create_node_data(
491
+ class_type="ControlNetLoader",
492
+ inputs={
493
+ "control_net_name": control_net_name,
494
+ },
495
+ outputs={"slot_index": 0},
496
+ )
497
+ assigned_id = self.assigned_id
498
+ node = BizyAirNodeIO(assigned_id, {assigned_id: node_data})
499
+ return (node,)
500
+
501
+
502
+ class BizyAir_ControlNetApplyAdvanced(BizyAirBaseNode):
503
+ @classmethod
504
+ def INPUT_TYPES(s):
505
+ return {
506
+ "required": {
507
+ "positive": (data_types.CONDITIONING,),
508
+ "negative": (data_types.CONDITIONING,),
509
+ "control_net": (data_types.CONTROL_NET,),
510
+ "image": ("IMAGE",),
511
+ "strength": (
512
+ "FLOAT",
513
+ {"default": 1.0, "min": 0.0, "max": 10.0, "step": 0.01},
514
+ ),
515
+ "start_percent": (
516
+ "FLOAT",
517
+ {"default": 0.0, "min": 0.0, "max": 1.0, "step": 0.001},
518
+ ),
519
+ "end_percent": (
520
+ "FLOAT",
521
+ {"default": 1.0, "min": 0.0, "max": 1.0, "step": 0.001},
522
+ ),
523
+ }
524
+ }
525
+
526
+ RETURN_TYPES = (data_types.CONDITIONING, data_types.CONDITIONING)
527
+ RETURN_NAMES = ("positive", "negative")
528
+ FUNCTION = "apply_controlnet"
529
+
530
+ CATEGORY = "conditioning"
531
+
532
+ def apply_controlnet(self, **kwargs):
533
+ new_positive = kwargs["positive"].copy(self.assigned_id)
534
+ new_negative = kwargs["negative"].copy(self.assigned_id)
535
+ outs = [
536
+ new_positive,
537
+ new_negative,
538
+ ]
539
+ for slot_index, out in zip(range(0, 2), outs):
540
+ out.add_node_data(
541
+ class_type="ControlNetApplyAdvanced",
542
+ inputs=kwargs,
543
+ outputs={"slot_index": slot_index},
544
+ )
545
+ return outs
546
+
547
+
548
+ class BizyAir_ControlNetApply(BizyAirBaseNode):
549
+ @classmethod
550
+ def INPUT_TYPES(s):
551
+ return {
552
+ "required": {
553
+ "conditioning": (data_types.CONDITIONING,),
554
+ "control_net": (data_types.CONTROL_NET,),
555
+ "image": ("IMAGE",),
556
+ "strength": (
557
+ "FLOAT",
558
+ {"default": 1.0, "min": 0.0, "max": 10.0, "step": 0.01},
559
+ ),
560
+ }
561
+ }
562
+
563
+ RETURN_TYPES = (data_types.CONDITIONING,)
564
+ RETURN_NAMES = ("CONDITIONING",)
565
+ FUNCTION = "apply_controlnet"
566
+
567
+ CATEGORY = f"{PREFIX}/conditioning/controlnet"
568
+
569
+ def apply_controlnet(
570
+ self, conditioning, control_net: BizyAirNodeIO, image, strength
571
+ ):
572
+ new_cond: BizyAirNodeIO = conditioning.copy(self.assigned_id)
573
+ new_cond.add_node_data(
574
+ class_type="ControlNetApply",
575
+ inputs={
576
+ "conditioning": conditioning,
577
+ "control_net": control_net,
578
+ "image": image,
579
+ "strength": strength,
580
+ },
581
+ outputs={"slot_index": 0},
582
+ )
583
+ return (new_cond,)
584
+
585
+
586
+ class BizyAir_CLIPVisionLoader(BizyAirBaseNode):
587
+ @classmethod
588
+ def INPUT_TYPES(s):
589
+ return {
590
+ "required": {
591
+ "clip_name": (folder_paths.get_filename_list("clip_vision"),),
592
+ }
593
+ }
594
+
595
+ RETURN_TYPES = ("CLIP_VISION",)
596
+ FUNCTION = "load_clip"
597
+
598
+ CATEGORY = "loaders"
599
+
600
+ def load_clip(self, clip_name):
601
+ node_data = create_node_data(
602
+ class_type="CLIPVisionLoader",
603
+ inputs={"clip_name": clip_name},
604
+ outputs={"slot_index": 0},
605
+ )
606
+ clip_vision = BizyAirNodeIO(self.assigned_id, {self.assigned_id: node_data})
607
+ return (clip_vision,)
608
+
609
+
610
+ class VAELoader(BizyAirBaseNode):
611
+ @classmethod
612
+ def INPUT_TYPES(s):
613
+ return {"required": {"vae_name": (folder_paths.get_filename_list("vae"),)}}
614
+
615
+ RETURN_TYPES = (data_types.VAE,)
616
+ RETURN_NAMES = ("vae",)
617
+ FUNCTION = "load_vae"
618
+
619
+ CATEGORY = "loaders"
620
+
621
+ def load_vae(self, vae_name):
622
+ node_data = create_node_data(
623
+ class_type="VAELoader",
624
+ inputs={"vae_name": vae_name},
625
+ outputs={"slot_index": 0},
626
+ )
627
+ vae = BizyAirNodeIO(
628
+ self.assigned_id,
629
+ {self.assigned_id: node_data},
630
+ config_file=folder_paths.guess_config(vae_name=vae_name),
631
+ )
632
+ return (vae,)
633
+
634
+
635
+ class UNETLoader(BizyAirBaseNode):
636
+ @classmethod
637
+ def INPUT_TYPES(s):
638
+ return {
639
+ "required": {
640
+ "unet_name": (folder_paths.get_filename_list("unet"),),
641
+ "weight_dtype": (["default", "fp8_e4m3fn", "fp8_e5m2"],),
642
+ }
643
+ }
644
+
645
+ RETURN_TYPES = (data_types.MODEL,)
646
+ FUNCTION = "load_unet"
647
+
648
+ CATEGORY = "advanced/loaders"
649
+
650
+ def load_unet(self, unet_name, weight_dtype):
651
+ node_data = create_node_data(
652
+ class_type="UNETLoader",
653
+ inputs={
654
+ "unet_name": unet_name,
655
+ "weight_dtype": weight_dtype,
656
+ },
657
+ outputs={"slot_index": 0},
658
+ )
659
+ model = BizyAirNodeIO(
660
+ self.assigned_id,
661
+ {self.assigned_id: node_data},
662
+ config_file=folder_paths.guess_config(unet_name=unet_name),
663
+ )
664
+ return (model,)
665
+
666
+
667
+ class SamplerCustomAdvanced(BizyAirBaseNode):
668
+ @classmethod
669
+ def INPUT_TYPES(s):
670
+ return {
671
+ "required": {
672
+ "noise": ("NOISE",),
673
+ "guider": ("GUIDER",),
674
+ "sampler": ("SAMPLER",),
675
+ "sigmas": ("SIGMAS",),
676
+ "latent_image": ("LATENT",),
677
+ }
678
+ }
679
+
680
+ RETURN_TYPES = ("LATENT", "LATENT")
681
+ RETURN_NAMES = ("output", "denoised_output")
682
+
683
+ # FUNCTION = "sample"
684
+
685
+ CATEGORY = "sampling/custom_sampling"
686
+
687
+ # def sample(self, **kwargs):
688
+ # guider: BizyAirNodeIO = kwargs["guider"].copy(self.assigned_id)
689
+ # guider.add_node_data(
690
+ # class_type="SamplerCustomAdvanced",
691
+ # inputs=kwargs,
692
+ # outputs={"slot_index": 0},
693
+ # )
694
+ # return (guider, None)
695
+
696
+
697
+ class BasicGuider(BizyAirBaseNode):
698
+ @classmethod
699
+ def INPUT_TYPES(s):
700
+ return {
701
+ "required": {
702
+ "model": (data_types.MODEL,),
703
+ "conditioning": (data_types.CONDITIONING,),
704
+ }
705
+ }
706
+
707
+ RETURN_TYPES = ("GUIDER",)
708
+
709
+ FUNCTION = "get_guider"
710
+ CATEGORY = "sampling/custom_sampling/guiders"
711
+
712
+ def get_guider(self, model: BizyAirNodeIO, conditioning):
713
+ new_model = model.copy(self.assigned_id)
714
+ new_model.add_node_data(
715
+ class_type="BasicGuider",
716
+ inputs={
717
+ "model": model,
718
+ "conditioning": conditioning,
719
+ },
720
+ outputs={"slot_index": 0},
721
+ )
722
+ return (new_model,)
723
+
724
+
725
+ class BasicScheduler(BizyAirBaseNode):
726
+ @classmethod
727
+ def INPUT_TYPES(s):
728
+ return {
729
+ "required": {
730
+ "model": (data_types.MODEL,),
731
+ "scheduler": (comfy.samplers.SCHEDULER_NAMES,),
732
+ "steps": ("INT", {"default": 20, "min": 1, "max": 10000}),
733
+ "denoise": (
734
+ "FLOAT",
735
+ {"default": 1.0, "min": 0.0, "max": 1.0, "step": 0.01},
736
+ ),
737
+ }
738
+ }
739
+
740
+ RETURN_TYPES = ("SIGMAS",)
741
+ CATEGORY = "sampling/custom_sampling/schedulers"
742
+
743
+ FUNCTION = "get_sigmas"
744
+
745
+ def get_sigmas(self, **kwargs):
746
+ new_model: BizyAirNodeIO = kwargs["model"].copy(self.assigned_id)
747
+ new_model.add_node_data(
748
+ class_type="BasicScheduler",
749
+ inputs=kwargs,
750
+ outputs={"slot_index": 0},
751
+ )
752
+ return (new_model,)
753
+
754
+
755
+ class DualCLIPLoader(BizyAirBaseNode):
756
+ @classmethod
757
+ def INPUT_TYPES(s):
758
+ return {
759
+ "required": {
760
+ "clip_name1": (folder_paths.get_filename_list("clip"),),
761
+ "clip_name2": (folder_paths.get_filename_list("clip"),),
762
+ "type": (["sdxl", "sd3", "flux"],),
763
+ }
764
+ }
765
+
766
+ RETURN_TYPES = (data_types.CLIP,)
767
+ FUNCTION = "load_clip"
768
+
769
+ CATEGORY = "advanced/loaders"
770
+
771
+ def load_clip(self, clip_name1, clip_name2, type):
772
+
773
+ node_data = create_node_data(
774
+ class_type="DualCLIPLoader",
775
+ inputs={
776
+ "clip_name1": clip_name1,
777
+ "clip_name2": clip_name2,
778
+ "type": type,
779
+ },
780
+ outputs={"slot_index": 0},
781
+ )
782
+ model = BizyAirNodeIO(
783
+ self.assigned_id,
784
+ {self.assigned_id: node_data},
785
+ config_file=folder_paths.guess_config(clip_name=clip_name1),
786
+ )
787
+ return (model,)
788
+
789
+
790
+ class KSamplerSelect(BizyAirBaseNode):
791
+ @classmethod
792
+ def INPUT_TYPES(s):
793
+ return {
794
+ "required": {
795
+ "sampler_name": (comfy.samplers.SAMPLER_NAMES,),
796
+ }
797
+ }
798
+
799
+ RETURN_TYPES = ("SAMPLER",)
800
+ CATEGORY = "sampling/custom_sampling/samplers"
801
+
802
+ FUNCTION = "get_sampler"
803
+
804
+ def get_sampler(self, **kwargs):
805
+ node_data = create_node_data(
806
+ class_type="KSamplerSelect",
807
+ inputs=kwargs,
808
+ outputs={"slot_index": 0},
809
+ )
810
+ model = BizyAirNodeIO(
811
+ self.assigned_id,
812
+ {self.assigned_id: node_data},
813
+ )
814
+ return (model,)
815
+
816
+
817
+ class RandomNoise(BizyAirBaseNode):
818
+ @classmethod
819
+ def INPUT_TYPES(s):
820
+ return {
821
+ "required": {
822
+ "noise_seed": (
823
+ "INT",
824
+ {"default": 0, "min": 0, "max": 0xFFFFFFFFFFFFFFFF},
825
+ ),
826
+ }
827
+ }
828
+
829
+ RETURN_TYPES = ("NOISE",)
830
+ FUNCTION = "get_noise"
831
+ CATEGORY = "sampling/custom_sampling/noise"
832
+
833
+ def get_noise(self, noise_seed):
834
+ node_data = create_node_data(
835
+ class_type="RandomNoise",
836
+ inputs={
837
+ "noise_seed": noise_seed,
838
+ },
839
+ outputs={"slot_index": 0},
840
+ )
841
+ model = BizyAirNodeIO(
842
+ self.assigned_id,
843
+ {self.assigned_id: node_data},
844
+ )
845
+ return (model,)
846
+
847
+
848
+ class CLIPSetLastLayer(BizyAirBaseNode):
849
+ @classmethod
850
+ def INPUT_TYPES(s):
851
+ return {
852
+ "required": {
853
+ "clip": (data_types.CLIP,),
854
+ "stop_at_clip_layer": (
855
+ "INT",
856
+ {"default": -1, "min": -24, "max": -1, "step": 1},
857
+ ),
858
+ }
859
+ }
860
+
861
+ RETURN_TYPES = (data_types.CLIP,)
862
+ FUNCTION = "set_last_layer"
863
+
864
+ CATEGORY = "conditioning"
865
+
866
+ def set_last_layer(self, clip: BizyAirNodeIO, stop_at_clip_layer):
867
+ new_clip = clip.copy(new_node_id=self.assigned_id)
868
+ new_clip.add_node_data(
869
+ class_type="CLIPSetLastLayer",
870
+ inputs={
871
+ "stop_at_clip_layer": stop_at_clip_layer,
872
+ "clip": clip,
873
+ },
874
+ outputs={"slot_index": 0},
875
+ )
876
+ return (new_clip,)
877
+
878
+
879
+ class InpaintModelConditioning(BizyAirBaseNode):
880
+ @classmethod
881
+ def INPUT_TYPES(s):
882
+ return {
883
+ "required": {
884
+ "positive": (data_types.CONDITIONING,),
885
+ "negative": (data_types.CONDITIONING,),
886
+ "vae": (data_types.VAE,),
887
+ "pixels": ("IMAGE",),
888
+ "mask": ("MASK",),
889
+ }
890
+ }
891
+
892
+ RETURN_TYPES = (data_types.CONDITIONING, data_types.CONDITIONING, "LATENT")
893
+ RETURN_NAMES = ("positive", "negative", "latent")
894
+ # FUNCTION = "encode"
895
+
896
+ CATEGORY = "conditioning/inpaint"
897
+
898
+
899
+ # noise_mask newly added in https://github.com/comfyanonymous/ComfyUI/blob/8f0009aad0591ceee59a147738aa227187b07898/nodes.py#L385
900
+ # "noise_mask": ("BOOLEAN", {"default": False, "tooltip": "Add a noise mask to the latent so sampling will only happen within the mask. Might improve results or completely break things depending on the model."}),
901
+ class InpaintModelConditioning_v2(InpaintModelConditioning):
902
+ CLASS_TYPE_NAME = "InpaintModelConditioning"
903
+
904
+ @classmethod
905
+ def INPUT_TYPES(s):
906
+ ret = super().INPUT_TYPES()
907
+ ret["required"]["noise_mask"] = (
908
+ "BOOLEAN",
909
+ {
910
+ "default": False,
911
+ "tooltip": "Add a noise mask to the latent so sampling will only happen within the mask. Might improve results or completely break things depending on the model.",
912
+ },
913
+ )
914
+ return ret
915
+
916
+
917
+ class SharedLoraLoader(BizyAir_LoraLoader_Legacy):
918
+ @classmethod
919
+ def INPUT_TYPES(s):
920
+ return {
921
+ "required": {
922
+ "share_id": ("STRING", {"default": "share_id"}),
923
+ "lora_name": ([],),
924
+ "model": (data_types.MODEL,),
925
+ "clip": (data_types.CLIP,),
926
+ "strength_model": (
927
+ "FLOAT",
928
+ {"default": 1.0, "min": -100.0, "max": 100.0, "step": 0.01},
929
+ ),
930
+ "strength_clip": (
931
+ "FLOAT",
932
+ {"default": 1.0, "min": -100.0, "max": 100.0, "step": 0.01},
933
+ ),
934
+ }
935
+ }
936
+
937
+ RETURN_TYPES = (data_types.MODEL, data_types.CLIP)
938
+ RETURN_NAMES = ("MODEL", "CLIP")
939
+ FUNCTION = "shared_load_lora"
940
+ CATEGORY = f"{PREFIX}/loaders"
941
+ NODE_DISPLAY_NAME = "Shared Lora Loader"
942
+
943
+ @classmethod
944
+ def VALIDATE_INPUTS(cls, share_id: str, lora_name: str):
945
+ if lora_name in folder_paths.filename_path_mapping.get("loras", {}):
946
+ return True
947
+
948
+ outs = folder_paths.get_share_filename_list("loras", share_id=share_id)
949
+ if lora_name not in outs:
950
+ raise ValueError(
951
+ f"Lora {lora_name} not found in share {share_id} with {outs}"
952
+ )
953
+ return True
954
+
955
+ def shared_load_lora(
956
+ self, model, clip, lora_name, strength_model, strength_clip, **kwargs
957
+ ):
958
+ resolved_path = folder_paths.filename_path_mapping["loras"][lora_name]
959
+ return super().load_lora(
960
+ model=model,
961
+ clip=clip,
962
+ lora_name=resolved_path,
963
+ strength_model=strength_model,
964
+ strength_clip=strength_clip,
965
+ )
966
+
967
+
968
+ class ConditioningCombine(BizyAirBaseNode):
969
+ @classmethod
970
+ def INPUT_TYPES(s):
971
+ return {
972
+ "required": {
973
+ "conditioning_1": (data_types.CONDITIONING,),
974
+ "conditioning_2": (data_types.CONDITIONING,),
975
+ }
976
+ }
977
+
978
+ RETURN_TYPES = (data_types.CONDITIONING,)
979
+ # FUNCTION = "combine"
980
+ NODE_DISPLAY_NAME = "Conditioning (Combine)"
981
+ CATEGORY = "conditioning"
982
+
983
+
984
+ class ConditioningAverage(BizyAirBaseNode):
985
+ @classmethod
986
+ def INPUT_TYPES(s):
987
+ return {
988
+ "required": {
989
+ "conditioning_to": (data_types.CONDITIONING,),
990
+ "conditioning_from": (data_types.CONDITIONING,),
991
+ "conditioning_to_strength": (
992
+ "FLOAT",
993
+ {"default": 1.0, "min": 0.0, "max": 1.0, "step": 0.01},
994
+ ),
995
+ }
996
+ }
997
+
998
+ RETURN_TYPES = (data_types.CONDITIONING,)
999
+ # FUNCTION = "addWeighted"
1000
+ NODE_DISPLAY_NAME = "Conditioning (Average)"
1001
+ CATEGORY = "conditioning"
1002
+
1003
+
1004
+ class ConditioningConcat(BizyAirBaseNode):
1005
+ @classmethod
1006
+ def INPUT_TYPES(s):
1007
+ return {
1008
+ "required": {
1009
+ "conditioning_to": (data_types.CONDITIONING,),
1010
+ "conditioning_from": (data_types.CONDITIONING,),
1011
+ }
1012
+ }
1013
+
1014
+ RETURN_TYPES = (data_types.CONDITIONING,)
1015
+ # FUNCTION = "concat"
1016
+ NODE_DISPLAY_NAME = "Conditioning (Concat)"
1017
+ CATEGORY = "conditioning"
1018
+
1019
+
1020
+ class ConditioningSetArea(BizyAirBaseNode):
1021
+ @classmethod
1022
+ def INPUT_TYPES(s):
1023
+ return {
1024
+ "required": {
1025
+ "conditioning": (data_types.CONDITIONING,),
1026
+ "width": (
1027
+ "INT",
1028
+ {"default": 64, "min": 64, "max": MAX_RESOLUTION, "step": 8},
1029
+ ),
1030
+ "height": (
1031
+ "INT",
1032
+ {"default": 64, "min": 64, "max": MAX_RESOLUTION, "step": 8},
1033
+ ),
1034
+ "x": (
1035
+ "INT",
1036
+ {"default": 0, "min": 0, "max": MAX_RESOLUTION, "step": 8},
1037
+ ),
1038
+ "y": (
1039
+ "INT",
1040
+ {"default": 0, "min": 0, "max": MAX_RESOLUTION, "step": 8},
1041
+ ),
1042
+ "strength": (
1043
+ "FLOAT",
1044
+ {"default": 1.0, "min": 0.0, "max": 10.0, "step": 0.01},
1045
+ ),
1046
+ }
1047
+ }
1048
+
1049
+ RETURN_TYPES = (data_types.CONDITIONING,)
1050
+ # FUNCTION = "append"
1051
+ NODE_DISPLAY_NAME = "Conditioning (Set Area)"
1052
+ CATEGORY = "conditioning"
1053
+
1054
+
1055
+ class ConditioningSetAreaPercentage(BizyAirBaseNode):
1056
+ @classmethod
1057
+ def INPUT_TYPES(s):
1058
+ return {
1059
+ "required": {
1060
+ "conditioning": (data_types.CONDITIONING,),
1061
+ "width": (
1062
+ "FLOAT",
1063
+ {"default": 1.0, "min": 0, "max": 1.0, "step": 0.01},
1064
+ ),
1065
+ "height": (
1066
+ "FLOAT",
1067
+ {"default": 1.0, "min": 0, "max": 1.0, "step": 0.01},
1068
+ ),
1069
+ "x": ("FLOAT", {"default": 0, "min": 0, "max": 1.0, "step": 0.01}),
1070
+ "y": ("FLOAT", {"default": 0, "min": 0, "max": 1.0, "step": 0.01}),
1071
+ "strength": (
1072
+ "FLOAT",
1073
+ {"default": 1.0, "min": 0.0, "max": 10.0, "step": 0.01},
1074
+ ),
1075
+ }
1076
+ }
1077
+
1078
+ RETURN_TYPES = (data_types.CONDITIONING,)
1079
+ # FUNCTION = "append"
1080
+ NODE_DISPLAY_NAME = "Conditioning (Set Area with Percentage)"
1081
+ CATEGORY = "conditioning"
1082
+
1083
+
1084
+ class ConditioningSetMask(BizyAirBaseNode):
1085
+ @classmethod
1086
+ def INPUT_TYPES(s):
1087
+ return {
1088
+ "required": {
1089
+ "conditioning": (data_types.CONDITIONING,),
1090
+ "mask": ("MASK",),
1091
+ "strength": (
1092
+ "FLOAT",
1093
+ {"default": 1.0, "min": 0.0, "max": 10.0, "step": 0.01},
1094
+ ),
1095
+ "set_cond_area": (["default", "mask bounds"],),
1096
+ }
1097
+ }
1098
+
1099
+ RETURN_TYPES = (data_types.CONDITIONING,)
1100
+ # FUNCTION = "append"
1101
+ NODE_DISPLAY_NAME = "Conditioning (Set Mask)"
1102
+ CATEGORY = "conditioning"
1103
+
1104
+
1105
+ class ConditioningZeroOut(BizyAirBaseNode):
1106
+ @classmethod
1107
+ def INPUT_TYPES(s):
1108
+ return {"required": {"conditioning": (data_types.CONDITIONING,)}}
1109
+
1110
+ RETURN_TYPES = (data_types.CONDITIONING,)
1111
+ # FUNCTION = "zero_out"
1112
+
1113
+ CATEGORY = "advanced/conditioning"
1114
+
1115
+
1116
+ class ConditioningSetTimestepRange(BizyAirBaseNode):
1117
+ @classmethod
1118
+ def INPUT_TYPES(s):
1119
+ return {
1120
+ "required": {
1121
+ "conditioning": (data_types.CONDITIONING,),
1122
+ "start": (
1123
+ "FLOAT",
1124
+ {"default": 0.0, "min": 0.0, "max": 1.0, "step": 0.001},
1125
+ ),
1126
+ "end": (
1127
+ "FLOAT",
1128
+ {"default": 1.0, "min": 0.0, "max": 1.0, "step": 0.001},
1129
+ ),
1130
+ }
1131
+ }
1132
+
1133
+ RETURN_TYPES = (data_types.CONDITIONING,)
1134
+ # FUNCTION = "set_range"
1135
+
1136
+ CATEGORY = "advanced/conditioning"
1137
+
1138
+
1139
+ class SharedControlNetLoader(BizyAir_ControlNetLoader_Legacy):
1140
+ @classmethod
1141
+ def INPUT_TYPES(s):
1142
+ ret = super().INPUT_TYPES()
1143
+ ret["required"]["share_id"] = ("STRING", {"default": "share_id"})
1144
+ return ret
1145
+
1146
+ NODE_DISPLAY_NAME = "Shared Load ControlNet Model"
1147
+
1148
+ @classmethod
1149
+ def VALIDATE_INPUTS(cls, share_id: str, control_net_name: str):
1150
+ if control_net_name in folder_paths.filename_path_mapping.get("controlnet", {}):
1151
+ return True
1152
+
1153
+ outs = folder_paths.get_share_filename_list("controlnet", share_id=share_id)
1154
+ if control_net_name not in outs:
1155
+ raise ValueError(
1156
+ f"ControlNet {control_net_name} not found in share {share_id} with {outs}"
1157
+ )
1158
+
1159
+ return True
1160
+
1161
+ def load_controlnet(self, control_net_name, share_id, **kwargs):
1162
+ resolved_path = folder_paths.filename_path_mapping["controlnet"][
1163
+ control_net_name
1164
+ ]
1165
+ return super().load_controlnet(control_net_name=resolved_path, **kwargs)
1166
+
1167
+
1168
+ class CLIPVisionEncode(BizyAirBaseNode):
1169
+ @classmethod
1170
+ def INPUT_TYPES(s):
1171
+ return {"required": {"clip_vision": ("CLIP_VISION",), "image": ("IMAGE",)}}
1172
+
1173
+ RETURN_TYPES = ("CLIP_VISION_OUTPUT",)
1174
+ # FUNCTION = "encode"
1175
+
1176
+ CATEGORY = "conditioning"
1177
+
1178
+
1179
+ class StyleModelLoader(BizyAirBaseNode):
1180
+ @classmethod
1181
+ def INPUT_TYPES(s):
1182
+ return {
1183
+ "required": {
1184
+ "style_model_name": (folder_paths.get_filename_list("style_models"),)
1185
+ }
1186
+ }
1187
+
1188
+ RETURN_TYPES = (data_types.STYLE_MODEL,)
1189
+ # FUNCTION = "load_style_model"
1190
+
1191
+ CATEGORY = "loaders"
1192
+
1193
+
1194
+ class StyleModelApply(BizyAirBaseNode):
1195
+ @classmethod
1196
+ def INPUT_TYPES(s):
1197
+ return {
1198
+ "required": {
1199
+ "conditioning": (data_types.CONDITIONING,),
1200
+ "style_model": (data_types.STYLE_MODEL,),
1201
+ "clip_vision_output": ("CLIP_VISION_OUTPUT",),
1202
+ }
1203
+ }
1204
+
1205
+ RETURN_TYPES = (data_types.CONDITIONING,)
1206
+ # FUNCTION = "apply_stylemodel"
1207
+
1208
+ CATEGORY = "conditioning/style_model"