horde-engine 3.6.2__tar.gz → 3.7.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 (241) hide show
  1. {horde_engine-3.6.2 → horde_engine-3.7.1}/PKG-INFO +2 -2
  2. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/_version.py +2 -2
  3. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/model_manager/base.py +61 -0
  4. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/preload.py +171 -1
  5. {horde_engine-3.6.2 → horde_engine-3.7.1}/pyproject.toml +1 -1
  6. {horde_engine-3.6.2 → horde_engine-3.7.1}/.gitignore +0 -0
  7. {horde_engine-3.6.2 → horde_engine-3.7.1}/LICENSE +0 -0
  8. {horde_engine-3.6.2 → horde_engine-3.7.1}/README.md +0 -0
  9. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/__init__.py +0 -0
  10. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/__pyinstaller.py +0 -0
  11. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/api.py +0 -0
  12. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/benchmark.py +0 -0
  13. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/beta_models.py +0 -0
  14. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/comfy_horde.py +0 -0
  15. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/config_path.py +0 -0
  16. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/consts.py +0 -0
  17. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/exceptions.py +0 -0
  18. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/execution/__init__.py +0 -0
  19. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/execution/comfy_patches.py +0 -0
  20. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/execution/graph_utils.py +0 -0
  21. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/execution/in_process.py +0 -0
  22. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/execution/interface.py +0 -0
  23. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/execution/phase_timing.py +0 -0
  24. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/execution/progress_hook.py +0 -0
  25. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/execution/sampling_lease.py +0 -0
  26. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/feature_impact.py +0 -0
  27. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/feature_requirements.py +0 -0
  28. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/horde.py +0 -0
  29. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/initialisation.py +0 -0
  30. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/installation/__init__.py +0 -0
  31. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/installation/__main__.py +0 -0
  32. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/installation/installer.py +0 -0
  33. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/installation/manifest.json +0 -0
  34. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/installation/manifest.py +0 -0
  35. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/integrations/__init__.py +0 -0
  36. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/integrations/logfire_comfy_internals.py +0 -0
  37. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/integrations/logfire_setup.py +0 -0
  38. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/metrics.py +0 -0
  39. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/model_database/db_dep.json +0 -0
  40. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/model_database/db_embeds.json +0 -0
  41. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/model_database/diffusers.json +0 -0
  42. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/model_database/med_config.json +0 -0
  43. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/model_manager/__init__.py +0 -0
  44. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/model_manager/civitai_adhoc.py +0 -0
  45. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/model_manager/civitai_provider.py +0 -0
  46. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/model_manager/civitai_records.py +0 -0
  47. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/model_manager/codeformer.py +0 -0
  48. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/model_manager/compvis.py +0 -0
  49. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/model_manager/controlnet.py +0 -0
  50. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/model_manager/diffusers.py +0 -0
  51. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/model_manager/esrgan.py +0 -0
  52. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/model_manager/gfpgan.py +0 -0
  53. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/model_manager/hyper.py +0 -0
  54. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/model_manager/lora.py +0 -0
  55. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/model_manager/miscellaneous.py +0 -0
  56. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/model_manager/safety_checker.py +0 -0
  57. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/model_manager/ti.py +0 -0
  58. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/__init__.py +0 -0
  59. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/comfyui_layerdiffuse/LICENSE +0 -0
  60. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/comfyui_layerdiffuse/README.md +0 -0
  61. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/comfyui_layerdiffuse/__init__.py +0 -0
  62. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/comfyui_layerdiffuse/examples/layer_diffusion_cond_example.json +0 -0
  63. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/comfyui_layerdiffuse/examples/layer_diffusion_cond_fg_all.json +0 -0
  64. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/comfyui_layerdiffuse/examples/layer_diffusion_cond_joint_bg.json +0 -0
  65. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/comfyui_layerdiffuse/examples/layer_diffusion_cond_joint_fg.json +0 -0
  66. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/comfyui_layerdiffuse/examples/layer_diffusion_diff_bg.json +0 -0
  67. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/comfyui_layerdiffuse/examples/layer_diffusion_diff_bg_stop_at.json +0 -0
  68. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/comfyui_layerdiffuse/examples/layer_diffusion_diff_fg.json +0 -0
  69. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/comfyui_layerdiffuse/examples/layer_diffusion_fg_example.json +0 -0
  70. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/comfyui_layerdiffuse/examples/layer_diffusion_fg_example_rgba.json +0 -0
  71. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/comfyui_layerdiffuse/examples/layer_diffusion_joint.json +0 -0
  72. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/comfyui_layerdiffuse/layered_diffusion.py +0 -0
  73. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/comfyui_layerdiffuse/lib_layerdiffusion/__init__.py +0 -0
  74. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/comfyui_layerdiffuse/lib_layerdiffusion/attention_sharing.py +0 -0
  75. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/comfyui_layerdiffuse/lib_layerdiffusion/enums.py +0 -0
  76. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/comfyui_layerdiffuse/lib_layerdiffusion/models.py +0 -0
  77. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/comfyui_layerdiffuse/lib_layerdiffusion/utils.py +0 -0
  78. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/comfyui_layerdiffuse/pyproject.toml +0 -0
  79. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/comfyui_layerdiffuse/requirements.txt +0 -0
  80. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/LICENSE +0 -0
  81. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/README.md +0 -0
  82. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/__init__.py +0 -0
  83. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/basicsr/VERSION +0 -0
  84. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/basicsr/__init__.py +0 -0
  85. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/basicsr/archs/__init__.py +0 -0
  86. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/basicsr/archs/arcface_arch.py +0 -0
  87. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/basicsr/archs/arch_util.py +0 -0
  88. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/basicsr/archs/codeformer_arch.py +0 -0
  89. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/basicsr/archs/rrdbnet_arch.py +0 -0
  90. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/basicsr/archs/vgg_arch.py +0 -0
  91. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/basicsr/archs/vqgan_arch.py +0 -0
  92. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/basicsr/data/__init__.py +0 -0
  93. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/basicsr/data/data_sampler.py +0 -0
  94. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/basicsr/data/data_util.py +0 -0
  95. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/basicsr/data/prefetch_dataloader.py +0 -0
  96. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/basicsr/data/transforms.py +0 -0
  97. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/basicsr/losses/__init__.py +0 -0
  98. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/basicsr/losses/loss_util.py +0 -0
  99. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/basicsr/losses/losses.py +0 -0
  100. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/basicsr/metrics/__init__.py +0 -0
  101. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/basicsr/metrics/metric_util.py +0 -0
  102. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/basicsr/metrics/psnr_ssim.py +0 -0
  103. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/basicsr/models/__init__.py +0 -0
  104. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/basicsr/ops/__init__.py +0 -0
  105. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/basicsr/ops/dcn/__init__.py +0 -0
  106. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/basicsr/ops/dcn/deform_conv.py +0 -0
  107. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/basicsr/ops/dcn/src/deform_conv_cuda.cpp +0 -0
  108. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/basicsr/ops/dcn/src/deform_conv_cuda_kernel.cu +0 -0
  109. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/basicsr/ops/dcn/src/deform_conv_ext.cpp +0 -0
  110. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/basicsr/ops/fused_act/__init__.py +0 -0
  111. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/basicsr/ops/fused_act/fused_act.py +0 -0
  112. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/basicsr/ops/fused_act/src/fused_bias_act.cpp +0 -0
  113. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/basicsr/ops/fused_act/src/fused_bias_act_kernel.cu +0 -0
  114. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/basicsr/ops/upfirdn2d/__init__.py +0 -0
  115. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/basicsr/ops/upfirdn2d/src/upfirdn2d.cpp +0 -0
  116. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/basicsr/ops/upfirdn2d/src/upfirdn2d_kernel.cu +0 -0
  117. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/basicsr/ops/upfirdn2d/upfirdn2d.py +0 -0
  118. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/basicsr/setup.py +0 -0
  119. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/basicsr/train.py +0 -0
  120. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/basicsr/utils/__init__.py +0 -0
  121. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/basicsr/utils/dist_util.py +0 -0
  122. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/basicsr/utils/download_util.py +0 -0
  123. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/basicsr/utils/file_client.py +0 -0
  124. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/basicsr/utils/img_util.py +0 -0
  125. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/basicsr/utils/lmdb_util.py +0 -0
  126. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/basicsr/utils/logger.py +0 -0
  127. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/basicsr/utils/matlab_functions.py +0 -0
  128. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/basicsr/utils/misc.py +0 -0
  129. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/basicsr/utils/options.py +0 -0
  130. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/basicsr/utils/realesrgan_utils.py +0 -0
  131. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/basicsr/utils/registry.py +0 -0
  132. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/basicsr/version.py +0 -0
  133. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/facelib/__init__.py +0 -0
  134. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/facelib/detection/__init__.py +0 -0
  135. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/facelib/detection/align_trans.py +0 -0
  136. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/facelib/detection/matlab_cp2tform.py +0 -0
  137. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/facelib/detection/retinaface/retinaface.py +0 -0
  138. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/facelib/detection/retinaface/retinaface_net.py +0 -0
  139. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/facelib/detection/retinaface/retinaface_utils.py +0 -0
  140. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/facelib/detection/yolov5face/__init__.py +0 -0
  141. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/facelib/detection/yolov5face/face_detector.py +0 -0
  142. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/facelib/detection/yolov5face/models/__init__.py +0 -0
  143. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/facelib/detection/yolov5face/models/common.py +0 -0
  144. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/facelib/detection/yolov5face/models/experimental.py +0 -0
  145. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/facelib/detection/yolov5face/models/yolo.py +0 -0
  146. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/facelib/detection/yolov5face/models/yolov5l.yaml +0 -0
  147. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/facelib/detection/yolov5face/models/yolov5n.yaml +0 -0
  148. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/facelib/detection/yolov5face/utils/__init__.py +0 -0
  149. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/facelib/detection/yolov5face/utils/autoanchor.py +0 -0
  150. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/facelib/detection/yolov5face/utils/datasets.py +0 -0
  151. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/facelib/detection/yolov5face/utils/extract_ckpt.py +0 -0
  152. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/facelib/detection/yolov5face/utils/general.py +0 -0
  153. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/facelib/detection/yolov5face/utils/torch_utils.py +0 -0
  154. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/facelib/parsing/__init__.py +0 -0
  155. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/facelib/parsing/bisenet.py +0 -0
  156. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/facelib/parsing/parsenet.py +0 -0
  157. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/facelib/parsing/resnet.py +0 -0
  158. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/facelib/utils/__init__.py +0 -0
  159. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/facelib/utils/face_restoration_helper.py +0 -0
  160. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/facelib/utils/face_utils.py +0 -0
  161. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/facelib/utils/misc.py +0 -0
  162. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/r_chainner/README.md +0 -0
  163. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/r_chainner/__init__.py +0 -0
  164. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/r_chainner/gfpganv1_clean_arch.py +0 -0
  165. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/r_chainner/model_loading.py +0 -0
  166. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/r_chainner/stylegan2_clean_arch.py +0 -0
  167. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/facerestore_cf/r_chainner/types.py +0 -0
  168. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/node_controlnet_model_loader.py +0 -0
  169. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/node_image_loader.py +0 -0
  170. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/node_image_output.py +0 -0
  171. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/node_lora_loader.py +0 -0
  172. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/node_model_loader.py +0 -0
  173. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/nodes/node_upscale_model_loader.py +0 -0
  174. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/pipeline/__init__.py +0 -0
  175. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/pipeline/constants.py +0 -0
  176. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/pipeline/context.py +0 -0
  177. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/pipeline/families/__init__.py +0 -0
  178. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/pipeline/families/image.py +0 -0
  179. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/pipeline/families/post_processing.py +0 -0
  180. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/pipeline/graph.py +0 -0
  181. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/pipeline/horde_compat.py +0 -0
  182. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/pipeline/patches.py +0 -0
  183. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/pipeline/payload.py +0 -0
  184. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/pipeline/payload_pp.py +0 -0
  185. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/pipeline/registry.py +0 -0
  186. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/pipeline/resolution.py +0 -0
  187. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/pipeline/template.py +0 -0
  188. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/pipeline_designs/pipeline_controlnet.json +0 -0
  189. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/pipeline_designs/pipeline_controlnet_annotator.json +0 -0
  190. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/pipeline_designs/pipeline_controlnet_hires_fix.json +0 -0
  191. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/pipeline_designs/pipeline_flux.json +0 -0
  192. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/pipeline_designs/pipeline_image_facefix.json +0 -0
  193. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/pipeline_designs/pipeline_image_upscale.json +0 -0
  194. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/pipeline_designs/pipeline_qr_code.json +0 -0
  195. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/pipeline_designs/pipeline_qwen.json +0 -0
  196. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/pipeline_designs/pipeline_stable_cascade.json +0 -0
  197. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/pipeline_designs/pipeline_stable_cascade_2pass.json +0 -0
  198. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/pipeline_designs/pipeline_stable_cascade_remix.json +0 -0
  199. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/pipeline_designs/pipeline_stable_diffusion.json +0 -0
  200. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/pipeline_designs/pipeline_stable_diffusion_hires_fix.json +0 -0
  201. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/pipeline_designs/pipeline_stable_diffusion_img2img_mask.json +0 -0
  202. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/pipeline_designs/pipeline_stable_diffusion_paint.json +0 -0
  203. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/pipelines/pipeline_controlnet.json +0 -0
  204. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/pipelines/pipeline_controlnet_annotator.json +0 -0
  205. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/pipelines/pipeline_controlnet_hires_fix.json +0 -0
  206. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/pipelines/pipeline_flux.json +0 -0
  207. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/pipelines/pipeline_image_facefix.json +0 -0
  208. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/pipelines/pipeline_image_upscale.json +0 -0
  209. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/pipelines/pipeline_qr_code.json +0 -0
  210. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/pipelines/pipeline_qwen.json +0 -0
  211. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/pipelines/pipeline_stable_cascade.json +0 -0
  212. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/pipelines/pipeline_stable_cascade_2pass.json +0 -0
  213. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/pipelines/pipeline_stable_cascade_remix.json +0 -0
  214. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/pipelines/pipeline_stable_diffusion.json +0 -0
  215. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/pipelines/pipeline_stable_diffusion_hires_fix.json +0 -0
  216. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/pipelines/pipeline_stable_diffusion_img2img_mask.json +0 -0
  217. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/pipelines/pipeline_stable_diffusion_paint.json +0 -0
  218. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/pipelines/pipeline_z_image.json +0 -0
  219. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/py.typed +0 -0
  220. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/pyinstaller_hooks/__init__.py +0 -0
  221. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/pyinstaller_hooks/hook-hordelib.horde.py +0 -0
  222. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/safety.py +0 -0
  223. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/safety_checker.py +0 -0
  224. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/settings.py +0 -0
  225. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/shared_model_manager.py +0 -0
  226. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/train.py +0 -0
  227. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/utils/__init__.py +0 -0
  228. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/utils/device_pinning.py +0 -0
  229. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/utils/distance.py +0 -0
  230. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/utils/dynamicprompt.py +0 -0
  231. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/utils/gpuinfo.py +0 -0
  232. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/utils/image_utils.py +0 -0
  233. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/utils/ioredirect.py +0 -0
  234. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/utils/logger.py +0 -0
  235. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/utils/nvml.py +0 -0
  236. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/utils/optional_deps.py +0 -0
  237. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/utils/sanitizer.py +0 -0
  238. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/utils/switch.py +0 -0
  239. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/utils/torch_build.py +0 -0
  240. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/utils/torch_memory.py +0 -0
  241. {horde_engine-3.6.2 → horde_engine-3.7.1}/hordelib/vram_planning.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: horde-engine
