inline-core 1.2.73__tar.gz → 1.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 (547) hide show
  1. {inline_core-1.2.73 → inline_core-1.3.0}/CLAUDE.md +5 -5
  2. {inline_core-1.2.73 → inline_core-1.3.0}/PKG-INFO +1 -1
  3. {inline_core-1.2.73 → inline_core-1.3.0}/pyproject.toml +1 -1
  4. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/characters/apply.py +63 -9
  5. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/characters/charfile.py +6 -1
  6. inline_core-1.3.0/src/inline_core/characters/encode.py +418 -0
  7. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/characters/scoring.py +136 -25
  8. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/characters/weights.py +2 -1
  9. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/config.py +10 -0
  10. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/graph/cache.py +7 -2
  11. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/graph/descriptor.py +7 -0
  12. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/graph/schema.py +20 -0
  13. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/graph/validate.py +2 -2
  14. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/catalog.py +41 -6
  15. inline_core-1.3.0/src/inline_core/models/character/__init__.py +3 -0
  16. inline_core-1.3.0/src/inline_core/models/character/runner.py +577 -0
  17. inline_core-1.3.0/src/inline_core/models/characterreqs.py +81 -0
  18. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/flux2/runner.py +38 -11
  19. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/krea2/runner.py +41 -0
  20. inline_core-1.3.0/src/inline_core/models/registry_index.py +301 -0
  21. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/requirements.py +3 -0
  22. inline_core-1.3.0/src/inline_core/models/training/__init__.py +3 -0
  23. inline_core-1.3.0/src/inline_core/models/training/runner.py +239 -0
  24. inline_core-1.3.0/src/inline_core/models/trainingreqs.py +108 -0
  25. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/server/__main__.py +2 -0
  26. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/server/app.py +109 -2
  27. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/server/bootstrap.py +15 -0
  28. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/server/serialize.py +42 -1
  29. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/studio/characters.py +84 -101
  30. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/studio/generation.py +40 -7
  31. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/studio/graph_build.py +27 -1
  32. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/studio/handlers.py +31 -24
  33. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/studio/models.py +212 -12
  34. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/studio/moodboard.py +25 -38
  35. inline_core-1.3.0/src/inline_core/studio/recipe.py +276 -0
  36. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/studio/schema.py +64 -1
  37. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/studio/store.py +47 -0
  38. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/studio/training.py +53 -9
  39. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/training/models.py +11 -0
  40. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/training/trainer.py +24 -2
  41. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_catalog.py +62 -3
  42. inline_core-1.3.0/tests/test_character_nodes.py +579 -0
  43. inline_core-1.3.0/tests/test_character_requirements.py +131 -0
  44. inline_core-1.3.0/tests/test_characters_apply.py +109 -0
  45. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_characters_encode.py +114 -0
  46. inline_core-1.3.0/tests/test_characters_rpc.py +237 -0
  47. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_characters_scoring.py +82 -0
  48. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_characters_wiring.py +50 -14
  49. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_frontend_serving.py +29 -1
  50. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_krea2_runner.py +1 -0
  51. inline_core-1.3.0/tests/test_model_download_queue.py +165 -0
  52. inline_core-1.3.0/tests/test_model_registry_index.py +163 -0
  53. inline_core-1.3.0/tests/test_recipe.py +406 -0
  54. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_studio_rpc.py +15 -0
  55. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_studio_schema.py +87 -0
  56. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_studio_store.py +36 -0
  57. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_studio_training.py +35 -0
  58. inline_core-1.3.0/tests/test_training_nodes.py +290 -0
  59. inline_core-1.3.0/tests/test_training_requirements.py +117 -0
  60. {inline_core-1.2.73 → inline_core-1.3.0}/uv.lock +1 -1
  61. inline_core-1.2.73/src/inline_core/characters/encode.py +0 -232
  62. inline_core-1.2.73/src/inline_core/studio/recipe.py +0 -109
  63. inline_core-1.2.73/tests/test_characters_rpc.py +0 -199
  64. inline_core-1.2.73/tests/test_recipe.py +0 -100
  65. {inline_core-1.2.73 → inline_core-1.3.0}/.gitignore +0 -0
  66. {inline_core-1.2.73 → inline_core-1.3.0}/.python-version +0 -0
  67. {inline_core-1.2.73 → inline_core-1.3.0}/README.md +0 -0
  68. {inline_core-1.2.73 → inline_core-1.3.0}/main.py +0 -0
  69. {inline_core-1.2.73 → inline_core-1.3.0}/scripts/flux2_train_matrix.py +0 -0
  70. {inline_core-1.2.73 → inline_core-1.3.0}/scripts/minimax_h3_lora_check.py +0 -0
  71. {inline_core-1.2.73 → inline_core-1.3.0}/scripts/minimax_h3_train_matrix.py +0 -0
  72. {inline_core-1.2.73 → inline_core-1.3.0}/scripts/reference.py +0 -0
  73. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/__init__.py +0 -0
  74. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/characters/__init__.py +0 -0
  75. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/characters/library.py +0 -0
  76. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/components/__init__.py +0 -0
  77. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/components/conditioning.py +0 -0
  78. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/components/interfaces.py +0 -0
  79. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/device/__init__.py +0 -0
  80. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/device/auto.py +0 -0
  81. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/device/detect.py +0 -0
  82. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/device/memory.py +0 -0
  83. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/device/policy.py +0 -0
  84. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/device/probe.py +0 -0
  85. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/device/types.py +0 -0
  86. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/errors.py +0 -0
  87. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/extensions/__init__.py +0 -0
  88. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/extensions/api.py +0 -0
  89. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/extensions/constraints.py +0 -0
  90. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/extensions/fetch.py +0 -0
  91. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/extensions/handlers.py +0 -0
  92. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/extensions/importer.py +0 -0
  93. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/extensions/install.py +0 -0
  94. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/extensions/loader.py +0 -0
  95. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/extensions/manifest.py +0 -0
  96. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/extensions/models.py +0 -0
  97. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/extensions/paths.py +0 -0
  98. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/extensions/resolve.py +0 -0
  99. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/extensions/scanner.py +0 -0
  100. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/extensions/state.py +0 -0
  101. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/extensions/tools.py +0 -0
  102. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/ffmpeg.py +0 -0
  103. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/graph/__init__.py +0 -0
  104. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/graph/executor.py +0 -0
  105. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/graph/loader_runners.py +0 -0
  106. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/graph/primitives.py +0 -0
  107. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/graph/registry.py +0 -0
  108. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/graph/runners.py +0 -0
  109. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/graph/topo.py +0 -0
  110. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/media.py +0 -0
  111. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/__init__.py +0 -0
  112. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/checkpoint.py +0 -0
  113. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/controlspace.py +0 -0
  114. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/flux2/__init__.py +0 -0
  115. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/flux2/controlnet.py +0 -0
  116. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/flux2/embeds.py +0 -0
  117. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/flux2/provider.py +0 -0
  118. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/flux2/requirements.py +0 -0
  119. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/flux2/variants.py +0 -0
  120. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/keymap.py +0 -0
  121. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/krea2/__init__.py +0 -0
  122. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/krea2/convert.py +0 -0
  123. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/krea2/depth_control.py +0 -0
  124. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/krea2/img2img.py +0 -0
  125. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/krea2/provider.py +0 -0
  126. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/krea2/requirements.py +0 -0
  127. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/loaders.py +0 -0
  128. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/lora.py +0 -0
  129. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/__init__.py +0 -0
  130. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/lora_keys.py +0 -0
  131. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/memory.py +0 -0
  132. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/pipeline.py +0 -0
  133. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/provider.py +0 -0
  134. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/requirements.py +0 -0
  135. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/runner.py +0 -0
  136. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/__init__.py +0 -0
  137. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/__init__.py +0 -0
  138. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/allocator_trim_strategy.py +0 -0
  139. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/batch_split.py +0 -0
  140. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/block_streaming/__init__.py +0 -0
  141. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/block_streaming/block_fetcher.py +0 -0
  142. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/block_streaming/builder.py +0 -0
  143. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/block_streaming/disk.py +0 -0
  144. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/block_streaming/pool.py +0 -0
  145. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/block_streaming/provider.py +0 -0
  146. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/block_streaming/source.py +0 -0
  147. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/block_streaming/stream_sync.py +0 -0
  148. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/block_streaming/utils.py +0 -0
  149. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/block_streaming/wrapper.py +0 -0
  150. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/color/__init__.py +0 -0
  151. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/color/audio_mux.py +0 -0
  152. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/color/hlg.py +0 -0
  153. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/color/primaries.py +0 -0
  154. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/color/yuv.py +0 -0
  155. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/components/__init__.py +0 -0
  156. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/components/diffusion_steps.py +0 -0
  157. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/components/guiders.py +0 -0
  158. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/components/noisers.py +0 -0
  159. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/components/patchifiers.py +0 -0
  160. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/components/protocols.py +0 -0
  161. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/components/schedulers.py +0 -0
  162. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/conditioning/__init__.py +0 -0
  163. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/conditioning/exceptions.py +0 -0
  164. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/conditioning/item.py +0 -0
  165. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/conditioning/mask_utils.py +0 -0
  166. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/conditioning/types/__init__.py +0 -0
  167. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/conditioning/types/attention_strength_wrapper.py +0 -0
  168. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/conditioning/types/keyframe_cond.py +0 -0
  169. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/conditioning/types/keyframe_slots.py +0 -0
  170. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/conditioning/types/latent_cond.py +0 -0
  171. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/conditioning/types/mask_cond.py +0 -0
  172. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/conditioning/types/noise_mask_cond.py +0 -0
  173. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/conditioning/types/reference_audio_cond.py +0 -0
  174. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/conditioning/types/reference_video_cond.py +0 -0
  175. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/devices.py +0 -0
  176. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/duration_head/__init__.py +0 -0
  177. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/duration_head/duration_head.py +0 -0
  178. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/duration_head/model_configurator.py +0 -0
  179. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/guidance/__init__.py +0 -0
  180. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/guidance/perturbations.py +0 -0
  181. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/hdr.py +0 -0
  182. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/loader/__init__.py +0 -0
  183. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/loader/attention_ops.py +0 -0
  184. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/loader/fuse_loras.py +0 -0
  185. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/loader/helpers.py +0 -0
  186. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/loader/kernels.py +0 -0
  187. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/loader/module_ops.py +0 -0
  188. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/loader/primitives.py +0 -0
  189. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/loader/registry.py +0 -0
  190. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/loader/sd_ops.py +0 -0
  191. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/loader/sft_loader.py +0 -0
  192. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/loader/single_gpu_model_builder.py +0 -0
  193. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/modality_tiling.py +0 -0
  194. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/__init__.py +0 -0
  195. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/audio_vae/__init__.py +0 -0
  196. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/audio_vae/attention.py +0 -0
  197. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/audio_vae/audio_vae.py +0 -0
  198. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/audio_vae/causal_conv_2d.py +0 -0
  199. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/audio_vae/causality_axis.py +0 -0
  200. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/audio_vae/downsample.py +0 -0
  201. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/audio_vae/model_configurator.py +0 -0
  202. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/audio_vae/ops.py +0 -0
  203. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/audio_vae/resnet.py +0 -0
  204. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/audio_vae/upsample.py +0 -0
  205. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/audio_vae/vocoder.py +0 -0
  206. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/common/__init__.py +0 -0
  207. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/common/normalization.py +0 -0
  208. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/disposable.py +0 -0
  209. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/model_protocol.py +0 -0
  210. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/transformer/__init__.py +0 -0
  211. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/transformer/adaln.py +0 -0
  212. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/transformer/attention.py +0 -0
  213. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/transformer/compiling.py +0 -0
  214. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/transformer/cudagraph_capture.py +0 -0
  215. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/transformer/feed_forward.py +0 -0
  216. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/transformer/gelu_approx.py +0 -0
  217. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/transformer/modality.py +0 -0
  218. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/transformer/model.py +0 -0
  219. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/transformer/model_configurator.py +0 -0
  220. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/transformer/ops.py +0 -0
  221. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/transformer/rope.py +0 -0
  222. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/transformer/text_projection.py +0 -0
  223. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/transformer/timestep_embedding.py +0 -0
  224. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/transformer/transformer.py +0 -0
  225. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/transformer/transformer_args.py +0 -0
  226. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/upsampler/__init__.py +0 -0
  227. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/upsampler/blur_downsample.py +0 -0
  228. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/upsampler/model.py +0 -0
  229. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/upsampler/model_configurator.py +0 -0
  230. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/upsampler/pixel_shuffle.py +0 -0
  231. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/upsampler/res_block.py +0 -0
  232. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/upsampler/spatial_rational_resampler.py +0 -0
  233. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/__init__.py +0 -0
  234. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/attention.py +0 -0
  235. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/conv_video_decoder.py +0 -0
  236. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/convolution.py +0 -0
  237. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/diffusion_tiling.py +0 -0
  238. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/diffusion_video_decoder.py +0 -0
  239. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/enums.py +0 -0
  240. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/memory_efficient_decode.py +0 -0
  241. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/model_configurator.py +0 -0
  242. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/normalization.py +0 -0
  243. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/ops.py +0 -0
  244. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/resnet.py +0 -0
  245. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/sampling.py +0 -0
  246. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/__init__.py +0 -0
  247. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/apply.py +0 -0
  248. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/attention.py +0 -0
  249. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/blocks.py +0 -0
  250. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/chunked/__init__.py +0 -0
  251. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/chunked/attn.py +0 -0
  252. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/chunked/block.py +0 -0
  253. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/chunked/context.py +0 -0
  254. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/chunked/mlp.py +0 -0
  255. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/combined/__init__.py +0 -0
  256. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/combined/attn.py +0 -0
  257. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/combined/block.py +0 -0
  258. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/combined/context.py +0 -0
  259. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/combined/mlp.py +0 -0
  260. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/compiling.py +0 -0
  261. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/config.py +0 -0
  262. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/det_attn_rope.py +0 -0
  263. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/dsl_kernels/__init__.py +0 -0
  264. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/dsl_kernels/apply_dsl.py +0 -0
  265. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/dsl_kernels/attn.py +0 -0
  266. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/dsl_kernels/block.py +0 -0
  267. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/dsl_kernels/chain.py +0 -0
  268. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/fallback_na/__init__.py +0 -0
  269. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/fallback_na/eager.py +0 -0
  270. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/fallback_na/triton_na.py +0 -0
  271. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/layers.py +0 -0
  272. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/qkv.py +0 -0
  273. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/rope.py +0 -0
  274. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/rope_math.py +0 -0
  275. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/swiglu.py +0 -0
  276. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/video_vae.py +0 -0
  277. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/multigpu/__init__.py +0 -0
  278. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/multigpu/gemma/__init__.py +0 -0
  279. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/multigpu/gemma/accelerate_wrapper.py +0 -0
  280. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/multigpu/gemma/batch_parallel_wrapper.py +0 -0
  281. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/multigpu/gemma/broadcast_wrapper.py +0 -0
  282. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/multigpu/gemma/loader.py +0 -0
  283. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/multigpu/sharded_sd.py +0 -0
  284. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/multigpu/transformer/__init__.py +0 -0
  285. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/multigpu/transformer/attention.py +0 -0
  286. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/multigpu/transformer/sequence_parallel.py +0 -0
  287. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/multigpu/transformer/tiled_data_parallel.py +0 -0
  288. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/multigpu/vae/__init__.py +0 -0
  289. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/multigpu/vae/distributed_decoder.py +0 -0
  290. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/quantization/__init__.py +0 -0
  291. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/quantization/blockwise/__init__.py +0 -0
  292. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/quantization/blockwise/_impl.py +0 -0
  293. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/quantization/fp8_cast.py +0 -0
  294. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/quantization/fp8_scaled_mm.py +0 -0
  295. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/quantization/nvfp4/__init__.py +0 -0
  296. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/quantization/nvfp4/convert.py +0 -0
  297. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/quantization/nvfp4/fuse.py +0 -0
  298. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/quantization/nvfp4/linear.py +0 -0
  299. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/quantization/nvfp4/prequant.py +0 -0
  300. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/quantization/nvfp4/types.py +0 -0
  301. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/quantization/policy.py +0 -0
  302. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/text_encoders/__init__.py +0 -0
  303. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/text_encoders/gemma/__init__.py +0 -0
  304. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/text_encoders/gemma/embeddings_connector.py +0 -0
  305. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/text_encoders/gemma/embeddings_processor.py +0 -0
  306. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/text_encoders/gemma/encoders/base_encoder.py +0 -0
  307. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/text_encoders/gemma/encoders/encoder_configurator.py +0 -0
  308. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/text_encoders/gemma/encoders/prompts/gemma3_i2v_system_prompt.txt +0 -0
  309. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/text_encoders/gemma/encoders/prompts/gemma3_t2v_system_prompt.txt +0 -0
  310. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/text_encoders/gemma/encoders/prompts/gemma4_i2v_system_prompt.txt +0 -0
  311. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/text_encoders/gemma/encoders/prompts/gemma4_t2v_system_prompt.txt +0 -0
  312. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/text_encoders/gemma/feature_extractor.py +0 -0
  313. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/text_encoders/gemma/gemma_assets.py +0 -0
  314. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/text_encoders/gemma/tokenizer.py +0 -0
  315. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/tiling.py +0 -0
  316. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/tools.py +0 -0
  317. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/types.py +0 -0
  318. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_core/utils.py +0 -0
  319. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_pipelines/__init__.py +0 -0
  320. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_pipelines/a2vid_two_stage.py +0 -0
  321. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_pipelines/dfr_layout.py +0 -0
  322. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_pipelines/dfr_pipeline.py +0 -0
  323. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_pipelines/distilled.py +0 -0
  324. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_pipelines/distilled_mgpu.py +0 -0
  325. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_pipelines/dubit.py +0 -0
  326. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_pipelines/hdr_ic_lora.py +0 -0
  327. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_pipelines/ic_lora.py +0 -0
  328. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_pipelines/iclora_utils.py +0 -0
  329. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_pipelines/keyframe_interpolation.py +0 -0
  330. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_pipelines/multigpu/__init__.py +0 -0
  331. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_pipelines/multigpu/_broadcast.py +0 -0
  332. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_pipelines/multigpu/bp_gemma_builder.py +0 -0
  333. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_pipelines/multigpu/controller.py +0 -0
  334. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_pipelines/multigpu/delegating_builder.py +0 -0
  335. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_pipelines/multigpu/fleet.py +0 -0
  336. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_pipelines/multigpu/gemma_builders.py +0 -0
  337. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_pipelines/multigpu/nccl_groups.py +0 -0
  338. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_pipelines/multigpu/runner.py +0 -0
  339. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_pipelines/multigpu/sp_builder.py +0 -0
  340. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_pipelines/multigpu/tdp_builder.py +0 -0
  341. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_pipelines/multigpu/vae_builders.py +0 -0
  342. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_pipelines/multigpu/weight_tracker.py +0 -0
  343. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_pipelines/retake.py +0 -0
  344. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_pipelines/t2a_one_stage.py +0 -0
  345. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_pipelines/ti2vid_one_stage.py +0 -0
  346. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_pipelines/ti2vid_two_stages.py +0 -0
  347. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_pipelines/ti2vid_two_stages_hq.py +0 -0
  348. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_pipelines/ti2vid_two_stages_hq_mgpu.py +0 -0
  349. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_pipelines/ti2vid_two_stages_mgpu.py +0 -0
  350. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/__init__.py +0 -0
  351. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/args.py +0 -0
  352. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/blocks.py +0 -0
  353. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/constants.py +0 -0
  354. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/denoisers.py +0 -0
  355. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/gpu_model.py +0 -0
  356. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/helpers.py +0 -0
  357. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/media_io/__init__.py +0 -0
  358. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/media_io/color_config.py +0 -0
  359. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/media_io/decode.py +0 -0
  360. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/media_io/encode.py +0 -0
  361. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/media_io/exr.py +0 -0
  362. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/media_io/range_map.py +0 -0
  363. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/media_io/resize.py +0 -0
  364. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/model_paths.py +0 -0
  365. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/quantization_factory.py +0 -0
  366. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/res2s.py +0 -0
  367. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/samplers.py +0 -0
  368. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/types.py +0 -0
  369. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/minimaxh3/__init__.py +0 -0
  370. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/minimaxh3/adaln.py +0 -0
  371. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/minimaxh3/keys.py +0 -0
  372. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/minimaxh3/load.py +0 -0
  373. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/minimaxh3/lora_keys.py +0 -0
  374. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/minimaxh3/pipeline.py +0 -0
  375. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/minimaxh3/provider.py +0 -0
  376. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/minimaxh3/requirements.py +0 -0
  377. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/minimaxh3/runner.py +0 -0
  378. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/minimaxh3/vae_keys.py +0 -0
  379. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/minimaxh3/vendor/__init__.py +0 -0
  380. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/minimaxh3/vendor/autoencoder_kl_minimax_h3.py +0 -0
  381. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/minimaxh3/vendor/autoencoder_kl_minimax_h3_audio.py +0 -0
  382. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/minimaxh3/vendor/before_denoise.py +0 -0
  383. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/minimaxh3/vendor/before_encoder.py +0 -0
  384. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/minimaxh3/vendor/decoders.py +0 -0
  385. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/minimaxh3/vendor/denoise.py +0 -0
  386. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/minimaxh3/vendor/encoders.py +0 -0
  387. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/minimaxh3/vendor/modular_blocks_minimax_h3.py +0 -0
  388. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/minimaxh3/vendor/modular_pipeline.py +0 -0
  389. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/minimaxh3/vendor/packing.py +0 -0
  390. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/minimaxh3/vendor/packing_ref2va.py +0 -0
  391. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/minimaxh3/vendor/scheduling_minimax_h3.py +0 -0
  392. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/minimaxh3/vendor/transformer_minimax_h3.py +0 -0
  393. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/offload.py +0 -0
  394. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/pipeline_runtime.py +0 -0
  395. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/prepared.py +0 -0
  396. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/preprocess/__init__.py +0 -0
  397. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/preprocess/requirements.py +0 -0
  398. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/preprocess/runner.py +0 -0
  399. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/references.py +0 -0
  400. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/sampling.py +0 -0
  401. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/video_params.py +0 -0
  402. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/zimage/__init__.py +0 -0
  403. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/zimage/primitives.py +0 -0
  404. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/zimage/provider.py +0 -0
  405. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/zimage/requirements.py +0 -0
  406. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/models/zimage/runner.py +0 -0
  407. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/parallel/__init__.py +0 -0
  408. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/parallel/config.py +0 -0
  409. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/parallel/group.py +0 -0
  410. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/parallel/launch.py +0 -0
  411. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/parallel/protocol.py +0 -0
  412. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/parallel/registry.py +0 -0
  413. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/parallel/worker.py +0 -0
  414. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/runtime/__init__.py +0 -0
  415. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/runtime/context.py +0 -0
  416. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/runtime/file_store.py +0 -0
  417. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/runtime/progress.py +0 -0
  418. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/runtime/run.py +0 -0
  419. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/runtime/store.py +0 -0
  420. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/runtime/video_encode.py +0 -0
  421. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/sampling/__init__.py +0 -0
  422. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/sampling/batch.py +0 -0
  423. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/server/__init__.py +0 -0
  424. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/server/assets.py +0 -0
  425. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/server/frontend.py +0 -0
  426. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/server/manager.py +0 -0
  427. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/server/rpc.py +0 -0
  428. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/server/run_store.py +0 -0
  429. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/studio/__init__.py +0 -0
  430. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/studio/activity.py +0 -0
  431. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/studio/assets.py +0 -0
  432. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/studio/config.py +0 -0
  433. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/studio/dataset_import.py +0 -0
  434. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/studio/fal.py +0 -0
  435. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/studio/frames.py +0 -0
  436. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/studio/image_meta.py +0 -0
  437. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/studio/peaks.py +0 -0
  438. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/studio/system_stats.py +0 -0
  439. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/studio/timeline/__init__.py +0 -0
  440. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/studio/timeline/compose.py +0 -0
  441. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/studio/timeline/ffmpeg.py +0 -0
  442. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/studio/timeline/render.py +0 -0
  443. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/studio/timeline/resolve.py +0 -0
  444. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/studio/training_store.py +0 -0
  445. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/takes.py +0 -0
  446. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/training/__init__.py +0 -0
  447. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/training/__main__.py +0 -0
  448. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/training/arch.py +0 -0
  449. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/training/cache.py +0 -0
  450. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/training/caption.py +0 -0
  451. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/training/dataset.py +0 -0
  452. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/training/h3.py +0 -0
  453. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/training/ltx25.py +0 -0
  454. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/training/precache_store.py +0 -0
  455. {inline_core-1.2.73 → inline_core-1.3.0}/src/inline_core/training/protocol.py +0 -0
  456. {inline_core-1.2.73 → inline_core-1.3.0}/tests/conftest.py +0 -0
  457. {inline_core-1.2.73 → inline_core-1.3.0}/tests/helpers.py +0 -0
  458. {inline_core-1.2.73 → inline_core-1.3.0}/tests/reference/lookalike_faces.json +0 -0
  459. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_cache.py +0 -0
  460. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_characters_library.py +0 -0
  461. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_charfile.py +0 -0
  462. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_checkpoint.py +0 -0
  463. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_clip_grid_parity.py +0 -0
  464. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_config.py +0 -0
  465. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_dataset_import.py +0 -0
  466. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_device_detect.py +0 -0
  467. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_encoder_parking.py +0 -0
  468. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_executor.py +0 -0
  469. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_extension_api.py +0 -0
  470. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_extension_install.py +0 -0
  471. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_extension_manifest.py +0 -0
  472. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_extension_resolve.py +0 -0
  473. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_extension_scanner.py +0 -0
  474. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_extension_spine.py +0 -0
  475. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_extension_state.py +0 -0
  476. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_file_store.py +0 -0
  477. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_flux2_controlnet.py +0 -0
  478. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_flux2_folder.py +0 -0
  479. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_flux2_resolve.py +0 -0
  480. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_flux2_runner.py +0 -0
  481. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_flux2_training.py +0 -0
  482. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_flux2_variants.py +0 -0
  483. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_hidden_nodes.py +0 -0
  484. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_keymap.py +0 -0
  485. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_krea2_convert.py +0 -0
  486. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_krea2_depth_control.py +0 -0
  487. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_krea2_requirements.py +0 -0
  488. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_loader_runners.py +0 -0
  489. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_loaders.py +0 -0
  490. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_lora.py +0 -0
  491. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_lora_download.py +0 -0
  492. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_ltx25_lora_keys.py +0 -0
  493. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_ltx25_nodes.py +0 -0
  494. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_ltx25_requirements.py +0 -0
  495. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_ltx25_training.py +0 -0
  496. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_ltx25_wired_refs.py +0 -0
  497. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_manager_queue.py +0 -0
  498. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_memory_policy.py +0 -0
  499. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_minimaxh3_adaln.py +0 -0
  500. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_minimaxh3_keys.py +0 -0
  501. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_minimaxh3_load.py +0 -0
  502. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_minimaxh3_lora_keys.py +0 -0
  503. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_minimaxh3_nodes.py +0 -0
  504. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_minimaxh3_training.py +0 -0
  505. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_model_requirements.py +0 -0
  506. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_offload_prepared.py +0 -0
  507. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_output_kind_contract.py +0 -0
  508. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_parallel_group.py +0 -0
  509. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_pipeline_cache.py +0 -0
  510. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_precache_store.py +0 -0
  511. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_primitives.py +0 -0
  512. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_references.py +0 -0
  513. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_rpc_bridge.py +0 -0
  514. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_run_store.py +0 -0
  515. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_sampling.py +0 -0
  516. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_schema.py +0 -0
  517. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_server.py +0 -0
  518. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_staged_residency.py +0 -0
  519. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_studio_activity.py +0 -0
  520. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_studio_assets.py +0 -0
  521. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_studio_fal.py +0 -0
  522. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_studio_frames.py +0 -0
  523. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_studio_generation.py +0 -0
  524. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_studio_graph_build.py +0 -0
  525. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_studio_models.py +0 -0
  526. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_studio_moodboard.py +0 -0
  527. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_studio_multi_reference.py +0 -0
  528. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_studio_node_size.py +0 -0
  529. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_studio_peaks.py +0 -0
  530. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_studio_timeline.py +0 -0
  531. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_take_bytes.py +0 -0
  532. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_topo.py +0 -0
  533. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_training_arch.py +0 -0
  534. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_training_dataset.py +0 -0
  535. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_training_models.py +0 -0
  536. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_training_resolve.py +0 -0
  537. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_training_snapshots.py +0 -0
  538. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_validate.py +0 -0
  539. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_video_encode.py +0 -0
  540. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_video_params.py +0 -0
  541. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_webui_install.py +0 -0
  542. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_xfuser_sampler.py +0 -0
  543. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_zimage_primitives.py +0 -0
  544. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_zimage_resolve.py +0 -0
  545. {inline_core-1.2.73 → inline_core-1.3.0}/tests/test_zimage_runner.py +0 -0
  546. {inline_core-1.2.73 → inline_core-1.3.0}/webui.bat +0 -0
  547. {inline_core-1.2.73 → inline_core-1.3.0}/webui.sh +0 -0
