horde-model-reference 7.2.0__tar.gz → 7.3.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.2.0/src/horde_model_reference.egg-info → horde_model_reference-7.3.0}/PKG-INFO +1 -1
  2. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/scripts/hash_components.py +16 -13
  3. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/_version.py +3 -3
  4. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/canonical_components.py +17 -14
  5. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/component_hash.py +34 -24
  6. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/legacy/classes/legacy_converters.py +4 -4
  7. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/legacy/classes/legacy_models.py +12 -10
  8. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/model_reference_records.py +4 -2
  9. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0/src/horde_model_reference.egg-info}/PKG-INFO +1 -1
  10. horde_model_reference-7.3.0/src/horde_model_reference.egg-info/scm_version.json +8 -0
  11. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/test_component_hash.py +12 -6
  12. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/test_hash_components_script.py +11 -8
  13. horde_model_reference-7.2.0/src/horde_model_reference.egg-info/scm_version.json +0 -8
  14. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/.dockerignore +0 -0
  15. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/.env.example +0 -0
  16. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/.env.primary.example +0 -0
  17. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/.env.sync.example +0 -0
  18. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/.git-blame-ignore-revs +0 -0
  19. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/.github/workflows/codeql.yml +0 -0
  20. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/.github/workflows/docker-publish.yml +0 -0
  21. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/.github/workflows/docker-validation.yml +0 -0
  22. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/.github/workflows/docs.yml +0 -0
  23. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/.github/workflows/lint.yml +0 -0
  24. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/.github/workflows/maintests.yml +0 -0
  25. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/.github/workflows/prtests.yml +0 -0
  26. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/.github/workflows/r2_sync.yml +0 -0
  27. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/.github/workflows/release.yml +0 -0
  28. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/.gitignore +0 -0
  29. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/.gitmodules +0 -0
  30. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/.hadolint.yaml +0 -0
  31. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/.pre-commit-config.yaml +0 -0
  32. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/.readthedocs.yaml +0 -0
  33. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/CONTRIBUTING.md +0 -0
  34. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/DEPLOYMENT.md +0 -0
  35. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/Dockerfile +0 -0
  36. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/LICENSE +0 -0
  37. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/MANIFEST.in +0 -0
  38. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/README.md +0 -0
  39. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docker-compose.redis.yml +0 -0
  40. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docker-compose.sync.example.yml +0 -0
  41. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docker-compose.yml +0 -0
  42. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/.pages +0 -0
  43. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/build_docs.py +0 -0
  44. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/concepts/.pages +0 -0
  45. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/concepts/analytics_pipeline.md +0 -0
  46. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/concepts/architecture_overview.md +0 -0
  47. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/concepts/canonical_format.md +0 -0
  48. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/concepts/design_decisions.md +0 -0
  49. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/concepts/gated_r2_mirror.md +0 -0
  50. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/concepts/http_service.md +0 -0
  51. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/concepts/integrations.md +0 -0
  52. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/concepts/request_lifecycle.md +0 -0
  53. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/concepts/sync_system.md +0 -0
  54. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/guides/.pages +0 -0
  55. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/guides/consume_the_http_api.md +0 -0
  56. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/guides/filter_models_for_a_worker.md +0 -0
  57. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/guides/installation.md +0 -0
  58. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/guides/mirror_models_to_r2.md +0 -0
  59. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/guides/offline_and_resilient_reads.md +0 -0
  60. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/guides/submit_models_via_the_api.md +0 -0
  61. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/guides/write_a_live_provider.md +0 -0
  62. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/.pages +0 -0
  63. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/analytics/.pages +0 -0
  64. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/analytics/base_cache.md +0 -0
  65. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/analytics/cache_hydrator.md +0 -0
  66. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/analytics/constants.md +0 -0
  67. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/analytics/deletion_risk_analysis.md +0 -0
  68. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/analytics/deletion_risk_cache.md +0 -0
  69. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/analytics/filter_presets.md +0 -0
  70. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/analytics/statistics.md +0 -0
  71. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/analytics/statistics_cache.md +0 -0
  72. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/analytics/text_model_grouping.md +0 -0
  73. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/analytics/text_model_parser.md +0 -0
  74. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/audit/.pages +0 -0
  75. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/audit/events.md +0 -0
  76. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/audit/reader.md +0 -0
  77. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/audit/replay.md +0 -0
  78. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/audit/writer.md +0 -0
  79. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/backends/.pages +0 -0
  80. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/backends/base.md +0 -0
  81. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/backends/filesystem_backend.md +0 -0
  82. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/backends/github_backend.md +0 -0
  83. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/backends/http_backend.md +0 -0
  84. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/backends/redis_backend.md +0 -0
  85. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/backends/replica_backend_base.md +0 -0
  86. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/cli/.pages +0 -0
  87. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/data/.pages +0 -0
  88. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/diff_service.md +0 -0
  89. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/http_retry.md +0 -0
  90. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/integrations/.pages +0 -0
  91. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/integrations/data_merger.md +0 -0
  92. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/integrations/horde_api_integration.md +0 -0
  93. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/integrations/horde_api_models.md +0 -0
  94. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/legacy/.pages +0 -0
  95. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/legacy/classes/.pages +0 -0
  96. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/legacy/classes/legacy_converters.md +0 -0
  97. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/legacy/classes/legacy_models.md +0 -0
  98. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/legacy/convert_all_legacy_dbs.md +0 -0
  99. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/legacy/text_csv_utils.md +0 -0
  100. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/legacy/validate_sd.md +0 -0
  101. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/legacy/validation/.pages +0 -0
  102. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/meta_consts.md +0 -0
  103. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/model_consts/.pages +0 -0
  104. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/model_consts/image.md +0 -0
  105. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/model_consts/shared.md +0 -0
  106. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/model_consts/text.md +0 -0
  107. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/model_kind_validation.md +0 -0
  108. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/model_reference_manager.md +0 -0
  109. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/model_reference_metadata.md +0 -0
  110. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/model_reference_records.md +0 -0
  111. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/path_consts.md +0 -0
  112. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/pending_queue/.pages +0 -0
  113. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/pending_queue/apply.md +0 -0
  114. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/pending_queue/audit_events.md +0 -0
  115. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/pending_queue/audit_view.md +0 -0
  116. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/pending_queue/diff_utils.md +0 -0
  117. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/pending_queue/models.md +0 -0
  118. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/pending_queue/service.md +0 -0
  119. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/pending_queue/store.md +0 -0
  120. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/providers/.pages +0 -0
  121. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/providers/base.md +0 -0
  122. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/providers/registry.md +0 -0
  123. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/providers/static_provider.md +0 -0
  124. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/query.md +0 -0
  125. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/query_fields.md +0 -0
  126. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/registries.md +0 -0
  127. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/service/.pages +0 -0
  128. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/service/app.md +0 -0
  129. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/service/pending_queue/.pages +0 -0
  130. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/service/pending_queue/audit_router.md +0 -0
  131. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/service/pending_queue/dependencies.md +0 -0
  132. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/service/pending_queue/router.md +0 -0
  133. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/service/shared.md +0 -0
  134. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/service/statistics/.pages +0 -0
  135. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/service/statistics/routers/.pages +0 -0
  136. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/service/statistics/routers/deletion_risk.md +0 -0
  137. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/service/statistics/routers/statistics.md +0 -0
  138. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/service/v1/.pages +0 -0
  139. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/service/v1/routers/.pages +0 -0
  140. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/service/v1/routers/create_update.md +0 -0
  141. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/service/v1/routers/metadata.md +0 -0
  142. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/service/v1/routers/pending_queue.md +0 -0
  143. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/service/v1/routers/pending_queue_audit.md +0 -0
  144. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/service/v1/routers/references.md +0 -0
  145. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/service/v1/routers/shared.md +0 -0
  146. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/service/v1/routers/write_validations.md +0 -0
  147. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/service/v2/.pages +0 -0
  148. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/service/v2/models.md +0 -0
  149. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/service/v2/routers/.pages +0 -0
  150. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/service/v2/routers/metadata.md +0 -0
  151. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/service/v2/routers/pending_queue.md +0 -0
  152. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/service/v2/routers/pending_queue_audit.md +0 -0
  153. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/service/v2/routers/references.md +0 -0
  154. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/service/v2/routers/search.md +0 -0
  155. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/service/v2/routers/text_utils.md +0 -0
  156. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/service/v2/routers/user.md +0 -0
  157. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/service/v2/routers/write_validations.md +0 -0
  158. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/showcase/.pages +0 -0
  159. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/source_consts.md +0 -0
  160. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/sync/.pages +0 -0
  161. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/sync/comparator.md +0 -0
  162. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/sync/config.md +0 -0
  163. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/sync/github_client.md +0 -0
  164. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/sync/legacy_text_validator.md +0 -0
  165. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/sync/text_generation_serializer.md +0 -0
  166. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/sync/watch_mode.md +0 -0
  167. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/text_backend_names.md +0 -0
  168. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/text_model_duplicates.md +0 -0
  169. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/text_model_write_processor.md +0 -0
  170. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/horde_model_reference/util.md +0 -0
  171. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/index.md +0 -0
  172. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/reference/.pages +0 -0
  173. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/reference/api_deployments.md +0 -0
  174. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/reference/audit_trail.md +0 -0
  175. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/reference/glossary.md +0 -0
  176. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/reference/http_api/.pages +0 -0
  177. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/reference/http_api/conventions.md +0 -0
  178. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/reference/http_api/pending_queue_endpoints.md +0 -0
  179. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/reference/http_api/v1_endpoints.md +0 -0
  180. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/reference/http_api/v2_endpoints.md +0 -0
  181. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/reference/http_api/v2_text_utils.md +0 -0
  182. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/reference/legacy_csv_conversion.md +0 -0
  183. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/reference/model_providers.md +0 -0
  184. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/reference/model_reference_backend.md +0 -0
  185. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/reference/model_reference_records.md +0 -0
  186. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/reference/pending_queue.md +0 -0
  187. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/reference/replica_backend_base.md +0 -0
  188. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/stylesheets/extra.css +0 -0
  189. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/tutorials/.pages +0 -0
  190. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/tutorials/configuration_and_troubleshooting.md +0 -0
  191. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/tutorials/getting_started.md +0 -0
  192. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/tutorials/querying_models.md +0 -0
  193. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/tutorials/registering_providers.md +0 -0
  194. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/tutorials/using_the_http_api.md +0 -0
  195. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/docs/tutorials/working_with_records.md +0 -0
  196. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/examples/01_quickstart.py +0 -0
  197. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/examples/02_query_recipes.py +0 -0
  198. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/examples/03_working_with_records.py +0 -0
  199. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/examples/04_register_provider.py +0 -0
  200. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/examples/README.md +0 -0
  201. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/mkdocs.yml +0 -0
  202. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/pyproject.toml +0 -0
  203. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/schemas/stable_diffusion.example.json +0 -0
  204. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/schemas/stable_diffusion.schema.json +0 -0
  205. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/scripts/README.md +0 -0
  206. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/scripts/__init__.py +0 -0
  207. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/scripts/apply_backfill_report.py +0 -0
  208. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/scripts/get_all_names.py +0 -0
  209. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/scripts/legacy_text/__init__.py +0 -0
  210. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/scripts/legacy_text/convert.py +0 -0
  211. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/scripts/legacy_text/defaults.json +0 -0
  212. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/scripts/legacy_text/generation_params.json +0 -0
  213. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/scripts/legacy_text/reverse_convert.py +0 -0
  214. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/scripts/r2_sync/__init__.py +0 -0
  215. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/scripts/r2_sync/allowlist.py +0 -0
  216. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/scripts/r2_sync/byte_source.py +0 -0
  217. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/scripts/r2_sync/object_store.py +0 -0
  218. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/scripts/r2_sync/planner.py +0 -0
  219. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/scripts/r2_sync/redistributable_allowlist.json +0 -0
  220. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/scripts/r2_sync/sync.py +0 -0
  221. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/scripts/seed_annotator_reference.py +0 -0
  222. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/scripts/sync/README.md +0 -0
  223. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/scripts/sync/__init__.py +0 -0
  224. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/scripts/sync/github_app_auth_example.md +0 -0
  225. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/scripts/sync/sync_github_references.py +0 -0
  226. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/scripts/verify_query_fields.py +0 -0
  227. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/setup.cfg +0 -0
  228. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/__init__.py +0 -0
  229. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/analytics/__init__.py +0 -0
  230. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/analytics/base_cache.py +0 -0
  231. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/analytics/cache_hydrator.py +0 -0
  232. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/analytics/constants.py +0 -0
  233. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/analytics/deletion_risk_analysis.py +0 -0
  234. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/analytics/deletion_risk_cache.py +0 -0
  235. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/analytics/filter_presets.py +0 -0
  236. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/analytics/statistics.py +0 -0
  237. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/analytics/statistics_cache.py +0 -0
  238. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/analytics/text_model_grouping.py +0 -0
  239. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/analytics/text_model_parser.py +0 -0
  240. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/annotator_catalog.py +0 -0
  241. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/annotator_records.py +0 -0
  242. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/audit/__init__.py +0 -0
  243. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/audit/events.py +0 -0
  244. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/audit/reader.py +0 -0
  245. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/audit/replay.py +0 -0
  246. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/audit/writer.py +0 -0
  247. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/backends/__init__.py +0 -0
  248. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/backends/base.py +0 -0
  249. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/backends/filesystem_backend.py +0 -0
  250. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/backends/github_backend.py +0 -0
  251. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/backends/http_backend.py +0 -0
  252. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/backends/local_readonly_backend.py +0 -0
  253. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/backends/redis_backend.py +0 -0
  254. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/backends/replica_backend_base.py +0 -0
  255. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/cli/__init__.py +0 -0
  256. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/cli/migrate_layout.py +0 -0
  257. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/data/defaults.json +0 -0
  258. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/data/generation_params.json +0 -0
  259. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/diff_service.py +0 -0
  260. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/download_engine.py +0 -0
  261. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/group_aliases.py +0 -0
  262. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/group_families.py +0 -0
  263. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/group_schema_store.py +0 -0
  264. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/http_retry.py +0 -0
  265. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/integrations/__init__.py +0 -0
  266. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/integrations/data_merger.py +0 -0
  267. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/integrations/horde_api_integration.py +0 -0
  268. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/integrations/horde_api_models.py +0 -0
  269. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/legacy/README.md +0 -0
  270. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/legacy/__init__.py +0 -0
  271. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/legacy/classes/__init__.py +0 -0
  272. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/legacy/convert_all_legacy_dbs.py +0 -0
  273. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/legacy/text_csv_utils.py +0 -0
  274. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/legacy/validate_sd.py +0 -0
  275. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/meta_consts.py +0 -0
  276. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/model_consts/__init__.py +0 -0
  277. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/model_consts/image.py +0 -0
  278. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/model_consts/shared.py +0 -0
  279. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/model_consts/text.py +0 -0
  280. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/model_kind_validation.py +0 -0
  281. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/model_reference_manager.py +0 -0
  282. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/model_reference_metadata.py +0 -0
  283. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/on_disk_layout.py +0 -0
  284. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/path_consts.py +0 -0
  285. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/pending_queue/__init__.py +0 -0
  286. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/pending_queue/apply.py +0 -0
  287. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/pending_queue/audit_events.py +0 -0
  288. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/pending_queue/audit_view.py +0 -0
  289. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/pending_queue/diff_utils.py +0 -0
  290. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/pending_queue/materialize.py +0 -0
  291. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/pending_queue/models.py +0 -0
  292. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/pending_queue/service.py +0 -0
  293. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/pending_queue/store.py +0 -0
  294. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/providers/__init__.py +0 -0
  295. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/providers/base.py +0 -0
  296. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/providers/pending_provider.py +0 -0
  297. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/providers/registry.py +0 -0
  298. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/providers/static_provider.py +0 -0
  299. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/py.typed +0 -0
  300. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/query.py +0 -0
  301. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/query_fields.py +0 -0
  302. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/registries.py +0 -0
  303. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/service/__init__.py +0 -0
  304. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/service/app.py +0 -0
  305. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/service/pending_queue/__init__.py +0 -0
  306. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/service/pending_queue/audit_router.py +0 -0
  307. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/service/pending_queue/dependencies.py +0 -0
  308. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/service/pending_queue/router.py +0 -0
  309. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/service/shared.py +0 -0
  310. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/service/statistics/__init__.py +0 -0
  311. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/service/statistics/routers/__init__.py +0 -0
  312. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/service/statistics/routers/deletion_risk.py +0 -0
  313. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/service/statistics/routers/statistics.py +0 -0
  314. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/service/v1/__init__.py +0 -0
  315. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/service/v1/routers/__init__.py +0 -0
  316. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/service/v1/routers/create_update.py +0 -0
  317. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/service/v1/routers/metadata.py +0 -0
  318. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/service/v1/routers/pending_queue.py +0 -0
  319. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/service/v1/routers/pending_queue_audit.py +0 -0
  320. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/service/v1/routers/references.py +0 -0
  321. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/service/v1/routers/shared.py +0 -0
  322. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/service/v1/routers/write_validations.py +0 -0
  323. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/service/v2/__init__.py +0 -0
  324. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/service/v2/models.py +0 -0
  325. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/service/v2/routers/__init__.py +0 -0
  326. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/service/v2/routers/metadata.py +0 -0
  327. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/service/v2/routers/pending_queue.py +0 -0
  328. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/service/v2/routers/pending_queue_audit.py +0 -0
  329. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/service/v2/routers/references.py +0 -0
  330. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/service/v2/routers/search.py +0 -0
  331. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/service/v2/routers/text_utils.py +0 -0
  332. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/service/v2/routers/user.py +0 -0
  333. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/service/v2/routers/write_validations.py +0 -0
  334. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/showcase/README.md +0 -0
  335. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/source_consts.py +0 -0
  336. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/sync/__init__.py +0 -0
  337. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/sync/comparator.py +0 -0
  338. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/sync/config.py +0 -0
  339. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/sync/github_client.py +0 -0
  340. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/sync/legacy_text_validator.py +0 -0
  341. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/sync/text_generation_serializer.py +0 -0
  342. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/sync/watch_mode.py +0 -0
  343. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/text_backend_names.py +0 -0
  344. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/text_model_duplicates.py +0 -0
  345. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/text_model_write_processor.py +0 -0
  346. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference/util.py +0 -0
  347. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference.egg-info/SOURCES.txt +0 -0
  348. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference.egg-info/dependency_links.txt +0 -0
  349. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference.egg-info/entry_points.txt +0 -0
  350. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference.egg-info/requires.txt +0 -0
  351. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference.egg-info/scm_file_list.json +0 -0
  352. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/src/horde_model_reference.egg-info/top_level.txt +0 -0
  353. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/README.md +0 -0
  354. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/__init__.py +0 -0
  355. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/backends/__init__.py +0 -0
  356. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/backends/test_backends_init.py +0 -0
  357. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/backends/test_http_backend.py +0 -0
  358. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/backends/test_local_readonly_backend.py +0 -0
  359. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/backends/test_primary_mode.py +0 -0
  360. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/backends/test_redis_backend.py +0 -0
  361. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/check_model_ref_type_blocks.py +0 -0
  362. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/conftest.py +0 -0
  363. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/create_env_file_example.py +0 -0
  364. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/create_example_json.py +0 -0
  365. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/helpers.py +0 -0
  366. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/horde_api/__init__.py +0 -0
  367. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/horde_api/conftest.py +0 -0
  368. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/horde_api/test_data_merger.py +0 -0
  369. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/horde_api/test_deletion_risk_analysis_live.py +0 -0
  370. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/horde_api/test_deletion_risk_worker_count.py +0 -0
  371. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/horde_api/test_horde_api_integration.py +0 -0
  372. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/horde_api/test_horde_api_integration_live.py +0 -0
  373. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/horde_api/test_indexed_horde_types.py +0 -0
  374. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/integrations/test_stats_aggregation.py +0 -0
  375. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/pending_queue/test_apply.py +0 -0
  376. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/pending_queue/test_audit_view.py +0 -0
  377. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/pending_queue/test_diff_service.py +0 -0
  378. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/pending_queue/test_service.py +0 -0
  379. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/pending_queue/test_store.py +0 -0
  380. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/service/__init__.py +0 -0
  381. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/service/test_api_design_phase4.py +0 -0
  382. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/service/test_pending_models_endpoint.py +0 -0
  383. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/service/test_pending_queue_audit_endpoints.py +0 -0
  384. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/service/test_replica_backend_base.py +0 -0
  385. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/service/test_shared_allowlists.py +0 -0
  386. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/service/test_shared_auth.py +0 -0
  387. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/service/test_text_utils.py +0 -0
  388. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/service/test_user_roles_endpoint.py +0 -0
  389. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/service/test_v1_api.py +0 -0
  390. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/service/test_v2_api.py +0 -0
  391. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/service/test_v2_search.py +0 -0
  392. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/statistics_and_audit/__init__.py +0 -0
  393. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/statistics_and_audit/test_cache_hydrator.py +0 -0
  394. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/statistics_and_audit/test_deletion_risk_analysis.py +0 -0
  395. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/statistics_and_audit/test_extras_and_aliases.py +0 -0
  396. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/statistics_and_audit/test_group_families.py +0 -0
  397. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/statistics_and_audit/test_statistics.py +0 -0
  398. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/statistics_and_audit/test_statistics_cache.py +0 -0
  399. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/statistics_and_audit/test_text_model_grouping.py +0 -0
  400. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/statistics_and_audit/test_text_model_parser.py +0 -0
  401. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/sync/__init__.py +0 -0
  402. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/sync/test_comparator.py +0 -0
  403. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/sync/test_comparator_integration.py +0 -0
  404. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/sync/test_config.py +0 -0
  405. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/sync/test_github_client.py +0 -0
  406. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/sync/test_legacy_text_validator.py +0 -0
  407. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/sync/test_text_generation_serializer.py +0 -0
  408. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/test_annotator_catalog.py +0 -0
  409. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/test_annotator_records.py +0 -0
  410. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/test_audit_replay.py +0 -0
  411. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/test_audit_trail.py +0 -0
  412. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/test_broken_tutu_grouping.py +0 -0
  413. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/test_canonical_components.py +0 -0
  414. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/test_canonical_format.py +0 -0
  415. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/test_combined_model_statistics.py +0 -0
  416. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/test_consts.py +0 -0
  417. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/test_convert_legacy_database.py +0 -0
  418. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/test_converters.py +0 -0
  419. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/test_csv_rows_to_legacy_dict.py +0 -0
  420. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/test_download_engine.py +0 -0
  421. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/test_env_example.py +0 -0
  422. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/test_examples.py +0 -0
  423. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/test_hash_components_submit.py +0 -0
  424. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/test_metadata.py +0 -0
  425. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/test_migrate_layout.py +0 -0
  426. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/test_model_kind_validation.py +0 -0
  427. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/test_model_providers.py +0 -0
  428. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/test_model_reference_manager.py +0 -0
  429. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/test_on_disk_layout.py +0 -0
  430. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/test_pending_materialize.py +0 -0
  431. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/test_pending_provider.py +0 -0
  432. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/test_query.py +0 -0
  433. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/test_r2_sync.py +0 -0
  434. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/test_records.py +0 -0
  435. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/test_registries.py +0 -0
  436. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/test_scripts.py +0 -0
  437. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/test_text_generation_csv_conversion.py +0 -0
  438. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/test_text_generation_file_paths.py +0 -0
  439. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/test_text_model_duplicates.py +0 -0
  440. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/test_text_model_group.py +0 -0
  441. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/test_text_model_write_processor.py +0 -0
  442. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/test_torch_free_imports.py +0 -0
  443. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/test_v2_to_legacy_conversion.py +0 -0
  444. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/tests/test_zimage_presence_contract.py +0 -0
  445. {horde_model_reference-7.2.0 → horde_model_reference-7.3.0}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: horde_model_reference
