horde-engine 6.3.0__tar.gz → 6.3.2__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 (275) hide show
  1. {horde_engine-6.3.0 → horde_engine-6.3.2}/PKG-INFO +1 -1
  2. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/_version.py +2 -2
  3. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/model_manager/civitai_adhoc.py +78 -8
  4. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/model_manager/hyper.py +5 -0
  5. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/shared_model_manager.py +7 -0
  6. {horde_engine-6.3.0 → horde_engine-6.3.2}/.gitignore +0 -0
  7. {horde_engine-6.3.0 → horde_engine-6.3.2}/LICENSE +0 -0
  8. {horde_engine-6.3.0 → horde_engine-6.3.2}/README.md +0 -0
  9. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/__init__.py +0 -0
  10. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/__pyinstaller.py +0 -0
  11. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/api.py +0 -0
  12. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/benchmark.py +0 -0
  13. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/beta_models.py +0 -0
  14. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/comfy_horde.py +0 -0
  15. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/config_path.py +0 -0
  16. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/consts.py +0 -0
  17. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/exceptions.py +0 -0
  18. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/execution/__init__.py +0 -0
  19. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/execution/comfy_events.py +0 -0
  20. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/execution/comfy_patches.py +0 -0
  21. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/execution/component_materialize.py +0 -0
  22. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/execution/component_stability_probe.py +0 -0
  23. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/execution/graph_utils.py +0 -0
  24. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/execution/in_process.py +0 -0
  25. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/execution/interface.py +0 -0
  26. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/execution/model_dirs.py +0 -0
  27. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/execution/phase_timing.py +0 -0
  28. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/execution/progress_hook.py +0 -0
  29. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/execution/results.py +0 -0
  30. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/execution/sampling_lease.py +0 -0
  31. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/execution/server_shim.py +0 -0
  32. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/execution/shared_components.py +0 -0
  33. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/execution/stage_graph.py +0 -0
  34. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/execution/stage_payloads.py +0 -0
  35. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/execution/zero_copy_load.py +0 -0
  36. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/feature_impact.py +0 -0
  37. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/feature_requirements.py +0 -0
  38. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/horde.py +0 -0
  39. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/initialisation.py +0 -0
  40. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/installation/__init__.py +0 -0
  41. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/installation/__main__.py +0 -0
  42. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/installation/installer.py +0 -0
  43. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/installation/manifest.json +0 -0
  44. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/installation/manifest.py +0 -0
  45. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/integrations/__init__.py +0 -0
  46. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/integrations/logfire_comfy_internals.py +0 -0
  47. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/integrations/logfire_setup.py +0 -0
  48. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/metrics.py +0 -0
  49. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/model_database/db_dep.json +0 -0
  50. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/model_database/db_embeds.json +0 -0
  51. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/model_database/diffusers.json +0 -0
  52. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/model_database/med_config.json +0 -0
  53. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/model_manager/__init__.py +0 -0
  54. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/model_manager/annotator_provider.py +0 -0
  55. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/model_manager/base.py +0 -0
  56. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/model_manager/civitai_provider.py +0 -0
  57. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/model_manager/civitai_records.py +0 -0
  58. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/model_manager/codeformer.py +0 -0
  59. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/model_manager/compvis.py +0 -0
  60. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/model_manager/controlnet.py +0 -0
  61. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/model_manager/controlnet_annotator.py +0 -0
  62. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/model_manager/diffusers.py +0 -0
  63. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/model_manager/esrgan.py +0 -0
  64. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/model_manager/gfpgan.py +0 -0
  65. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/model_manager/lora.py +0 -0
  66. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/model_manager/miscellaneous.py +0 -0
  67. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/model_manager/safety_checker.py +0 -0
  68. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/model_manager/ti.py +0 -0
  69. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/__init__.py +0 -0
  70. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/comfyui_layerdiffuse/LICENSE +0 -0
  71. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/comfyui_layerdiffuse/README.md +0 -0
  72. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/comfyui_layerdiffuse/__init__.py +0 -0
  73. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/comfyui_layerdiffuse/examples/layer_diffusion_cond_example.json +0 -0
  74. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/comfyui_layerdiffuse/examples/layer_diffusion_cond_fg_all.json +0 -0
  75. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/comfyui_layerdiffuse/examples/layer_diffusion_cond_joint_bg.json +0 -0
  76. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/comfyui_layerdiffuse/examples/layer_diffusion_cond_joint_fg.json +0 -0
  77. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/comfyui_layerdiffuse/examples/layer_diffusion_diff_bg.json +0 -0
  78. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/comfyui_layerdiffuse/examples/layer_diffusion_diff_bg_stop_at.json +0 -0
  79. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/comfyui_layerdiffuse/examples/layer_diffusion_diff_fg.json +0 -0
  80. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/comfyui_layerdiffuse/examples/layer_diffusion_fg_example.json +0 -0
  81. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/comfyui_layerdiffuse/examples/layer_diffusion_fg_example_rgba.json +0 -0
  82. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/comfyui_layerdiffuse/examples/layer_diffusion_joint.json +0 -0
  83. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/comfyui_layerdiffuse/layered_diffusion.py +0 -0
  84. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/comfyui_layerdiffuse/lib_layerdiffusion/__init__.py +0 -0
  85. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/comfyui_layerdiffuse/lib_layerdiffusion/attention_sharing.py +0 -0
  86. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/comfyui_layerdiffuse/lib_layerdiffusion/enums.py +0 -0
  87. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/comfyui_layerdiffuse/lib_layerdiffusion/models.py +0 -0
  88. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/comfyui_layerdiffuse/lib_layerdiffusion/utils.py +0 -0
  89. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/comfyui_layerdiffuse/pyproject.toml +0 -0
  90. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/comfyui_layerdiffuse/requirements.txt +0 -0
  91. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/LICENSE +0 -0
  92. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/README.md +0 -0
  93. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/__init__.py +0 -0
  94. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/basicsr/VERSION +0 -0
  95. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/basicsr/__init__.py +0 -0
  96. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/basicsr/archs/__init__.py +0 -0
  97. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/basicsr/archs/arcface_arch.py +0 -0
  98. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/basicsr/archs/arch_util.py +0 -0
  99. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/basicsr/archs/codeformer_arch.py +0 -0
  100. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/basicsr/archs/rrdbnet_arch.py +0 -0
  101. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/basicsr/archs/vgg_arch.py +0 -0
  102. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/basicsr/archs/vqgan_arch.py +0 -0
  103. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/basicsr/data/__init__.py +0 -0
  104. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/basicsr/data/data_sampler.py +0 -0
  105. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/basicsr/data/data_util.py +0 -0
  106. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/basicsr/data/prefetch_dataloader.py +0 -0
  107. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/basicsr/data/transforms.py +0 -0
  108. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/basicsr/losses/__init__.py +0 -0
  109. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/basicsr/losses/loss_util.py +0 -0
  110. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/basicsr/losses/losses.py +0 -0
  111. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/basicsr/metrics/__init__.py +0 -0
  112. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/basicsr/metrics/metric_util.py +0 -0
  113. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/basicsr/metrics/psnr_ssim.py +0 -0
  114. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/basicsr/models/__init__.py +0 -0
  115. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/basicsr/ops/__init__.py +0 -0
  116. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/basicsr/ops/dcn/__init__.py +0 -0
  117. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/basicsr/ops/dcn/deform_conv.py +0 -0
  118. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/basicsr/ops/dcn/src/deform_conv_cuda.cpp +0 -0
  119. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/basicsr/ops/dcn/src/deform_conv_cuda_kernel.cu +0 -0
  120. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/basicsr/ops/dcn/src/deform_conv_ext.cpp +0 -0
  121. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/basicsr/ops/fused_act/__init__.py +0 -0
  122. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/basicsr/ops/fused_act/fused_act.py +0 -0
  123. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/basicsr/ops/fused_act/src/fused_bias_act.cpp +0 -0
  124. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/basicsr/ops/fused_act/src/fused_bias_act_kernel.cu +0 -0
  125. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/basicsr/ops/upfirdn2d/__init__.py +0 -0
  126. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/basicsr/ops/upfirdn2d/src/upfirdn2d.cpp +0 -0
  127. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/basicsr/ops/upfirdn2d/src/upfirdn2d_kernel.cu +0 -0
  128. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/basicsr/ops/upfirdn2d/upfirdn2d.py +0 -0
  129. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/basicsr/setup.py +0 -0
  130. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/basicsr/train.py +0 -0
  131. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/basicsr/utils/__init__.py +0 -0
  132. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/basicsr/utils/dist_util.py +0 -0
  133. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/basicsr/utils/download_util.py +0 -0
  134. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/basicsr/utils/file_client.py +0 -0
  135. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/basicsr/utils/img_util.py +0 -0
  136. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/basicsr/utils/lmdb_util.py +0 -0
  137. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/basicsr/utils/logger.py +0 -0
  138. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/basicsr/utils/matlab_functions.py +0 -0
  139. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/basicsr/utils/misc.py +0 -0
  140. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/basicsr/utils/options.py +0 -0
  141. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/basicsr/utils/realesrgan_utils.py +0 -0
  142. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/basicsr/utils/registry.py +0 -0
  143. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/basicsr/version.py +0 -0
  144. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/facelib/__init__.py +0 -0
  145. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/facelib/detection/__init__.py +0 -0
  146. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/facelib/detection/align_trans.py +0 -0
  147. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/facelib/detection/matlab_cp2tform.py +0 -0
  148. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/facelib/detection/retinaface/retinaface.py +0 -0
  149. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/facelib/detection/retinaface/retinaface_net.py +0 -0
  150. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/facelib/detection/retinaface/retinaface_utils.py +0 -0
  151. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/facelib/detection/yolov5face/__init__.py +0 -0
  152. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/facelib/detection/yolov5face/face_detector.py +0 -0
  153. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/facelib/detection/yolov5face/models/__init__.py +0 -0
  154. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/facelib/detection/yolov5face/models/common.py +0 -0
  155. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/facelib/detection/yolov5face/models/experimental.py +0 -0
  156. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/facelib/detection/yolov5face/models/yolo.py +0 -0
  157. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/facelib/detection/yolov5face/models/yolov5l.yaml +0 -0
  158. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/facelib/detection/yolov5face/models/yolov5n.yaml +0 -0
  159. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/facelib/detection/yolov5face/utils/__init__.py +0 -0
  160. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/facelib/detection/yolov5face/utils/autoanchor.py +0 -0
  161. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/facelib/detection/yolov5face/utils/datasets.py +0 -0
  162. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/facelib/detection/yolov5face/utils/extract_ckpt.py +0 -0
  163. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/facelib/detection/yolov5face/utils/general.py +0 -0
  164. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/facelib/detection/yolov5face/utils/torch_utils.py +0 -0
  165. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/facelib/parsing/__init__.py +0 -0
  166. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/facelib/parsing/bisenet.py +0 -0
  167. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/facelib/parsing/parsenet.py +0 -0
  168. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/facelib/parsing/resnet.py +0 -0
  169. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/facelib/utils/__init__.py +0 -0
  170. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/facelib/utils/face_restoration_helper.py +0 -0
  171. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/facelib/utils/face_utils.py +0 -0
  172. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/facelib/utils/misc.py +0 -0
  173. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/r_chainner/README.md +0 -0
  174. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/r_chainner/__init__.py +0 -0
  175. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/r_chainner/gfpganv1_clean_arch.py +0 -0
  176. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/r_chainner/model_loading.py +0 -0
  177. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/r_chainner/stylegan2_clean_arch.py +0 -0
  178. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/facerestore_cf/r_chainner/types.py +0 -0
  179. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/node_controlnet_model_loader.py +0 -0
  180. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/node_image_loader.py +0 -0
  181. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/node_image_output.py +0 -0
  182. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/node_lora_loader.py +0 -0
  183. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/node_model_loader.py +0 -0
  184. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/node_stage_io.py +0 -0
  185. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/node_upscale_model_loader.py +0 -0
  186. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/nodes/node_v3_canary.py +0 -0
  187. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/pipeline/__init__.py +0 -0
  188. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/pipeline/comfy_node_inputs.json +0 -0
  189. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/pipeline/constants.py +0 -0
  190. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/pipeline/context.py +0 -0
  191. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/pipeline/definition.py +0 -0
  192. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/pipeline/families/__init__.py +0 -0
  193. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/pipeline/families/image.py +0 -0
  194. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/pipeline/families/image_gen/__init__.py +0 -0
  195. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/pipeline/families/image_gen/baselines.py +0 -0
  196. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/pipeline/families/image_gen/bindings.py +0 -0
  197. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/pipeline/families/image_gen/cascade.py +0 -0
  198. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/pipeline/families/image_gen/controlnet.py +0 -0
  199. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/pipeline/families/image_gen/creative_upscale.py +0 -0
  200. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/pipeline/families/image_gen/features.py +0 -0
  201. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/pipeline/families/image_gen/flux.py +0 -0
  202. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/pipeline/families/image_gen/qr_code.py +0 -0
  203. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/pipeline/families/image_gen/qwen.py +0 -0
  204. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/pipeline/families/image_gen/stable_diffusion.py +0 -0
  205. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/pipeline/families/image_gen/steps.py +0 -0
  206. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/pipeline/families/image_gen/z_image.py +0 -0
  207. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/pipeline/families/post_processing.py +0 -0
  208. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/pipeline/graph.py +0 -0
  209. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/pipeline/horde_compat.py +0 -0
  210. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/pipeline/identifiers.py +0 -0
  211. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/pipeline/node_schemas.py +0 -0
  212. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/pipeline/patches.py +0 -0
  213. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/pipeline/payload.py +0 -0
  214. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/pipeline/payload_pp.py +0 -0
  215. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/pipeline/registry.py +0 -0
  216. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/pipeline/resolution.py +0 -0
  217. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/pipeline/sdk_adapter.py +0 -0
  218. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/pipeline_designs/pipeline_controlnet.json +0 -0
  219. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/pipeline_designs/pipeline_controlnet_annotator.json +0 -0
  220. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/pipeline_designs/pipeline_controlnet_hires_fix.json +0 -0
  221. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/pipeline_designs/pipeline_flux.json +0 -0
  222. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/pipeline_designs/pipeline_image_facefix.json +0 -0
  223. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/pipeline_designs/pipeline_image_upscale.json +0 -0
  224. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/pipeline_designs/pipeline_qr_code.json +0 -0
  225. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/pipeline_designs/pipeline_qwen.json +0 -0
  226. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/pipeline_designs/pipeline_stable_cascade.json +0 -0
  227. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/pipeline_designs/pipeline_stable_cascade_2pass.json +0 -0
  228. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/pipeline_designs/pipeline_stable_cascade_remix.json +0 -0
  229. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/pipeline_designs/pipeline_stable_diffusion.json +0 -0
  230. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/pipeline_designs/pipeline_stable_diffusion_hires_fix.json +0 -0
  231. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/pipeline_designs/pipeline_stable_diffusion_img2img_mask.json +0 -0
  232. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/pipeline_designs/pipeline_stable_diffusion_paint.json +0 -0
  233. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/pipelines/pipeline_controlnet.json +0 -0
  234. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/pipelines/pipeline_controlnet_annotator.json +0 -0
  235. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/pipelines/pipeline_controlnet_hires_fix.json +0 -0
  236. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/pipelines/pipeline_creative_upscale.json +0 -0
  237. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/pipelines/pipeline_flux.json +0 -0
  238. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/pipelines/pipeline_image_facefix.json +0 -0
  239. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/pipelines/pipeline_image_upscale.json +0 -0
  240. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/pipelines/pipeline_qr_code.json +0 -0
  241. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/pipelines/pipeline_qwen.json +0 -0
  242. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/pipelines/pipeline_stable_cascade.json +0 -0
  243. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/pipelines/pipeline_stable_cascade_2pass.json +0 -0
  244. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/pipelines/pipeline_stable_cascade_remix.json +0 -0
  245. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/pipelines/pipeline_stable_diffusion.json +0 -0
  246. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/pipelines/pipeline_stable_diffusion_hires_fix.json +0 -0
  247. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/pipelines/pipeline_stable_diffusion_img2img_mask.json +0 -0
  248. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/pipelines/pipeline_stable_diffusion_paint.json +0 -0
  249. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/pipelines/pipeline_z_image.json +0 -0
  250. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/preload.py +0 -0
  251. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/profiling.py +0 -0
  252. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/py.typed +0 -0
  253. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/pyinstaller_hooks/__init__.py +0 -0
  254. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/pyinstaller_hooks/hook-hordelib.horde.py +0 -0
  255. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/safety.py +0 -0
  256. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/safety_checker.py +0 -0
  257. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/settings.py +0 -0
  258. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/train.py +0 -0
  259. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/utils/__init__.py +0 -0
  260. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/utils/device_pinning.py +0 -0
  261. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/utils/distance.py +0 -0
  262. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/utils/dynamicprompt.py +0 -0
  263. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/utils/fd_limits.py +0 -0
  264. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/utils/gpuinfo.py +0 -0
  265. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/utils/image_utils.py +0 -0
  266. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/utils/ioredirect.py +0 -0
  267. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/utils/logger.py +0 -0
  268. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/utils/nvml.py +0 -0
  269. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/utils/optional_deps.py +0 -0
  270. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/utils/sanitizer.py +0 -0
  271. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/utils/switch.py +0 -0
  272. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/utils/torch_build.py +0 -0
  273. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/utils/torch_memory.py +0 -0
  274. {horde_engine-6.3.0 → horde_engine-6.3.2}/hordelib/vram_planning.py +0 -0
  275. {horde_engine-6.3.0 → horde_engine-6.3.2}/pyproject.toml +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: horde-engine