@@ -212,12 +212,12 @@ real codec that moves tensors lives with the model runner.
212
212
 
213
213
  - **Typed, strict.** `pyright` in strict mode (`[tool.pyright]`, `typeCheckingMode = "strict"`), all of
214
214
  `src` + `tests`. No silent `Any` leaks across component/graph boundaries.
215
- - **Comments are short.** One or two lines, and only for the **why** a reader can't infer from the
216
- code - a non-obvious constraint, a rejected alternative, an ordering that matters. Module
217
- docstrings: 1-3 sentences. Function docstrings: one line, or none when the signature says it.
215
+ - **Comments are one line.** Not two, not a paragraph, and only for the **why** a reader can't infer
216
+ from the code - a non-obvious constraint, a rejected alternative, an ordering that matters. Module
217
+ docstrings: one sentence. Function docstrings: one line, or none when the signature says it.
218
218
  Never narrate what the code does, never write an essay in a docstring, never leave a comment that
219
- restates the line below it. If the reasoning genuinely needs paragraphs, it belongs in a doc, not
220
- in the source.
219
+ restates the line below it. If the reasoning genuinely needs more, it belongs in a doc, not in
220
+ the source.
221
221
  - **Lint.** `ruff` with `select = ["E", "F", "I", "UP", "B"]`, line length 100, target `py311`.
