horde-model-reference 7.0.2__tar.gz → 7.2.0__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 (445) hide show
  1. {horde_model_reference-7.0.2/src/horde_model_reference.egg-info → horde_model_reference-7.2.0}/PKG-INFO +1 -1
  2. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/schemas/stable_diffusion.schema.json +27 -0
  3. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/scripts/apply_backfill_report.py +94 -1
  4. horde_model_reference-7.2.0/scripts/hash_components.py +322 -0
  5. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/_version.py +3 -3
  6. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/annotator_catalog.py +8 -0
  7. horde_model_reference-7.2.0/src/horde_model_reference/canonical_components.py +177 -0
  8. horde_model_reference-7.2.0/src/horde_model_reference/component_hash.py +407 -0
  9. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/legacy/classes/legacy_converters.py +65 -0
  10. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/legacy/classes/legacy_models.py +19 -1
  11. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/model_reference_records.py +16 -0
  12. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0/src/horde_model_reference.egg-info}/PKG-INFO +1 -1
  13. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference.egg-info/SOURCES.txt +8 -0
  14. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference.egg-info/scm_file_list.json +8 -0
  15. horde_model_reference-7.2.0/src/horde_model_reference.egg-info/scm_version.json +8 -0
  16. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/pending_queue/test_apply.py +34 -4
  17. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/test_annotator_catalog.py +10 -3
  18. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/test_annotator_records.py +15 -22
  19. horde_model_reference-7.2.0/tests/test_canonical_components.py +95 -0
  20. horde_model_reference-7.2.0/tests/test_component_hash.py +148 -0
  21. horde_model_reference-7.2.0/tests/test_hash_components_script.py +75 -0
  22. horde_model_reference-7.2.0/tests/test_hash_components_submit.py +141 -0
  23. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/test_records.py +35 -0
  24. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/test_torch_free_imports.py +1 -0
  25. horde_model_reference-7.2.0/tests/test_v2_to_legacy_conversion.py +83 -0
  26. horde_model_reference-7.0.2/src/horde_model_reference.egg-info/scm_version.json +0 -8
  27. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/.dockerignore +0 -0
  28. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/.env.example +0 -0
  29. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/.env.primary.example +0 -0
  30. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/.env.sync.example +0 -0
  31. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/.git-blame-ignore-revs +0 -0
  32. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/.github/workflows/codeql.yml +0 -0
  33. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/.github/workflows/docker-publish.yml +0 -0
  34. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/.github/workflows/docker-validation.yml +0 -0
  35. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/.github/workflows/docs.yml +0 -0
  36. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/.github/workflows/lint.yml +0 -0
  37. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/.github/workflows/maintests.yml +0 -0
  38. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/.github/workflows/prtests.yml +0 -0
  39. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/.github/workflows/r2_sync.yml +0 -0
  40. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/.github/workflows/release.yml +0 -0
  41. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/.gitignore +0 -0
  42. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/.gitmodules +0 -0
  43. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/.hadolint.yaml +0 -0
  44. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/.pre-commit-config.yaml +0 -0
  45. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/.readthedocs.yaml +0 -0
  46. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/CONTRIBUTING.md +0 -0
  47. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/DEPLOYMENT.md +0 -0
  48. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/Dockerfile +0 -0
  49. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/LICENSE +0 -0
  50. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/MANIFEST.in +0 -0
  51. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/README.md +0 -0
  52. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docker-compose.redis.yml +0 -0
  53. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docker-compose.sync.example.yml +0 -0
  54. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docker-compose.yml +0 -0
  55. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/.pages +0 -0
  56. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/build_docs.py +0 -0
  57. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/concepts/.pages +0 -0
  58. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/concepts/analytics_pipeline.md +0 -0
  59. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/concepts/architecture_overview.md +0 -0
  60. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/concepts/canonical_format.md +0 -0
  61. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/concepts/design_decisions.md +0 -0
  62. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/concepts/gated_r2_mirror.md +0 -0
  63. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/concepts/http_service.md +0 -0
  64. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/concepts/integrations.md +0 -0
  65. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/concepts/request_lifecycle.md +0 -0
  66. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/concepts/sync_system.md +0 -0
  67. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/guides/.pages +0 -0
  68. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/guides/consume_the_http_api.md +0 -0
  69. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/guides/filter_models_for_a_worker.md +0 -0
  70. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/guides/installation.md +0 -0
  71. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/guides/mirror_models_to_r2.md +0 -0
  72. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/guides/offline_and_resilient_reads.md +0 -0
  73. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/guides/submit_models_via_the_api.md +0 -0
  74. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/guides/write_a_live_provider.md +0 -0
  75. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/.pages +0 -0
  76. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/analytics/.pages +0 -0
  77. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/analytics/base_cache.md +0 -0
  78. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/analytics/cache_hydrator.md +0 -0
  79. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/analytics/constants.md +0 -0
  80. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/analytics/deletion_risk_analysis.md +0 -0
  81. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/analytics/deletion_risk_cache.md +0 -0
  82. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/analytics/filter_presets.md +0 -0
  83. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/analytics/statistics.md +0 -0
  84. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/analytics/statistics_cache.md +0 -0
  85. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/analytics/text_model_grouping.md +0 -0
  86. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/analytics/text_model_parser.md +0 -0
  87. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/audit/.pages +0 -0
  88. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/audit/events.md +0 -0
  89. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/audit/reader.md +0 -0
  90. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/audit/replay.md +0 -0
  91. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/audit/writer.md +0 -0
  92. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/backends/.pages +0 -0
  93. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/backends/base.md +0 -0
  94. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/backends/filesystem_backend.md +0 -0
  95. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/backends/github_backend.md +0 -0
  96. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/backends/http_backend.md +0 -0
  97. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/backends/redis_backend.md +0 -0
  98. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/backends/replica_backend_base.md +0 -0
  99. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/cli/.pages +0 -0
  100. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/data/.pages +0 -0
  101. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/diff_service.md +0 -0
  102. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/http_retry.md +0 -0
  103. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/integrations/.pages +0 -0
  104. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/integrations/data_merger.md +0 -0
  105. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/integrations/horde_api_integration.md +0 -0
  106. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/integrations/horde_api_models.md +0 -0
  107. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/legacy/.pages +0 -0
  108. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/legacy/classes/.pages +0 -0
  109. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/legacy/classes/legacy_converters.md +0 -0
  110. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/legacy/classes/legacy_models.md +0 -0
  111. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/legacy/convert_all_legacy_dbs.md +0 -0
  112. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/legacy/text_csv_utils.md +0 -0
  113. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/legacy/validate_sd.md +0 -0
  114. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/legacy/validation/.pages +0 -0
  115. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/meta_consts.md +0 -0
  116. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/model_consts/.pages +0 -0
  117. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/model_consts/image.md +0 -0
  118. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/model_consts/shared.md +0 -0
  119. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/model_consts/text.md +0 -0
  120. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/model_kind_validation.md +0 -0
  121. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/model_reference_manager.md +0 -0
  122. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/model_reference_metadata.md +0 -0
  123. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/model_reference_records.md +0 -0
  124. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/path_consts.md +0 -0
  125. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/pending_queue/.pages +0 -0
  126. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/pending_queue/apply.md +0 -0
  127. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/pending_queue/audit_events.md +0 -0
  128. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/pending_queue/audit_view.md +0 -0
  129. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/pending_queue/diff_utils.md +0 -0
  130. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/pending_queue/models.md +0 -0
  131. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/pending_queue/service.md +0 -0
  132. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/pending_queue/store.md +0 -0
  133. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/providers/.pages +0 -0
  134. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/providers/base.md +0 -0
  135. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/providers/registry.md +0 -0
  136. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/providers/static_provider.md +0 -0
  137. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/query.md +0 -0
  138. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/query_fields.md +0 -0
  139. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/registries.md +0 -0
  140. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/service/.pages +0 -0
  141. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/service/app.md +0 -0
  142. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/service/pending_queue/.pages +0 -0
  143. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/service/pending_queue/audit_router.md +0 -0
  144. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/service/pending_queue/dependencies.md +0 -0
  145. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/service/pending_queue/router.md +0 -0
  146. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/service/shared.md +0 -0
  147. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/service/statistics/.pages +0 -0
  148. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/service/statistics/routers/.pages +0 -0
  149. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/service/statistics/routers/deletion_risk.md +0 -0
  150. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/service/statistics/routers/statistics.md +0 -0
  151. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/service/v1/.pages +0 -0
  152. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/service/v1/routers/.pages +0 -0
  153. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/service/v1/routers/create_update.md +0 -0
  154. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/service/v1/routers/metadata.md +0 -0
  155. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/service/v1/routers/pending_queue.md +0 -0
  156. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/service/v1/routers/pending_queue_audit.md +0 -0
  157. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/service/v1/routers/references.md +0 -0
  158. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/service/v1/routers/shared.md +0 -0
  159. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/service/v1/routers/write_validations.md +0 -0
  160. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/service/v2/.pages +0 -0
  161. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/service/v2/models.md +0 -0
  162. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/service/v2/routers/.pages +0 -0
  163. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/service/v2/routers/metadata.md +0 -0
  164. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/service/v2/routers/pending_queue.md +0 -0
  165. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/service/v2/routers/pending_queue_audit.md +0 -0
  166. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/service/v2/routers/references.md +0 -0
  167. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/service/v2/routers/search.md +0 -0
  168. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/service/v2/routers/text_utils.md +0 -0
  169. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/service/v2/routers/user.md +0 -0
  170. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/service/v2/routers/write_validations.md +0 -0
  171. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/showcase/.pages +0 -0
  172. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/source_consts.md +0 -0
  173. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/sync/.pages +0 -0
  174. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/sync/comparator.md +0 -0
  175. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/sync/config.md +0 -0
  176. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/sync/github_client.md +0 -0
  177. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/sync/legacy_text_validator.md +0 -0
  178. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/sync/text_generation_serializer.md +0 -0
  179. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/sync/watch_mode.md +0 -0
  180. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/text_backend_names.md +0 -0
  181. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/text_model_duplicates.md +0 -0
  182. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/text_model_write_processor.md +0 -0
  183. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/horde_model_reference/util.md +0 -0
  184. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/index.md +0 -0
  185. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/reference/.pages +0 -0
  186. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/reference/api_deployments.md +0 -0
  187. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/reference/audit_trail.md +0 -0
  188. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/reference/glossary.md +0 -0
  189. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/reference/http_api/.pages +0 -0
  190. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/reference/http_api/conventions.md +0 -0
  191. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/reference/http_api/pending_queue_endpoints.md +0 -0
  192. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/reference/http_api/v1_endpoints.md +0 -0
  193. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/reference/http_api/v2_endpoints.md +0 -0
  194. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/reference/http_api/v2_text_utils.md +0 -0
  195. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/reference/legacy_csv_conversion.md +0 -0
  196. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/reference/model_providers.md +0 -0
  197. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/reference/model_reference_backend.md +0 -0
  198. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/reference/model_reference_records.md +0 -0
  199. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/reference/pending_queue.md +0 -0
  200. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/reference/replica_backend_base.md +0 -0
  201. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/stylesheets/extra.css +0 -0
  202. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/tutorials/.pages +0 -0
  203. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/tutorials/configuration_and_troubleshooting.md +0 -0
  204. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/tutorials/getting_started.md +0 -0
  205. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/tutorials/querying_models.md +0 -0
  206. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/tutorials/registering_providers.md +0 -0
  207. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/tutorials/using_the_http_api.md +0 -0
  208. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/docs/tutorials/working_with_records.md +0 -0
  209. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/examples/01_quickstart.py +0 -0
  210. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/examples/02_query_recipes.py +0 -0
  211. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/examples/03_working_with_records.py +0 -0
  212. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/examples/04_register_provider.py +0 -0
  213. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/examples/README.md +0 -0
  214. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/mkdocs.yml +0 -0
  215. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/pyproject.toml +0 -0
  216. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/schemas/stable_diffusion.example.json +0 -0
  217. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/scripts/README.md +0 -0
  218. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/scripts/__init__.py +0 -0
  219. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/scripts/get_all_names.py +0 -0
  220. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/scripts/legacy_text/__init__.py +0 -0
  221. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/scripts/legacy_text/convert.py +0 -0
  222. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/scripts/legacy_text/defaults.json +0 -0
  223. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/scripts/legacy_text/generation_params.json +0 -0
  224. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/scripts/legacy_text/reverse_convert.py +0 -0
  225. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/scripts/r2_sync/__init__.py +0 -0
  226. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/scripts/r2_sync/allowlist.py +0 -0
  227. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/scripts/r2_sync/byte_source.py +0 -0
  228. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/scripts/r2_sync/object_store.py +0 -0
  229. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/scripts/r2_sync/planner.py +0 -0
  230. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/scripts/r2_sync/redistributable_allowlist.json +0 -0
  231. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/scripts/r2_sync/sync.py +0 -0
  232. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/scripts/seed_annotator_reference.py +0 -0
  233. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/scripts/sync/README.md +0 -0
  234. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/scripts/sync/__init__.py +0 -0
  235. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/scripts/sync/github_app_auth_example.md +0 -0
  236. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/scripts/sync/sync_github_references.py +0 -0
  237. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/scripts/verify_query_fields.py +0 -0
  238. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/setup.cfg +0 -0
  239. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/__init__.py +0 -0
  240. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/analytics/__init__.py +0 -0
  241. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/analytics/base_cache.py +0 -0
  242. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/analytics/cache_hydrator.py +0 -0
  243. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/analytics/constants.py +0 -0
  244. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/analytics/deletion_risk_analysis.py +0 -0
  245. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/analytics/deletion_risk_cache.py +0 -0
  246. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/analytics/filter_presets.py +0 -0
  247. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/analytics/statistics.py +0 -0
  248. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/analytics/statistics_cache.py +0 -0
  249. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/analytics/text_model_grouping.py +0 -0
  250. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/analytics/text_model_parser.py +0 -0
  251. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/annotator_records.py +0 -0
  252. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/audit/__init__.py +0 -0
  253. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/audit/events.py +0 -0
  254. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/audit/reader.py +0 -0
  255. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/audit/replay.py +0 -0
  256. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/audit/writer.py +0 -0
  257. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/backends/__init__.py +0 -0
  258. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/backends/base.py +0 -0
  259. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/backends/filesystem_backend.py +0 -0
  260. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/backends/github_backend.py +0 -0
  261. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/backends/http_backend.py +0 -0
  262. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/backends/local_readonly_backend.py +0 -0
  263. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/backends/redis_backend.py +0 -0
  264. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/backends/replica_backend_base.py +0 -0
  265. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/cli/__init__.py +0 -0
  266. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/cli/migrate_layout.py +0 -0
  267. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/data/defaults.json +0 -0
  268. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/data/generation_params.json +0 -0
  269. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/diff_service.py +0 -0
  270. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/download_engine.py +0 -0
  271. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/group_aliases.py +0 -0
  272. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/group_families.py +0 -0
  273. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/group_schema_store.py +0 -0
  274. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/http_retry.py +0 -0
  275. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/integrations/__init__.py +0 -0
  276. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/integrations/data_merger.py +0 -0
  277. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/integrations/horde_api_integration.py +0 -0
  278. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/integrations/horde_api_models.py +0 -0
  279. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/legacy/README.md +0 -0
  280. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/legacy/__init__.py +0 -0
  281. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/legacy/classes/__init__.py +0 -0
  282. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/legacy/convert_all_legacy_dbs.py +0 -0
  283. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/legacy/text_csv_utils.py +0 -0
  284. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/legacy/validate_sd.py +0 -0
  285. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/meta_consts.py +0 -0
  286. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/model_consts/__init__.py +0 -0
  287. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/model_consts/image.py +0 -0
  288. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/model_consts/shared.py +0 -0
  289. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/model_consts/text.py +0 -0
  290. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/model_kind_validation.py +0 -0
  291. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/model_reference_manager.py +0 -0
  292. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/model_reference_metadata.py +0 -0
  293. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/on_disk_layout.py +0 -0
  294. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/path_consts.py +0 -0
  295. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/pending_queue/__init__.py +0 -0
  296. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/pending_queue/apply.py +0 -0
  297. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/pending_queue/audit_events.py +0 -0
  298. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/pending_queue/audit_view.py +0 -0
  299. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/pending_queue/diff_utils.py +0 -0
  300. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/pending_queue/materialize.py +0 -0
  301. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/pending_queue/models.py +0 -0
  302. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/pending_queue/service.py +0 -0
  303. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/pending_queue/store.py +0 -0
  304. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/providers/__init__.py +0 -0
  305. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/providers/base.py +0 -0
  306. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/providers/pending_provider.py +0 -0
  307. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/providers/registry.py +0 -0
  308. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/providers/static_provider.py +0 -0
  309. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/py.typed +0 -0
  310. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/query.py +0 -0
  311. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/query_fields.py +0 -0
  312. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/registries.py +0 -0
  313. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/service/__init__.py +0 -0
  314. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/service/app.py +0 -0
  315. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/service/pending_queue/__init__.py +0 -0
  316. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/service/pending_queue/audit_router.py +0 -0
  317. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/service/pending_queue/dependencies.py +0 -0
  318. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/service/pending_queue/router.py +0 -0
  319. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/service/shared.py +0 -0
  320. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/service/statistics/__init__.py +0 -0
  321. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/service/statistics/routers/__init__.py +0 -0
  322. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/service/statistics/routers/deletion_risk.py +0 -0
  323. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/service/statistics/routers/statistics.py +0 -0
  324. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/service/v1/__init__.py +0 -0
  325. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/service/v1/routers/__init__.py +0 -0
  326. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/service/v1/routers/create_update.py +0 -0
  327. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/service/v1/routers/metadata.py +0 -0
  328. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/service/v1/routers/pending_queue.py +0 -0
  329. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/service/v1/routers/pending_queue_audit.py +0 -0
  330. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/service/v1/routers/references.py +0 -0
  331. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/service/v1/routers/shared.py +0 -0
  332. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/service/v1/routers/write_validations.py +0 -0
  333. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/service/v2/__init__.py +0 -0
  334. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/service/v2/models.py +0 -0
  335. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/service/v2/routers/__init__.py +0 -0
  336. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/service/v2/routers/metadata.py +0 -0
  337. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/service/v2/routers/pending_queue.py +0 -0
  338. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/service/v2/routers/pending_queue_audit.py +0 -0
  339. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/service/v2/routers/references.py +0 -0
  340. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/service/v2/routers/search.py +0 -0
  341. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/service/v2/routers/text_utils.py +0 -0
  342. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/service/v2/routers/user.py +0 -0
  343. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/service/v2/routers/write_validations.py +0 -0
  344. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/showcase/README.md +0 -0
  345. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/source_consts.py +0 -0
  346. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/sync/__init__.py +0 -0
  347. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/sync/comparator.py +0 -0
  348. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/sync/config.py +0 -0
  349. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/sync/github_client.py +0 -0
  350. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/sync/legacy_text_validator.py +0 -0
  351. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/sync/text_generation_serializer.py +0 -0
  352. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/sync/watch_mode.py +0 -0
  353. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/text_backend_names.py +0 -0
  354. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/text_model_duplicates.py +0 -0
  355. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/text_model_write_processor.py +0 -0
  356. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference/util.py +0 -0
  357. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference.egg-info/dependency_links.txt +0 -0
  358. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference.egg-info/entry_points.txt +0 -0
  359. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference.egg-info/requires.txt +0 -0
  360. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/src/horde_model_reference.egg-info/top_level.txt +0 -0
  361. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/README.md +0 -0
  362. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/__init__.py +0 -0
  363. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/backends/__init__.py +0 -0
  364. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/backends/test_backends_init.py +0 -0
  365. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/backends/test_http_backend.py +0 -0
  366. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/backends/test_local_readonly_backend.py +0 -0
  367. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/backends/test_primary_mode.py +0 -0
  368. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/backends/test_redis_backend.py +0 -0
  369. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/check_model_ref_type_blocks.py +0 -0
  370. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/conftest.py +0 -0
  371. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/create_env_file_example.py +0 -0
  372. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/create_example_json.py +0 -0
  373. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/helpers.py +0 -0
  374. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/horde_api/__init__.py +0 -0
  375. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/horde_api/conftest.py +0 -0
  376. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/horde_api/test_data_merger.py +0 -0
  377. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/horde_api/test_deletion_risk_analysis_live.py +0 -0
  378. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/horde_api/test_deletion_risk_worker_count.py +0 -0
  379. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/horde_api/test_horde_api_integration.py +0 -0
  380. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/horde_api/test_horde_api_integration_live.py +0 -0
  381. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/horde_api/test_indexed_horde_types.py +0 -0
  382. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/integrations/test_stats_aggregation.py +0 -0
  383. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/pending_queue/test_audit_view.py +0 -0
  384. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/pending_queue/test_diff_service.py +0 -0
  385. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/pending_queue/test_service.py +0 -0
  386. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/pending_queue/test_store.py +0 -0
  387. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/service/__init__.py +0 -0
  388. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/service/test_api_design_phase4.py +0 -0
  389. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/service/test_pending_models_endpoint.py +0 -0
  390. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/service/test_pending_queue_audit_endpoints.py +0 -0
  391. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/service/test_replica_backend_base.py +0 -0
  392. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/service/test_shared_allowlists.py +0 -0
  393. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/service/test_shared_auth.py +0 -0
  394. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/service/test_text_utils.py +0 -0
  395. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/service/test_user_roles_endpoint.py +0 -0
  396. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/service/test_v1_api.py +0 -0
  397. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/service/test_v2_api.py +0 -0
  398. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/service/test_v2_search.py +0 -0
  399. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/statistics_and_audit/__init__.py +0 -0
  400. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/statistics_and_audit/test_cache_hydrator.py +0 -0
  401. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/statistics_and_audit/test_deletion_risk_analysis.py +0 -0
  402. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/statistics_and_audit/test_extras_and_aliases.py +0 -0
  403. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/statistics_and_audit/test_group_families.py +0 -0
  404. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/statistics_and_audit/test_statistics.py +0 -0
  405. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/statistics_and_audit/test_statistics_cache.py +0 -0
  406. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/statistics_and_audit/test_text_model_grouping.py +0 -0
  407. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/statistics_and_audit/test_text_model_parser.py +0 -0
  408. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/sync/__init__.py +0 -0
  409. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/sync/test_comparator.py +0 -0
  410. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/sync/test_comparator_integration.py +0 -0
  411. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/sync/test_config.py +0 -0
  412. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/sync/test_github_client.py +0 -0
  413. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/sync/test_legacy_text_validator.py +0 -0
  414. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/sync/test_text_generation_serializer.py +0 -0
  415. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/test_audit_replay.py +0 -0
  416. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/test_audit_trail.py +0 -0
  417. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/test_broken_tutu_grouping.py +0 -0
  418. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/test_canonical_format.py +0 -0
  419. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/test_combined_model_statistics.py +0 -0
  420. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/test_consts.py +0 -0
  421. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/test_convert_legacy_database.py +0 -0
  422. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/test_converters.py +0 -0
  423. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/test_csv_rows_to_legacy_dict.py +0 -0
  424. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/test_download_engine.py +0 -0
  425. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/test_env_example.py +0 -0
  426. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/test_examples.py +0 -0
  427. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/test_metadata.py +0 -0
  428. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/test_migrate_layout.py +0 -0
  429. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/test_model_kind_validation.py +0 -0
  430. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/test_model_providers.py +0 -0
  431. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/test_model_reference_manager.py +0 -0
  432. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/test_on_disk_layout.py +0 -0
  433. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/test_pending_materialize.py +0 -0
  434. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/test_pending_provider.py +0 -0
  435. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/test_query.py +0 -0
  436. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/test_r2_sync.py +0 -0
  437. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/test_registries.py +0 -0
  438. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/test_scripts.py +0 -0
  439. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/test_text_generation_csv_conversion.py +0 -0
  440. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/test_text_generation_file_paths.py +0 -0
  441. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/test_text_model_duplicates.py +0 -0
  442. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/test_text_model_group.py +0 -0
  443. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/test_text_model_write_processor.py +0 -0
  444. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/tests/test_zimage_presence_contract.py +0 -0
  445. {horde_model_reference-7.0.2 → horde_model_reference-7.2.0}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: horde_model_reference