3
- Version: 6.3.0
3
+ Version: 6.3.2
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
@@ -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 = '6.3.0'
22
- __version_tuple__ = version_tuple = (6, 3, 0)
21
+ __version__ = version = '6.3.2'
22
+ __version_tuple__ = version_tuple = (6, 3, 2)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -77,6 +77,15 @@ lets the rename land once the transient read handle closes.
77
77
  REFERENCE_REPLACE_RETRY_DELAY = 0.05
78
78
  """Delay between atomic-rename retries, in seconds."""
79
79
 
80
+ ORPHAN_TEMP_MIN_AGE_SECONDS = 3600
81
+ """Only prune an atomic-write temp file whose mtime is older than this many seconds.
82
+
83
+ A temp file younger than this may belong to a writer in another process still transferring bytes: a
84
+ weight download can run for the whole of a large transfer. A live writer finishes (its rename) or
85
+ fails (its own cleanup) well inside this window, so only a crashed writer's temp survives past it.
86
+ Age-gating the prune reclaims leaked disk without ever deleting an in-flight write.
87
+ """
88
+
80
89
  DEFAULT_MIN_FREE_DISK_MB = 1024
81
90
  """Keep at least this many MB free on the cache volume; ad-hoc downloads evict (then refuse) below it.
82
91
 
@@ -331,6 +340,7 @@ class CivitaiAdhocModelManager[RecordT: GenericModelRecord](
331
340
  if not self.read_only:
332
341
  os.makedirs(self.model_folder_path, exist_ok=True)
333
342
  os.makedirs(self.models_db_path.parent, exist_ok=True)
343
+ self._prune_orphan_temp_files()
334
344
 
335
345
  if not self.models_db_path.exists():
336
346
  manager_logger.info("adhoc.reference_missing", database_name=self.models_db_name)
@@ -380,6 +390,33 @@ class CivitaiAdhocModelManager[RecordT: GenericModelRecord](
380
390
  )
381
391
  return reference
382
392
 
393
+ def _prune_orphan_temp_files(self) -> None:
394
+ """Remove atomic-write temp files left by a writer that crashed mid-download.
395
+
396
+ A temp file is inert: it is never loaded and never matches the weight-file scan, so it only
397
+ wastes disk. Only files older than :data:`ORPHAN_TEMP_MIN_AGE_SECONDS` are removed, because a
398
+ younger temp may belong to a writer in another process still transferring bytes (a fresh
399
+ manager on this host can be constructed while the download process is mid-fetch), and deleting
400
+ it would fail that in-flight write. Never called for a read-only manager, which never writes
401
+ weights and so never orphans a temp file.
402
+ """
403
+ cutoff = time.time() - ORPHAN_TEMP_MIN_AGE_SECONDS
404
+ for temp_file in glob.glob(os.path.join(self.model_folder_path, "*.tmp-*")):
405
+ try:
406
+ mtime = os.stat(temp_file).st_mtime
407
+ except OSError:
408
+ # The file vanished between the glob and the stat (its writer completed the rename, or
409
+ # another pruner won the race); there is nothing left to remove.
410
+ continue
411
+ if mtime > cutoff:
412
+ continue
413
+ try:
414
+ os.remove(temp_file)
415
+ except OSError as remove_error:
416
+ logger.bind(manager=self.METRIC_PREFIX).warning(
417
+ "adhoc.temp_file_prune_failed", temp_path=temp_file, error=str(remove_error)
418
+ )
419
+
383
420
  def _prune_missing_files(self) -> None:
384
421
  """Drop cache entries whose weight file is no longer present on disk."""
385
422
  for entry in list(self._iter_cache_entries()):
@@ -409,20 +446,25 @@ class CivitaiAdhocModelManager[RecordT: GenericModelRecord](
409
446
  tmp_path = f"{self.models_db_path}.tmp-{uuid.uuid4().hex[:8]}"
410
447
  with open(tmp_path, "w", encoding="utf-8", errors="ignore") as outfile:
411
448
  outfile.write(payload)
412
- self._replace_reference_file(tmp_path)
449
+ self._replace_file_with_retry(tmp_path, self.models_db_path)
413
450
  self._record_reference_stamp()
414
451
  if self._using_multiprocessing:
415
452
  self.cleanup_reference_backup_files()
416
453
 
417
- def _replace_reference_file(self, tmp_path: str) -> None:
418
- """Rename *tmp_path* onto the reference file, retrying a transient Windows sharing violation.
454
+ def _replace_file_with_retry(self, tmp_path: str, dest_path: str | Path) -> None:
455
+ """Rename *tmp_path* onto *dest_path*, retrying a transient Windows sharing violation.
456
+
457
+ On Windows a rename onto a file another process holds open (a lock-free reader mid-read) fails
458
+ with a sharing violation even though that reader still sees the intact previous file. A brief
459
+ bounded retry lets the rename land once the transient read handle closes. On final failure the
460
+ temp file is removed so a blocked replace leaves nothing behind.
419
461
 
420
462
  Raises:
421
463
  PermissionError: If the rename is still blocked after :data:`REFERENCE_REPLACE_ATTEMPTS`.
422
464
  """
