comfy-ui-api-workflow 0.0.1__tar.gz

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 (177) hide show
  1. comfy_ui_api_workflow-0.0.1/.gitignore +231 -0
  2. comfy_ui_api_workflow-0.0.1/LICENSE +21 -0
  3. comfy_ui_api_workflow-0.0.1/PKG-INFO +123 -0
  4. comfy_ui_api_workflow-0.0.1/README.md +99 -0
  5. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/__about__.py +1 -0
  6. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/__init__.py +9 -0
  7. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/__init__.py +0 -0
  8. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/data_structure.py +182 -0
  9. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/enums.py +13 -0
  10. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/errors/__init__.py +3 -0
  11. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/errors/data_structure.py +34 -0
  12. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/errors/node.py +63 -0
  13. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/errors/output.py +5 -0
  14. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/errors/pipeline.py +14 -0
  15. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/errors/workflow.py +13 -0
  16. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/exceptions.py +22 -0
  17. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/lazy.py +71 -0
  18. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/__init__.py +3 -0
  19. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/advanced/__init__.py +3 -0
  20. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/advanced/debug.py +103 -0
  21. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/advanced/guidance.py +281 -0
  22. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/advanced/hooks/__init__.py +29 -0
  23. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/advanced/hooks/clip.py +35 -0
  24. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/advanced/hooks/combine.py +108 -0
  25. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/advanced/hooks/cond_pair.py +203 -0
  26. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/advanced/hooks/cond_single.py +143 -0
  27. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/advanced/hooks/create.py +130 -0
  28. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/advanced/hooks/scheduling.py +167 -0
  29. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/advanced/multigpu.py +78 -0
  30. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/audio.py +260 -0
  31. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/base.py +214 -0
  32. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/experimental/__init__.py +283 -0
  33. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/experimental/attention_experiments.py +156 -0
  34. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/experimental/stable_cascade.py +16 -0
  35. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/image/__init__.py +601 -0
  36. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/image/adjustments.py +46 -0
  37. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/image/background_removal.py +16 -0
  38. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/image/batch.py +236 -0
  39. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/image/color.py +104 -0
  40. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/image/compositing.py +128 -0
  41. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/image/detection.py +689 -0
  42. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/image/filters.py +215 -0
  43. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/image/geometry_estimation.py +307 -0
  44. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/image/mask.py +291 -0
  45. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/image/post_processors.py +45 -0
  46. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/image/pre_processors.py +13 -0
  47. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/image/transform.py +385 -0
  48. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/image/upscaling.py +188 -0
  49. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/image/video.py +66 -0
  50. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/__init__.py +3 -0
  51. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/conditioning/__init__.py +395 -0
  52. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/conditioning/ace.py +232 -0
  53. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/conditioning/autoregressive.py +53 -0
  54. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/conditioning/controlnet.py +153 -0
  55. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/conditioning/cosmos.py +108 -0
  56. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/conditioning/flux.py +121 -0
  57. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/conditioning/gligen.py +57 -0
  58. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/conditioning/hidream.py +31 -0
  59. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/conditioning/hunyuan_3d.py +44 -0
  60. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/conditioning/hunyuan_image.py +21 -0
  61. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/conditioning/hunyuan_video.py +243 -0
  62. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/conditioning/instructpix2pix.py +28 -0
  63. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/conditioning/kandinsky.py +78 -0
  64. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/conditioning/lotus.py +8 -0
  65. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/conditioning/ltxv.py +504 -0
  66. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/conditioning/lumina.py +39 -0
  67. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/conditioning/minimax.py +110 -0
  68. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/conditioning/minimax_music.py +53 -0
  69. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/conditioning/photomaker.py +28 -0
  70. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/conditioning/pixart.py +34 -0
  71. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/conditioning/qwen_image.py +101 -0
  72. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/conditioning/stable_audio.py +34 -0
  73. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/conditioning/stable_cascade.py +16 -0
  74. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/conditioning/stable_diffusion.py +141 -0
  75. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/conditioning/stable_diffusion_upscaler.py +37 -0
  76. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/conditioning/stable_video.py +63 -0
  77. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/conditioning/stable_video_3d.py +53 -0
  78. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/conditioning/stable_zero123.py +128 -0
  79. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/conditioning/transform.py +341 -0
  80. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/conditioning/trellis.py +168 -0
  81. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/conditioning/triposplat.py +54 -0
  82. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/conditioning/void.py +61 -0
  83. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/conditioning/wan/__init__.py +184 -0
  84. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/conditioning/wan/animate.py +255 -0
  85. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/conditioning/wan/camera.py +150 -0
  86. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/conditioning/wan/dancer.py +102 -0
  87. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/conditioning/wan/fun_control.py +129 -0
  88. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/conditioning/wan/fun_inpaint.py +68 -0
  89. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/conditioning/wan/humo.py +63 -0
  90. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/conditioning/wan/move.py +332 -0
  91. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/conditioning/wan/phantom_subject.py +58 -0
  92. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/conditioning/wan/scail.py +161 -0
  93. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/conditioning/wan/sound.py +128 -0
  94. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/conditioning/wan/vace.py +73 -0
  95. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/conditioning/yue2.py +189 -0
  96. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/conditioning/z_image.py +59 -0
  97. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/latent/__init__.py +510 -0
  98. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/latent/ace.py +49 -0
  99. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/latent/advanced/__init__.py +210 -0
  100. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/latent/advanced/operations.py +113 -0
  101. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/latent/autoregressive.py +36 -0
  102. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/latent/batch.py +93 -0
  103. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/latent/chroma_radiance.py +28 -0
  104. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/latent/cosmos.py +36 -0
  105. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/latent/flux.py +28 -0
  106. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/latent/hidream.py +28 -0
  107. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/latent/hunyuan_3d.py +57 -0
  108. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/latent/hunyuan_image.py +28 -0
  109. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/latent/hunyuan_video.py +130 -0
  110. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/latent/ltxv.py +162 -0
  111. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/latent/minimax.py +28 -0
  112. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/latent/minimax_music.py +25 -0
  113. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/latent/mochi.py +36 -0
  114. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/latent/qwen.py +36 -0
  115. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/latent/seedvr.py +16 -0
  116. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/latent/stable_cascade.py +60 -0
  117. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/latent/stable_diffusion.py +28 -0
  118. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/latent/transform.py +92 -0
  119. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/latent/trellis.py +91 -0
  120. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/latent/triposplat.py +86 -0
  121. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/latent/void.py +54 -0
  122. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/latent/yue2.py +25 -0
  123. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/loaders.py +820 -0
  124. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/merging/__init__.py +290 -0
  125. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/merging/model_specific.py +4370 -0
  126. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/patch/__init__.py +463 -0
  127. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/patch/anima.py +53 -0
  128. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/patch/chroma_radiance.py +50 -0
  129. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/patch/flux.py +63 -0
  130. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/patch/hidream.py +72 -0
  131. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/patch/ltxv.py +125 -0
  132. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/patch/minimax.py +92 -0
  133. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/patch/qwen.py +57 -0
  134. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/patch/sensenova.py +21 -0
  135. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/patch/stable_cascade.py +21 -0
  136. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/patch/stable_diffusion.py +21 -0
  137. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/patch/supir.py +57 -0
  138. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/patch/unet.py +281 -0
  139. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/patch/wan.py +143 -0
  140. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/sampling/__init__.py +228 -0
  141. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/sampling/custom.py +123 -0
  142. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/sampling/guiders.py +252 -0
  143. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/sampling/noise.py +52 -0
  144. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/sampling/samplers.py +531 -0
  145. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/sampling/schedulers.py +462 -0
  146. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/sampling/sigmas.py +163 -0
  147. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/model/training.py +249 -0
  148. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/partner/__init__.py +3 -0
  149. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/partner/audio/__init__.py +3 -0
  150. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/partner/audio/elevenlabs.py +47 -0
  151. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/partner/image/__init__.py +3 -0
  152. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/partner/image/bytedance.py +16 -0
  153. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/partner/image/krea.py +31 -0
  154. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/partner/image/luma.py +27 -0
  155. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/partner/image/recraft.py +220 -0
  156. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/partner/text/__init__.py +3 -0
  157. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/partner/text/gemini.py +25 -0
  158. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/partner/text/openai.py +77 -0
  159. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/partner/video/__init__.py +3 -0
  160. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/partner/video/bytedance.py +16 -0
  161. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/partner/video/pixverse.py +27 -0
  162. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/text.py +506 -0
  163. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/three_d/__init__.py +563 -0
  164. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/three_d/mesh.py +183 -0
  165. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/three_d/splat.py +262 -0
  166. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/three_d/texturing.py +254 -0
  167. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/utilities/__init__.py +404 -0
  168. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/utilities/logic.py +44 -0
  169. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/utilities/primitive.py +107 -0
  170. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/validation.py +126 -0
  171. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/video/__init__.py +440 -0
  172. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/video/batch.py +45 -0
  173. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/video/preprocessors.py +24 -0
  174. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/nodes/video/transform.py +52 -0
  175. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/pipeline.py +67 -0
  176. comfy_ui_api_workflow-0.0.1/comfy_ui_api_workflow/_impl/workflow.py +539 -0
  177. comfy_ui_api_workflow-0.0.1/pyproject.toml +54 -0