3
- Version: 3.6.2
3
+ Version: 3.7.1
4
4
  Summary: A wrapper around ComfyUI to allow use by AI Horde.
5
5
  Project-URL: Homepage, https://github.com/Haidra-Org/hordelib
6
6
  Project-URL: Bug Tracker, https://github.com/Haidra-Org/hordelib/issues
@@ -690,7 +690,7 @@ Requires-Dist: filelock
690
690
  Requires-Dist: ftfy
691
691
  Requires-Dist: fuzzywuzzy>=0.18.0
692
692
  Requires-Dist: gitpython>=3.1.45
693
- Requires-Dist: horde-model-reference<6.0.0,>=5.1.1
693
+ Requires-Dist: horde-model-reference<7.0.0,>=6.0.0
694
694
  Requires-Dist: horde-sdk>=0.20.1
695
695
  Requires-Dist: kornia>=0.7.1
696
696
  Requires-Dist: logfire[system-metrics]==4.14.2
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '3.6.2'
22
- __version_tuple__ = version_tuple = (3, 6, 2)
21
+ __version__ = version = '3.7.1'
22
+ __version_tuple__ = version_tuple = (3, 7, 1)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -2,6 +2,7 @@ import os
2
2
  import threading
3
3
  from abc import ABC
4
4
  from collections.abc import Callable, Iterable