423
465
  for attempt in range(REFERENCE_REPLACE_ATTEMPTS):
424
466
  try:
425
- os.replace(tmp_path, self.models_db_path)
467
+ os.replace(tmp_path, dest_path)
426
468
  return
427
469
  except PermissionError:
428
470
  if attempt == REFERENCE_REPLACE_ATTEMPTS - 1:
@@ -433,6 +475,31 @@ class CivitaiAdhocModelManager[RecordT: GenericModelRecord](
433
475
  raise
434
476
  time.sleep(REFERENCE_REPLACE_RETRY_DELAY)
435
477
 
478
+ def _atomic_write_bytes(self, dest_path: str, data: bytes) -> None:
479
+ """Write *data* to *dest_path* atomically via a sibling temp file and a hardened rename.
480
+
481
+ The bytes are staged to a uniquely named temp file in the same directory as *dest_path* (same
482
+ filesystem, so the rename is atomic) and then moved into place with
483
+ :meth:`_replace_file_with_retry`. A concurrent reader listing the folder only ever observes the
484
+ temp name or the fully placed final file, never a truncated write at *dest_path*. The temp file
485
+ is removed on any failure, so an error mid-write leaves neither a partial final file nor a
486
+ leaked temp file.
487
+
488
+ Raises:
489
+ OSError: If the temp write or the rename fails (e.g. a full disk or a persistent lock).
490
+ """
491
+ tmp_path = f"{dest_path}.tmp-{uuid.uuid4().hex[:8]}"
492
+ try:
493
+ with open(tmp_path, "wb") as tmp_file:
494
+ tmp_file.write(data)
495
+ self._replace_file_with_retry(tmp_path, dest_path)
496
+ finally:
497
+ if os.path.exists(tmp_path):
498
+ try:
499
+ os.remove(tmp_path)
500
+ except OSError:
501
+ pass
502
+
436
503
  def reload_reference_from_disk(self) -> None:
437
504
  """Reload the reference from disk, rebuild the indices and available list, and restamp the file."""
438
505
  with self._file_mutex, self._file_lock:
@@ -788,10 +855,13 @@ class CivitaiAdhocModelManager[RecordT: GenericModelRecord](
788
855
  time.sleep(self.RETRY_DELAY)
789
856
  continue
790
857
 
791
- with open(filepath, "wb") as weight_file:
792
- weight_file.write(response.content)
793
- with open(hashpath, "w") as hash_file:
794
- hash_file.write(f"{sha256} *{target.filename}")
858
+ # Stage the weight bytes to a temp file and rename into place so a concurrent reader
859
+ # (another process loading this model) never observes a torn or truncated file at the
860
+ # final path. The sidecar lands only after the weight file is fully placed, so a present
861
+ # sidecar always describes a complete weight file; a weight file without a sidecar is
862
+ # harmlessly re-verified or re-downloaded.
863
+ self._atomic_write_bytes(filepath, response.content)
864
+ self._atomic_write_bytes(hashpath, f"{sha256} *{target.filename}".encode())
795
865
 
796
866
  self._commit_download(record, target, downloaded=True)
797
867
  self._metric_download_duration.record(time.perf_counter() - download_start)
@@ -11,6 +11,7 @@ from loguru import logger
11
11
 
12
12
  # from hordelib.model_manager.diffusers import DiffusersModelManager
13
13
  from hordelib.model_manager.base import BaseModelManager
14
+ from hordelib.model_manager.civitai_adhoc import CivitaiAdhocModelManager
14
15
  from hordelib.model_manager.codeformer import CodeFormerModelManager
15
16
  from hordelib.model_manager.compvis import CompVisModelManager
16
17
  from hordelib.model_manager.controlnet import ControlNetModelManager
@@ -201,6 +202,7 @@ class ModelManager:
201
202
  managers_to_load: Iterable[str | MODEL_REFERENCE_CATEGORY | type[BaseModelManager]],
202
203
  multiprocessing_lock: multiprocessing_lock | None = None,
203
204
  lora_reference_backups: bool | None = None,
205
+ adhoc_read_only: bool = False,
204
206
  ) -> None:
205
207
  for raw_manager_to_load in managers_to_load:
206
208
  manager_to_load = resolve_manager_alias(raw_manager_to_load)
@@ -234,6 +236,9 @@ class ModelManager:
234
236
  }