222
222
  - **Typed graph, validated before run.** Never execute an unvalidated graph. Edge type-checking
223
223
  (`graph/validate.py` + `port_satisfies`) rejects bad wiring at submit. New port kinds go in
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: inline-core
3
- Version: 1.2.73
3
+ Version: 1.3.0
4
4
  Summary: The generation engine behind Inline Studio.
5
5
  License-Expression: GPL-3.0-or-later
6
6
  Requires-Python: >=3.11
@@ -1,7 +1,7 @@
1
1
  [project]
2
2
  # PyPI name; the import package is `inline_core` (src/inline_core).
3
3
  name = "inline-core"
4
- version = "1.2.73"
4
+ version = "1.3.0"
5
5
  description = "The generation engine behind Inline Studio."
6
6
  readme = "README.md"
7
7
  license = "GPL-3.0-or-later"
@@ -25,15 +25,29 @@ _CACHE_LIMIT_BYTES = 2 * 1024**3
25
25
  class AppliedCharacter:
26
26
  """What a runner needs: ordered reference handles, plus the prompt text that names them."""
27
27
 
28
- def __init__(self, name: str, refs: list[AssetRef], description: str) -> None:
28
+ def __init__(
29
+ self,
30
+ name: str,
31
+ refs: list[AssetRef],
32
+ description: str,
33
+ lora: Path | None = None,
34
+ lora_strength: float = 1.0,
35
+ ) -> None:
29
36
  self.name = name