5
+ from functools import lru_cache
5
6
  from pathlib import Path
6
7
  from typing import Any, cast
7
8
  from urllib import parse
@@ -26,6 +27,59 @@ from hordelib.config_path import get_hordelib_path
26
27
  from hordelib.consts import CIVITAI_API_PATH
27
28
  from hordelib.settings import UserSettings
28
29
 
30
+ _ANON_API_KEY = "0000000000"
31
+
32
+
33
+ def _resolve_horde_api_key() -> str | None:
34
+ """Return the worker's horde API key from the environment, or None for anonymous/standalone use.
35
+
36
+ The key gates the content-addressed R2 mirror in the download engine. The anonymous key cannot be trusted,
37
+ and a standalone hordelib user without a key simply downloads from each model's origin host. The worker
38
+ exposes its configured key as ``AIHORDE_API_KEY`` (inherited by the download subprocess).
39
+ """
40
+ key = os.environ.get("AIHORDE_API_KEY") or os.environ.get("AI_HORDE_API_KEY")
41
+ if not key or key == _ANON_API_KEY:
42
+ return None
43
+ return key
44
+
45
+
46
+ @lru_cache(maxsize=1)
47
+ def _resolve_r2_gateway_url() -> str | None:
48
+ """Return the gated-R2 gateway base URL from horde_model_reference settings (process-static, cached).
49
+
50
+ None when no gateway is configured, in which case the engine downloads only from origin hosts. An older
51
+ horde_model_reference without the R2 settings block degrades to the same origin-only behaviour rather than
52
+ breaking the download path, so the worker keeps working ahead of a coordinated hmr release.
53
+
54
+ The gateway URL is owned by the official deployment (the horde_model_reference default); it is deliberately
55
+ not a per-worker config knob. A sophisticated operator can still override it via the
56
+ ``HORDE_MODEL_REFERENCE_R2__GATEWAY_URL`` environment variable, in which case the safety guard below applies:
57
+ because the worker's API key is sent to the gateway, a plaintext (non-``https``) gateway is refused outright
58
+ (the mirror is disabled and origins are used) so the key cannot travel in the clear.
59
+ """
60
+ try:
61
+ from horde_model_reference import HordeModelReferenceSettings
62
+ from horde_model_reference.download_engine import gateway_accepts_key
63
+
64
+ gateway_url = HordeModelReferenceSettings().r2.gateway_url
65
+ except (AttributeError, ImportError):
66
+ # Older horde_model_reference without the R2 settings block or the key-safety guard: origin-only.
67
+ return None
68
+
69
+ if not gateway_url:
70
+ return None
71
+ if not gateway_accepts_key(gateway_url):
72
+ logger.warning(
73
+ "Configured R2 gateway is not https; refusing to send the API key over plaintext and disabling the "
74
+ "mirror (downloads use origin hosts): gateway={}",
75
+ gateway_url,
76
+ )
77
+ return None
78
+ # Normal path logs at DEBUG only: the gateway is a deployment-owned technical detail, not something a typical
79
+ # operator configures or needs to reason about, so it stays out of the default console.
80
+ logger.debug("Gated R2 mirror enabled; the API key will be sent to gateway={}", parse.urlparse(gateway_url).netloc)
81
+ return gateway_url
82
+
29
83
 