3
- Version: 7.2.0
3
+ Version: 7.3.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
@@ -46,7 +46,6 @@ from horde_model_reference.component_hash import (
46
46
  ComponentKind,
47
47
  NoComponentTensorsError,
48
48
  RangeNotSupportedError,
49
- UnsupportedComponentError,
50
49
  UnsupportedContainerError,
51
50
  component_kind_for_purpose,
52
51
  hash_embedded_component_url,
@@ -61,7 +60,7 @@ if TYPE_CHECKING:
61
60
  from horde_model_reference.model_reference_records import GenericModelRecord
62
61
 
63
62
  _SAFETENSORS_SUFFIX = ".safetensors"
64
- _EMBEDDED_VAE_KEY = "vae"
63
+ _EMBEDDABLE_KINDS = (ComponentKind.VAE, ComponentKind.TEXT_ENCODERS)
65
64
  _DEFAULT_PRIMARY_URL = "https://models.aihorde.net"
66
65
  _APIKEY_ENV_VARS = ("AI_HORDE_API_KEY", "HORDE_API_KEY")
67
66
  _SUBMIT_OK_STATUSES = frozenset({200, 201, 202})
@@ -88,15 +87,13 @@ def _looks_like_safetensors(file_name: str, file_url: str) -> bool:
88
87
  def plan_component_hash_tasks(record: GenericModelRecord, *, skip_existing: bool) -> list[ComponentHashTask]:
89
88
  """Plan which components of *record* to hash, without doing any I/O.
90
89
 
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.
90
+ Standalone component files are hashed whole. A model with no standalone file for a component kind is
91
+ treated as monolithic for that kind, and its primary safetensors files are probed for the embedded VAE
92
+ and text encoders. When *skip_existing* is set, components that already carry a hash are left alone.
94
93
  """
95
94
  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)