3
- Version: 7.0.2
3
+ Version: 7.2.0
4
4
  Summary: A helper library providing a way to work with the lists of generation models, utility models, and any other related files required for the AI-Horde ecosystem.
5
5
  Author-email: tazlin <tazlin.on.github@gmail.com>, db0 <mail@dbzer0.com>
6
6
  License: GNU AFFERO GENERAL PUBLIC LICENSE
@@ -17,6 +17,18 @@
17
17
  "title": "Sha256Sum",
18
18
  "type": "string"
19
19
  },
20
+ "content_hash": {
21
+ "anyOf": [
22
+ {
23
+ "type": "string"
24
+ },
25
+ {
26
+ "type": "null"
27
+ }
28
+ ],
29
+ "default": null,
30
+ "title": "Content Hash"
31
+ },
20
32
  "file_purpose": {
21
33
  "anyOf": [
22
34
  {
@@ -134,6 +146,21 @@
134
146
  },
135
147
  "title": "Download",
136
148
  "type": "array"
149
+ },
150
+ "embedded_component_hashes": {
151
+ "anyOf": [
152
+ {
153
+ "additionalProperties": {
154
+ "type": "string"
155
+ },
156
+ "type": "object"
157
+ },
158
+ {
159
+ "type": "null"
160
+ }
161
+ ],
162
+ "default": null,
163
+ "title": "Embedded Component Hashes"
137
164
  }
138
165
  },