30
84
  class BaseModelManager[RecordT: GenericModelRecord | dict[str, Any]](ABC):
31
85
  """Abstract base for the per-category model managers.
@@ -477,6 +531,7 @@ class BaseModelManager[RecordT: GenericModelRecord | dict[str, Any]](ABC):
477
531
  model_name: str,
478
532
  *,
479
533
  callback: Callable[[int, int], None] | None = None,
534
+ connections: int = 1,
480
535
  ) -> bool | None:
481
536
  """Ensure *model_name*'s declared files are present, fetching any that are missing.
482
537
 
@@ -487,6 +542,9 @@ class BaseModelManager[RecordT: GenericModelRecord | dict[str, Any]](ABC):
487
542
  Args:
488
543
  model_name: The reference key of the model to download.
489
544
  callback: Optional ``(downloaded_bytes, total_bytes)`` progress callback, per file.
545
+ connections: Maximum concurrent connections per large file, forwarded to the engine. 1 keeps the
546
+ single-stream path; a higher value lets the engine segment a large file across that many
547
+ ranged connections to raise single-file throughput (the caller's configured value).
490
548
 
491
549
  Returns:
492
550
  True if the model is present and validated, False on download/validation failure, and None
@@ -520,6 +578,9 @@ class BaseModelManager[RecordT: GenericModelRecord | dict[str, Any]](ABC):
520
578
  self._weights_root,
521
579
  progress_callback=callback,
522
580
  auth_query_token=self._civitai_token_for(record),
581
+ gateway_base_url=_resolve_r2_gateway_url(),
582
+ apikey=_resolve_horde_api_key(),
583
+ connections=connections,
523
584
  )