95
+ standalone_kinds = {component_kind_for_purpose(download.file_purpose) for download in downloads}
96
+ embedded_hashes = record.config.embedded_component_hashes or {}
100
97
 
101
98
  tasks: list[ComponentHashTask] = []
102
99
  for index, download in enumerate(downloads):
@@ -107,8 +104,14 @@ def plan_component_hash_tasks(record: GenericModelRecord, *, skip_existing: bool
107
104
  if skip_existing and download.content_hash is not None:
108
105
  continue
109
106
  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))
107
+ continue
108
+ # Primary checkpoint: probe for each embeddable component that has no standalone file of its own.
109
+ for embed_kind in _EMBEDDABLE_KINDS:
110
+ if embed_kind in standalone_kinds:
111
+ continue
112
+ if skip_existing and embedded_hashes.get(embed_kind.value) is not None:
113
+ continue
114
+ tasks.append(ComponentHashTask(index, download.file_url, embed_kind, embedded=True))
112
115
  return tasks
113
116
 
114
117
 
@@ -120,7 +123,7 @@ def _hash_task(task: ComponentHashTask, *, session: requests.Session) -> str | N
120
123
  return hash_standalone_component_url(task.url, session=session)
121
124
  except NoComponentTensorsError:
122
125
  return None
123
- except (UnsupportedContainerError, UnsupportedComponentError) as skip_reason:
126
+ except UnsupportedContainerError as skip_reason:
124
127
  logger.debug("Not hashable ({}): {}", skip_reason, task.url)