139
166
  "title": "GenericModelRecordConfig",
@@ -157,6 +157,98 @@ def _apply_model_reference_corrections(
157
157
  return True
158
158
 
159
159
 
160
+ # ── v2-only category corrections (no legacy representation) ───────────────
161
+
162
+
163
+ def _is_v2_only_category(category: str) -> bool:
164
+ """Return whether *category* has no legacy representation (e.g. ``controlnet_annotator``).
165
+
166
+ Such a category has no v1 endpoint, so its corrections must go through the v2 per-model API.
167
+ """
168
+ try:
169
+ from horde_model_reference.meta_consts import get_category_descriptor
170
+
171
+ return get_category_descriptor(category).has_legacy_format is False
172
+ except Exception:
173
+ return False
174
+
175
+
176
+ def _patch_config_download(record: dict[str, Any], corrections: list[dict[str, Any]]) -> int:
177
+ """Update ``sha256sum`` in v2 ``config.download`` entries matching each correction's ``file_name``.
178
+
179
+ Returns the number of entries patched.
180
+ """
181
+ downloads: list[dict[str, Any]] = record.get("config", {}).get("download", [])
182
+ patched = 0
183
+ for corr in corrections:
184
+ target = corr["file_name"]
185
+ new_sha = corr["new_sha256"]
186
+ for dentry in downloads:
187
+ if dentry.get("file_name") == target:
188
+ old = dentry.get("sha256sum")
189
+ if old != new_sha:
190
+ dentry["sha256sum"] = new_sha
191
+ patched += 1
192
+ print(f" {target}: {old} -> {new_sha}")
193
+ else:
194
+ print(f" {target}: already correct ({new_sha})")
195
+ break
196
+ else:
197
+ print(f" WARNING: file '{target}' not found in config.download; skipping.", file=sys.stderr)
198
+ return patched
199
+
200
+
201
+ def _apply_v2_corrections(
202
+ client: httpx.Client,
203
+ base_url: str,
204
+ category: str,
205
+ entries: list[dict[str, Any]],
206
+ *,
207
+ dry_run: bool,
208
+ ) -> bool:
209
+ """Fetch, patch, and PUT each model of a v2-only category via the v2 per-model API. Return True on success.
210
+
211
+ Like the v1 path, a successful PUT returns ``202`` (queued for approval); a maintainer applies the batch.
212
+ """
213
+ print(f"\nCategory: {category} ({len(entries)} correction(s)) [v2-only]")
214
+ by_model: dict[str, list[dict[str, Any]]] = {}
215
+ for entry in entries:
216
+ by_model.setdefault(entry["model_name"], []).append(entry)
217
+
218
+ base = base_url.rstrip("/")
219
+ ok = True
220
+ for model_name, corrections in by_model.items():
221
+ url = f"{base}/api/model_references/v2/{category}/model/{model_name}"
222
+ try:
223
+ resp = client.get(url, timeout=30)
224
+ resp.raise_for_status()
225
+ except httpx.HTTPError as exc:
226
+ print(f" WARNING: could not fetch '{model_name}' ({exc}); skipping.", file=sys.stderr)
227
+ continue
228
+
229
+ record = resp.json()
230
+ if _patch_config_download(record, corrections) == 0:
231
+ print(f" No changes needed for '{model_name}'.")
232
+ continue
233
+ if dry_run:
234
+ print(f" [DRY-RUN] Would PUT updated record for '{model_name}'.")
235
+ continue
236
+
237
+ try:
238
+ put = client.put(url, json=record, timeout=30)
239
+ except httpx.HTTPError as exc:
240
+ print(f" FAILED to PUT '{model_name}': {exc}", file=sys.stderr)
241
+ ok = False
242
+ continue
243
+ if put.status_code in (200, 201, 202):
244
+ verb = "queued for approval" if put.status_code == 202 else "updated"
245
+ print(f" OK ({put.status_code}): '{model_name}' {verb}.")
246
+ else:
247
+ print(f" FAILED ({put.status_code}): {put.text}", file=sys.stderr)
248
+ ok = False
249
+ return ok
250
+
251
+
160
252
  # ── main ─────────────────────────────────────────────────────────────────
161
253
 
162
254
 
@@ -205,7 +297,8 @@ def main() -> int:
205
297
 
206
298
  with httpx.Client(headers=headers, timeout=args.timeout) as client:
207
299
  for category, entries in groups.items():
208
- if not _apply_model_reference_corrections(client, args.base_url, category, entries, dry_run=args.dry_run):
300
+ apply_fn = _apply_v2_corrections if _is_v2_only_category(category) else _apply_model_reference_corrections
301
+ if not apply_fn(client, args.base_url, category, entries, dry_run=args.dry_run):
209
302
  ok = False
210
303
 
211
304
  if args.dry_run:
@@ -0,0 +1,322 @@
1
+ """Offline pass: populate reference records with component content hashes and derive the canonical set.
2
+
3
+ Fetches the live reference, computes the torch-free tensor-region content hash of each model's VAE and
4
+ text-encoder components over HTTP range requests (never downloading a whole checkpoint), then optionally
5
+ writes the populated per-category records locally and/or submits them to a live PRIMARY service. It always
6
+ writes a ``canonical_components.json`` registry, and reports what could not be hashed.
7
+
8
+ What gets hashed, per model:
9
+
10
+ * every declared standalone component file (a ``DownloadRecord`` whose ``file_purpose`` is ``vae`` or
11
+ ``text_encoders``) is hashed whole and recorded on that download's ``content_hash``; this covers the
12
+ split-file families (Flux/Qwen/Z-Image), whose large encoders live here.
13
+ * a monolithic checkpoint (a model with no separate VAE file) has its **embedded VAE** extracted and
14
+ recorded in the config's ``embedded_component_hashes``. Embedded text encoders are intentionally not
15
+ hashed: ComfyUI renames and reshuffles those keys at load, so a torch-free file hash cannot reproduce the
16
+ standalone form.
17
+
18
+ Anything that cannot be hashed (a ``.ckpt`` pickle, a host that ignores range requests, a network error, a
19
+ checkpoint with no VAE) is skipped and left without a hash, so it simply falls back to a normal load
20
+ downstream. The canonical set is then derived by frequency with a curated allow/deny override.
21
+
22
+ Submitting is opt-in and cautious: ``--submit`` writes the populated records to a PRIMARY service, but only
23
+ previews (dry-run) unless ``--no-dry-run`` is also passed. ``--api-version v2`` PUTs the v2 record (which
24
+ carries the new hash fields natively) and needs a ``canonical_format='v2'`` deployment; ``--api-version v1``
25
+ converts each record to the legacy shape and POST/PUTs it to the legacy image-generation endpoint (matching
26
+ the ``submit_*`` scripts). Run from the checkout so the library is importable, e.g.::
27
+
28
+ uv run --no-sync scripts/hash_components.py --output-dir ./component_hashes --limit 20
29
+ uv run --no-sync scripts/hash_components.py --submit --api-version v2 --apikey "$AI_HORDE_API_KEY"
30
+ """
31
+
32
+ from __future__ import annotations
33
+
34
+ import argparse
35
+ import json
36
+ import sys
37
+ from dataclasses import dataclass
38
+ from pathlib import Path
39
+ from typing import TYPE_CHECKING
40
+
41
+ import requests
42
+ from loguru import logger
43
+
44
+ from horde_model_reference.canonical_components import DEFAULT_MIN_SHARED_MODELS, derive_canonical_registry
45
+ from horde_model_reference.component_hash import (
46
+ ComponentKind,
47
+ NoComponentTensorsError,
48
+ RangeNotSupportedError,
49
+ UnsupportedComponentError,
50
+ UnsupportedContainerError,
51
+ component_kind_for_purpose,
52
+ hash_embedded_component_url,
53
+ hash_standalone_component_url,
54
+ )
55
+ from horde_model_reference.meta_consts import MODEL_REFERENCE_CATEGORY
56
+ from horde_model_reference.model_reference_manager import ModelReferenceManager
57
+
58
+ if TYPE_CHECKING:
59
+ from collections.abc import Sequence
60
+
61
+ from horde_model_reference.model_reference_records import GenericModelRecord
62
+
63
+ _SAFETENSORS_SUFFIX = ".safetensors"
64
+ _EMBEDDED_VAE_KEY = "vae"
65
+ _DEFAULT_PRIMARY_URL = "https://models.aihorde.net"
66
+ _APIKEY_ENV_VARS = ("AI_HORDE_API_KEY", "HORDE_API_KEY")
67
+ _SUBMIT_OK_STATUSES = frozenset({200, 201, 202})
68
+
69
+
70
+ @dataclass(frozen=True)
71
+ class ComponentHashTask:
72
+ """One planned hashing action for a record: which download to fetch, and how to hash it."""
73
+
74
+ download_index: int
75
+ url: str
76
+ kind: ComponentKind
77
+ embedded: bool
78
+ """True to extract an embedded VAE from a monolithic checkpoint; False to hash a standalone file whole."""
79
+
80
+
81
+ def _looks_like_safetensors(file_name: str, file_url: str) -> bool:
82
+ """Return whether a download is a safetensors container (the only form this pass can hash)."""
83
+ if file_name.lower().endswith(_SAFETENSORS_SUFFIX):
84
+ return True
85
+ return file_url.lower().split("?", 1)[0].endswith(_SAFETENSORS_SUFFIX)
86
+
87
+
88
+ def plan_component_hash_tasks(record: GenericModelRecord, *, skip_existing: bool) -> list[ComponentHashTask]:
89
+ """Plan which components of *record* to hash, without doing any I/O.
90
+
91
+ Standalone component files are hashed whole. A model with no separate VAE file is treated as monolithic
92
+ and its primary safetensors files are probed for an embedded VAE. When *skip_existing* is set, downloads
93
+ that already carry the relevant hash are left alone.
94
+ """
95
+ downloads = record.config.download
96
+ has_standalone_vae = any(
97
+ component_kind_for_purpose(download.file_purpose) is ComponentKind.VAE for download in downloads
98
+ )
99
+ existing_embedded_vae = (record.config.embedded_component_hashes or {}).get(_EMBEDDED_VAE_KEY)
100
+
101
+ tasks: list[ComponentHashTask] = []
102
+ for index, download in enumerate(downloads):
103
+ if not _looks_like_safetensors(download.file_name, download.file_url):
104
+ continue
105
+ kind = component_kind_for_purpose(download.file_purpose)
106
+ if kind is not None:
107
+ if skip_existing and download.content_hash is not None:
108
+ continue
109
+ tasks.append(ComponentHashTask(index, download.file_url, kind, embedded=False))
110
+ elif not has_standalone_vae and not (skip_existing and existing_embedded_vae is not None):
111
+ tasks.append(ComponentHashTask(index, download.file_url, ComponentKind.VAE, embedded=True))
112
+ return tasks
113
+
114
+
115
+ def _hash_task(task: ComponentHashTask, *, session: requests.Session) -> str | None:
116
+ """Execute a hashing task, returning the hash or None when the component cannot be hashed."""
117
+ try:
118
+ if task.embedded:
119
+ return hash_embedded_component_url(task.url, task.kind, session=session)
120
+ return hash_standalone_component_url(task.url, session=session)
121
+ except NoComponentTensorsError:
122
+ return None
123
+ except (UnsupportedContainerError, UnsupportedComponentError) as skip_reason:
124
+ logger.debug("Not hashable ({}): {}", skip_reason, task.url)
125
+ return None
126
+ except (RangeNotSupportedError, requests.RequestException) as fetch_error:
127
+ logger.warning("Could not fetch component ({}): {}", fetch_error, task.url)
128
+ return None
129
+
130
+
131
+ def _record_hash(record: GenericModelRecord, task: ComponentHashTask, content_hash: str) -> None:
132
+ """Store *content_hash* on the record, on the download for a standalone file or in the embedded map."""
133
+ if task.embedded:
134
+ embedded = dict(record.config.embedded_component_hashes or {})
135
+ embedded[_EMBEDDED_VAE_KEY] = content_hash
136
+ record.config.embedded_component_hashes = embedded
137
+ else:
138
+ record.config.download[task.download_index].content_hash = content_hash
139
+
140
+
141
+ def hash_category_records(
142
+ records: dict[str, GenericModelRecord],
143
+ *,
144
+ session: requests.Session,
145
+ skip_existing: bool,
146
+ limit: int,
147
+ ) -> list[str]:
148
+ """Hash the components of every record in a category in place; return the names that changed."""
149
+ changed: list[str] = []
150
+ for processed, (name, record) in enumerate(records.items()):
151
+ if limit and processed >= limit:
152
+ break
153
+ wrote_any = False
154
+ for task in plan_component_hash_tasks(record, skip_existing=skip_existing):
155
+ content_hash = _hash_task(task, session=session)
156
+ if content_hash is None:
157
+ continue
158
+ _record_hash(record, task, content_hash)
159
+ wrote_any = True
160
+ form = "embedded" if task.embedded else "file"
161
+ logger.info("Hashed {} {} for {}: {}", form, task.kind, name, content_hash)
162
+ if wrote_any:
163
+ changed.append(name)
164
+ return changed
165
+
166
+
167
+ def _resolve_apikey(cli_value: str | None) -> str:
168
+ """Return the API key from the CLI or a known environment variable, exiting if none is set."""
169
+ import os
170
+
171
+ apikey = cli_value or next((os.environ[var] for var in _APIKEY_ENV_VARS if os.environ.get(var)), None)
172
+ if not apikey:
173
+ sys.exit(f"No API key provided. Pass --apikey or set one of {', '.join(_APIKEY_ENV_VARS)}.")
174
+ return apikey
175
+
176
+
177
+ def _report_submission(response: requests.Response, name: str) -> None:
178
+ """Log the outcome of a single submission."""
179
+ if response.status_code in _SUBMIT_OK_STATUSES:
180
+ logger.info("Submitted {}: HTTP {}", name, response.status_code)
181
+ else:
182
+ logger.error("Submit failed for {}: HTTP {} {}", name, response.status_code, response.text[:200])
183
+
184
+
185
+ def _submit_record(
186
+ record: GenericModelRecord,
187
+ name: str,
188
+ category: MODEL_REFERENCE_CATEGORY,
189
+ *,
190
+ api_version: str,
191
+ base_url: str,
192
+ apikey: str,
193
+ session: requests.Session,
194
+ dry_run: bool,
195
+ update: bool,
196
+ timeout: float,
197
+ ) -> None:
198
+ """Submit one populated record to a PRIMARY service via the chosen API version, honouring dry-run."""
199
+ headers = {"apikey": apikey, "Content-Type": "application/json"}
200
+ root = base_url.rstrip("/")
201
+ if api_version == "v2":
202
+ url = f"{root}/api/model_references/v2/{category.value}/{name}"
203
+ payload = record.model_dump(mode="json")
204
+ method_name = "PUT"
205
+ sender = session.put
206
+ else:
207
+ from horde_model_reference.legacy.classes.legacy_converters import image_generation_record_to_legacy_dict
208
+
209
+ url = f"{root}/api/model_references/v1/{category.value}"
210
+ payload = image_generation_record_to_legacy_dict(record)
211
+ method_name = "PUT" if update else "POST"
212
+ sender = session.put if update else session.post
213
+
214
+ if dry_run:
215
+ logger.info("[dry-run] {} {} for {}", method_name, url, name)
216
+ return
217
+ _report_submission(sender(url, json=payload, headers=headers, timeout=timeout), name)
218
+
219
+
220
+ def _load_curated(
221
+ curated_json: Path | None,
222
+ allow: Sequence[str],
223
+ deny: Sequence[str],
224
+ ) -> tuple[set[str], set[str]]:
225
+ """Merge inline ``--allow``/``--deny`` hashes with an optional curated JSON of the same shape."""
226
+ allow_set = set(allow)
227
+ deny_set = set(deny)
228
+ if curated_json is not None:
229
+ payload = json.loads(curated_json.read_text(encoding="utf-8"))
230
+ allow_set.update(payload.get("allow", []))
231
+ deny_set.update(payload.get("deny", []))
232
+ return allow_set, deny_set
233
+
234
+
235
+ def run(args: argparse.Namespace) -> int:
236
+ """Fetch the reference, hash components, emit/submit populated records, and write the canonical registry."""
237
+ output_dir = Path(args.output_dir)
238
+ output_dir.mkdir(parents=True, exist_ok=True)
239
+ allow_set, deny_set = _load_curated(args.curated_json, args.allow, args.deny)
240
+ apikey = _resolve_apikey(args.apikey) if args.submit else ""
241
+
242
+ manager = ModelReferenceManager.get_instance()
243
+ all_references = manager.get_all_model_references(overwrite_existing=args.overwrite_existing)
244
+
245
+ session = requests.Session()
246
+ combined: dict[str, GenericModelRecord] = {}
247
+ for category in args.categories:
248
+ records = all_references.get(category, {})
249
+ if not records:
250
+ logger.warning("No records for category {}", category)
251
+ continue
252
+ changed = hash_category_records(records, session=session, skip_existing=args.skip_existing, limit=args.limit)
253
+ logger.info("Category {}: {} of {} models changed", category, len(changed), len(records))
254
+ if args.emit_json:
255
+ serialized = ModelReferenceManager.model_reference_to_json_dict(records)
256
+ (output_dir / f"{category.value}.records.json").write_text(
257
+ json.dumps(serialized, indent=2, sort_keys=True),
258
+ encoding="utf-8",
259
+ )
260
+ if args.submit:
261
+ for name in changed:
262
+ _submit_record(
263
+ records[name],
264
+ name,
265
+ category,
266
+ api_version=args.api_version,
267
+ base_url=args.primary_url,
268
+ apikey=apikey,
269
+ session=session,
270
+ dry_run=not args.no_dry_run,
271
+ update=args.update,
272
+ timeout=args.timeout,
273
+ )
274
+ combined.update(records)
275
+
276
+ registry = derive_canonical_registry(
277
+ combined,
278
+ min_shared_models=args.min_shared_models,
279
+ allow=allow_set,
280
+ deny=deny_set,
281
+ )
282
+ registry_path = output_dir / "canonical_components.json"
283
+ registry_path.write_text(registry.model_dump_json(indent=2), encoding="utf-8")
284
+ logger.info("Derived {} canonical components -> {}", len(registry.components), registry_path)
285
+ return 0
286
+
287
+
288
+ def _parse_args(argv: Sequence[str] | None = None) -> argparse.Namespace:
289
+ parser = argparse.ArgumentParser(description="Populate reference records with component content hashes.")
290
+ parser.add_argument("--output-dir", default="component_hashes", help="Directory for the emitted JSON files.")
291
+ parser.add_argument(
292
+ "--categories",
293
+ nargs="+",
294
+ type=MODEL_REFERENCE_CATEGORY,
295
+ default=[MODEL_REFERENCE_CATEGORY.image_generation],
296
+ help="Model reference categories to hash (default: image_generation).",
297
+ )
298
+ parser.add_argument("--min-shared-models", type=int, default=DEFAULT_MIN_SHARED_MODELS)
299
+ parser.add_argument("--allow", nargs="*", default=[], help="Content hashes to force into the canonical set.")
300
+ parser.add_argument("--deny", nargs="*", default=[], help="Content hashes to exclude from the canonical set.")
301
+ parser.add_argument("--curated-json", type=Path, default=None, help='JSON: {"allow": [...], "deny": [...]}.')
302
+ parser.add_argument("--limit", type=int, default=0, help="Hash only the first N models per category (0 = all).")
303
+ parser.add_argument("--skip-existing", action="store_true", help="Do not re-hash records with a hash already.")
304
+ parser.add_argument("--overwrite-existing", action="store_true", help="Force the backend to refetch reference.")
305
+ parser.add_argument("--no-emit-json", action="store_false", dest="emit_json", help="Do not write records JSON.")
306
+ parser.add_argument("--submit", action="store_true", help="Submit populated records to a PRIMARY service.")
307
+ parser.add_argument("--api-version", choices=["v1", "v2"], default="v2", help="Submit API version (default v2).")
308
+ parser.add_argument("--primary-url", default=_DEFAULT_PRIMARY_URL, help="PRIMARY service base URL for --submit.")
309
+ parser.add_argument("--apikey", default=None, help=f"API key for --submit (or set {'/'.join(_APIKEY_ENV_VARS)}).")
310
+ parser.add_argument("--no-dry-run", action="store_true", help="With --submit, perform real writes.")
311
+ parser.add_argument("--update", action="store_true", help="For v1 submit, PUT (update) instead of POST (create).")
312
+ parser.add_argument("--timeout", type=float, default=30.0, help="Per-request timeout in seconds.")
313
+ return parser.parse_args(argv)
314
+
315
+
316
+ def main(argv: Sequence[str] | None = None) -> int:
317
+ """Entry point for the offline component-hashing pass."""
318
+ return run(_parse_args(argv))
319
+
320
+
321
+ if __name__ == "__main__":
322
+ sys.exit(main())
@@ -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 = '7.0.2'
22
- __version_tuple__ = version_tuple = (7, 0, 2)
21
+ __version__ = version = '7.2.0'
22
+ __version_tuple__ = version_tuple = (7, 2, 0)
23
23
 
24
- __commit_id__ = commit_id = 'g89c3a020d'
24
+ __commit_id__ = commit_id = 'g320a47a13'
@@ -90,6 +90,7 @@ ANNOTATOR_FILES: tuple[AnnotatorFile, ...] = (
90
90
  AnnotatorFile(
91
91
  repo=ANNOTATOR_HF_REPO,
92
92
  filename="ControlNetHED.pth",
93
+ sha256="5ca93762ffd68a29fee1af9d495bf6aab80ae86f08905fb35472a083a4c7a8fa",
93
94
  control_types=("hed", "fakescribbles"),
94
95
  preprocessors=("HEDPreprocessor", "FakeScribblePreprocessor"),
95
96
  ),
@@ -97,12 +98,14 @@ ANNOTATOR_FILES: tuple[AnnotatorFile, ...] = (
97
98
  AnnotatorFile(
98
99
  repo=ANNOTATOR_HF_REPO,
99
100
  filename="res101.pth",
101
+ sha256="1d696b2ef3e8336b057d0c15bc82d2fecef821bfebe5ef9d7671a5ec5dde520b",
100
102
  control_types=("depth",),
101
103
  preprocessors=("LeReS-DepthMapPreprocessor",),
102
104
  ),
103
105
  AnnotatorFile(
104
106
  repo=ANNOTATOR_HF_REPO,
105
107
  filename="latest_net_G.pth",
108
+ sha256="50ec735d74ed6499562d898f41b49343e521808b8dae589aa3c2f5c9ac9f7462",
106
109
  control_types=("depth",),
107
110
  preprocessors=("LeReS-DepthMapPreprocessor",),
108
111
  ),
@@ -110,18 +113,21 @@ ANNOTATOR_FILES: tuple[AnnotatorFile, ...] = (
110
113
  AnnotatorFile(
111
114
  repo=ANNOTATOR_HF_REPO,
112
115
  filename="body_pose_model.pth",
116
+ sha256="25a948c16078b0f08e236bda51a385d855ef4c153598947c28c0d47ed94bb746",
113
117
  control_types=("openpose",),
114
118
  preprocessors=("OpenposePreprocessor",),
115
119
  ),
116
120
  AnnotatorFile(
117
121
  repo=ANNOTATOR_HF_REPO,
118
122
  filename="hand_pose_model.pth",
123
+ sha256="b76b00d1750901abd07b9f9d8c98cc3385b8fe834a26d4b4f0aad439e75fc600",
119
124
  control_types=("openpose",),
120
125
  preprocessors=("OpenposePreprocessor",),
121
126
  ),
122
127
  AnnotatorFile(
123
128
  repo=ANNOTATOR_HF_REPO,
124
129
  filename="facenet.pth",
130
+ sha256="8beb52e548624ffcc4aed12af7aee7dcbfaeea420c75609fee999fe7add79d43",
125
131
  control_types=("openpose",),
126
132
  preprocessors=("OpenposePreprocessor",),
127
133
  ),
@@ -129,6 +135,7 @@ ANNOTATOR_FILES: tuple[AnnotatorFile, ...] = (
129
135
  AnnotatorFile(
130
136
  repo=ANNOTATOR_HF_REPO,
131
137
  filename="upernet_global_small.pth",
138
+ sha256="bebfa1264c10381e389d8065056baaadbdadee8ddc6e36770d1ec339dc84d970",
132
139
  control_types=("seg",),
133
140
  preprocessors=("SemSegPreprocessor",),
134
141
  ),
@@ -136,6 +143,7 @@ ANNOTATOR_FILES: tuple[AnnotatorFile, ...] = (
136
143
  AnnotatorFile(
137
144
  repo=ANNOTATOR_HF_REPO,
138
145
  filename="mlsd_large_512_fp32.pth",
146
+ sha256="5696f168eb2c30d4374bbfd45436f7415bb4d88da29bea97eea0101520fba082",
139
147
  control_types=("mlsd", "hough"),
140
148
  preprocessors=("M-LSDPreprocessor",),
141
149
  ),