524
585
  if not download_succeeded:
525
586
  return False
@@ -27,11 +27,37 @@ Two optimisations keep this cheap after the first time:
27
27
  import contextlib
28
28
  import os
29
29
  import threading
30
- from collections.abc import Iterator
30
+ from collections.abc import Iterable, Iterator
31
31
  from pathlib import Path
32
+ from typing import Protocol
32
33
 
33
34
  from loguru import logger
34
35
 
36
+
37
+ class _AnnotatorFileLike(Protocol):
38
+ """The shape the prefetch reads from a ``horde_model_reference.annotator_catalog.AnnotatorFile``.
39
+
40
+ Described structurally so this module type-checks even against an older installed ``horde_model_reference``
41
+ that does not yet ship the catalog (the concrete type is imported lazily and may be absent; see
42
+ :func:`_prefetch_annotator_files`).
43
+ """
44
+
45
+ repo: str
46
+ subfolder: str
47
+ filename: str
48
+ sha256: str | None
49
+ preprocessors: tuple[str, ...]
50
+
51
+ @property
52
+ def relative_path(self) -> str:
53
+ """The file's path relative to the annotator checkpoints directory (``<repo>/<subfolder>/<filename>``)."""
54
+ ...
55
+
56
+ @property
57
+ def origin_url(self) -> str:
58
+ """The HuggingFace origin URL the file is fetched from when the gated mirror does not serve it."""
59
+ ...
60
+
35
61
  _preload_mutex = threading.Lock()