125
128
  return None
126
129
  except (RangeNotSupportedError, requests.RequestException) as fetch_error:
@@ -132,7 +135,7 @@ def _record_hash(record: GenericModelRecord, task: ComponentHashTask, content_ha
132
135
  """Store *content_hash* on the record, on the download for a standalone file or in the embedded map."""
133
136
  if task.embedded:
134
137
  embedded = dict(record.config.embedded_component_hashes or {})
135
- embedded[_EMBEDDED_VAE_KEY] = content_hash
138
+ embedded[task.kind.value] = content_hash
136
139
  record.config.embedded_component_hashes = embedded
137
140
  else:
138
141
  record.config.download[task.download_index].content_hash = content_hash
@@ -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.2.0'
22
- __version_tuple__ = version_tuple = (7, 2, 0)
21
+ __version__ = version = '7.3.0'
22
+ __version_tuple__ = version_tuple = (7, 3, 0)
23
23
 
24
- __commit_id__ = commit_id = 'g320a47a13'
24
+ __commit_id__ = commit_id = 'g0d95c3fff'
@@ -1,16 +1,17 @@
1
1
  """The canonical set of shareable model components, and how it is derived from the reference.
2
2
 
3
3
  A component (a VAE or a text encoder) is worth sharing across processes only when several models use the
4
- byte-identical weights. This module holds the derived answer to "which component content-hashes are worth
4
+ byte-identical weights. This module holds the derived answer to "which component identities are worth
5
5
  materialising once and sharing?" plus, for each, where a worker can obtain the standalone file (which model
6
- carries it, and whether as its own file or embedded in a checkpoint it must slice).
6
+ carries it, and whether as its own file or embedded in a checkpoint it must extract).
7
7
 
8
- The set is derived centrally by the offline hashing pass and served as data, so every worker consumes one
9
- authoritative answer rather than each re-deriving it (and drifting). Derivation is by frequency with a
10
- curated override: a component shared by at least ``min_shared_models`` distinct models is promoted, an
11
- allowlist can force a specific hash in regardless of count, and a denylist can exclude one. The identity is
12
- the torch-free tensor-region hash from :mod:`horde_model_reference.component_hash`; the kind values match
13
- ``on_disk_layout.COMPONENT_PURPOSE_FOLDERS`` so placement of a materialised file reuses that routing.
8
+ The set is derived centrally and served as data, so every worker consumes one authoritative answer rather
9
+ than each re-deriving it (and drifting). Derivation is by frequency with a curated override: a component
10
+ shared by at least ``min_shared_models`` distinct models is promoted, an allowlist can force a specific hash
11
+ in regardless of count, and a denylist can exclude one. The identity is the torch-free **content hash** (the
12
+ tensor-region file hash), which is identical on every machine; the loaded-module hash is device- and
13
+ dtype-dependent, so it is a machine-local runtime detail only and is never shipped here. The kind values
14
+ match ``on_disk_layout.COMPONENT_PURPOSE_FOLDERS`` so a materialised file's placement reuses that routing.
14
15
 
15
16
  This module stays torch-free: it is pure reference data and grouping logic over already-computed hashes.
16
17
  """
@@ -61,12 +62,13 @@ class CanonicalComponentSource(BaseModel):
61
62
 
62
63
 
63
64
  class CanonicalComponent(BaseModel):
64
- """A shareable component promoted to the canonical set, identified by its content hash."""
65
+ """A shareable component promoted to the canonical set, identified by its content (file) hash."""
65
66
 
66
67
  model_config = get_default_config()
67
68
 
68
69
  content_hash: str
69
- """The torch-free tensor-region content hash identifying these weights."""
70
+ """The cross-platform-stable file-content identity the registry keys on (not the machine-dependent
71
+ loaded-module hash)."""
70
72
  kind: ComponentKind
71
73
  """The component kind (``vae`` or ``text_encoders``)."""
72
74
  shared_by_model_count: int
@@ -98,7 +100,8 @@ def _iter_component_candidates(
98
100
  """Yield every ``(content_hash, kind, source)`` a single record contributes.
99
101
 
100
102
  Split-file components come from each ``DownloadRecord`` that declares a component ``file_purpose`` and a
101
- ``content_hash``; embedded components come from the record's ``embedded_component_hashes`` map.
103
+ ``content_hash``; embedded components come from the record's ``embedded_component_hashes`` map. A component
104
+ whose content hash is not yet populated contributes nothing.
102
105
  """
103
106
  config = record.config
104
107
  for download in config.download:
@@ -136,15 +139,15 @@ def derive_canonical_registry(
136
139
  ) -> CanonicalComponentRegistry:
137
140
  """Derive the canonical component set from *records* by frequency, with a curated override.
138
141
 
139
- A ``(content_hash, kind)`` group is promoted when its hash is in *allow*, or when its hash is not in
142
+ A ``(content_hash, kind)`` group is promoted when its identity hash is in *allow*, or when it is not in
140
143
  *deny* and at least *min_shared_models* distinct models carry it. Sources are collected per group and
141
144
  deduplicated, so a worker can pick whichever carrier it already has on disk.
142
145
 
143
146
  Args:
144
147
  records: The reference, keyed by model name.
145
148
  min_shared_models: The frequency threshold for automatic promotion.
146
- allow: Content hashes to force into the set regardless of count.
147
- deny: Content hashes to exclude even when frequent.
149
+ allow: Module (identity) hashes to force into the set regardless of count.
150
+ deny: Module (identity) hashes to exclude even when frequent.
148
151
  """
149
152
  allow_set = set(allow)
150
153
  deny_set = set(deny)
@@ -15,15 +15,17 @@ Two forms are hashed, because a component can appear either as its own file or e
15
15
  * **standalone** (:func:`hash_standalone_component`): the file *is* the component (a split-file VAE or
16
16
  text-encoder). Every tensor is hashed with its bare key.
17
17
  * **embedded** (:func:`hash_embedded_component`): the component's tensors are selected out of a monolithic
18
- checkpoint by their known key prefix, and that prefix is stripped so the result equals the standalone
19
- hash of the same weights extracted to their own file.
18
+ checkpoint by their known key prefix, and that prefix is stripped.
20
19
 
21
- Embedded extraction is supported for the **VAE only**. In a monolithic checkpoint ComfyUI does not merely
22
- prefix the text-encoder weights, it renames and structurally reshuffles them at load time (SD1.5/SDXL fold
20
+ For the **VAE**, the embedded hash equals the standalone hash of the same weights extracted to their own
21
+ file (ComfyUI strips the VAE prefix cleanly, no key renaming). For **text encoders** it does not: in a
22
+ monolithic checkpoint ComfyUI renames and structurally reshuffles them at load (SD1.5/SDXL fold
23
23
  ``conditioner.embedders.*`` into ``clip_l``/``clip_g`` and convert the OpenCLIP layout, which fuses/splits
24
- tensors), so a torch-free file hash cannot reproduce the standalone form without reimplementing that
25
- loader. Embedded text-encoder hashing therefore raises :class:`UnsupportedComponentError`; text-encoder
26
- sharing is served by the split-file families (Flux/Qwen/Z-Image), whose encoders are already standalone.
24
+ tensors), so a torch-free file hash cannot reproduce a standalone text-encoder file. The embedded
25
+ text-encoder hash is therefore a stable identity matched only against *other monolithic checkpoints* (which
26
+ all store the encoders the same way) and the lane's representative-checkpoint load, never against a
27
+ standalone text-encoder file. Split-file families (Flux/Qwen/Z-Image) ship their encoders standalone and use
28
+ the standalone hash directly.
27
29
 
28
30
  This module stays inside :mod:`horde_model_reference`'s torch-free boundary (enforced by
29
31
  ``tests/test_torch_free_imports.py``): it parses the safetensors header with the stdlib and hashes byte
@@ -59,7 +61,6 @@ __all__ = [
59
61
  "NoComponentTensorsError",
60
62
  "RangeNotSupportedError",
61
63
  "RegionReader",
62
- "UnsupportedComponentError",
63
64
  "UnsupportedContainerError",
64
65
  "component_kind_for_purpose",
65
66
  "hash_embedded_component",
@@ -101,12 +102,22 @@ the strip is a pure leading-substring removal with no key renaming, so stripping
101
102
  bare ``encoder.``/``decoder.`` keys a standalone VAE file carries."""
102
103
 
103
104
 
104
- class UnsupportedContainerError(ValueError):
105
- """Raised when a file is not a parseable safetensors container (e.g. a pickle ``.ckpt``)."""
105
+ _EMBEDDED_TE_PREFIXES: tuple[str, ...] = ("conditioner.embedders.", "cond_stage_model.")
106
+ """Key prefixes under which a monolithic checkpoint stores its text encoders (SDXL
107
+ ``conditioner.embedders.0/1.``, SD1.5 ``cond_stage_model.``). Unlike the VAE, ComfyUI renames and reshuffles
108
+ these keys at load, so this hash does NOT equal a standalone text-encoder file; it is a stable identity for a
109
+ monolithic checkpoint's text encoders, matched only against other monolithic checkpoints (and the lane's
110
+ representative-checkpoint load), which all store them identically."""
106
111
 
107
112
 
108
- class UnsupportedComponentError(ValueError):
109
- """Raised when embedded extraction is requested for a component kind it is not supported for."""
113
+ _EMBEDDED_PREFIXES: dict[ComponentKind, tuple[str, ...]] = {
114
+ ComponentKind.VAE: _EMBEDDED_VAE_PREFIXES,
115
+ ComponentKind.TEXT_ENCODERS: _EMBEDDED_TE_PREFIXES,
116
+ }
117
+
118
+
119
+ class UnsupportedContainerError(ValueError):
120
+ """Raised when a file is not a parseable safetensors container (e.g. a pickle ``.ckpt``)."""
110
121
 
111
122
 
112
123
  class NoComponentTensorsError(LookupError):
@@ -304,13 +315,14 @@ def _select_standalone_tensors(header: dict[str, object]) -> list[ComponentTenso
304
315
  return selected
305
316
 
306
317
 
307
- def _select_embedded_vae_tensors(header: dict[str, object]) -> list[ComponentTensor]:
308
- """Select the VAE tensors from a monolithic checkpoint, stripping the checkpoint prefix to bare keys."""
318
+ def _select_embedded_tensors(header: dict[str, object], kind: ComponentKind) -> list[ComponentTensor]:
319
+ """Select *kind*'s tensors from a monolithic checkpoint, stripping the checkpoint prefix to bare keys."""
320
+ prefixes = _EMBEDDED_PREFIXES[kind]
309
321
  selected: list[ComponentTensor] = []
310
322
  for name, entry in header.items():
311
323
  if name == "__metadata__":
312
324
  continue
313
- prefix = next((candidate for candidate in _EMBEDDED_VAE_PREFIXES if name.startswith(candidate)), None)
325
+ prefix = next((candidate for candidate in prefixes if name.startswith(candidate)), None)
314
326
  if prefix is None:
315
327
  continue
316
328
  tensor = _tensor_from_entry(name[len(prefix) :], entry)
@@ -362,22 +374,20 @@ def hash_standalone_component(reader: RegionReader) -> str:
362
374
 
363
375
 
364
376
  def hash_embedded_component(reader: RegionReader, kind: ComponentKind) -> str:
365
- """Return the normalized content hash of *kind* extracted from a monolithic checkpoint read via *reader*.
377
+ """Return the content hash of *kind* selected from a monolithic checkpoint read via *reader*.
366
378
 
367
- Only :attr:`ComponentKind.VAE` is supported; the result equals :func:`hash_standalone_component` of the
368
- same VAE extracted to its own file.
379
+ The embedded VAE hash equals :func:`hash_standalone_component` of the same VAE extracted to its own file
380
+ (ComfyUI strips the VAE prefix cleanly). The embedded text-encoder hash does NOT equal a standalone
381
+ text-encoder file (ComfyUI renames those keys at load); it is a stable identity for a monolithic
382
+ checkpoint's text encoders, matched only against other monolithic checkpoints that store them identically.
383
+ Both are file-content hashes, independent of platform, device and load-time dtype selection.
369
384
 
370
385
  Raises:
371
- UnsupportedComponentError: *kind* has no supported embedded extraction (any text encoder).
372
386
  UnsupportedContainerError: The source is not a parseable safetensors container.
373
387
  NoComponentTensorsError: The checkpoint holds no tensors for *kind*.
374
388
  """
375
- if kind is not ComponentKind.VAE:
376
- raise UnsupportedComponentError(
377
- f"Embedded extraction is not supported for {kind}; it is served by split-file component files.",
378
- )
379
389
  header, data_start = _parse_safetensors_header(reader)
380
- tensors = _select_embedded_vae_tensors(header)
390
+ tensors = _select_embedded_tensors(header, kind)
381
391
  if not tensors:
382
392
  raise NoComponentTensorsError(f"No embedded {kind} tensors found in checkpoint.")
383
393
  return _hash_selected(reader, data_start, tensors)
@@ -60,10 +60,10 @@ def image_generation_record_to_legacy_dict(record: GenericModelRecord) -> dict[s
60
60
  """Convert a v2 image-generation record to a legacy ``stable_diffusion.json`` entry dict.
61
61
 
62
62
  Inverts the legacy-to-v2 config split: each v2 download becomes a legacy ``files`` entry (carrying its
63
- ``sha256sum``, ``file_type`` from ``file_purpose`` and the new ``content_hash``) plus a ``download``
64
- entry (carrying the URL), and the config's ``embedded_component_hashes`` is preserved. The baseline is
65
- mapped back to its legacy string form where one exists (otherwise passed through). The result validates
66
- against :class:`LegacyStableDiffusionRecord`.
63
+ ``sha256sum``, ``file_type`` from ``file_purpose`` and the component ``content_hash``) plus a
64
+ ``download`` entry (carrying the URL), and the config's ``embedded_component_hashes`` is preserved. The
65
+ baseline is mapped back to its legacy string form where one exists (otherwise passed through). The result
66
+ validates against :class:`LegacyStableDiffusionRecord`.
67
67
 