30
37
  self.refs = refs
31
38
  self.description = description
39
+ #: A trained adapter, which for a model with no reference channel is the only route.
40
+ self.lora = lora
41
+ #: What it fuses at. Set on Attach Adapter, because an overfit adapter is only usable
42
+ #: turned down and the character wire carries no controls of its own.
43
+ self.lora_strength = lora_strength
32
44
 
33
45
  def prompt_prefix(self, first_position: int) -> str:
34
46
  """Text naming the positions the character lands on, so ordinal prompting resolves."""
35
47
  if not self.refs:
36
- return ""
48
+ # A LoRA carries the likeness, so the description is all the prompt needs.
49
+ detail = " ".join(self.description.split())
50
+ return f"{detail} " if detail else ""
37
51
  positions = [str(first_position + i) for i in range(len(self.refs))]
38
52
  if len(positions) == 1:
39
53
  which = f"Image {positions[0]} shows"
@@ -53,9 +67,12 @@ def _cache_root() -> Path:
53
67
  return data_dir() / "characters"
54
68
 
55
69
 
56
- def char_apply(chosen: str) -> AppliedCharacter | None:
57
- """References and prompt text for a pick, or None when none. An unreadable pick raises rather
58
- than silently generating the wrong person."""
70
+ def char_apply(chosen: str, arch: str = encode.FLUX2_KLEIN_ARCH) -> AppliedCharacter | None:
71
+ """How a character applies on ``arch``, or None when none is picked. An unreadable pick raises
72
+ rather than silently generating the wrong person.
73
+
74
+ ``arch`` matters because a model without a reference channel can only take the adapter, and its
75
+ payloads are keyed separately."""
59
76
  name = str(chosen or "").strip()