36
62
  _preload_completed = False
37
63
 
@@ -52,6 +78,83 @@ _PRELOAD_MARKER_NAME = ".hordelib_preload_complete"
52
78
  _ONNXRUNTIME_GATED_PREPROCESSORS = frozenset({"OpenposePreprocessor"})
53
79
 
54
80
 
81
+ def _annotator_files_to_prefetch(all_files: Iterable[_AnnotatorFileLike]) -> list[_AnnotatorFileLike]:
82
+ """Filter the annotator catalog to the files whose preprocessor will actually run on this install.
83
+
84
+ On a lean base install (no ``controlnet`` extra) the onnxruntime-gated preprocessors never register and the
85
+ preload skips them (see :func:`_run_preload`), so prefetching their large weights would be wasted. A file is
86
+ kept when at least one preprocessor that loads it is not gated away. Best-effort: if the feature check itself
87
+ cannot be evaluated, everything is kept (the worst case is a redundant download, never a missing one).
88
+ """
89
+ try:
90
+ from hordelib.feature_impact import FEATURE_KIND
91
+ from hordelib.feature_requirements import feature_available
92
+
93
+ if feature_available(FEATURE_KIND.controlnet):
94
+ return list(all_files)
95
+ except Exception as e:
96
+ logger.debug("Could not evaluate controlnet feature for annotator prefetch; keeping all: error={}", e)
97
+ return list(all_files)
98
+
99
+ return [
100
+ entry
101
+ for entry in all_files
102
+ if any(preprocessor not in _ONNXRUNTIME_GATED_PREPROCESSORS for preprocessor in entry.preprocessors)
103
+ ]
104
+
105
+
106
+ def _prefetch_annotator_files(ckpts_dir: Path) -> None:
107
+ """Pre-place known annotator checkpoints via the unified gated-mirror-then-origin download engine.
108
+
109
+ For each catalog file not already on disk, fetch it to the exact path ``custom_hf_download`` expects, so the
110
+ detector finds it present and skips its own HuggingFace download. The gated R2 mirror (when configured and
111
+ the file's hash is known) is tried first and falls back to the HuggingFace origin on any failure, so this
112
+ only ever adds a faster, free path; it never blocks a download. Best-effort throughout: any failure simply
113
+ leaves the file for the detector to fetch itself, exactly as before this hook existed.
114
+ """
115
+ try:
116
+ from horde_model_reference import annotator_catalog, download_engine
117
+ except Exception as e:
118
+ # An older installed horde_model_reference without the catalog (or its record-free fetch helper): the
119
+ # detectors download from HuggingFace themselves, exactly as before. Degrade quietly.
120
+ logger.debug("Annotator catalog unavailable (older horde_model_reference?); skipping prefetch: {}", e)
121
+ return
122
+
123
+ gateway_base_url: str | None = None
124
+ apikey: str | None = None
125
+ try:
126
+ from hordelib.model_manager.base import _resolve_horde_api_key, _resolve_r2_gateway_url
127
+
128
+ gateway_base_url = _resolve_r2_gateway_url()
129
+ apikey = _resolve_horde_api_key()
130
+ except Exception as e:
131
+ logger.debug("Could not resolve gated-mirror settings; annotator prefetch uses origin only: error={}", e)
132
+
133
+ for entry in _annotator_files_to_prefetch(annotator_catalog.ANNOTATOR_FILES):
134
+ destination = ckpts_dir / Path(entry.relative_path)
135
+ if destination.is_file():
136
+ continue
137
+ try:
138
+ outcome = download_engine.download_addressed_file(
139
+ entry.origin_url,
140
+ destination,
141
+ sha256=entry.sha256,
142
+ gateway_base_url=gateway_base_url,
143
+ apikey=apikey,
144
+ )
145
+ if not outcome.success:
146
+ logger.info(
147
+ "Annotator prefetch did not complete; the detector will fetch it at first use: file={}",
148
+ entry.filename,
149
+ )
150
+ except Exception as e:
151
+ logger.warning(
152
+ "Annotator prefetch errored; the detector will fetch it at first use: file={} error={}",
153
+ entry.filename,
154
+ e,
155
+ )
156
+
157
+
55
158
  def _midas_already_cached() -> bool:
56
159
  """Return whether the transformers-based MiDaS annotator is fully in the HF cache.
57
160
 
@@ -153,6 +256,66 @@ def controlnet_annotators_present() -> bool | None:
153
256
  return None
154
257
 
155
258
 
259
+ def _annotator_file_resolvable(entry: _AnnotatorFileLike, ckpts_dir: Path | None) -> bool:
260
+ """Whether one annotator file is already where the engine will find it at first use (no download needed).
261
+
262
+ Existence-based, unlike the preload marker: a detector loads a file it finds on disk and skips its own
263
+ HuggingFace fetch, so a file present in the checkpoints dir (the flat ``<repo>/<subfolder>/<filename>``
264
+ layout ``custom_hf_download`` writes) -- or already in the HuggingFace hub cache, which a fetch resolves
265
+ without touching the network -- will not be re-downloaded. The cheap on-disk path is checked first.
266
+ """
267
+ if ckpts_dir is not None and (ckpts_dir / Path(entry.relative_path)).is_file():
268
+ return True
269
+ try:
270
+ from huggingface_hub import try_to_load_from_cache
271
+
272
+ in_repo = "/".join(part for part in (entry.subfolder, entry.filename) if part)
273
+ if isinstance(try_to_load_from_cache(repo_id=entry.repo, filename=in_repo), str):
274
+ return True
275
+ if ckpts_dir is not None and isinstance(
276
+ try_to_load_from_cache(repo_id=entry.repo, filename=in_repo, cache_dir=str(ckpts_dir)),
277
+ str,
278
+ ):
279
+ return True
280
+ except Exception as e: # pragma: no cover - a hub-cache probe failure just means "not via the cache"
281
+ logger.debug("Hub-cache annotator lookup failed (treating this file as absent): error={}", e)
282
+ return False
283
+
284
+
285
+ def annotators_resolvable(control_types: Iterable[str]) -> bool | None:
286
+ """Whether the controlnet annotators for *control_types* are on disk or cached (existence, not the marker).
287
+
288
+ The authoritative answer to "will a controlnet job for these control types need a slow annotator download
289
+ before it can run", as distinct from :func:`controlnet_annotators_present`, which reads the preload
290
+ *marker* (a stricter, pin-keyed fast-path that is ``False`` whenever a full verify has not run for the
291
+ current pin, even when every file is already present on disk). A surface deciding whether to prompt a
292
+ pre-download should use this; the marker stays only the preload's own skip optimisation.
293
+
294
+ Weightless control types (``canny``, ``scribble``) and types unknown to the catalog need no files and are
295
+ vacuously resolvable. Returns ``None`` only when the file catalog or the checkpoint directory cannot be
296
+ determined, so a caller treats the unknown as "do not claim missing" rather than nagging spuriously.
297
+ """
298
+ try:
299
+ from horde_model_reference import annotator_catalog
300
+ except Exception as e:
301
+ logger.debug("Annotator catalog unavailable; cannot resolve annotator presence: error={}", e)
302
+ return None
303
+ # Prefer the catalog's own control-type selector; fall back to filtering the file list directly so an
304
+ # older horde_model_reference that ships ANNOTATOR_FILES but not the helper still resolves correctly.
305
+ selector = getattr(annotator_catalog, "annotators_for_control_types", None)
306
+ if selector is not None:
307
+ needed = selector(control_types)
308
+ else:
309
+ wanted = set(control_types)
310
+ needed = tuple(entry for entry in annotator_catalog.ANNOTATOR_FILES if wanted.intersection(entry.control_types))
311
+ if not needed:
312
+ return True
313
+ ckpts_dir = _annotator_ckpts_dir()
314
+ if ckpts_dir is None:
315
+ return None
316
+ return all(_annotator_file_resolvable(entry, ckpts_dir) for entry in needed)
317
+
318
+
156
319
  def _record_annotators_verified(ref: str) -> None:
157
320
  """Persist that annotators for ``ref`` are downloaded and verified on this machine.