68
68
  The mapping is intentionally lossy in one direction: v2-only metadata that has no legacy counterpart
69
69
  (record ``metadata``, ``model_classification``, ``finetune_series``) is dropped. The goal is a minimal,
@@ -83,8 +83,8 @@ class LegacyConfigFile(BaseModel):
83
83
  file_type: str | None = None
84
84
  content_hash: str | None = None
85
85
  """The normalized tensor-region content hash of this component file (distinct from the whole-file
86
- ``sha256sum``), used to identify byte-equivalent components for cross-process sharing. ``None`` when
87
- unknown or unhashable."""
86
+ ``sha256sum``): the cross-platform-stable identity used for cross-process sharing. ``None`` when unknown
87
+ or unhashable."""
88
88
 
89
89
  @model_validator(mode="after")
90
90
  def _ensure_sha256sum_for_model_files(self, info: ValidationInfo) -> LegacyConfigFile:
@@ -138,9 +138,9 @@ class LegacyConfig(BaseModel):
138
138
  files: list[LegacyConfigFile] = Field(default_factory=list)
139
139
  download: list[LegacyConfigDownload] = Field(default_factory=list)
140
140
  embedded_component_hashes: dict[str, str] | None = None
141
- """Maps a component kind (``vae``, ``text_encoders``) to the normalized tensor-region content hash of
142
- that component embedded in the primary checkpoint. ``None`` when the model embeds no shareable
143
- component or is unhashable."""
141
+ """Maps a component kind (``vae``, ``text_encoders``) to the tensor-region content hash of that component
142
+ embedded in the primary checkpoint: the cross-platform-stable identity for cross-process sharing. ``None``
143
+ when the model embeds no shareable component or is unhashable."""
144
144
 
145
145
  @classmethod
146
146
  def _coerce_config_dict(cls, value: object, info: ValidationInfo) -> dict[str, Any]:
@@ -149,9 +149,10 @@ class LegacyConfig(BaseModel):
149
149
  if not isinstance(value, dict):
150
150
  raise TypeError("config entries must be provided as a mapping")
151
151
  raw_dict: dict[str, object] = {str(k): v for k, v in value.items()}
152
- # embedded_component_hashes is a legitimate third config entry; it is not one of the legacy
153
- # files/download pair the ">2 entries" heuristic guards against.
154
- countable = {key: value for key, value in raw_dict.items() if key != "embedded_component_hashes"}
152
+ # The embedded-hash maps are legitimate extra config entries, not part of the legacy files/download
153
+ # pair the ">2 entries" heuristic guards against.
154
+ embedded_keys = ("embedded_component_hashes",)
155
+ countable = {key: value for key, value in raw_dict.items() if key not in embedded_keys}
155
156
  if len(countable) > 2:
156
157
  _record_issue(info, "has more than 2 config entries.")
157
158
  coerced: dict[str, Any] = {}
@@ -160,8 +161,9 @@ class LegacyConfig(BaseModel):
160
161
  if not isinstance(entries, Iterable):
161
162
  raise TypeError(f"config[{key!s}] must be iterable")
162
163
  coerced[key] = list(entries)
163
- if raw_dict.get("embedded_component_hashes") is not None:
164
- coerced["embedded_component_hashes"] = raw_dict["embedded_component_hashes"]
164
+ for key in embedded_keys:
165
+ if raw_dict.get(key) is not None:
166
+ coerced[key] = raw_dict[key]
165
167
  return coerced
166
168
 
167
169
  _coerce_config_dict = model_validator(mode="before")(_coerce_config_dict) # type: ignore[assignment] # Pydantic wraps the classmethod in a descriptor proxy
@@ -66,8 +66,10 @@ class DownloadRecord(BaseModel): # TODO Rename? (record to subrecord?)
66
66
 
67
67
  Distinct from the whole-file :attr:`sha256sum`: it hashes only the component's tensor payload (sorted by
68
68
  name, folding in dtype/shape/bytes and excluding container metadata and key ordering), so byte-equivalent
69
- VAE/text-encoder weights shipped in different containers share one hash. Used to identify components that
70
- can be shared across processes. ``None`` when unknown or unhashable (e.g. a ``.ckpt`` pickle file)."""
69
+ VAE/text-encoder weights shipped in different containers share one hash. This cross-platform-stable value
70
+ (a pure function of the file bytes, independent of device and load-time dtype) is the identity the
71
+ canonical registry keys on for cross-process sharing. ``None`` when unknown or unhashable (e.g. a
72
+ ``.ckpt`` pickle file)."""
71
73
  file_purpose: str | None = None
72
74
  """The role this file plays for the model (e.g. ``"vae"`` or ``"text_encoders"``).