60
77
  if not name:
61
78
  return None
@@ -67,15 +84,52 @@ def char_apply(chosen: str) -> AppliedCharacter | None:
67
84
 
68
85
  doc = cf.read(path)
69
86
  digest = library.content_hash(path)
70
- arch = encode.FLUX2_KLEIN_ARCH
87
+ references = arch == encode.FLUX2_KLEIN_ARCH
71
88
 
72
- if not cf.payload_valid(doc.manifest, arch, encode.PAYLOAD_ENCODER_VERSION):
89
+ if references and not cf.payload_valid(doc.manifest, arch, encode.PAYLOAD_ENCODER_VERSION):
73
90
  doc = _recompile(doc, path)
74
91
  digest = library.content_hash(path)
75
92
 
76
- refs = _extract(doc, digest, arch)
77
93
  description = _description(doc)
78
- return AppliedCharacter(doc.manifest.name or path.stem, refs, description)
94
+ lora = _extract_lora(doc, digest, arch)
95
+ strength = encode.lora_strength(doc.manifest, arch)
96
+ # A trained adapter wins unless the character says otherwise: the user asked for it explicitly,
97
+ # and loading both would apply the identity twice.
98
+ mode = doc.manifest.apply.get(arch) or ("lora" if lora else "reference")
99
+ # No reference channel on this arch, so the adapter is the only way it can apply at all.
100
+ if not references:
101
+ mode = "lora"
102
+ refs = [] if mode == "lora" else _extract(doc, digest, arch)
103
+ return AppliedCharacter(
104
+ doc.manifest.name or path.stem,
105
+ refs,
106
+ description,
107
+ lora if mode == "lora" else None,
108
+ strength,
109
+ )
110
+
111
+
112
+ def _extract_lora(doc: cf.CharDoc, digest: str, arch: str) -> Path | None:
113
+ """The adapter for ``arch``, or None. A stale one is the wrong face, so it is ignored."""
114
+ entry = encode.lora_payload(doc.manifest, arch)
115
+ if not entry:
116
+ return None
117
+ key = encode.payload_key(arch, encode.PAYLOAD_LORA)
118
+ if not cf.payload_valid(doc.manifest, key, encode.LORA_PAYLOAD_VERSION):
119
+ logger.info("Ignoring a stale %s adapter for %s", arch, doc.manifest.name)
120
+ return None
121
+ files = [str(f.get("path")) for f in entry.get("files") or [] if f.get("path")]
122
+ if not files:
123
+ return None
124
+ root = _cache_root() / digest / key
125
+ target = root / Path(files[0]).name
126
+ if not target.is_file():
127
+ root.mkdir(parents=True, exist_ok=True)
128
+ data = doc.members.get(files[0])
129
+ if data is None:
130
+ return None
131
+ target.write_bytes(data)
132
+ return target
79
133
 