235
237
  if resolve_manager_to_load_type is LoraModelManager and lora_reference_backups is not None:
236
238
  manager_kwargs["reference_backups"] = lora_reference_backups
239
+ # read_only is an ad-hoc CivitAI concept only; the other managers do not accept it.
240
+ if issubclass(resolve_manager_to_load_type, CivitaiAdhocModelManager):
241
+ manager_kwargs["read_only"] = adhoc_read_only
237
242
 
238
243
  self.active_model_managers.append(resolve_manager_to_load_type(**manager_kwargs))
239
244
 
@@ -82,6 +82,7 @@ class SharedModelManager:
82
82
  multiprocessing_lock: multiprocessing_lock | None = None,
83
83
  lora_reference_backups: bool | None = None,
84
84
  reference_offline: bool | None = None,
85
+ adhoc_read_only: bool = False,
85
86
  ):
86
87
  """Load the model managers specified.
87
88
 
@@ -98,6 +99,11 @@ class SharedModelManager:
98
99
  reference_offline (bool | None, optional): If True, construct the reference manager in \
99
100
  offline mode (read references from local disk only, never download). If None, defers \
100
101
  to the process-wide override / ``HORDE_MODEL_REFERENCE_OFFLINE``. Defaults to None.
102
+ adhoc_read_only (bool, optional): When True, the ad-hoc CivitAI managers (LoRA and TI) are \
103
+ constructed read-only. A read-only ad-hoc manager never writes its reference, downloads \
104
+ weights, or evicts, and construction itself performs no writes; any mutating call raises \
105
+ ReadOnlyModelManagerError. Lets a consumer process that must never write (an inference \
106
+ child) get that enforcement. Non-ad-hoc managers are unaffected. Defaults to False.
101
107
  """
102
108
  if cls.manager is None:
103
109
  cls.manager = ModelManager()
@@ -137,6 +143,7 @@ class SharedModelManager:
137
143
  managers_to_load,
138
144
  multiprocessing_lock=multiprocessing_lock,
139
145
  lora_reference_backups=lora_reference_backups,
146
+ adhoc_read_only=adhoc_read_only,
140
147
  )
141
148
 
142
149
  cls._register_civitai_provider()
File without changes
File without changes
File without changes