73
75
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: horde_model_reference
3
- Version: 7.2.0
3
+ Version: 7.3.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
@@ -0,0 +1,8 @@
1
+ {
2
+ "tag": "7.3.0",
3
+ "distance": 0,
4
+ "node": "g0d95c3fff084fd7e15c2f01f865a81b3907195e3",
5
+ "dirty": false,
6
+ "branch": "HEAD",
7
+ "node_date": "2026-07-05"
8
+ }
@@ -17,7 +17,6 @@ import pytest
17
17
  from horde_model_reference.component_hash import (
18
18
  ComponentKind,
19
19
  NoComponentTensorsError,
20
- UnsupportedComponentError,
21
20
  UnsupportedContainerError,
22
21
  component_kind_for_purpose,
23
22
  hash_embedded_component_file,
@@ -113,15 +112,22 @@ def test_embedded_vae_matches_standalone(tmp_path: Path, vae_prefix: str) -> Non
113
112
  assert hash_embedded_component_file(checkpoint, ComponentKind.VAE) == hash_standalone_component_file(standalone)
114
113
 
115
114
 
116
- def test_embedded_text_encoder_unsupported(tmp_path: Path) -> None:
117
- """Embedded text-encoder extraction is refused (ComfyUI renames those keys)."""
115
+ def test_embedded_text_encoder_is_hashed(tmp_path: Path) -> None:
116
+ """Embedded text encoders hash consistently across checkpoints, independent of UNet/VAE and stable."""
117
+ te = [
118
+ ("conditioner.embedders.0.weight", "F32", (1, 2), bytes(range(16, 24))),
119
+ ("conditioner.embedders.1.weight", "F16", (2, 2), bytes(range(1, 9))),
120
+ ]
118
121
  checkpoint = _write(
119
122
  tmp_path,
120
123
  "ckpt.safetensors",
121
- [("conditioner.embedders.0.y", "F32", (1,), bytes(range(50, 54)))],
124
+ [("model.diffusion_model.x", "F16", (2,), bytes(range(40, 44))), *te],
122
125
  )
123
- with pytest.raises(UnsupportedComponentError):
124
- hash_embedded_component_file(checkpoint, ComponentKind.TEXT_ENCODERS)
126
+ te_hash = hash_embedded_component_file(checkpoint, ComponentKind.TEXT_ENCODERS)
127
+ # A different checkpoint carrying the same text encoders (different UNet) hashes equal.
128
+ other_unet = ("model.diffusion_model.x", "F16", (3,), bytes(range(60, 66)))
129
+ other = _write(tmp_path, "other.safetensors", [other_unet, *te])
130
+ assert hash_embedded_component_file(other, ComponentKind.TEXT_ENCODERS) == te_hash
125
131
 
126
132
 
127
133
  def test_embedded_vae_missing_raises(tmp_path: Path) -> None:
@@ -47,13 +47,12 @@ def test_split_file_plans_standalone_not_embedded() -> None:
47
47
  }