80
134
 
81
135
  def _description(doc: cf.CharDoc) -> str:
@@ -37,7 +37,7 @@ MANIFEST_NAME = "manifest.json"
37
37
  #: Fixed so the signature lands at byte 0 and two writes produce identical bytes.
38
38
  _KEY_ORDER = (
39
39
  "magic", "format_version", "char_id", "name", "created_at", "modified_at", "app",
40
- "app_version", "refs", "derived", "text", "payloads", "scoring", "hints", "reserved",
40
+ "app_version", "refs", "derived", "text", "payloads", "scoring", "hints", "apply", "reserved",
41
41
  )
42
42
 
43
43
 
@@ -58,6 +58,9 @@ class Manifest:
58
58
  payloads: dict[str, Any] = field(default_factory=dict)
59
59
  scoring: dict[str, Any] = field(default_factory=dict)
60
60
  hints: list[str] = field(default_factory=list)
61
+ #: arch -> "reference" | "lora". Absent means "whatever this model does best", resolved at
62
+ #: apply time, so an older file needs no migration.
63
+ apply: dict[str, str] = field(default_factory=dict)
61
64
  reserved: dict[str, Any] = field(
62
65
  default_factory=lambda: {"adapters": {}, "video_payloads": {}, "members": []}
63
66
  )
@@ -78,6 +81,7 @@ class Manifest:
78
81
  "payloads": self.payloads,
79
82
  "scoring": self.scoring,
80
83
  "hints": self.hints,
84
+ "apply": self.apply,
81
85
  "reserved": self.reserved,
82
86
  }
83
87
 
@@ -95,6 +99,7 @@ class Manifest:
95
99
  payloads=dict(raw.get("payloads") or {}),
96
100
  scoring=dict(raw.get("scoring") or {}),
97
101
  hints=list(raw.get("hints") or []),
102
+ apply={str(k): str(v) for k, v in (raw.get("apply") or {}).items()},
98
103
  reserved=dict(raw.get("reserved") or {}),
99
104
  )
100
105
 