@@ -0,0 +1,231 @@
1
+ # Custom
2
+ .venv
3
+ dist
4
+ video_wan2_2_14B_i2v.json
5
+ incremental-dag.tdd.md
6
+ new_object_info.json
7
+ workflow-ksampler.tdd.md
8
+ /docs
9
+ .env
10
+ /runpod_outputs
11
+
12
+ # Byte-compiled / optimized / DLL files
13
+ __pycache__/
14
+ *.py[codz]
15
+ *$py.class
16
+
17
+ # C extensions
18
+ *.so
19
+
20
+ # Distribution / packaging
21
+ .Python
22
+ build/
23
+ develop-eggs/
24
+ dist/
25
+ downloads/
26
+ eggs/
27
+ .eggs/
28
+ lib/
29
+ lib64/
30
+ parts/
31
+ sdist/
32
+ var/
33
+ wheels/
34
+ share/python-wheels/
35
+ *.egg-info/
36
+ .installed.cfg
37
+ *.egg
38
+ MANIFEST
39
+
40
+ # PyInstaller
41
+ # Usually these files are written by a python script from a template
42
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
43
+ *.manifest
44
+ *.spec
45
+
46
+ # Installer logs
47
+ pip-log.txt
48
+ pip-delete-this-directory.txt
49
+
50
+ # Unit test / coverage reports
51
+ htmlcov/
52
+ .tox/
53
+ .nox/
54
+ .coverage
55
+ .coverage.*
56
+ .cache
57
+ nosetests.xml
58
+ coverage.xml
59
+ *.cover
60
+ *.py.cover
61
+ *.lcov
62
+ .hypothesis/
63
+ .pytest_cache/
64
+ cover/
65
+
66
+ # Translations
67
+ *.mo
68
+ *.pot
69
+
70
+ # Django stuff:
71
+ *.log
72
+ local_settings.py
73
+ db.sqlite3
74
+ db.sqlite3-journal
75
+
76
+ # Flask stuff:
77
+ instance/
78
+ .webassets-cache
79
+
80
+ # Scrapy stuff:
81
+ .scrapy
82
+
83
+ # Sphinx documentation
84
+ docs/_build/
85
+
86
+ # PyBuilder
87
+ .pybuilder/
88
+ target/
89
+
90
+ # Jupyter Notebook
91
+ .ipynb_checkpoints
92
+
93
+ # IPython
94
+ profile_default/
95
+ ipython_config.py
96
+
97
+ # pyenv
98
+ # For a library or package, you might want to ignore these files since the code is
99
+ # intended to run in multiple environments; otherwise, check them in:
100
+ # .python-version
101
+
102
+ # pipenv
103
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
104
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
105
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
106
+ # install all needed dependencies.
107
+ # Pipfile.lock
108
+
109
+ # uv
110
+ # Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
111
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
112
+ # commonly ignored for libraries.
113
+ # uv.lock
114
+
115
+ # poetry
116
+ # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
117
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
118
+ # commonly ignored for libraries.
119
+ # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
120
+ # poetry.lock
121
+ # poetry.toml
122
+
123
+ # pdm
124
+ # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
125
+ # pdm recommends including project-wide configuration in pdm.toml, but excluding .pdm-python.
126
+ # https://pdm-project.org/en/latest/usage/project/#working-with-version-control
127
+ # pdm.lock
128
+ # pdm.toml
129
+ .pdm-python
130
+ .pdm-build/
131
+
132
+ # pixi
133
+ # Similar to Pipfile.lock, it is generally recommended to include pixi.lock in version control.
134
+ # pixi.lock
135
+ # Pixi creates a virtual environment in the .pixi directory, just like venv module creates one
136
+ # in the .venv directory. It is recommended not to include this directory in version control.
137
+ .pixi/*
138
+ !.pixi/config.toml
139
+
140
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
141
+ __pypackages__/
142
+
143
+ # Celery stuff
144
+ celerybeat-schedule*
145
+ celerybeat.pid
146
+
147
+ # Redis
148
+ *.rdb
149
+ *.aof
150
+ *.pid
151
+
152
+ # RabbitMQ
153
+ mnesia/
154
+ rabbitmq/
155
+ rabbitmq-data/
156
+
157
+ # ActiveMQ
158
+ activemq-data/
159
+
160
+ # SageMath parsed files
161
+ *.sage.py
162
+
163
+ # Environments
164
+ .env
165
+ .envrc
166
+ .venv
167
+ env/
168
+ venv/
169
+ ENV/
170
+ env.bak/
171
+ venv.bak/
172
+
173
+ # Spyder project settings
174
+ .spyderproject
175
+ .spyproject
176
+
177
+ # Rope project settings
178
+ .ropeproject
179
+
180
+ # mkdocs/Zensical documentation
181
+ /site
182
+
183
+ # mypy
184
+ .mypy_cache/
185
+ .dmypy.json
186
+ dmypy.json
187
+
188
+ # Pyre type checker
189
+ .pyre/
190
+
191
+ # pytype static type analyzer
192
+ .pytype/
193
+
194
+ # Cython debug symbols
195
+ cython_debug/
196
+
197
+ # PyCharm
198
+ # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
199
+ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
200
+ # and can be added to the global gitignore or merged into this file. For a more nuclear
201
+ # option (not recommended) you can uncomment the following to ignore the entire idea folder.
202
+ # .idea/
203
+
204
+ # Abstra
205
+ # Abstra is an AI-powered process automation framework.
206
+ # Ignore directories containing user credentials, local state, and settings.
207
+ # Learn more at https://abstra.io/docs
208
+ .abstra/
209
+
210
+ # Visual Studio Code
211
+ # Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore that
212
+ # can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore
213
+ # and can be added to the global gitignore or merged into this file. However, if you prefer, you
214
+ # could uncomment the following to ignore the entire vscode folder
215
+ # .vscode/
216
+ # Temporary file for partial code execution
217
+ tempCodeRunnerFile.py
218
+
219
+ # Ruff stuff:
220
+ .ruff_cache/
221
+
222
+ # PyPI configuration file
223
+ .pypirc
224
+
225
+ # Marimo
226
+ marimo/_static/
227
+ marimo/_lsp/
228
+ __marimo__/
229
+
230
+ # Streamlit
231
+ .streamlit/secrets.toml
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Fabio Antonio Astore
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,123 @@
1
+ Metadata-Version: 2.5
2
+ Name: comfy-ui-api-workflow
3
+ Version: 0.0.1
4
+ Summary: Run ComfyUI workflows through the ComfyUI API.
5
+ Project-URL: Documentation, https://github.com/fabioantonioastore/comfy-ui-api-workflow#readme
6
+ Project-URL: Issues, https://github.com/fabioantonioastore/comfy-ui-api-workflow/issues
7
+ Project-URL: Source, https://github.com/fabioantonioastore/comfy-ui-api-workflow
8
+ Author: Fabio Antonio Astore
9
+ License-Expression: MIT
10
+ License-File: LICENSE
11
+ Keywords: api,comfyui,workflow
12
+ Classifier: Development Status :: 2 - Pre-Alpha
13
+ Classifier: Operating System :: OS Independent
14
+ Classifier: Programming Language :: Python
15
+ Classifier: Programming Language :: Python :: 3 :: Only
16
+ Classifier: Programming Language :: Python :: 3.10
17
+ Classifier: Programming Language :: Python :: 3.11
18
+ Classifier: Programming Language :: Python :: 3.12
19
+ Classifier: Programming Language :: Python :: 3.13
20
+ Classifier: Programming Language :: Python :: 3.14
21
+ Classifier: Programming Language :: Python :: Implementation :: CPython
22
+ Requires-Python: >=3.10
23
+ Description-Content-Type: text/markdown
24
+
25
+ # comfy-ui-api-workflow
26
+
27
+ Build [ComfyUI](https://github.com/comfyanonymous/ComfyUI) workflows in Python
28
+ and export them in the API format that ComfyUI's `POST /prompt` endpoint runs.
29
+
30
+ - **618 ComfyUI nodes as Python classes**, from `KSampler` to Wan, LTXV, Flux,
31
+ 3D and partner API nodes.
32
+ - **Checked as you build**: input types, `min`/`max` ranges, combo choices,
33
+ output names, socket types (no `LATENT` into a `CLIP` input) and cycles. A bad
34
+ workflow fails in your code with a clear message, not in the ComfyUI queue.
35
+ - **Pipelines**: reusable groups of nodes with typed parameters and named
36
+ outputs, added all or nothing.
37
+ - **Round trip**: load a workflow saved with ComfyUI's *Export (API)*, change it
38
+ from Python, export it again.
39
+ - No dependencies. Python 3.10+.
40
+
41
+ ## Installation
42
+
43
+ ```bash
44
+ pip install git+https://github.com/fabioantonioastore/comfy-ui-api-workflow
45
+ ```
46
+
47
+ ## Quick start
48
+
49
+ ```python
50
+ import json
51
+
52
+ from comfy_ui_api_workflow import Workflow, nodes
53
+
54
+ workflow = Workflow()
55
+ checkpoint = workflow.add_node(
56
+ nodes.model.loaders.CheckpointLoaderSimple, ckpt_name="sd_xl_base_1.0.safetensors"
57
+ )
58
+ prompt = workflow.add_node(
59
+ nodes.model.conditioning.CLIPTextEncode,
60
+ text="a lighthouse at dusk",
61
+ clip=checkpoint.output["CLIP"],
62
+ )
63
+ negative = workflow.add_node(
64
+ nodes.model.conditioning.CLIPTextEncode, text="blurry", clip=checkpoint.output["CLIP"]
65
+ )
66
+ latent = workflow.add_node(
67
+ nodes.model.latent.EmptyLatentImage, width=1024, height=1024, batch_size=1
68
+ )
69
+ sampler = workflow.add_node(
70
+ nodes.model.sampling.KSampler,
71
+ model=checkpoint.output["MODEL"],
72
+ positive=prompt.output["CONDITIONING"],
73
+ negative=negative.output["CONDITIONING"],
74
+ latent_image=latent.output["LATENT"],
75
+ sampler_name="dpmpp_2m",
76
+ scheduler="karras",
77
+ steps=25,
78
+ cfg=7.0,
79
+ )
80
+ image = workflow.add_node(
81
+ nodes.model.latent.VAEDecode, samples=sampler.output["LATENT"], vae=checkpoint.output["VAE"]
82
+ )
83
+ workflow.add_node(nodes.image.SaveImage, images=image.output["IMAGE"], filename_prefix="lighthouse")
84
+
85
+ print(json.dumps(workflow.get_comfy_ui_workflow_format(), indent=2))
86
+ ```
87
+
88
+ The printed JSON is what ComfyUI's `/prompt` endpoint takes as `prompt`.
89
+
90
+ Mistakes are caught right away:
91
+
92
+ ```python
93
+ from comfy_ui_api_workflow import Workflow, errors, nodes
94
+
95
+ workflow = Workflow()
96
+ latent = workflow.add_node(nodes.model.latent.EmptyLatentImage, width=512, height=512)
97
+
98
+ try:
99
+ latent.width = 8
100
+ except errors.node.InvalidNodeParameterValue as error:
101
+ print(error) # width must be in closed range: [16, 16384]
102
+ ```
103
+
104
+ ## Documentation
105
+
106
+ - [User guide](docs/guide.md): workflows, links, validation, changing nodes,
107
+ pipelines, loading and exporting, running on ComfyUI, errors.
108
+ - [API reference](docs/api.md): every public class, method, attribute and error.
109
+ - [Custom nodes](docs/custom_nodes.md): classes for nodes from custom node packs.
110
+ - [Node catalog](docs/nodes.md): every node with its inputs and outputs.
111
+ - [`examples/`](examples): runnable scripts with pipelines and nodes.
112
+
113
+ ## Development
114
+
115
+ ```bash
116
+ hatch test # unit tests (RunPod tests are skipped)
117
+ hatch test --cover # with coverage
118
+ hatch test -- --runpod # also send real jobs to the RunPod endpoint in .env (paid GPU)
119
+ ```
120
+
121
+ ## License
122
+
123
+ MIT
@@ -0,0 +1,99 @@
1
+ # comfy-ui-api-workflow
2
+
3
+ Build [ComfyUI](https://github.com/comfyanonymous/ComfyUI) workflows in Python
4
+ and export them in the API format that ComfyUI's `POST /prompt` endpoint runs.
5
+
6
+ - **618 ComfyUI nodes as Python classes**, from `KSampler` to Wan, LTXV, Flux,
7
+ 3D and partner API nodes.
8
+ - **Checked as you build**: input types, `min`/`max` ranges, combo choices,
9
+ output names, socket types (no `LATENT` into a `CLIP` input) and cycles. A bad
10
+ workflow fails in your code with a clear message, not in the ComfyUI queue.
11
+ - **Pipelines**: reusable groups of nodes with typed parameters and named
12
+ outputs, added all or nothing.
13
+ - **Round trip**: load a workflow saved with ComfyUI's *Export (API)*, change it
14
+ from Python, export it again.
15
+ - No dependencies. Python 3.10+.
16
+
17
+ ## Installation
18
+
19
+ ```bash
20
+ pip install git+https://github.com/fabioantonioastore/comfy-ui-api-workflow
21
+ ```
22
+
23
+ ## Quick start
24
+
25
+ ```python
26
+ import json
27
+
28
+ from comfy_ui_api_workflow import Workflow, nodes
29
+
30
+ workflow = Workflow()
31
+ checkpoint = workflow.add_node(
32
+ nodes.model.loaders.CheckpointLoaderSimple, ckpt_name="sd_xl_base_1.0.safetensors"
33
+ )
34
+ prompt = workflow.add_node(
35
+ nodes.model.conditioning.CLIPTextEncode,
36
+ text="a lighthouse at dusk",
37
+ clip=checkpoint.output["CLIP"],
38
+ )
39
+ negative = workflow.add_node(
40
+ nodes.model.conditioning.CLIPTextEncode, text="blurry", clip=checkpoint.output["CLIP"]
41
+ )
42
+ latent = workflow.add_node(
43
+ nodes.model.latent.EmptyLatentImage, width=1024, height=1024, batch_size=1
44
+ )
45
+ sampler = workflow.add_node(
46
+ nodes.model.sampling.KSampler,
47
+ model=checkpoint.output["MODEL"],
48
+ positive=prompt.output["CONDITIONING"],
49
+ negative=negative.output["CONDITIONING"],
50
+ latent_image=latent.output["LATENT"],
51
+ sampler_name="dpmpp_2m",
52
+ scheduler="karras",
53
+ steps=25,
54
+ cfg=7.0,
55
+ )
56
+ image = workflow.add_node(
57
+ nodes.model.latent.VAEDecode, samples=sampler.output["LATENT"], vae=checkpoint.output["VAE"]
58
+ )
59
+ workflow.add_node(nodes.image.SaveImage, images=image.output["IMAGE"], filename_prefix="lighthouse")
60
+
61
+ print(json.dumps(workflow.get_comfy_ui_workflow_format(), indent=2))
62
+ ```
63
+
64
+ The printed JSON is what ComfyUI's `/prompt` endpoint takes as `prompt`.
65
+
66
+ Mistakes are caught right away:
67
+
68
+ ```python
69
+ from comfy_ui_api_workflow import Workflow, errors, nodes
70
+
71
+ workflow = Workflow()
72
+ latent = workflow.add_node(nodes.model.latent.EmptyLatentImage, width=512, height=512)
73
+
74
+ try:
75
+ latent.width = 8
76
+ except errors.node.InvalidNodeParameterValue as error:
77
+ print(error) # width must be in closed range: [16, 16384]
78
+ ```
79
+
80
+ ## Documentation
81
+
82
+ - [User guide](docs/guide.md): workflows, links, validation, changing nodes,
83
+ pipelines, loading and exporting, running on ComfyUI, errors.
84
+ - [API reference](docs/api.md): every public class, method, attribute and error.
85
+ - [Custom nodes](docs/custom_nodes.md): classes for nodes from custom node packs.
86
+ - [Node catalog](docs/nodes.md): every node with its inputs and outputs.
87
+ - [`examples/`](examples): runnable scripts with pipelines and nodes.
88
+
89
+ ## Development
90
+
91
+ ```bash
92
+ hatch test # unit tests (RunPod tests are skipped)
93
+ hatch test --cover # with coverage
94
+ hatch test -- --runpod # also send real jobs to the RunPod endpoint in .env (paid GPU)
95
+ ```
96
+
97
+ ## License
98
+
99
+ MIT
@@ -0,0 +1 @@
1
+ version = "0.0.1"
@@ -0,0 +1,9 @@
1
+ from ._impl import errors, nodes, exceptions, enums
2
+ from ._impl.workflow import Workflow
3
+ from ._impl.pipeline import Pipeline
4
+ from ._impl.lazy import public_modules
5
+
6
+
7
+ __all__ = ["errors", "nodes", "exceptions", "enums", "Workflow", "Pipeline"]
8
+
9
+ public_modules(__name__, ["errors", "nodes", "exceptions", "enums"])
@@ -0,0 +1,182 @@
1
+ from typing import Any
2
+
3
+ from .errors.data_structure import CycleError
4
+
5
+
6
+ class IncrementalDirectedAcyclicGraphNode:
7
+ def __init__(self, data: Any) -> None:
8
+ self.data = data
9
+
10
+ def __repr__(self) -> str:
11
+ return f"{type(self).__name__}({self.data!r})"
12
+
13
+ def __str__(self) -> str:
14
+ return repr(self.data)
15
+
16
+
17
+ class IncrementalDirectedAcyclicGraph:
18
+ def __init__(self) -> None:
19
+ self._successors: dict[
20
+ IncrementalDirectedAcyclicGraphNode,
21
+ set[IncrementalDirectedAcyclicGraphNode],
22
+ ] = {}
23
+ self._predecessors: dict[
24
+ IncrementalDirectedAcyclicGraphNode,
25
+ set[IncrementalDirectedAcyclicGraphNode],
26
+ ] = {}
27
+ self._order: dict[IncrementalDirectedAcyclicGraphNode, int] = {}
28
+ self._next = 0
29
+
30
+ def add_node(self, node: IncrementalDirectedAcyclicGraphNode) -> None:
31
+ if node in self._order:
32
+ return
33
+ self._successors[node] = set()
34
+ self._predecessors[node] = set()
35
+ self._order[node] = self._next
36
+ self._next += 1
37
+
38
+ def remove_node(self, node: IncrementalDirectedAcyclicGraphNode) -> None:
39
+ if node not in self._order:
40
+ raise KeyError(node)
41
+ for successor in self._successors[node]:
42
+ self._predecessors[successor].discard(node)
43
+ for predecessor in self._predecessors[node]:
44
+ self._successors[predecessor].discard(node)
45
+ del self._successors[node], self._predecessors[node], self._order[node]
46
+
47
+ def insert_between(
48
+ self,
49
+ a: IncrementalDirectedAcyclicGraphNode,
50
+ b: IncrementalDirectedAcyclicGraphNode,
51
+ node: IncrementalDirectedAcyclicGraphNode,
52
+ remove_original: bool = True,
53
+ ) -> None:
54
+ new_nodes = [n for n in (a, b, node) if n not in self]
55
+ new_edge = node not in self._successors.get(a, ())
56
+ try:
57
+ self.add_node(node=node)
58
+ self.add_edge(x=a, y=node)
59
+ self.add_edge(x=node, y=b)
60
+ except CycleError:
61
+ if new_edge and a in self and node in self:
62
+ self.remove_edge(x=a, y=node)
63
+ for new_node in new_nodes:
64
+ if new_node in self:
65
+ self.remove_node(node=new_node)
66
+ raise
67
+ if remove_original:
68
+ self.remove_edge(x=a, y=b)
69
+
70
+ def add_edge(
71
+ self,
72
+ x: IncrementalDirectedAcyclicGraphNode,
73
+ y: IncrementalDirectedAcyclicGraphNode,
74
+ ) -> None:
75
+ if x == y:
76
+ raise CycleError([x, x])
77
+ self.add_node(node=x)
78
+ self.add_node(node=y)
79
+ if y in self._successors[x]:
80
+ return
81
+ order_x = self._order[x]
82
+ order_y = self._order[y]
83
+ if order_x < order_y:
84
+ self._link(x=x, y=y)
85
+ return
86
+ forward = self._forward_search(y=y, x=x, upper_bound=order_x)
87
+ backward = self._backward_search(x=x, lower_bound=order_y)
88
+ self._reorder(backward=backward, forward=forward)
89
+ self._link(x=x, y=y)
90
+
91
+ def remove_edge(
92
+ self,
93
+ x: IncrementalDirectedAcyclicGraphNode,
94
+ y: IncrementalDirectedAcyclicGraphNode,
95
+ ) -> None:
96
+ self._successors[x].discard(y)
97
+ self._predecessors[y].discard(x)
98
+
99
+ def topological_order(self) -> list[IncrementalDirectedAcyclicGraphNode]:
100
+ return sorted(self._order, key=self._order.__getitem__)
101
+
102
+ def dependencies(
103
+ self, node: IncrementalDirectedAcyclicGraphNode
104
+ ) -> set[IncrementalDirectedAcyclicGraphNode]:
105
+ return set(self._successors[node])
106
+
107
+ def dependents(
108
+ self, node: IncrementalDirectedAcyclicGraphNode
109
+ ) -> set[IncrementalDirectedAcyclicGraphNode]:
110
+ return set(self._predecessors[node])
111
+
112
+ def __contains__(self, node: object) -> bool:
113
+ return node in self._order
114
+
115
+ def __len__(self) -> int:
116
+ return len(self._order)
117
+
118
+ def _link(
119
+ self,
120
+ x: IncrementalDirectedAcyclicGraphNode,
121
+ y: IncrementalDirectedAcyclicGraphNode,
122
+ ) -> None:
123
+ self._successors[x].add(y)
124
+ self._predecessors[y].add(x)
125
+
126
+ def _forward_search(
127
+ self,
128
+ y: IncrementalDirectedAcyclicGraphNode,
129
+ x: IncrementalDirectedAcyclicGraphNode,
130
+ upper_bound: int,
131
+ ) -> list[IncrementalDirectedAcyclicGraphNode]:
132
+ parent: dict[
133
+ IncrementalDirectedAcyclicGraphNode,
134
+ IncrementalDirectedAcyclicGraphNode | None,
135
+ ] = {y: None}
136
+ stack = [y]
137
+ while stack:
138
+ node = stack.pop()
139
+ for successor in self._successors[node]:
140
+ if successor == x:
141
+ path = [node]
142
+ previous = parent[node]
143
+ while previous is not None:
144
+ path.append(previous)
145
+ previous = parent[previous]
146
+ path.reverse()
147
+ raise CycleError([x] + path + [x])
148
+ if successor not in parent and self._order[successor] < upper_bound:
149
+ parent[successor] = node
150
+ stack.append(successor)
151
+ return list(parent)
152
+
153
+ def _backward_search(
154
+ self,
155
+ x: IncrementalDirectedAcyclicGraphNode,
156
+ lower_bound: int,
157
+ ) -> list[IncrementalDirectedAcyclicGraphNode]:
158
+ visited = {x}
159
+ stack = [x]
160
+ while stack:
161
+ node = stack.pop()
162
+ for predecessor in self._predecessors[node]:
163
+ if (
164
+ predecessor not in visited
165
+ and self._order[predecessor] > lower_bound
166
+ ):
167
+ visited.add(predecessor)
168
+ stack.append(predecessor)
169
+ return list(visited)
170
+
171
+ def _reorder(
172
+ self,
173
+ backward: list[IncrementalDirectedAcyclicGraphNode],
174
+ forward: list[IncrementalDirectedAcyclicGraphNode],
175
+ ) -> None:
176
+ key = self._order.__getitem__
177
+ backward.sort(key=key)
178
+ forward.sort(key=key)
179
+ nodes = backward + forward
180
+ slots = sorted(self._order[node] for node in nodes)
181
+ for node, position in zip(nodes, slots):
182
+ self._order[node] = position
@@ -0,0 +1,13 @@
1
+ from enum import Enum
2
+
3
+
4
+ # Behaves like StrEnum, which only exists from Python 3.11 (the project supports 3.10).
5
+ class OutputTypes(str, Enum):
6
+ MODEL = "MODEL"
7
+ CONDITIONING = "CONDITIONING"
8
+ LATENT = "LATENT"
9
+ CLIP = "CLIP"
10
+ VAE = "VAE"
11
+
12
+ def __str__(self) -> str:
13
+ return self.value
@@ -0,0 +1,3 @@
1
+ from ..lazy import submodules_of
2
+
3
+ __getattr__ = submodules_of(__name__)