48
48
 
49
49
 
50
- def test_monolithic_plans_embedded_vae() -> None:
51
- """A monolithic checkpoint (no separate VAE) is probed for an embedded VAE."""
50
+ def test_monolithic_plans_embedded_vae_and_te() -> None:
51
+ """A monolithic checkpoint (no separate component files) is probed for embedded VAE and text encoders."""
52
52
  record = _record([_download("sdxl_finetune.safetensors")])
53
53
  tasks = plan_component_hash_tasks(record, skip_existing=False)
54
- assert len(tasks) == 1
55
- assert tasks[0].embedded is True
56
- assert tasks[0].kind is ComponentKind.VAE
54
+ assert all(task.embedded for task in tasks)
55
+ assert {task.kind for task in tasks} == {ComponentKind.VAE, ComponentKind.TEXT_ENCODERS}
57
56
 
58
57
 
59
58
  def test_non_safetensors_is_skipped() -> None:
@@ -69,7 +68,11 @@ def test_skip_existing_standalone_hash() -> None:
69
68
  assert len(plan_component_hash_tasks(record, skip_existing=False)) == 1
70
69
 
71
70
 
72
- def test_skip_existing_embedded_vae() -> None:
73
- """skip_existing leaves an already-recorded embedded VAE alone."""
74
- record = _record([_download("sdxl_finetune.safetensors")], embedded={"vae": "e" * 64})
71
+ def test_skip_existing_embedded_components() -> None:
72
+ """skip_existing leaves already-recorded embedded components alone."""
73
+ record = _record(
74
+ [_download("sdxl_finetune.safetensors")],
75
+ embedded={"vae": "e" * 64, "text_encoders": "f" * 64},
76
+ )
75
77
  assert plan_component_hash_tasks(record, skip_existing=True) == []
78
+ assert len(plan_component_hash_tasks(record, skip_existing=False)) == 2
@@ -1,8 +0,0 @@
1
- {
2
- "tag": "7.2.0",
3
- "distance": 0,
4
- "node": "g320a47a13ccd705aae78c49c56aa6c8b13d2cc95",
5
- "dirty": false,
6
- "branch": "HEAD",
7
- "node_date": "2026-07-04"
8
- }