@@ -0,0 +1,418 @@
1
+ """``char_encode``: reference images plus a description compiled into one ``.char``.
2
+
3
+ Refs go in untouched apart from EXIF rotation, because everything else is derived from them.
4
+ """
5
+
6
+ from __future__ import annotations
7
+
8
+ import io
9
+ import time
10
+ import uuid
11
+ from collections.abc import Callable
12
+ from pathlib import Path
13
+ from typing import Any
14
+
15
+ from . import charfile as cf
16
+ from . import scoring
17
+
18
+ #: ``(fraction 0-1, human status)``. Reporting is best-effort - it never fails an encode.
19
+ Progress = Callable[[float, str], None]
20
+
21
+ #: The payload compiler's version. Bumping it recompiles every character's ref set on next use.
22
+ PAYLOAD_ENCODER_VERSION = "1"
23
+
24
+ #: Bumping this rebuilds every stored adapter, for a change in how one is trained or packed.
25
+ LORA_PAYLOAD_VERSION = "1"
26
+ PAYLOAD_ENCODER_ID = "flux2-klein-refset"
27
+ FLUX2_KLEIN_ARCH = "flux2-klein"
28
+
29
+ #: What a payload is, not which model it targets; one arch can carry both kinds.
30
+ PAYLOAD_REF = "ref"
31
+ PAYLOAD_LORA = "lora"
32
+
33
+
34
+ def payload_key(arch: str, kind: str = PAYLOAD_REF) -> str:
35
+ """Where a payload lives. A reference set keeps the bare arch key, so v1 files stay valid."""
36
+ return arch if kind == PAYLOAD_REF else f"{arch}-{kind}"
37
+
38
+ #: Done here so the pixels the pipeline sees are the pixels we hashed, once per character.
39
+ PAYLOAD_POLICY: dict[str, Any] = {"max_pixels": 1024 * 1024, "multiple_of": 16}
40
+
41
+ #: What each model accepts as a reference. A video model has its own frame grid, so the policy
42
+ #: cannot stay one constant - and it rides in the payload entry, because the fingerprint is taken
43
+ #: against the policy the payload was built with, not against whatever is current.
44
+ REFERENCE_POLICIES: dict[str, dict[str, Any]] = {
45
+ FLUX2_KLEIN_ARCH: PAYLOAD_POLICY,
46
+ }
47
+
48
+
49
+ def reference_policy(arch: str) -> dict[str, Any]:
50
+ return REFERENCE_POLICIES.get(arch, PAYLOAD_POLICY)
51
+
52
+ #: Enough pixels for SFace without carrying a full reference into the file.
53
+ FACE_CROP_SIZE = 512
54
+
55
+ _FACE_EMBEDS = f"scoring/embeds_{scoring.SFACE_ID}.json"
56
+ _SUBJECT_EMBEDS = f"scoring/embeds_{scoring.DINOV2_ID}.json"
57
+
58
+
59
+ def _open(path: Path) -> Any:
60
+ from PIL import Image, ImageOps
61
+
62
+ with Image.open(path) as handle:
63
+ # Without EXIF rotation every downstream crop and centroid is wrong the same invisible way.
64
+ return ImageOps.exif_transpose(handle).convert("RGB")
65
+
66
+
67
+ def _png_bytes(image: Any) -> bytes:
68
+ buffer = io.BytesIO()
69
+ image.save(buffer, format="PNG")
70
+ return buffer.getvalue()
71
+
72
+
73
+ def normalise_reference(image: Any, policy: dict[str, Any] | None = None) -> Any:
74
+ """A reference resized into a model's budget, on its grid, preserving aspect."""
75
+ rules = policy or PAYLOAD_POLICY
76
+ max_pixels = int(rules["max_pixels"])
77
+ grid = int(rules["multiple_of"])
78
+ width, height = image.width, image.height
79
+ if width * height > max_pixels:
80
+ scale = (max_pixels / (width * height)) ** 0.5
81
+ width, height = int(width * scale), int(height * scale)
82
+ width = max(grid, (width // grid) * grid)
83
+ height = max(grid, (height // grid) * grid)
84
+ if (width, height) == (image.width, image.height):
85
+ return image
86
+ from PIL import Image
87
+
88
+ return image.resize((width, height), Image.LANCZOS)
89
+
90
+
91
+ def strength_hints(sizes: list[tuple[int, int]], framings: list[float] | None = None) -> list[str]:
92
+ """One nudge per distinct gap. Creation is never gated on any of these.
93
+
94
+ Takes sizes rather than images so it can be recomputed from a manifest, which is what keeps a
95
+ rule change from leaving every existing character showing the advice it was encoded with.
96
+
97
+ The full-body hint is the one that changes a number rather than taste: with no reference wider
98
+ than a close-up, the subject term cannot speak to a wide take and is left out of the score
99
+ entirely (``scoring.SUBJECT_FRAMING_RATIO``).
100
+ """
101
+ hints: list[str] = []
102
+ # Escalating, never stacked: at one reference "add another angle" and "add a profile view" are
103
+ # the same request worded twice, which reads as two chores instead of one.
104
+ if len(sizes) == 1:
105
+ hints.append("Add a second angle")
106
+ elif len(sizes) == 2:
107
+ hints.append("Add a profile view")
108
+ elif len(sizes) < 4:
109
+ hints.append("Add a different outfit or setting")
110
+ ratios = [w / h for w, h in sizes if h]
111
+ if len(sizes) >= 2 and ratios and abs(max(ratios) - min(ratios)) < 0.05:
112
+ hints.append("Add a wider or tighter crop")
113
+ if framings and not any(f <= scoring.WIDE_REF_FRACTION for f in framings):
114
+ hints.append("Add a full-body shot, so wide takes can be scored")
115
+ return hints
116
+
117
+
118
+ def flags_for(doc: cf.CharDoc) -> dict[str, Any]:
119
+ """Reference agreement recomputed from the stored embeddings, so a floor change reaches
120
+ characters already on disk. Falls back to what was recorded at encode time."""
121
+ refs = scoring.load_embeds(doc.members, str(doc.manifest.scoring.get("faceEmbeds") or ""))
122
+ if not refs:
123
+ return {
124
+ "refAgreement": list(doc.manifest.scoring.get("refAgreement") or []),
125
+ "flaggedRefs": list(doc.manifest.scoring.get("flaggedRefs") or []),
126
+ }
127
+ return {
128
+ "refAgreement": scoring.reference_agreement(refs),
129
+ "flaggedRefs": scoring.flagged_references(refs),
130
+ }
131
+
132
+
133
+ def hints_for(manifest: cf.Manifest) -> list[str]:
134
+ """Hints recomputed from the manifest, so they never go stale against the current rules."""
135
+ framings = [float(f) for f in (manifest.scoring.get("refFramings") or [])]
136
+ return strength_hints(
137
+ [(int(r.get("width") or 0), int(r.get("height") or 0)) for r in manifest.refs], framings
138
+ )
139
+
140
+
141
+ def char_encode(
142
+ refs: list[Path | str],
143
+ *,
144
+ name: str,
145
+ description: str = "",
146
+ app_version: str = "",
147
+ char_id: str | None = None,
148
+ created_at: int | None = None,
149
+ on_progress: Progress | None = None,
150
+ ) -> cf.CharDoc:
151
+ """Compile reference images into a `CharDoc`. The caller writes it wherever it belongs.
152
+
153
+ ``on_progress`` reports the encode as it runs. It matters because the first call on a machine
154
+ downloads ~370MB of encoder weights, which without a signal is indistinguishable from a hang."""
155
+ report = on_progress or (lambda _fraction, _status: None)
156
+ paths = [Path(p) for p in refs]
157
+ if not paths:
158
+ raise ValueError("A character needs at least one reference image.")
159
+ missing = [p.name for p in paths if not p.is_file()]
160
+ if missing:
161
+ raise ValueError(f"Reference image not found: {', '.join(missing)}")
162
+
163
+ now = int(time.time())
164
+ images = [_open(p) for p in paths]
165
+ members: dict[str, bytes] = {}
166
+ manifest = cf.Manifest(
167
+ char_id=char_id or str(uuid.uuid4()),
168
+ name=name.strip() or "Character",
169
+ created_at=created_at or now,
170
+ modified_at=now,
171
+ app_version=app_version,
172
+ )
173
+
174
+ report(0.05, "Reading references…")
175
+ for index, (path, image) in enumerate(zip(paths, images, strict=True)):
176
+ member = cf.member_name("refs", index, ".png")
177
+ data = _png_bytes(image)
178
+ members[member] = data
179
+ manifest.refs.append(
180
+ {
181
+ "path": member,
182
+ "sha256": cf.sha256_bytes(data),
183
+ "width": image.width,
184
+ "height": image.height,
185
+ "source_name": path.name,
186
+ }
187
+ )
188
+
189
+ text_member = "text/description.md"
190
+ text_bytes = (description or "").encode("utf-8")
191
+ members[text_member] = text_bytes
192
+ manifest.text = {"path": text_member, "sha256": cf.sha256_bytes(text_bytes)}
193
+
194
+ crops: list[Any | None] = []
195
+ total = len(images)
196
+ for index, image in enumerate(images):
197
+ report(0.15 + 0.25 * index / total, f"Finding faces ({index + 1} of {total})…")
198
+ crop = scoring.face_crop(image)
199
+ crops.append(crop)
200
+ if crop is None:
201
+ continue
202
+ crop = crop.resize((FACE_CROP_SIZE, FACE_CROP_SIZE))
203
+ member = f"derived/face_{index:03d}.png"
204
+ data = _png_bytes(crop)
205
+ members[member] = data
206
+ manifest.derived.append(
207
+ {
208
+ "path": member,
209
+ "kind": "face_crop",
210
+ "from": cf.member_name("refs", index, ".png"),
211
+ "producer": "yunet",
212
+ "producer_version": scoring.weights.YUNET_VERSION,
213
+ "sha256": cf.sha256_bytes(data),
214
+ }
215
+ )
216
+
217
+ report(0.4, "Normalising reference set…")
218
+ build_payload(manifest, members, images)
219
+ _build_centroids(manifest, members, images, crops, report)
220
+ # From the manifest the scoring pass just wrote, so the hint and the score cannot disagree.
221
+ manifest.hints = hints_for(manifest)
222
+ report(1.0, "Done")
223
+ return cf.CharDoc(manifest=manifest, members=members)
224
+
225
+
226
+ def append_refs(doc: cf.CharDoc, paths: list[Path]) -> None:
227
+ """Add references without touching an encoder, so editing a character stays instant.
228
+
229
+ Scoring and payloads go stale rather than being recomputed here; the fingerprint check already
230
+ treats a changed reference set as invalid, and rebuilding is an explicit act."""
231
+ used = {str(ref.get("path") or "") for ref in doc.manifest.refs}
232
+ index = 0
233
+ for path in paths:
234
+ image = _open(path)
235
+ while (member := cf.member_name("refs", index, ".png")) in used:
236
+ index += 1
237
+ used.add(member)
238
+ data = _png_bytes(image)
239
+ doc.members[member] = data
240
+ doc.manifest.refs.append(
241
+ {
242
+ "path": member,
243
+ "sha256": cf.sha256_bytes(data),
244
+ "width": image.width,
245
+ "height": image.height,
246
+ "source_name": path.name,
247
+ }
248
+ )
249
+ doc.manifest.modified_at = int(time.time())
250
+
251
+
252
+ def drop_ref(doc: cf.CharDoc, index: int) -> None:
253
+ """Remove one reference, leaving a gap in the member numbering rather than renaming the rest."""
254
+ if not 0 <= index < len(doc.manifest.refs):
255
+ raise ValueError("That reference is not in this character.")
256
+ if len(doc.manifest.refs) == 1:
257
+ raise ValueError("A character needs at least one reference image.")
258
+ removed = doc.manifest.refs.pop(index)
259
+ member = str(removed.get("path") or "")
260
+ doc.members.pop(member, None)
261
+ # Its face crop was derived from it, so it goes too rather than pointing at a missing ref.
262
+ for entry in [d for d in doc.manifest.derived if str(d.get("from") or "") == member]:
263
+ doc.members.pop(str(entry.get("path") or ""), None)
264
+ doc.manifest.derived.remove(entry)
265
+ doc.manifest.modified_at = int(time.time())
266
+
267
+
268
+ def payload_stale(manifest: cf.Manifest, key: str) -> bool:
269
+ """Whether one payload was built from references that have since changed.
270
+
271
+ Checked against the policy stored *in that payload*, because two models normalise references
272
+ differently and a fingerprint only means anything beside the policy that produced it.
273
+ """
274
+ entry = manifest.payloads.get(key)
275
+ if not isinstance(entry, dict):
276
+ return True
277
+ policy = entry.get("policy") if isinstance(entry.get("policy"), dict) else PAYLOAD_POLICY
278
+ return str(entry.get("source_sha256") or "") != cf.refs_fingerprint(manifest, policy)
279
+
280
+
281
+ def stale_payloads(manifest: cf.Manifest) -> list[str]:
282
+ """Every compiled payload that no longer matches the references, newest format first."""
283
+ return [key for key in manifest.payloads if payload_stale(manifest, key)]
284
+
285
+
286
+ def needs_rebuild(manifest: cf.Manifest) -> bool:
287
+ """Whether anything compiled from the references is out of date."""
288
+ if not manifest.payloads:
289
+ return bool(manifest.refs)
290
+ return bool(stale_payloads(manifest))
291
+
292
+
293
+ def build_payload(
294
+ manifest: cf.Manifest,
295
+ members: dict[str, bytes],
296
+ images: list[Any],
297
+ arch: str = FLUX2_KLEIN_ARCH,
298
+ ) -> None:
299
+ """(Re)compile one model's reference set. Public because ``apply`` rebuilds stale ones."""
300
+ policy = reference_policy(arch)
301
+ for stale in [m for m in members if m.startswith(f"payloads/{arch}/")]:
302
+ members.pop(stale, None)
303
+ files: list[dict[str, Any]] = []
304
+ for index, image in enumerate(images):
305
+ member = f"payloads/{arch}/ref_{index:03d}.png"
306
+ data = _png_bytes(normalise_reference(image, policy))
307
+ members[member] = data
308
+ files.append({"path": member, "sha256": cf.sha256_bytes(data)})
309
+ manifest.payloads[arch] = {
310
+ "payload_version": 1,
311
+ "type": PAYLOAD_REF,
312
+ "encoder": {"id": PAYLOAD_ENCODER_ID, "version": PAYLOAD_ENCODER_VERSION},
313
+ "source_sha256": cf.refs_fingerprint(manifest, policy),
314
+ "policy": dict(policy),
315
+ "files": files,
316
+ }
317
+
318
+
319
+ def set_lora_payload(
320
+ manifest: cf.Manifest,
321
+ members: dict[str, bytes],
322
+ adapter: bytes,
323
+ *,
324
+ arch: str = FLUX2_KLEIN_ARCH,
325
+ base: str,
326
+ rank: int,
327
+ steps: int,
328
+ resolution: int,
329
+ strength: float = 1.0,
330
+ ) -> str:
331
+ """Store a trained adapter as this character's LoRA payload for ``arch``.
332
+
333
+ Records what it was trained against, because a LoRA is only valid for that base: loading a 4B
334
+ adapter onto a 9B silently degrades rather than raising. Shares the reference fingerprint, so
335
+ editing the reference set invalidates the adapter the same way it invalidates a reference set.
336
+
337
+ ``strength`` rides with the adapter because an overfit one is only usable turned down, and the
338
+ character applies through a wire that carries no controls of its own.
339
+ """
340
+ key = payload_key(arch, PAYLOAD_LORA)
341
+ for stale in [m for m in members if m.startswith(f"payloads/{key}/")]:
342
+ members.pop(stale, None)
343
+ member = f"payloads/{key}/adapter.safetensors"
344
+ members[member] = adapter
345
+ manifest.payloads[key] = {
346
+ "payload_version": 1,
347
+ "type": PAYLOAD_LORA,
348
+ "encoder": {"id": f"{arch}-lora", "version": LORA_PAYLOAD_VERSION},
349
+ "source_sha256": cf.refs_fingerprint(manifest, PAYLOAD_POLICY),
350
+ "policy": dict(PAYLOAD_POLICY),
351
+ "base": base,
352
+ "strength": float(strength),
353
+ "training": {"rank": rank, "steps": steps, "resolution": resolution},
354
+ "files": [{"path": member, "sha256": cf.sha256_bytes(adapter)}],
355
+ }
356
+ return key
357
+
358
+
359
+ def lora_strength(manifest: cf.Manifest, arch: str = FLUX2_KLEIN_ARCH) -> float:
360
+ """The strength this character's adapter fuses at, or 1.0 for one filed before it was set."""
361
+ entry = lora_payload(manifest, arch) or {}
362
+ try:
363
+ return float(entry.get("strength", 1.0))
364
+ except (TypeError, ValueError):
365
+ return 1.0
366
+
367
+
368
+ def lora_payload(manifest: cf.Manifest, arch: str = FLUX2_KLEIN_ARCH) -> dict[str, Any] | None:
369
+ """This character's adapter for ``arch``, or None when it has not been trained one."""
370
+ entry = manifest.payloads.get(payload_key(arch, PAYLOAD_LORA))
371
+ return entry if isinstance(entry, dict) else None
372
+
373
+
374
+ def _build_centroids(
375
+ manifest: cf.Manifest,
376
+ members: dict[str, bytes],
377
+ images: list[Any],
378
+ crops: list[Any | None],
379
+ report: Progress = lambda _fraction, _status: None,
380
+ ) -> None:
381
+ centroids: dict[str, str] = {}
382
+
383
+ report(0.55, "Loading identity encoders…")
384
+ # Whole frame, not the crop: SFace self-aligns, and mismatching the two sides costs ~10 points.
385
+ face_vectors = [v for image in images if (v := scoring.embed_face(image))]
386
+ face_centroid = scoring.mean_vector(face_vectors)
387
+ if face_centroid:
388
+ member = f"scoring/centroid_{scoring.SFACE_ID}.json"
389
+ members[member] = scoring.dump_centroid(face_centroid, len(face_vectors))
390
+ centroids[scoring.SFACE_ID] = member
391
+ # Every view kept, not just their mean: the face term matches the best-fitting one.
392
+ members[_FACE_EMBEDS] = scoring.dump_embeds(face_vectors)
393
+
394
+ report(0.7, "Measuring the subject…")
395
+ subject_vectors = [v for image in images if (v := scoring.embed_subject(image))]
396
+ subject_centroid = scoring.mean_vector(subject_vectors)
397
+ if subject_centroid:
398
+ member = f"scoring/centroid_{scoring.DINOV2_ID}.json"
399
+ members[member] = scoring.dump_centroid(subject_centroid, len(subject_vectors))
400
+ centroids[scoring.DINOV2_ID] = member
401
+ # Keep every view: a mean over chest-up refs matches none of them.
402
+ members[_SUBJECT_EMBEDS] = scoring.dump_embeds(subject_vectors)
403
+
404
+ report(0.9, "Measuring reference coverage…")
405
+ # How wide each reference is, so scoring can tell whether the gallery covers a take's framing.
406
+ framings = [f for image in images if (f := scoring.face_fraction(image)) is not None]
407
+
408
+ manifest.scoring = {
409
+ "encoders": scoring.encoder_versions(),
410
+ "centroids": centroids,
411
+ "faceEmbeds": _FACE_EMBEDS if face_centroid else "",
412
+ "subjectEmbeds": _SUBJECT_EMBEDS if subject_centroid else "",
413
+ "refFramings": framings,
414
+ "refAgreement": scoring.reference_agreement(face_vectors),
415
+ "flaggedRefs": scoring.flagged_references(face_vectors),
416
+ "face_bearing": bool(face_centroid),
417
+ "blend": {"face": scoring.FACE_WEIGHT, "subject": scoring.SUBJECT_WEIGHT},
418
+ }