inline-core 1.2.71__tar.gz → 1.2.73__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 (529) hide show
  1. {inline_core-1.2.71 → inline_core-1.2.73}/PKG-INFO +1 -1
  2. {inline_core-1.2.71 → inline_core-1.2.73}/pyproject.toml +1 -1
  3. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/checkpoint.py +37 -0
  4. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/flux2/requirements.py +39 -4
  5. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/flux2/variants.py +75 -11
  6. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/loaders.py +55 -17
  7. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/studio/models.py +11 -1
  8. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/studio/training.py +49 -20
  9. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_checkpoint.py +64 -0
  10. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_flux2_variants.py +68 -0
  11. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_studio_training.py +75 -0
  12. {inline_core-1.2.71 → inline_core-1.2.73}/.gitignore +0 -0
  13. {inline_core-1.2.71 → inline_core-1.2.73}/.python-version +0 -0
  14. {inline_core-1.2.71 → inline_core-1.2.73}/CLAUDE.md +0 -0
  15. {inline_core-1.2.71 → inline_core-1.2.73}/README.md +0 -0
  16. {inline_core-1.2.71 → inline_core-1.2.73}/main.py +0 -0
  17. {inline_core-1.2.71 → inline_core-1.2.73}/scripts/flux2_train_matrix.py +0 -0
  18. {inline_core-1.2.71 → inline_core-1.2.73}/scripts/minimax_h3_lora_check.py +0 -0
  19. {inline_core-1.2.71 → inline_core-1.2.73}/scripts/minimax_h3_train_matrix.py +0 -0
  20. {inline_core-1.2.71 → inline_core-1.2.73}/scripts/reference.py +0 -0
  21. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/__init__.py +0 -0
  22. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/characters/__init__.py +0 -0
  23. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/characters/apply.py +0 -0
  24. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/characters/charfile.py +0 -0
  25. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/characters/encode.py +0 -0
  26. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/characters/library.py +0 -0
  27. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/characters/scoring.py +0 -0
  28. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/characters/weights.py +0 -0
  29. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/components/__init__.py +0 -0
  30. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/components/conditioning.py +0 -0
  31. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/components/interfaces.py +0 -0
  32. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/config.py +0 -0
  33. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/device/__init__.py +0 -0
  34. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/device/auto.py +0 -0
  35. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/device/detect.py +0 -0
  36. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/device/memory.py +0 -0
  37. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/device/policy.py +0 -0
  38. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/device/probe.py +0 -0
  39. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/device/types.py +0 -0
  40. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/errors.py +0 -0
  41. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/extensions/__init__.py +0 -0
  42. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/extensions/api.py +0 -0
  43. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/extensions/constraints.py +0 -0
  44. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/extensions/fetch.py +0 -0
  45. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/extensions/handlers.py +0 -0
  46. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/extensions/importer.py +0 -0
  47. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/extensions/install.py +0 -0
  48. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/extensions/loader.py +0 -0
  49. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/extensions/manifest.py +0 -0
  50. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/extensions/models.py +0 -0
  51. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/extensions/paths.py +0 -0
  52. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/extensions/resolve.py +0 -0
  53. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/extensions/scanner.py +0 -0
  54. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/extensions/state.py +0 -0
  55. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/extensions/tools.py +0 -0
  56. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/ffmpeg.py +0 -0
  57. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/graph/__init__.py +0 -0
  58. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/graph/cache.py +0 -0
  59. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/graph/descriptor.py +0 -0
  60. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/graph/executor.py +0 -0
  61. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/graph/loader_runners.py +0 -0
  62. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/graph/primitives.py +0 -0
  63. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/graph/registry.py +0 -0
  64. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/graph/runners.py +0 -0
  65. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/graph/schema.py +0 -0
  66. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/graph/topo.py +0 -0
  67. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/graph/validate.py +0 -0
  68. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/media.py +0 -0
  69. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/__init__.py +0 -0
  70. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/catalog.py +0 -0
  71. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/controlspace.py +0 -0
  72. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/flux2/__init__.py +0 -0
  73. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/flux2/controlnet.py +0 -0
  74. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/flux2/embeds.py +0 -0
  75. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/flux2/provider.py +0 -0
  76. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/flux2/runner.py +0 -0
  77. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/keymap.py +0 -0
  78. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/krea2/__init__.py +0 -0
  79. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/krea2/convert.py +0 -0
  80. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/krea2/depth_control.py +0 -0
  81. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/krea2/img2img.py +0 -0
  82. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/krea2/provider.py +0 -0
  83. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/krea2/requirements.py +0 -0
  84. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/krea2/runner.py +0 -0
  85. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/lora.py +0 -0
  86. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/__init__.py +0 -0
  87. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/lora_keys.py +0 -0
  88. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/memory.py +0 -0
  89. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/pipeline.py +0 -0
  90. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/provider.py +0 -0
  91. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/requirements.py +0 -0
  92. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/runner.py +0 -0
  93. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/__init__.py +0 -0
  94. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/__init__.py +0 -0
  95. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/allocator_trim_strategy.py +0 -0
  96. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/batch_split.py +0 -0
  97. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/block_streaming/__init__.py +0 -0
  98. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/block_streaming/block_fetcher.py +0 -0
  99. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/block_streaming/builder.py +0 -0
  100. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/block_streaming/disk.py +0 -0
  101. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/block_streaming/pool.py +0 -0
  102. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/block_streaming/provider.py +0 -0
  103. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/block_streaming/source.py +0 -0
  104. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/block_streaming/stream_sync.py +0 -0
  105. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/block_streaming/utils.py +0 -0
  106. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/block_streaming/wrapper.py +0 -0
  107. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/color/__init__.py +0 -0
  108. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/color/audio_mux.py +0 -0
  109. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/color/hlg.py +0 -0
  110. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/color/primaries.py +0 -0
  111. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/color/yuv.py +0 -0
  112. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/components/__init__.py +0 -0
  113. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/components/diffusion_steps.py +0 -0
  114. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/components/guiders.py +0 -0
  115. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/components/noisers.py +0 -0
  116. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/components/patchifiers.py +0 -0
  117. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/components/protocols.py +0 -0
  118. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/components/schedulers.py +0 -0
  119. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/conditioning/__init__.py +0 -0
  120. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/conditioning/exceptions.py +0 -0
  121. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/conditioning/item.py +0 -0
  122. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/conditioning/mask_utils.py +0 -0
  123. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/conditioning/types/__init__.py +0 -0
  124. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/conditioning/types/attention_strength_wrapper.py +0 -0
  125. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/conditioning/types/keyframe_cond.py +0 -0
  126. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/conditioning/types/keyframe_slots.py +0 -0
  127. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/conditioning/types/latent_cond.py +0 -0
  128. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/conditioning/types/mask_cond.py +0 -0
  129. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/conditioning/types/noise_mask_cond.py +0 -0
  130. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/conditioning/types/reference_audio_cond.py +0 -0
  131. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/conditioning/types/reference_video_cond.py +0 -0
  132. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/devices.py +0 -0
  133. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/duration_head/__init__.py +0 -0
  134. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/duration_head/duration_head.py +0 -0
  135. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/duration_head/model_configurator.py +0 -0
  136. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/guidance/__init__.py +0 -0
  137. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/guidance/perturbations.py +0 -0
  138. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/hdr.py +0 -0
  139. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/loader/__init__.py +0 -0
  140. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/loader/attention_ops.py +0 -0
  141. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/loader/fuse_loras.py +0 -0
  142. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/loader/helpers.py +0 -0
  143. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/loader/kernels.py +0 -0
  144. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/loader/module_ops.py +0 -0
  145. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/loader/primitives.py +0 -0
  146. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/loader/registry.py +0 -0
  147. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/loader/sd_ops.py +0 -0
  148. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/loader/sft_loader.py +0 -0
  149. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/loader/single_gpu_model_builder.py +0 -0
  150. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/modality_tiling.py +0 -0
  151. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/__init__.py +0 -0
  152. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/audio_vae/__init__.py +0 -0
  153. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/audio_vae/attention.py +0 -0
  154. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/audio_vae/audio_vae.py +0 -0
  155. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/audio_vae/causal_conv_2d.py +0 -0
  156. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/audio_vae/causality_axis.py +0 -0
  157. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/audio_vae/downsample.py +0 -0
  158. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/audio_vae/model_configurator.py +0 -0
  159. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/audio_vae/ops.py +0 -0
  160. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/audio_vae/resnet.py +0 -0
  161. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/audio_vae/upsample.py +0 -0
  162. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/audio_vae/vocoder.py +0 -0
  163. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/common/__init__.py +0 -0
  164. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/common/normalization.py +0 -0
  165. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/disposable.py +0 -0
  166. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/model_protocol.py +0 -0
  167. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/transformer/__init__.py +0 -0
  168. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/transformer/adaln.py +0 -0
  169. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/transformer/attention.py +0 -0
  170. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/transformer/compiling.py +0 -0
  171. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/transformer/cudagraph_capture.py +0 -0
  172. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/transformer/feed_forward.py +0 -0
  173. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/transformer/gelu_approx.py +0 -0
  174. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/transformer/modality.py +0 -0
  175. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/transformer/model.py +0 -0
  176. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/transformer/model_configurator.py +0 -0
  177. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/transformer/ops.py +0 -0
  178. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/transformer/rope.py +0 -0
  179. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/transformer/text_projection.py +0 -0
  180. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/transformer/timestep_embedding.py +0 -0
  181. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/transformer/transformer.py +0 -0
  182. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/transformer/transformer_args.py +0 -0
  183. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/upsampler/__init__.py +0 -0
  184. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/upsampler/blur_downsample.py +0 -0
  185. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/upsampler/model.py +0 -0
  186. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/upsampler/model_configurator.py +0 -0
  187. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/upsampler/pixel_shuffle.py +0 -0
  188. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/upsampler/res_block.py +0 -0
  189. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/upsampler/spatial_rational_resampler.py +0 -0
  190. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/__init__.py +0 -0
  191. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/attention.py +0 -0
  192. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/conv_video_decoder.py +0 -0
  193. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/convolution.py +0 -0
  194. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/diffusion_tiling.py +0 -0
  195. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/diffusion_video_decoder.py +0 -0
  196. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/enums.py +0 -0
  197. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/memory_efficient_decode.py +0 -0
  198. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/model_configurator.py +0 -0
  199. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/normalization.py +0 -0
  200. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/ops.py +0 -0
  201. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/resnet.py +0 -0
  202. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/sampling.py +0 -0
  203. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/__init__.py +0 -0
  204. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/apply.py +0 -0
  205. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/attention.py +0 -0
  206. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/blocks.py +0 -0
  207. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/chunked/__init__.py +0 -0
  208. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/chunked/attn.py +0 -0
  209. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/chunked/block.py +0 -0
  210. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/chunked/context.py +0 -0
  211. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/chunked/mlp.py +0 -0
  212. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/combined/__init__.py +0 -0
  213. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/combined/attn.py +0 -0
  214. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/combined/block.py +0 -0
  215. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/combined/context.py +0 -0
  216. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/combined/mlp.py +0 -0
  217. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/compiling.py +0 -0
  218. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/config.py +0 -0
  219. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/det_attn_rope.py +0 -0
  220. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/dsl_kernels/__init__.py +0 -0
  221. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/dsl_kernels/apply_dsl.py +0 -0
  222. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/dsl_kernels/attn.py +0 -0
  223. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/dsl_kernels/block.py +0 -0
  224. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/dsl_kernels/chain.py +0 -0
  225. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/fallback_na/__init__.py +0 -0
  226. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/fallback_na/eager.py +0 -0
  227. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/fallback_na/triton_na.py +0 -0
  228. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/layers.py +0 -0
  229. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/qkv.py +0 -0
  230. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/rope.py +0 -0
  231. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/rope_math.py +0 -0
  232. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/swiglu.py +0 -0
  233. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/video_vae.py +0 -0
  234. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/multigpu/__init__.py +0 -0
  235. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/multigpu/gemma/__init__.py +0 -0
  236. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/multigpu/gemma/accelerate_wrapper.py +0 -0
  237. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/multigpu/gemma/batch_parallel_wrapper.py +0 -0
  238. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/multigpu/gemma/broadcast_wrapper.py +0 -0
  239. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/multigpu/gemma/loader.py +0 -0
  240. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/multigpu/sharded_sd.py +0 -0
  241. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/multigpu/transformer/__init__.py +0 -0
  242. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/multigpu/transformer/attention.py +0 -0
  243. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/multigpu/transformer/sequence_parallel.py +0 -0
  244. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/multigpu/transformer/tiled_data_parallel.py +0 -0
  245. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/multigpu/vae/__init__.py +0 -0
  246. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/multigpu/vae/distributed_decoder.py +0 -0
  247. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/quantization/__init__.py +0 -0
  248. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/quantization/blockwise/__init__.py +0 -0
  249. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/quantization/blockwise/_impl.py +0 -0
  250. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/quantization/fp8_cast.py +0 -0
  251. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/quantization/fp8_scaled_mm.py +0 -0
  252. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/quantization/nvfp4/__init__.py +0 -0
  253. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/quantization/nvfp4/convert.py +0 -0
  254. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/quantization/nvfp4/fuse.py +0 -0
  255. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/quantization/nvfp4/linear.py +0 -0
  256. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/quantization/nvfp4/prequant.py +0 -0
  257. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/quantization/nvfp4/types.py +0 -0
  258. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/quantization/policy.py +0 -0
  259. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/text_encoders/__init__.py +0 -0
  260. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/text_encoders/gemma/__init__.py +0 -0
  261. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/text_encoders/gemma/embeddings_connector.py +0 -0
  262. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/text_encoders/gemma/embeddings_processor.py +0 -0
  263. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/text_encoders/gemma/encoders/base_encoder.py +0 -0
  264. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/text_encoders/gemma/encoders/encoder_configurator.py +0 -0
  265. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/text_encoders/gemma/encoders/prompts/gemma3_i2v_system_prompt.txt +0 -0
  266. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/text_encoders/gemma/encoders/prompts/gemma3_t2v_system_prompt.txt +0 -0
  267. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/text_encoders/gemma/encoders/prompts/gemma4_i2v_system_prompt.txt +0 -0
  268. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/text_encoders/gemma/encoders/prompts/gemma4_t2v_system_prompt.txt +0 -0
  269. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/text_encoders/gemma/feature_extractor.py +0 -0
  270. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/text_encoders/gemma/gemma_assets.py +0 -0
  271. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/text_encoders/gemma/tokenizer.py +0 -0
  272. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/tiling.py +0 -0
  273. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/tools.py +0 -0
  274. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/types.py +0 -0
  275. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/utils.py +0 -0
  276. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/__init__.py +0 -0
  277. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/a2vid_two_stage.py +0 -0
  278. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/dfr_layout.py +0 -0
  279. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/dfr_pipeline.py +0 -0
  280. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/distilled.py +0 -0
  281. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/distilled_mgpu.py +0 -0
  282. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/dubit.py +0 -0
  283. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/hdr_ic_lora.py +0 -0
  284. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/ic_lora.py +0 -0
  285. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/iclora_utils.py +0 -0
  286. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/keyframe_interpolation.py +0 -0
  287. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/multigpu/__init__.py +0 -0
  288. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/multigpu/_broadcast.py +0 -0
  289. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/multigpu/bp_gemma_builder.py +0 -0
  290. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/multigpu/controller.py +0 -0
  291. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/multigpu/delegating_builder.py +0 -0
  292. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/multigpu/fleet.py +0 -0
  293. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/multigpu/gemma_builders.py +0 -0
  294. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/multigpu/nccl_groups.py +0 -0
  295. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/multigpu/runner.py +0 -0
  296. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/multigpu/sp_builder.py +0 -0
  297. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/multigpu/tdp_builder.py +0 -0
  298. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/multigpu/vae_builders.py +0 -0
  299. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/multigpu/weight_tracker.py +0 -0
  300. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/retake.py +0 -0
  301. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/t2a_one_stage.py +0 -0
  302. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/ti2vid_one_stage.py +0 -0
  303. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/ti2vid_two_stages.py +0 -0
  304. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/ti2vid_two_stages_hq.py +0 -0
  305. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/ti2vid_two_stages_hq_mgpu.py +0 -0
  306. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/ti2vid_two_stages_mgpu.py +0 -0
  307. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/__init__.py +0 -0
  308. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/args.py +0 -0
  309. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/blocks.py +0 -0
  310. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/constants.py +0 -0
  311. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/denoisers.py +0 -0
  312. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/gpu_model.py +0 -0
  313. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/helpers.py +0 -0
  314. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/media_io/__init__.py +0 -0
  315. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/media_io/color_config.py +0 -0
  316. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/media_io/decode.py +0 -0
  317. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/media_io/encode.py +0 -0
  318. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/media_io/exr.py +0 -0
  319. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/media_io/range_map.py +0 -0
  320. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/media_io/resize.py +0 -0
  321. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/model_paths.py +0 -0
  322. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/quantization_factory.py +0 -0
  323. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/res2s.py +0 -0
  324. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/samplers.py +0 -0
  325. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/types.py +0 -0
  326. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/minimaxh3/__init__.py +0 -0
  327. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/minimaxh3/adaln.py +0 -0
  328. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/minimaxh3/keys.py +0 -0
  329. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/minimaxh3/load.py +0 -0
  330. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/minimaxh3/lora_keys.py +0 -0
  331. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/minimaxh3/pipeline.py +0 -0
  332. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/minimaxh3/provider.py +0 -0
  333. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/minimaxh3/requirements.py +0 -0
  334. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/minimaxh3/runner.py +0 -0
  335. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/minimaxh3/vae_keys.py +0 -0
  336. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/minimaxh3/vendor/__init__.py +0 -0
  337. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/minimaxh3/vendor/autoencoder_kl_minimax_h3.py +0 -0
  338. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/minimaxh3/vendor/autoencoder_kl_minimax_h3_audio.py +0 -0
  339. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/minimaxh3/vendor/before_denoise.py +0 -0
  340. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/minimaxh3/vendor/before_encoder.py +0 -0
  341. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/minimaxh3/vendor/decoders.py +0 -0
  342. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/minimaxh3/vendor/denoise.py +0 -0
  343. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/minimaxh3/vendor/encoders.py +0 -0
  344. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/minimaxh3/vendor/modular_blocks_minimax_h3.py +0 -0
  345. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/minimaxh3/vendor/modular_pipeline.py +0 -0
  346. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/minimaxh3/vendor/packing.py +0 -0
  347. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/minimaxh3/vendor/packing_ref2va.py +0 -0
  348. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/minimaxh3/vendor/scheduling_minimax_h3.py +0 -0
  349. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/minimaxh3/vendor/transformer_minimax_h3.py +0 -0
  350. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/offload.py +0 -0
  351. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/pipeline_runtime.py +0 -0
  352. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/prepared.py +0 -0
  353. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/preprocess/__init__.py +0 -0
  354. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/preprocess/requirements.py +0 -0
  355. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/preprocess/runner.py +0 -0
  356. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/references.py +0 -0
  357. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/requirements.py +0 -0
  358. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/sampling.py +0 -0
  359. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/video_params.py +0 -0
  360. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/zimage/__init__.py +0 -0
  361. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/zimage/primitives.py +0 -0
  362. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/zimage/provider.py +0 -0
  363. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/zimage/requirements.py +0 -0
  364. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/zimage/runner.py +0 -0
  365. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/parallel/__init__.py +0 -0
  366. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/parallel/config.py +0 -0
  367. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/parallel/group.py +0 -0
  368. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/parallel/launch.py +0 -0
  369. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/parallel/protocol.py +0 -0
  370. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/parallel/registry.py +0 -0
  371. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/parallel/worker.py +0 -0
  372. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/runtime/__init__.py +0 -0
  373. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/runtime/context.py +0 -0
  374. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/runtime/file_store.py +0 -0
  375. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/runtime/progress.py +0 -0
  376. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/runtime/run.py +0 -0
  377. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/runtime/store.py +0 -0
  378. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/runtime/video_encode.py +0 -0
  379. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/sampling/__init__.py +0 -0
  380. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/sampling/batch.py +0 -0
  381. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/server/__init__.py +0 -0
  382. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/server/__main__.py +0 -0
  383. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/server/app.py +0 -0
  384. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/server/assets.py +0 -0
  385. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/server/bootstrap.py +0 -0
  386. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/server/frontend.py +0 -0
  387. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/server/manager.py +0 -0
  388. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/server/rpc.py +0 -0
  389. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/server/run_store.py +0 -0
  390. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/server/serialize.py +0 -0
  391. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/studio/__init__.py +0 -0
  392. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/studio/activity.py +0 -0
  393. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/studio/assets.py +0 -0
  394. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/studio/characters.py +0 -0
  395. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/studio/config.py +0 -0
  396. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/studio/dataset_import.py +0 -0
  397. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/studio/fal.py +0 -0
  398. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/studio/frames.py +0 -0
  399. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/studio/generation.py +0 -0
  400. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/studio/graph_build.py +0 -0
  401. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/studio/handlers.py +0 -0
  402. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/studio/image_meta.py +0 -0
  403. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/studio/moodboard.py +0 -0
  404. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/studio/peaks.py +0 -0
  405. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/studio/recipe.py +0 -0
  406. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/studio/schema.py +0 -0
  407. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/studio/store.py +0 -0
  408. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/studio/system_stats.py +0 -0
  409. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/studio/timeline/__init__.py +0 -0
  410. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/studio/timeline/compose.py +0 -0
  411. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/studio/timeline/ffmpeg.py +0 -0
  412. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/studio/timeline/render.py +0 -0
  413. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/studio/timeline/resolve.py +0 -0
  414. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/studio/training_store.py +0 -0
  415. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/takes.py +0 -0
  416. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/training/__init__.py +0 -0
  417. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/training/__main__.py +0 -0
  418. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/training/arch.py +0 -0
  419. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/training/cache.py +0 -0
  420. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/training/caption.py +0 -0
  421. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/training/dataset.py +0 -0
  422. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/training/h3.py +0 -0
  423. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/training/ltx25.py +0 -0
  424. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/training/models.py +0 -0
  425. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/training/precache_store.py +0 -0
  426. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/training/protocol.py +0 -0
  427. {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/training/trainer.py +0 -0
  428. {inline_core-1.2.71 → inline_core-1.2.73}/tests/conftest.py +0 -0
  429. {inline_core-1.2.71 → inline_core-1.2.73}/tests/helpers.py +0 -0
  430. {inline_core-1.2.71 → inline_core-1.2.73}/tests/reference/lookalike_faces.json +0 -0
  431. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_cache.py +0 -0
  432. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_catalog.py +0 -0
  433. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_characters_encode.py +0 -0
  434. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_characters_library.py +0 -0
  435. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_characters_rpc.py +0 -0
  436. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_characters_scoring.py +0 -0
  437. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_characters_wiring.py +0 -0
  438. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_charfile.py +0 -0
  439. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_clip_grid_parity.py +0 -0
  440. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_config.py +0 -0
  441. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_dataset_import.py +0 -0
  442. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_device_detect.py +0 -0
  443. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_encoder_parking.py +0 -0
  444. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_executor.py +0 -0
  445. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_extension_api.py +0 -0
  446. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_extension_install.py +0 -0
  447. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_extension_manifest.py +0 -0
  448. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_extension_resolve.py +0 -0
  449. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_extension_scanner.py +0 -0
  450. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_extension_spine.py +0 -0
  451. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_extension_state.py +0 -0
  452. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_file_store.py +0 -0
  453. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_flux2_controlnet.py +0 -0
  454. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_flux2_folder.py +0 -0
  455. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_flux2_resolve.py +0 -0
  456. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_flux2_runner.py +0 -0
  457. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_flux2_training.py +0 -0
  458. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_frontend_serving.py +0 -0
  459. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_hidden_nodes.py +0 -0
  460. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_keymap.py +0 -0
  461. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_krea2_convert.py +0 -0
  462. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_krea2_depth_control.py +0 -0
  463. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_krea2_requirements.py +0 -0
  464. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_krea2_runner.py +0 -0
  465. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_loader_runners.py +0 -0
  466. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_loaders.py +0 -0
  467. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_lora.py +0 -0
  468. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_lora_download.py +0 -0
  469. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_ltx25_lora_keys.py +0 -0
  470. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_ltx25_nodes.py +0 -0
  471. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_ltx25_requirements.py +0 -0
  472. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_ltx25_training.py +0 -0
  473. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_ltx25_wired_refs.py +0 -0
  474. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_manager_queue.py +0 -0
  475. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_memory_policy.py +0 -0
  476. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_minimaxh3_adaln.py +0 -0
  477. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_minimaxh3_keys.py +0 -0
  478. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_minimaxh3_load.py +0 -0
  479. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_minimaxh3_lora_keys.py +0 -0
  480. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_minimaxh3_nodes.py +0 -0
  481. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_minimaxh3_training.py +0 -0
  482. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_model_requirements.py +0 -0
  483. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_offload_prepared.py +0 -0
  484. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_output_kind_contract.py +0 -0
  485. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_parallel_group.py +0 -0
  486. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_pipeline_cache.py +0 -0
  487. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_precache_store.py +0 -0
  488. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_primitives.py +0 -0
  489. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_recipe.py +0 -0
  490. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_references.py +0 -0
  491. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_rpc_bridge.py +0 -0
  492. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_run_store.py +0 -0
  493. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_sampling.py +0 -0
  494. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_schema.py +0 -0
  495. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_server.py +0 -0
  496. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_staged_residency.py +0 -0
  497. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_studio_activity.py +0 -0
  498. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_studio_assets.py +0 -0
  499. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_studio_fal.py +0 -0
  500. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_studio_frames.py +0 -0
  501. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_studio_generation.py +0 -0
  502. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_studio_graph_build.py +0 -0
  503. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_studio_models.py +0 -0
  504. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_studio_moodboard.py +0 -0
  505. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_studio_multi_reference.py +0 -0
  506. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_studio_node_size.py +0 -0
  507. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_studio_peaks.py +0 -0
  508. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_studio_rpc.py +0 -0
  509. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_studio_schema.py +0 -0
  510. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_studio_store.py +0 -0
  511. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_studio_timeline.py +0 -0
  512. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_take_bytes.py +0 -0
  513. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_topo.py +0 -0
  514. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_training_arch.py +0 -0
  515. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_training_dataset.py +0 -0
  516. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_training_models.py +0 -0
  517. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_training_resolve.py +0 -0
  518. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_training_snapshots.py +0 -0
  519. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_validate.py +0 -0
  520. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_video_encode.py +0 -0
  521. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_video_params.py +0 -0
  522. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_webui_install.py +0 -0
  523. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_xfuser_sampler.py +0 -0
  524. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_zimage_primitives.py +0 -0
  525. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_zimage_resolve.py +0 -0
  526. {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_zimage_runner.py +0 -0
  527. {inline_core-1.2.71 → inline_core-1.2.73}/uv.lock +0 -0
  528. {inline_core-1.2.71 → inline_core-1.2.73}/webui.bat +0 -0
  529. {inline_core-1.2.71 → inline_core-1.2.73}/webui.sh +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: inline-core
3
- Version: 1.2.71
3
+ Version: 1.2.73
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.71"
4
+ version = "1.2.73"
5
5
  description = "The generation engine behind Inline Studio."
6
6
  readme = "README.md"
7
7
  license = "GPL-3.0-or-later"
@@ -34,6 +34,38 @@ _DTYPE_NAMES = {
34
34
  }
35
35
 
36
36
 
37
+ #: Markers a checkpoint carries when it was already quantized by someone else. ``comfy_quant`` is
38
+ #: ComfyUI's own tag; ``weight_scale`` is the per-tensor scale every fp8/int8 repack ships beside
39
+ #: the packed weights. Never match a bare ``.scale``: real models carry RMSNorm weights so named.
40
+ _QUANT_MARKERS = ("comfy_quant", "weight_scale", "scale_weight", "weight_scale_2")
41
+ _QUANT_DTYPES = frozenset({"I8", "U8"})
42
+
43
+
44
+ def prequantized_kind(path: str | Path) -> str | None:
45
+ """What quantization a checkpoint already carries, or None if it is plain weights.
46
+
47
+ Loading one of these into a stock model silently drops the scales as unexpected keys, leaving
48
+ packed tensors in layers sized for unpacked ones - which surfaces as a shape mismatch deep in a
49
+ matmul rather than as a load error. Quantizing it a second time compounds that.
50
+ """
51
+ file = Path(path)
52
+ if not file.is_file() or file.suffix.lower() not in (".safetensors", ".sft"):
53
+ return None
54
+ try:
55
+ reader = CheckpointReader(file)
56
+ dtypes = reader.dtypes()
57
+ except Exception: # noqa: BLE001 - unreadable is not classifiable
58
+ return None
59
+ if any(any(m in key for m in _QUANT_MARKERS) for key in dtypes):
60
+ return "prequantized"
61
+ weights = {d for key, d in dtypes.items() if key.endswith(".weight")}
62
+ if any(d.startswith("F8_") for d in weights):
63
+ return "fp8"
64
+ if weights & _QUANT_DTYPES:
65
+ return "int8"
66
+ return None
67
+
68
+
37
69
  class CheckpointReader:
38
70
  """Random access to one safetensors file, one tensor at a time."""
39
71
 
@@ -64,6 +96,11 @@ class CheckpointReader:
64
96
  infer a checkpoint's architecture (layer counts, widths) before deciding how to load it."""
65
97
  return {key: list(entry.get("shape") or []) for key, entry in self._index.items()}
66
98
 
99
+ def dtypes(self) -> dict[str, str]:
100
+ """Every tensor's on-disk dtype name, header only. These are safetensors' own spellings
101
+ (``BF16``, ``F8_E4M3``, ...), not torch's, so a dtype we cannot load is still reportable."""
102
+ return {key: str(entry.get("dtype") or "") for key, entry in self._index.items()}
103
+
67
104
  def get_tensor(self, key: str, device: str | None = None) -> Any:
68
105
  """One tensor, read straight from its byte range into a fresh buffer."""
69
106
  import torch
@@ -15,6 +15,7 @@ lets a Z-Image, Krea 2 and FLUX.2 checkpoint share ``diffusion_models/`` safely.
15
15
 
16
16
  from __future__ import annotations
17
17
 
18
+ import logging
18
19
  import os
19
20
  import re
20
21
  from pathlib import Path
@@ -24,6 +25,8 @@ from ..catalog import resolve_picked
24
25
  from ..requirements import ModelComponent
25
26
  from . import variants as V
26
27
 
28
+ logger = logging.getLogger("inline_core.flux2")
29
+
27
30
  __all__ = [
28
31
  "DIFFUSION_FILE",
29
32
  "SPLIT_REPO",
@@ -65,10 +68,13 @@ _EXTRAS: tuple[tuple[str, str, str, str, str], ...] = (
65
68
  ),
66
69
  (
67
70
  "diffusion_klein_9b",
68
- "Klein 9B (int8, needs ~12 GB VRAM)",
71
+ "Klein 9B (18 GB download, quantized on load)",
69
72
  "diffusion_models",
70
- "Sakujo/FLUX.2-Klein-9B-INT8-ConvRot",
71
- "flux-2-klein-9b-int8-ConvRot-comfyui.safetensors",
73
+ # BFL's own repo, because no ungated mirror carries the 9B transformer: Comfy-Org's
74
+ # flux2-klein-9B holds only the encoders and the VAE. The fp8 build is deliberately not
75
+ # used here - diffusers' single-file converter cannot read it (see loaders.py).
76
+ "black-forest-labs/FLUX.2-klein-9B",
77
+ "flux-2-klein-9b.safetensors",
72
78
  ),
73
79
  (
74
80
  "text_encoder_qwen3_8b",
@@ -205,7 +211,36 @@ def _folder_encoder_width(folder: Path) -> int | None:
205
211
 
206
212
  def flux2_checkpoints() -> list[Path]:
207
213
  """Every FLUX.2 checkpoint installed, identified by content rather than by name."""
208
- return [p for p in _weight_files("diffusion_models") if _identify(p) is not None]
214
+ found: list[Path] = []
215
+ skipped: list[str] = []
216
+ for path in _weight_files("diffusion_models"):
217
+ if _identify(path) is not None:
218
+ found.append(path)
219
+ else:
220
+ skipped.append(f"{path.name} ({skip_reason(path)})")
221
+ # A file that cannot be identified is left out of the dropdown, which from the UI is
222
+ # indistinguishable from it not being there at all. Say so once per scan.
223
+ if skipped and skipped != _LAST_SKIPPED:
224
+ _LAST_SKIPPED[:] = skipped
225
+ logger.info("Not offered as FLUX.2 checkpoints: %s", ", ".join(sorted(skipped)))
226
+ return found
227
+
228
+
229
+ #: Last reported skip list, so a rescan on every catalog bump does not repeat itself in the log.
230
+ _LAST_SKIPPED: list[str] = []
231
+
232
+
233
+ def skip_reason(path: Path) -> str:
234
+ """Why a file in ``diffusion_models/`` is not offered, in the words a user can act on."""
235
+ blocked = V.single_file_blocker(path)
236
+ if blocked is not None:
237
+ return f"{blocked}, so diffusers cannot convert it"
238
+ carried = V.quantization_of(path)
239
+ if carried is not None:
240
+ return f"a {carried} repack whose tensor names we do not recognise"
241
+ if path.suffix.lower() == ".gguf":
242
+ return "unrecognised GGUF build"
243
+ return "not a FLUX.2 checkpoint, or a repack whose tensor names we do not recognise"
209
244
 
210
245
 
211
246
  def flux2_encoders() -> list[Path]:
@@ -25,6 +25,8 @@ __all__ = [
25
25
  "derive_transformer_config",
26
26
  "folder_config",
27
27
  "is_prequantized",
28
+ "quantization_of",
29
+ "single_file_blocker",
28
30
  "detect",
29
31
  "get",
30
32
  "text_encoder_kind",
@@ -270,24 +272,86 @@ def folder_config(path: str | Path) -> dict[str, object] | None:
270
272
  return {k: v for k, v in config.items() if not k.startswith("_")}
271
273
 
272
274
 
275
+ #: Safetensors spells fp8 as ``F8_E4M3`` / ``F8_E5M2``. Never match on a ``.scale`` suffix alone:
276
+ #: a plain FLUX.2 checkpoint carries 80 RMSNorm ``norm.query_norm.scale`` weights that are not
277
+ #: quantization scales at all. Only a scale riding on a *fused qkv* is a repack artifact, and it is
278
+ #: the one diffusers' converter chokes on.
279
+ _FP8_PREFIX = "F8_"
280
+ _INT_DTYPES = frozenset({"I8", "U8"})
281
+ _QKV_SCALE_SUFFIXES = ("qkv.scale", "qkv.weight_scale", "qkv.scale_weight")
282
+
283
+
284
+ def quantization_of(path: str | Path) -> str | None:
285
+ """The quantization a checkpoint already carries, or None if it is plain weights.
286
+
287
+ A folder declares it in ``config.json``. A single file does not, so it is sniffed from the
288
+ header: an fp8 dtype, or the per-tensor scale tensors every int8/fp8 repack ships alongside.
289
+ """
290
+ target = Path(path)
291
+ if target.is_dir():
292
+ try:
293
+ import json
294
+
295
+ config = json.loads((target / "config.json").read_text())
296
+ except (OSError, ValueError):
297
+ return None
298
+ if not isinstance(config, dict):
299
+ return None
300
+ declared = config.get("quantization_config")
301
+ if not isinstance(declared, dict):
302
+ return None
303
+ return str(declared.get("quant_method", "quantized"))
304
+
305
+ if not target.is_file() or target.suffix.lower() not in _WEIGHT_SUFFIXES:
306
+ return None
307
+ try:
308
+ from ..checkpoint import CheckpointReader
309
+
310
+ reader = CheckpointReader(target)
311
+ dtypes = reader.dtypes()
312
+ except Exception: # noqa: BLE001 - unreadable means "not something we can classify"
313
+ return None
314
+ weights = {d for key, d in dtypes.items() if key.endswith(".weight")}
315
+ if any(d.startswith(_FP8_PREFIX) for d in weights):
316
+ return "fp8"
317
+ if weights & _INT_DTYPES:
318
+ return "int8"
319
+ if any(key.endswith(_QKV_SCALE_SUFFIXES) for key in dtypes):
320
+ return "quantized"
321
+ return None
322
+
323
+
324
+ def single_file_blocker(path: str | Path) -> str | None:
325
+ """Why a failed single-file load probably failed, or None if this is not the known cause.
326
+
327
+ Diagnostic only, never a gate: nothing calls this to decide whether to attempt a load. The
328
+ converter maps a ``.scale`` key to a weight and chunks it into q/k/v, so a **per-tensor**
329
+ (0-dim) scale on a fused qkv dies deep inside diffusers without naming the file.
330
+ """
331
+ target = Path(path)
332
+ if not target.is_file() or target.suffix.lower() not in _WEIGHT_SUFFIXES:
333
+ return None
334
+ try:
335
+ from ..checkpoint import CheckpointReader
336
+
337
+ shapes = CheckpointReader(target).shapes()
338
+ except Exception: # noqa: BLE001 - unreadable is not our call to make here
339
+ return None
340
+ scalar = [k for k, s in shapes.items() if k.endswith(_QKV_SCALE_SUFFIXES) and not s]
341
+ if not scalar:
342
+ return None
343
+ return f"it carries a single scale value on each of {len(scalar)} fused qkv tensors"
344
+
345
+
273
346
  def is_prequantized(path: str | Path) -> bool:
274
- """Whether a checkpoint folder carries its own quantization (an NF4 dev build, say).
347
+ """Whether a checkpoint carries its own quantization (an NF4 dev folder, an fp8 single file).
275
348
 
276
349
  Such a checkpoint must not be quantized again: its on-disk size already is its resident size,
277
350
  and handing diffusers a second, different quantization config is a hard error. It also means the
278
351
  fit ladder's assumption - that on-disk size is bf16 and quantization can halve it - does not
279
352
  hold here, so the caller passes ``Quantization.NONE`` and loads the weights as they are.
280
353
  """
281
- folder = Path(path)
282
- if not folder.is_dir():
283
- return False
284
- try:
285
- import json
286
-
287
- config = json.loads((folder / "config.json").read_text())
288
- except (OSError, ValueError):
289
- return False
290
- return isinstance(config, dict) and bool(config.get("quantization_config"))
354
+ return quantization_of(path) is not None
291
355
 
292
356
 
293
357
  def config_for(path: str | Path) -> dict[str, object] | None:
@@ -25,6 +25,7 @@ over it. Callers are the model-runner subpackages, which the server registers be
25
25
  from __future__ import annotations
26
26
 
27
27
  import hashlib
28
+ import logging
28
29
  import os
29
30
  from collections.abc import Callable
30
31
  from dataclasses import dataclass
@@ -35,6 +36,9 @@ from typing import TYPE_CHECKING, Any
35
36
  from ..config import data_dir
36
37
  from ..device.policy import Quantization
37
38
  from ..errors import ComponentError
39
+ from . import checkpoint
40
+
41
+ logger = logging.getLogger("inline_core.loaders")
38
42
 
39
43
  if TYPE_CHECKING:
40
44
  from ..graph.loader_runners import LoraRef
@@ -663,14 +667,33 @@ def load_text_encoder(
663
667
  root = ensure_assets(arch)
664
668
  weights_dir = _staged_encoder_dir(arch, file)
665
669
  device_map = {"": device} if device else None
666
- text_encoder = Qwen3Model.from_pretrained(
667
- str(weights_dir),
668
- torch_dtype=dtype,
669
- low_cpu_mem_usage=True,
670
- device_map=device_map,
671
- local_files_only=True,
672
- quantization_config=_quant_config(quant, framework="transformers"),
673
- )
670
+ # A repack that already carries its own scales must not be quantized again, and transformers
671
+ # drops those scales as unexpected keys - leaving packed tensors in layers sized for
672
+ # unpacked ones, which surfaces as a matmul shape error rather than a load failure.
673
+ carried = checkpoint.prequantized_kind(file)
674
+ effective = Quantization.NONE if carried else quant
675
+ if carried:
676
+ logger.info(
677
+ "%s is a %s text encoder; loading it as-is rather than quantizing on top.",
678
+ Path(file).name, carried,
679
+ )
680
+ try:
681
+ text_encoder = Qwen3Model.from_pretrained(
682
+ str(weights_dir),
683
+ torch_dtype=dtype,
684
+ low_cpu_mem_usage=True,
685
+ device_map=device_map,
686
+ local_files_only=True,
687
+ quantization_config=_quant_config(effective, framework="transformers"),
688
+ )
689
+ except Exception as error:
690
+ if not carried:
691
+ raise
692
+ raise ComponentError(
693
+ f"{Path(file).name} is a {carried} text encoder, which this loader cannot read: "
694
+ "its scales are not part of the stock Qwen3 layout. Use the full-precision encoder "
695
+ "(qwen_3_8b.safetensors from Comfy-Org/flux2-klein-9B)."
696
+ ) from error
674
697
  tokenizer = AutoTokenizer.from_pretrained(str(root / "tokenizer"), local_files_only=True)
675
698
  return text_encoder, tokenizer
676
699
 
@@ -1108,15 +1131,30 @@ def load_flux2_transformer(
1108
1131
  kwargs: dict[str, Any] = {}
1109
1132
  if _is_gguf(file):
1110
1133
  kwargs["quantization_config"] = _gguf_config(dtype)
1111
- model = Flux2Transformer2DModel.from_single_file(
1112
- file,
1113
- config=str(root),
1114
- torch_dtype=dtype,
1115
- low_cpu_mem_usage=True,
1116
- device=device,
1117
- local_files_only=True,
1118
- **kwargs,
1119
- )
1134
+ try:
1135
+ model = Flux2Transformer2DModel.from_single_file(
1136
+ file,
1137
+ config=str(root),
1138
+ torch_dtype=dtype,
1139
+ low_cpu_mem_usage=True,
1140
+ device=device,
1141
+ local_files_only=True,
1142
+ **kwargs,
1143
+ )
1144
+ except Exception as error:
1145
+ # Every checkpoint gets attempted - a user's own file is never refused on suspicion.
1146
+ # Explain afterwards instead, because diffusers' converter fails deep inside itself
1147
+ # without naming the file (see flux2/variants.single_file_blocker).
1148
+ from .flux2 import variants as flux2_variants
1149
+
1150
+ blocked = flux2_variants.single_file_blocker(file)
1151
+ if blocked is None:
1152
+ raise
1153
+ raise ComponentError(
1154
+ f"{Path(file).name} did not load: {blocked}, and diffusers splits those as if they "
1155
+ "were weights. A full-precision or .gguf build of the same model will work, and "
1156
+ "Inline Studio quantizes on load to fit your card either way."
1157
+ ) from error
1120
1158
  if _is_gguf(file):
1121
1159
  if loras:
1122
1160
  raise ComponentError(
@@ -185,7 +185,17 @@ class ModelDownloads:
185
185
  if getattr(getattr(error, "response", None), "status_code", None) not in (401, 403):
186
186
  raise
187
187
  shutil.rmtree(staging, ignore_errors=True)
188
- path = _fetch(False)
188
+ try:
189
+ path = _fetch(False)
190
+ except HfHubHTTPError as anonymous:
191
+ # Hugging Face reports a gated or missing repo identically, as 404 "Repository Not
192
+ # Found", which reads as a broken link rather than a licence the user must accept.
193
+ raise RuntimeError(
194
+ f"Could not download {comp.filename} from {comp.repo}. If that repository is "
195
+ f"gated, open https://huggingface.co/{comp.repo} , accept the licence, then "
196
+ "sign in with `hf auth login` (or set HF_TOKEN) and try again. If it is not "
197
+ "gated, the repository has moved or been removed."
198
+ ) from anonymous
189
199
 
190
200
  category_dir.mkdir(parents=True, exist_ok=True)
191
201
  destination = category_dir / comp.filename
@@ -13,6 +13,7 @@ from __future__ import annotations
13
13
 
14
14
  import asyncio
15
15
  import json
16
+ import logging
16
17
  import re
17
18
  import shutil
18
19
  import sys
@@ -35,6 +36,8 @@ from .dataset_import import read_metadata
35
36
 
36
37
  _CAPTION_EXT = ".txt"
37
38
 
39
+ logger = logging.getLogger("inline_core.training")
40
+
38
41
 
39
42
  def _preview_json(preview: Any) -> dict[str, Any]:
40
43
  return {
@@ -543,19 +546,25 @@ class Training:
543
546
  folder = self._run_dir(run_id) / "snapshots"
544
547
  if not folder.is_dir():
545
548
  return []
549
+ name = _safe(str((self._lookup(run_id) or {}).get("name") or run_id))
546
550
  out: list[dict[str, Any]] = []
547
551
  for file in sorted(folder.glob("step-*.safetensors")):
548
552
  digits = file.stem.removeprefix("step-")
553
+ step = int(digits) if digits.isdigit() else 0
549
554
  stat = file.stat()
550
- out.append(
551
- {
552
- "runId": run_id,
553
- "step": int(digits) if digits.isdigit() else 0,
554
- "path": self._relativize(str(file)),
555
- "sizeBytes": stat.st_size,
556
- "createdAt": int(stat.st_mtime * 1000),
557
- }
558
- )
555
+ row: dict[str, Any] = {
556
+ "runId": run_id,
557
+ "step": step,
558
+ "path": self._relativize(str(file)),
559
+ "sizeBytes": stat.st_size,
560
+ "createdAt": int(stat.st_mtime * 1000),
561
+ }
562
+ # Report the export if it is already there, or a reload offers "Add to models" on a
563
+ # snapshot that was auto-exported and makes a second copy under a -2 name.
564
+ exported = f"loras/{name}-step{step}.safetensors"
565
+ if (models_dir() / exported).is_file():
566
+ row["loraPath"] = exported
567
+ out.append(row)
559
568
  return out
560
569
 
561
570
  def export_snapshot(self, run_id: str, step: int) -> dict[str, Any]:
@@ -567,6 +576,10 @@ class Training:
567
576
  source = self._run_dir(run_id) / "snapshots" / f"step-{step:06d}.safetensors"
568
577
  if not source.is_file():
569
578
  raise ValueError(f"Run {run_id} has no snapshot at step {step}.")
579
+ return {"path": self._copy_to_loras(run_id, source, step)}
580
+
581
+ def _copy_to_loras(self, run_id: str, source: Path, step: int) -> str:
582
+ """Place one snapshot in ``models/loras/`` and make the picker aware of it."""
570
583
  run = self._lookup(run_id) or {}
571
584
  loras = models_dir() / "loras"
572
585
  loras.mkdir(parents=True, exist_ok=True)
@@ -576,7 +589,7 @@ class Training:
576
589
  # Same hook a finished run uses, so the new file bumps the registry and reaches the picker.
577
590
  if self._on_output is not None:
578
591
  self._on_output()
579
- return {"path": rel}
592
+ return rel
580
593
 
581
594
  def cancel(self, run_id: str) -> None:
582
595
  proc = self._active.get(run_id)
@@ -642,16 +655,7 @@ class Training:
642
655
  elif kind == "checkpoint" and msg.get("path"):
643
656
  self._persist(run_id, {"checkpointPath": msg["path"]})
644
657
  elif kind == "snapshot" and msg.get("path"):
645
- # The trainer has emitted these all along; nothing listened, so a mid-run LoRA sat
646
- # on disk with no way to reach it.
647
- self._events.broadcast(
648
- "events:trainingSnapshot",
649
- {
650
- "runId": run_id,
651
- "step": int(msg.get("step", 0)),
652
- "path": self._relativize(msg["path"]),
653
- },
654
- )
658
+ self._on_snapshot(run_id, msg)
655
659
  elif kind == "error" and msg.get("message"):
656
660
  # A trainer-side failure: keep it in the run's log so the node shows why it died.
657
661
  self._events.broadcast(
@@ -661,6 +665,31 @@ class Training:
661
665
  saw_done = True
662
666
  return saw_done
663
667
 
668
+ def _on_snapshot(self, run_id: str, msg: dict[str, Any]) -> None:
669
+ """Place a mid-run snapshot where a picker can see it, then announce it.
670
+
671
+ Exported as it is written rather than when the run ends: the reason to snapshot at step 400
672
+ is to test it while step 800 is still training, and the project working dir is not scanned
673
+ by any model catalog.
674
+ """
675
+ step = int(msg.get("step", 0))
676
+ written = Path(msg["path"])
677
+ # A complete TrainingSnapshot, not a partial one: the panel renders size and time straight
678
+ # off the event, and a missing field shows as "NaN KB" until the next listing lands.
679
+ stat = written.stat() if written.is_file() else None
680
+ payload: dict[str, Any] = {
681
+ "runId": run_id,
682
+ "step": step,
683
+ "path": self._relativize(msg["path"]),
684
+ "sizeBytes": stat.st_size if stat else 0,
685
+ "createdAt": int(stat.st_mtime * 1000) if stat else 0,
686
+ }
687
+ try:
688
+ payload["loraPath"] = self._copy_to_loras(run_id, written, step)
689
+ except Exception as error: # noqa: BLE001 - training is the expensive thing in flight
690
+ logger.warning("Could not export the snapshot at step %d: %s", step, error)
691
+ self._events.broadcast("events:trainingSnapshot", payload)
692
+
664
693
  def _on_progress(self, run_id: str, msg: dict[str, Any]) -> None:
665
694
  step = int(msg.get("step", 0))
666
695
  total = int(msg.get("total", 0)) or None
@@ -8,9 +8,14 @@ must agree with safetensors exactly.
8
8
 
9
9
  from __future__ import annotations
10
10
 
11
+ import json
12
+ import struct
13
+ from pathlib import Path
14
+
11
15
  import pytest
12
16
 
13
17
  from inline_core.errors import ComponentError
18
+ from inline_core.models import checkpoint
14
19
  from inline_core.models.checkpoint import CheckpointReader
15
20
 
16
21
  torch = pytest.importorskip("torch")
@@ -77,3 +82,62 @@ def test_a_non_checkpoint_file_is_a_clear_error(tmp_path) -> None:
77
82
  def test_a_missing_file_is_a_clear_error(tmp_path) -> None:
78
83
  with pytest.raises(ComponentError, match="Could not read checkpoint"):
79
84
  CheckpointReader(tmp_path / "absent.safetensors")
85
+
86
+
87
+ # --- already-quantized checkpoints ---------------------------------------------------------------
88
+ #
89
+ # A ComfyUI-quantized text encoder loads into a stock Qwen3Model with its `comfy_quant` and
90
+ # `weight_scale` keys dropped as unexpected, leaving packed tensors in layers sized for unpacked
91
+ # ones. That surfaced as a matmul shape error deep inside torchao, after the pipeline had
92
+ # already reported itself ready.
93
+
94
+
95
+ def _write(path: Path, index: dict[str, object]) -> Path:
96
+ blob = json.dumps(index).encode()
97
+ path.write_bytes(struct.pack("<Q", len(blob)) + blob + b"\x00" * 64)
98
+ return path
99
+
100
+
101
+ def _t(dtype: str, shape: list[int]) -> dict[str, object]:
102
+ return {"dtype": dtype, "shape": shape, "data_offsets": [0, 1]}
103
+
104
+
105
+ def test_a_comfy_quantized_encoder_is_recognised(tmp_path: Path) -> None:
106
+ file = _write(
107
+ tmp_path / "qwen_3_8b_comfyquant.safetensors",
108
+ {
109
+ "model.layers.0.self_attn.k_proj.weight": _t("I8", [1024, 2048]),
110
+ "model.layers.0.self_attn.k_proj.weight_scale": _t("F32", [1024]),
111
+ "model.layers.0.self_attn.k_proj.comfy_quant": _t("I8", []),
112
+ },
113
+ )
114
+ assert checkpoint.prequantized_kind(file) == "prequantized"
115
+
116
+
117
+ def test_an_fp8_checkpoint_is_recognised(tmp_path: Path) -> None:
118
+ file = _write(
119
+ tmp_path / "enc_fp8.safetensors",
120
+ {"model.layers.0.mlp.up_proj.weight": _t("F8_E4M3", [4096, 4096])},
121
+ )
122
+ assert checkpoint.prequantized_kind(file) == "fp8"
123
+
124
+
125
+ def test_a_plain_checkpoint_is_not_flagged(tmp_path: Path) -> None:
126
+ """A false positive here refuses to quantize a model that needs it, so it must not fire on
127
+ ordinary weights or on the RMSNorm tensors every transformer carries."""
128
+ file = _write(
129
+ tmp_path / "qwen_3_8b.safetensors",
130
+ {
131
+ "model.layers.0.self_attn.k_proj.weight": _t("BF16", [1024, 4096]),
132
+ "model.layers.0.input_layernorm.weight": _t("BF16", [4096]),
133
+ "model.layers.0.self_attn.q_norm.scale": _t("BF16", [128]),
134
+ },
135
+ )
136
+ assert checkpoint.prequantized_kind(file) is None
137
+
138
+
139
+ def test_an_unreadable_file_is_not_classified(tmp_path: Path) -> None:
140
+ junk = tmp_path / "junk.safetensors"
141
+ junk.write_bytes(b"\x00" * 32)
142
+ assert checkpoint.prequantized_kind(junk) is None
143
+ assert checkpoint.prequantized_kind(tmp_path / "missing.safetensors") is None
@@ -127,3 +127,71 @@ def test_an_unreadable_file_is_simply_not_flux2(tmp_path: Path) -> None:
127
127
  junk.write_bytes(b"\x00" * 64)
128
128
  assert V.detect(junk) is None
129
129
  assert V.detect(tmp_path / "missing.safetensors") is None
130
+
131
+
132
+ # --- prequantized single files --------------------------------------------------------------------
133
+ #
134
+ # diffusers' single-file converter admits `.scale` keys and then chunks them like a fused qkv
135
+ # weight. A per-tensor scale is 0-dim, so the load dies inside diffusers with no mention of which
136
+ # file caused it. Detecting the checkpoint up front is what turns that into a usable message.
137
+
138
+
139
+ def _write_index(path: Path, index: dict[str, object]) -> Path:
140
+ blob = json.dumps(index).encode()
141
+ path.write_bytes(struct.pack("<Q", len(blob)) + blob + b"\x00" * 64)
142
+ return path
143
+
144
+
145
+ def _tensor(dtype: str, shape: list[int]) -> dict[str, object]:
146
+ return {"dtype": dtype, "shape": shape, "data_offsets": [0, 1]}
147
+
148
+
149
+ def test_fp8_and_int8_single_files_are_prequantized(tmp_path: Path) -> None:
150
+ fp8 = _write_index(
151
+ tmp_path / "fp8.safetensors",
152
+ {
153
+ "double_blocks.0.img_attn.qkv.weight": _tensor("F8_E4M3", [9216, 3072]),
154
+ "double_blocks.0.img_attn.qkv.scale": _tensor("F32", []),
155
+ },
156
+ )
157
+ int8 = _write_index(
158
+ tmp_path / "int8.safetensors",
159
+ {"double_blocks.0.img_mlp.0.weight": _tensor("I8", [12288, 3072])},
160
+ )
161
+ assert V.quantization_of(fp8) == "fp8"
162
+ assert V.quantization_of(int8) == "int8"
163
+ assert V.is_prequantized(fp8) and V.is_prequantized(int8)
164
+
165
+
166
+ def test_a_scale_on_a_fused_qkv_is_a_repack_even_at_bf16(tmp_path: Path) -> None:
167
+ """The ConvRot-style repacks keep bf16 weights but add the scale that breaks the converter."""
168
+ repack = _write_index(
169
+ tmp_path / "convrot.safetensors",
170
+ {
171
+ "double_blocks.0.img_attn.qkv.weight": _tensor("BF16", [9216, 3072]),
172
+ "double_blocks.0.img_attn.qkv.scale": _tensor("F32", []),
173
+ },
174
+ )
175
+ assert V.quantization_of(repack) == "quantized"
176
+
177
+
178
+ def test_rmsnorm_scales_do_not_make_a_plain_checkpoint_look_quantized(tmp_path: Path) -> None:
179
+ """Every plain FLUX.2 checkpoint carries 80 `norm.*.scale` weights. Matching on the `.scale`
180
+ suffix alone would refuse to load the one build that actually works."""
181
+ plain = _write_index(
182
+ tmp_path / "plain.safetensors",
183
+ {
184
+ "double_blocks.0.img_attn.qkv.weight": _tensor("BF16", [9216, 3072]),
185
+ "double_blocks.0.img_attn.norm.query_norm.scale": _tensor("BF16", [128]),
186
+ "double_blocks.0.img_attn.norm.key_norm.scale": _tensor("BF16", [128]),
187
+ },
188
+ )
189
+ assert V.quantization_of(plain) is None
190
+ assert not V.is_prequantized(plain)
191
+
192
+
193
+ def test_a_non_checkpoint_is_not_classified(tmp_path: Path) -> None:
194
+ junk = tmp_path / "notamodel.safetensors"
195
+ junk.write_bytes(b"\x00" * 64)
196
+ assert V.quantization_of(junk) is None
197
+ assert V.quantization_of(tmp_path / "missing.safetensors") is None