158
321
 
@@ -284,6 +447,13 @@ def download_all_controlnet_annotators() -> bool:
284
447
  _preload_completed = True
285
448
  return True
286
449
 
450
+ # Pre-place the annotator checkpoints through the unified (gated R2 -> HuggingFace) download engine
451
+ # *before* the detectors run, so custom_hf_download finds them present and skips its own HF fetch. Runs
452
+ # with the Hub online (the offline window is inside _run_preload). Best-effort; never blocks the preload.
453
+ ckpts_dir = _annotator_ckpts_dir()
454
+ if ckpts_dir is not None:
455
+ _prefetch_annotator_files(ckpts_dir)
456
+
287
457
  force_offline = _midas_already_cached()
288
458
  if force_offline:
289
459
  logger.debug(
@@ -52,7 +52,7 @@ dependencies = [
52
52
  "ftfy", # comfyui_controlnet_aux node requirement (previously satisfied transitively via open-clip-torch)
53
53
  "fuzzywuzzy>=0.18.0",
54
54
  "gitpython>=3.1.45",
55
- "horde_model_reference>=5.1.1,<6.0.0",
55
+ "horde_model_reference>=6.0.0,<7.0.0",
56
56
  "horde-sdk>=0.20.1",
57
57
  "kornia>=0.7.1",
58
58
  "logfire[system-metrics]==4.14.2",
File without changes
File without changes
File without changes