inline-core 1.2.71__tar.gz → 1.2.72__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.72}/PKG-INFO +1 -1
  2. {inline_core-1.2.71 → inline_core-1.2.72}/pyproject.toml +1 -1
  3. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/checkpoint.py +5 -0
  4. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/flux2/requirements.py +39 -4
  5. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/flux2/variants.py +75 -11
  6. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/loaders.py +24 -9
  7. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/studio/models.py +11 -1
  8. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/studio/training.py +49 -20
  9. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_flux2_variants.py +68 -0
  10. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_studio_training.py +75 -0
  11. {inline_core-1.2.71 → inline_core-1.2.72}/.gitignore +0 -0
  12. {inline_core-1.2.71 → inline_core-1.2.72}/.python-version +0 -0
  13. {inline_core-1.2.71 → inline_core-1.2.72}/CLAUDE.md +0 -0
  14. {inline_core-1.2.71 → inline_core-1.2.72}/README.md +0 -0
  15. {inline_core-1.2.71 → inline_core-1.2.72}/main.py +0 -0
  16. {inline_core-1.2.71 → inline_core-1.2.72}/scripts/flux2_train_matrix.py +0 -0
  17. {inline_core-1.2.71 → inline_core-1.2.72}/scripts/minimax_h3_lora_check.py +0 -0
  18. {inline_core-1.2.71 → inline_core-1.2.72}/scripts/minimax_h3_train_matrix.py +0 -0
  19. {inline_core-1.2.71 → inline_core-1.2.72}/scripts/reference.py +0 -0
  20. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/__init__.py +0 -0
  21. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/characters/__init__.py +0 -0
  22. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/characters/apply.py +0 -0
  23. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/characters/charfile.py +0 -0
  24. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/characters/encode.py +0 -0
  25. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/characters/library.py +0 -0
  26. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/characters/scoring.py +0 -0
  27. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/characters/weights.py +0 -0
  28. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/components/__init__.py +0 -0
  29. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/components/conditioning.py +0 -0
  30. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/components/interfaces.py +0 -0
  31. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/config.py +0 -0
  32. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/device/__init__.py +0 -0
  33. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/device/auto.py +0 -0
  34. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/device/detect.py +0 -0
  35. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/device/memory.py +0 -0
  36. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/device/policy.py +0 -0
  37. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/device/probe.py +0 -0
  38. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/device/types.py +0 -0
  39. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/errors.py +0 -0
  40. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/extensions/__init__.py +0 -0
  41. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/extensions/api.py +0 -0
  42. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/extensions/constraints.py +0 -0
  43. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/extensions/fetch.py +0 -0
  44. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/extensions/handlers.py +0 -0
  45. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/extensions/importer.py +0 -0
  46. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/extensions/install.py +0 -0
  47. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/extensions/loader.py +0 -0
  48. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/extensions/manifest.py +0 -0
  49. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/extensions/models.py +0 -0
  50. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/extensions/paths.py +0 -0
  51. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/extensions/resolve.py +0 -0
  52. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/extensions/scanner.py +0 -0
  53. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/extensions/state.py +0 -0
  54. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/extensions/tools.py +0 -0
  55. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/ffmpeg.py +0 -0
  56. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/graph/__init__.py +0 -0
  57. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/graph/cache.py +0 -0
  58. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/graph/descriptor.py +0 -0
  59. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/graph/executor.py +0 -0
  60. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/graph/loader_runners.py +0 -0
  61. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/graph/primitives.py +0 -0
  62. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/graph/registry.py +0 -0
  63. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/graph/runners.py +0 -0
  64. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/graph/schema.py +0 -0
  65. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/graph/topo.py +0 -0
  66. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/graph/validate.py +0 -0
  67. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/media.py +0 -0
  68. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/__init__.py +0 -0
  69. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/catalog.py +0 -0
  70. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/controlspace.py +0 -0
  71. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/flux2/__init__.py +0 -0
  72. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/flux2/controlnet.py +0 -0
  73. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/flux2/embeds.py +0 -0
  74. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/flux2/provider.py +0 -0
  75. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/flux2/runner.py +0 -0
  76. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/keymap.py +0 -0
  77. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/krea2/__init__.py +0 -0
  78. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/krea2/convert.py +0 -0
  79. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/krea2/depth_control.py +0 -0
  80. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/krea2/img2img.py +0 -0
  81. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/krea2/provider.py +0 -0
  82. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/krea2/requirements.py +0 -0
  83. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/krea2/runner.py +0 -0
  84. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/lora.py +0 -0
  85. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/__init__.py +0 -0
  86. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/lora_keys.py +0 -0
  87. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/memory.py +0 -0
  88. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/pipeline.py +0 -0
  89. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/provider.py +0 -0
  90. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/requirements.py +0 -0
  91. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/runner.py +0 -0
  92. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/__init__.py +0 -0
  93. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/__init__.py +0 -0
  94. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/allocator_trim_strategy.py +0 -0
  95. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/batch_split.py +0 -0
  96. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/block_streaming/__init__.py +0 -0
  97. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/block_streaming/block_fetcher.py +0 -0
  98. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/block_streaming/builder.py +0 -0
  99. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/block_streaming/disk.py +0 -0
  100. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/block_streaming/pool.py +0 -0
  101. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/block_streaming/provider.py +0 -0
  102. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/block_streaming/source.py +0 -0
  103. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/block_streaming/stream_sync.py +0 -0
  104. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/block_streaming/utils.py +0 -0
  105. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/block_streaming/wrapper.py +0 -0
  106. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/color/__init__.py +0 -0
  107. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/color/audio_mux.py +0 -0
  108. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/color/hlg.py +0 -0
  109. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/color/primaries.py +0 -0
  110. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/color/yuv.py +0 -0
  111. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/components/__init__.py +0 -0
  112. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/components/diffusion_steps.py +0 -0
  113. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/components/guiders.py +0 -0
  114. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/components/noisers.py +0 -0
  115. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/components/patchifiers.py +0 -0
  116. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/components/protocols.py +0 -0
  117. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/components/schedulers.py +0 -0
  118. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/conditioning/__init__.py +0 -0
  119. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/conditioning/exceptions.py +0 -0
  120. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/conditioning/item.py +0 -0
  121. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/conditioning/mask_utils.py +0 -0
  122. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/conditioning/types/__init__.py +0 -0
  123. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/conditioning/types/attention_strength_wrapper.py +0 -0
  124. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/conditioning/types/keyframe_cond.py +0 -0
  125. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/conditioning/types/keyframe_slots.py +0 -0
  126. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/conditioning/types/latent_cond.py +0 -0
  127. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/conditioning/types/mask_cond.py +0 -0
  128. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/conditioning/types/noise_mask_cond.py +0 -0
  129. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/conditioning/types/reference_audio_cond.py +0 -0
  130. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/conditioning/types/reference_video_cond.py +0 -0
  131. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/devices.py +0 -0
  132. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/duration_head/__init__.py +0 -0
  133. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/duration_head/duration_head.py +0 -0
  134. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/duration_head/model_configurator.py +0 -0
  135. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/guidance/__init__.py +0 -0
  136. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/guidance/perturbations.py +0 -0
  137. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/hdr.py +0 -0
  138. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/loader/__init__.py +0 -0
  139. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/loader/attention_ops.py +0 -0
  140. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/loader/fuse_loras.py +0 -0
  141. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/loader/helpers.py +0 -0
  142. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/loader/kernels.py +0 -0
  143. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/loader/module_ops.py +0 -0
  144. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/loader/primitives.py +0 -0
  145. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/loader/registry.py +0 -0
  146. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/loader/sd_ops.py +0 -0
  147. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/loader/sft_loader.py +0 -0
  148. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/loader/single_gpu_model_builder.py +0 -0
  149. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/modality_tiling.py +0 -0
  150. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/__init__.py +0 -0
  151. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/audio_vae/__init__.py +0 -0
  152. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/audio_vae/attention.py +0 -0
  153. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/audio_vae/audio_vae.py +0 -0
  154. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/audio_vae/causal_conv_2d.py +0 -0
  155. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/audio_vae/causality_axis.py +0 -0
  156. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/audio_vae/downsample.py +0 -0
  157. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/audio_vae/model_configurator.py +0 -0
  158. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/audio_vae/ops.py +0 -0
  159. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/audio_vae/resnet.py +0 -0
  160. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/audio_vae/upsample.py +0 -0
  161. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/audio_vae/vocoder.py +0 -0
  162. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/common/__init__.py +0 -0
  163. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/common/normalization.py +0 -0
  164. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/disposable.py +0 -0
  165. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/model_protocol.py +0 -0
  166. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/transformer/__init__.py +0 -0
  167. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/transformer/adaln.py +0 -0
  168. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/transformer/attention.py +0 -0
  169. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/transformer/compiling.py +0 -0
  170. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/transformer/cudagraph_capture.py +0 -0
  171. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/transformer/feed_forward.py +0 -0
  172. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/transformer/gelu_approx.py +0 -0
  173. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/transformer/modality.py +0 -0
  174. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/transformer/model.py +0 -0
  175. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/transformer/model_configurator.py +0 -0
  176. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/transformer/ops.py +0 -0
  177. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/transformer/rope.py +0 -0
  178. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/transformer/text_projection.py +0 -0
  179. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/transformer/timestep_embedding.py +0 -0
  180. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/transformer/transformer.py +0 -0
  181. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/transformer/transformer_args.py +0 -0
  182. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/upsampler/__init__.py +0 -0
  183. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/upsampler/blur_downsample.py +0 -0
  184. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/upsampler/model.py +0 -0
  185. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/upsampler/model_configurator.py +0 -0
  186. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/upsampler/pixel_shuffle.py +0 -0
  187. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/upsampler/res_block.py +0 -0
  188. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/upsampler/spatial_rational_resampler.py +0 -0
  189. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/__init__.py +0 -0
  190. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/attention.py +0 -0
  191. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/conv_video_decoder.py +0 -0
  192. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/convolution.py +0 -0
  193. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/diffusion_tiling.py +0 -0
  194. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/diffusion_video_decoder.py +0 -0
  195. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/enums.py +0 -0
  196. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/memory_efficient_decode.py +0 -0
  197. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/model_configurator.py +0 -0
  198. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/normalization.py +0 -0
  199. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/ops.py +0 -0
  200. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/resnet.py +0 -0
  201. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/sampling.py +0 -0
  202. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/__init__.py +0 -0
  203. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/apply.py +0 -0
  204. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/attention.py +0 -0
  205. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/blocks.py +0 -0
  206. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/chunked/__init__.py +0 -0
  207. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/chunked/attn.py +0 -0
  208. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/chunked/block.py +0 -0
  209. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/chunked/context.py +0 -0
  210. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/chunked/mlp.py +0 -0
  211. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/combined/__init__.py +0 -0
  212. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/combined/attn.py +0 -0
  213. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/combined/block.py +0 -0
  214. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/combined/context.py +0 -0
  215. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/combined/mlp.py +0 -0
  216. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/compiling.py +0 -0
  217. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/config.py +0 -0
  218. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/det_attn_rope.py +0 -0
  219. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/dsl_kernels/__init__.py +0 -0
  220. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/dsl_kernels/apply_dsl.py +0 -0
  221. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/dsl_kernels/attn.py +0 -0
  222. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/dsl_kernels/block.py +0 -0
  223. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/dsl_kernels/chain.py +0 -0
  224. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/fallback_na/__init__.py +0 -0
  225. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/fallback_na/eager.py +0 -0
  226. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/fallback_na/triton_na.py +0 -0
  227. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/layers.py +0 -0
  228. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/qkv.py +0 -0
  229. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/rope.py +0 -0
  230. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/rope_math.py +0 -0
  231. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/swiglu.py +0 -0
  232. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/video_vae.py +0 -0
  233. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/multigpu/__init__.py +0 -0
  234. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/multigpu/gemma/__init__.py +0 -0
  235. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/multigpu/gemma/accelerate_wrapper.py +0 -0
  236. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/multigpu/gemma/batch_parallel_wrapper.py +0 -0
  237. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/multigpu/gemma/broadcast_wrapper.py +0 -0
  238. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/multigpu/gemma/loader.py +0 -0
  239. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/multigpu/sharded_sd.py +0 -0
  240. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/multigpu/transformer/__init__.py +0 -0
  241. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/multigpu/transformer/attention.py +0 -0
  242. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/multigpu/transformer/sequence_parallel.py +0 -0
  243. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/multigpu/transformer/tiled_data_parallel.py +0 -0
  244. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/multigpu/vae/__init__.py +0 -0
  245. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/multigpu/vae/distributed_decoder.py +0 -0
  246. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/quantization/__init__.py +0 -0
  247. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/quantization/blockwise/__init__.py +0 -0
  248. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/quantization/blockwise/_impl.py +0 -0
  249. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/quantization/fp8_cast.py +0 -0
  250. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/quantization/fp8_scaled_mm.py +0 -0
  251. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/quantization/nvfp4/__init__.py +0 -0
  252. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/quantization/nvfp4/convert.py +0 -0
  253. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/quantization/nvfp4/fuse.py +0 -0
  254. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/quantization/nvfp4/linear.py +0 -0
  255. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/quantization/nvfp4/prequant.py +0 -0
  256. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/quantization/nvfp4/types.py +0 -0
  257. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/quantization/policy.py +0 -0
  258. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/text_encoders/__init__.py +0 -0
  259. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/text_encoders/gemma/__init__.py +0 -0
  260. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/text_encoders/gemma/embeddings_connector.py +0 -0
  261. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/text_encoders/gemma/embeddings_processor.py +0 -0
  262. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/text_encoders/gemma/encoders/base_encoder.py +0 -0
  263. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/text_encoders/gemma/encoders/encoder_configurator.py +0 -0
  264. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/text_encoders/gemma/encoders/prompts/gemma3_i2v_system_prompt.txt +0 -0
  265. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/text_encoders/gemma/encoders/prompts/gemma3_t2v_system_prompt.txt +0 -0
  266. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/text_encoders/gemma/encoders/prompts/gemma4_i2v_system_prompt.txt +0 -0
  267. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/text_encoders/gemma/encoders/prompts/gemma4_t2v_system_prompt.txt +0 -0
  268. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/text_encoders/gemma/feature_extractor.py +0 -0
  269. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/text_encoders/gemma/gemma_assets.py +0 -0
  270. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/text_encoders/gemma/tokenizer.py +0 -0
  271. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/tiling.py +0 -0
  272. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/tools.py +0 -0
  273. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/types.py +0 -0
  274. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_core/utils.py +0 -0
  275. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_pipelines/__init__.py +0 -0
  276. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_pipelines/a2vid_two_stage.py +0 -0
  277. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_pipelines/dfr_layout.py +0 -0
  278. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_pipelines/dfr_pipeline.py +0 -0
  279. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_pipelines/distilled.py +0 -0
  280. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_pipelines/distilled_mgpu.py +0 -0
  281. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_pipelines/dubit.py +0 -0
  282. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_pipelines/hdr_ic_lora.py +0 -0
  283. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_pipelines/ic_lora.py +0 -0
  284. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_pipelines/iclora_utils.py +0 -0
  285. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_pipelines/keyframe_interpolation.py +0 -0
  286. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_pipelines/multigpu/__init__.py +0 -0
  287. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_pipelines/multigpu/_broadcast.py +0 -0
  288. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_pipelines/multigpu/bp_gemma_builder.py +0 -0
  289. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_pipelines/multigpu/controller.py +0 -0
  290. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_pipelines/multigpu/delegating_builder.py +0 -0
  291. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_pipelines/multigpu/fleet.py +0 -0
  292. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_pipelines/multigpu/gemma_builders.py +0 -0
  293. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_pipelines/multigpu/nccl_groups.py +0 -0
  294. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_pipelines/multigpu/runner.py +0 -0
  295. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_pipelines/multigpu/sp_builder.py +0 -0
  296. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_pipelines/multigpu/tdp_builder.py +0 -0
  297. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_pipelines/multigpu/vae_builders.py +0 -0
  298. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_pipelines/multigpu/weight_tracker.py +0 -0
  299. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_pipelines/retake.py +0 -0
  300. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_pipelines/t2a_one_stage.py +0 -0
  301. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_pipelines/ti2vid_one_stage.py +0 -0
  302. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_pipelines/ti2vid_two_stages.py +0 -0
  303. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_pipelines/ti2vid_two_stages_hq.py +0 -0
  304. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_pipelines/ti2vid_two_stages_hq_mgpu.py +0 -0
  305. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_pipelines/ti2vid_two_stages_mgpu.py +0 -0
  306. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/__init__.py +0 -0
  307. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/args.py +0 -0
  308. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/blocks.py +0 -0
  309. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/constants.py +0 -0
  310. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/denoisers.py +0 -0
  311. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/gpu_model.py +0 -0
  312. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/helpers.py +0 -0
  313. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/media_io/__init__.py +0 -0
  314. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/media_io/color_config.py +0 -0
  315. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/media_io/decode.py +0 -0
  316. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/media_io/encode.py +0 -0
  317. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/media_io/exr.py +0 -0
  318. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/media_io/range_map.py +0 -0
  319. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/media_io/resize.py +0 -0
  320. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/model_paths.py +0 -0
  321. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/quantization_factory.py +0 -0
  322. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/res2s.py +0 -0
  323. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/samplers.py +0 -0
  324. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/types.py +0 -0
  325. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/minimaxh3/__init__.py +0 -0
  326. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/minimaxh3/adaln.py +0 -0
  327. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/minimaxh3/keys.py +0 -0
  328. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/minimaxh3/load.py +0 -0
  329. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/minimaxh3/lora_keys.py +0 -0
  330. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/minimaxh3/pipeline.py +0 -0
  331. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/minimaxh3/provider.py +0 -0
  332. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/minimaxh3/requirements.py +0 -0
  333. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/minimaxh3/runner.py +0 -0
  334. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/minimaxh3/vae_keys.py +0 -0
  335. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/minimaxh3/vendor/__init__.py +0 -0
  336. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/minimaxh3/vendor/autoencoder_kl_minimax_h3.py +0 -0
  337. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/minimaxh3/vendor/autoencoder_kl_minimax_h3_audio.py +0 -0
  338. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/minimaxh3/vendor/before_denoise.py +0 -0
  339. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/minimaxh3/vendor/before_encoder.py +0 -0
  340. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/minimaxh3/vendor/decoders.py +0 -0
  341. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/minimaxh3/vendor/denoise.py +0 -0
  342. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/minimaxh3/vendor/encoders.py +0 -0
  343. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/minimaxh3/vendor/modular_blocks_minimax_h3.py +0 -0
  344. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/minimaxh3/vendor/modular_pipeline.py +0 -0
  345. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/minimaxh3/vendor/packing.py +0 -0
  346. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/minimaxh3/vendor/packing_ref2va.py +0 -0
  347. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/minimaxh3/vendor/scheduling_minimax_h3.py +0 -0
  348. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/minimaxh3/vendor/transformer_minimax_h3.py +0 -0
  349. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/offload.py +0 -0
  350. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/pipeline_runtime.py +0 -0
  351. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/prepared.py +0 -0
  352. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/preprocess/__init__.py +0 -0
  353. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/preprocess/requirements.py +0 -0
  354. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/preprocess/runner.py +0 -0
  355. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/references.py +0 -0
  356. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/requirements.py +0 -0
  357. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/sampling.py +0 -0
  358. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/video_params.py +0 -0
  359. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/zimage/__init__.py +0 -0
  360. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/zimage/primitives.py +0 -0
  361. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/zimage/provider.py +0 -0
  362. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/zimage/requirements.py +0 -0
  363. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/models/zimage/runner.py +0 -0
  364. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/parallel/__init__.py +0 -0
  365. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/parallel/config.py +0 -0
  366. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/parallel/group.py +0 -0
  367. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/parallel/launch.py +0 -0
  368. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/parallel/protocol.py +0 -0
  369. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/parallel/registry.py +0 -0
  370. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/parallel/worker.py +0 -0
  371. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/runtime/__init__.py +0 -0
  372. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/runtime/context.py +0 -0
  373. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/runtime/file_store.py +0 -0
  374. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/runtime/progress.py +0 -0
  375. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/runtime/run.py +0 -0
  376. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/runtime/store.py +0 -0
  377. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/runtime/video_encode.py +0 -0
  378. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/sampling/__init__.py +0 -0
  379. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/sampling/batch.py +0 -0
  380. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/server/__init__.py +0 -0
  381. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/server/__main__.py +0 -0
  382. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/server/app.py +0 -0
  383. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/server/assets.py +0 -0
  384. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/server/bootstrap.py +0 -0
  385. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/server/frontend.py +0 -0
  386. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/server/manager.py +0 -0
  387. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/server/rpc.py +0 -0
  388. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/server/run_store.py +0 -0
  389. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/server/serialize.py +0 -0
  390. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/studio/__init__.py +0 -0
  391. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/studio/activity.py +0 -0
  392. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/studio/assets.py +0 -0
  393. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/studio/characters.py +0 -0
  394. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/studio/config.py +0 -0
  395. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/studio/dataset_import.py +0 -0
  396. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/studio/fal.py +0 -0
  397. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/studio/frames.py +0 -0
  398. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/studio/generation.py +0 -0
  399. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/studio/graph_build.py +0 -0
  400. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/studio/handlers.py +0 -0
  401. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/studio/image_meta.py +0 -0
  402. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/studio/moodboard.py +0 -0
  403. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/studio/peaks.py +0 -0
  404. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/studio/recipe.py +0 -0
  405. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/studio/schema.py +0 -0
  406. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/studio/store.py +0 -0
  407. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/studio/system_stats.py +0 -0
  408. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/studio/timeline/__init__.py +0 -0
  409. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/studio/timeline/compose.py +0 -0
  410. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/studio/timeline/ffmpeg.py +0 -0
  411. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/studio/timeline/render.py +0 -0
  412. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/studio/timeline/resolve.py +0 -0
  413. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/studio/training_store.py +0 -0
  414. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/takes.py +0 -0
  415. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/training/__init__.py +0 -0
  416. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/training/__main__.py +0 -0
  417. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/training/arch.py +0 -0
  418. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/training/cache.py +0 -0
  419. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/training/caption.py +0 -0
  420. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/training/dataset.py +0 -0
  421. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/training/h3.py +0 -0
  422. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/training/ltx25.py +0 -0
  423. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/training/models.py +0 -0
  424. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/training/precache_store.py +0 -0
  425. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/training/protocol.py +0 -0
  426. {inline_core-1.2.71 → inline_core-1.2.72}/src/inline_core/training/trainer.py +0 -0
  427. {inline_core-1.2.71 → inline_core-1.2.72}/tests/conftest.py +0 -0
  428. {inline_core-1.2.71 → inline_core-1.2.72}/tests/helpers.py +0 -0
  429. {inline_core-1.2.71 → inline_core-1.2.72}/tests/reference/lookalike_faces.json +0 -0
  430. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_cache.py +0 -0
  431. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_catalog.py +0 -0
  432. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_characters_encode.py +0 -0
  433. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_characters_library.py +0 -0
  434. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_characters_rpc.py +0 -0
  435. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_characters_scoring.py +0 -0
  436. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_characters_wiring.py +0 -0
  437. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_charfile.py +0 -0
  438. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_checkpoint.py +0 -0
  439. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_clip_grid_parity.py +0 -0
  440. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_config.py +0 -0
  441. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_dataset_import.py +0 -0
  442. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_device_detect.py +0 -0
  443. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_encoder_parking.py +0 -0
  444. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_executor.py +0 -0
  445. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_extension_api.py +0 -0
  446. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_extension_install.py +0 -0
  447. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_extension_manifest.py +0 -0
  448. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_extension_resolve.py +0 -0
  449. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_extension_scanner.py +0 -0
  450. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_extension_spine.py +0 -0
  451. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_extension_state.py +0 -0
  452. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_file_store.py +0 -0
  453. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_flux2_controlnet.py +0 -0
  454. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_flux2_folder.py +0 -0
  455. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_flux2_resolve.py +0 -0
  456. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_flux2_runner.py +0 -0
  457. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_flux2_training.py +0 -0
  458. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_frontend_serving.py +0 -0
  459. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_hidden_nodes.py +0 -0
  460. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_keymap.py +0 -0
  461. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_krea2_convert.py +0 -0
  462. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_krea2_depth_control.py +0 -0
  463. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_krea2_requirements.py +0 -0
  464. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_krea2_runner.py +0 -0
  465. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_loader_runners.py +0 -0
  466. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_loaders.py +0 -0
  467. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_lora.py +0 -0
  468. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_lora_download.py +0 -0
  469. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_ltx25_lora_keys.py +0 -0
  470. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_ltx25_nodes.py +0 -0
  471. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_ltx25_requirements.py +0 -0
  472. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_ltx25_training.py +0 -0
  473. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_ltx25_wired_refs.py +0 -0
  474. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_manager_queue.py +0 -0
  475. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_memory_policy.py +0 -0
  476. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_minimaxh3_adaln.py +0 -0
  477. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_minimaxh3_keys.py +0 -0
  478. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_minimaxh3_load.py +0 -0
  479. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_minimaxh3_lora_keys.py +0 -0
  480. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_minimaxh3_nodes.py +0 -0
  481. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_minimaxh3_training.py +0 -0
  482. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_model_requirements.py +0 -0
  483. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_offload_prepared.py +0 -0
  484. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_output_kind_contract.py +0 -0
  485. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_parallel_group.py +0 -0
  486. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_pipeline_cache.py +0 -0
  487. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_precache_store.py +0 -0
  488. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_primitives.py +0 -0
  489. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_recipe.py +0 -0
  490. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_references.py +0 -0
  491. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_rpc_bridge.py +0 -0
  492. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_run_store.py +0 -0
  493. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_sampling.py +0 -0
  494. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_schema.py +0 -0
  495. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_server.py +0 -0
  496. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_staged_residency.py +0 -0
  497. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_studio_activity.py +0 -0
  498. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_studio_assets.py +0 -0
  499. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_studio_fal.py +0 -0
  500. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_studio_frames.py +0 -0
  501. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_studio_generation.py +0 -0
  502. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_studio_graph_build.py +0 -0
  503. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_studio_models.py +0 -0
  504. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_studio_moodboard.py +0 -0
  505. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_studio_multi_reference.py +0 -0
  506. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_studio_node_size.py +0 -0
  507. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_studio_peaks.py +0 -0
  508. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_studio_rpc.py +0 -0
  509. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_studio_schema.py +0 -0
  510. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_studio_store.py +0 -0
  511. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_studio_timeline.py +0 -0
  512. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_take_bytes.py +0 -0
  513. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_topo.py +0 -0
  514. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_training_arch.py +0 -0
  515. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_training_dataset.py +0 -0
  516. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_training_models.py +0 -0
  517. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_training_resolve.py +0 -0
  518. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_training_snapshots.py +0 -0
  519. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_validate.py +0 -0
  520. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_video_encode.py +0 -0
  521. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_video_params.py +0 -0
  522. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_webui_install.py +0 -0
  523. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_xfuser_sampler.py +0 -0
  524. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_zimage_primitives.py +0 -0
  525. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_zimage_resolve.py +0 -0
  526. {inline_core-1.2.71 → inline_core-1.2.72}/tests/test_zimage_runner.py +0 -0
  527. {inline_core-1.2.71 → inline_core-1.2.72}/uv.lock +0 -0
  528. {inline_core-1.2.71 → inline_core-1.2.72}/webui.bat +0 -0
  529. {inline_core-1.2.71 → inline_core-1.2.72}/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.72
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.72"
5
5
  description = "The generation engine behind Inline Studio."
6
6
  readme = "README.md"
7
7
  license = "GPL-3.0-or-later"
@@ -64,6 +64,11 @@ class CheckpointReader:
64
64
  infer a checkpoint's architecture (layer counts, widths) before deciding how to load it."""
65
65
  return {key: list(entry.get("shape") or []) for key, entry in self._index.items()}
66
66
 
67
+ def dtypes(self) -> dict[str, str]:
68
+ """Every tensor's on-disk dtype name, header only. These are safetensors' own spellings
69
+ (``BF16``, ``F8_E4M3``, ...), not torch's, so a dtype we cannot load is still reportable."""
70
+ return {key: str(entry.get("dtype") or "") for key, entry in self._index.items()}
71
+
67
72
  def get_tensor(self, key: str, device: str | None = None) -> Any:
68
73
  """One tensor, read straight from its byte range into a fresh buffer."""
69
74
  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:
@@ -1108,15 +1108,30 @@ def load_flux2_transformer(
1108
1108
  kwargs: dict[str, Any] = {}
1109
1109
  if _is_gguf(file):
1110
1110
  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
- )
1111
+ try:
1112
+ model = Flux2Transformer2DModel.from_single_file(
1113
+ file,
1114
+ config=str(root),
1115
+ torch_dtype=dtype,
1116
+ low_cpu_mem_usage=True,
1117
+ device=device,
1118
+ local_files_only=True,
1119
+ **kwargs,
1120
+ )
1121
+ except Exception as error:
1122
+ # Every checkpoint gets attempted - a user's own file is never refused on suspicion.
1123
+ # Explain afterwards instead, because diffusers' converter fails deep inside itself
1124
+ # without naming the file (see flux2/variants.single_file_blocker).
1125
+ from .flux2 import variants as flux2_variants
1126
+
1127
+ blocked = flux2_variants.single_file_blocker(file)
1128
+ if blocked is None:
1129
+ raise
1130
+ raise ComponentError(
1131
+ f"{Path(file).name} did not load: {blocked}, and diffusers splits those as if they "
1132
+ "were weights. A full-precision or .gguf build of the same model will work, and "
1133
+ "Inline Studio quantizes on load to fit your card either way."
1134
+ ) from error
1120
1135
  if _is_gguf(file):
1121
1136
  if loras:
1122
1137
  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
@@ -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
@@ -252,3 +252,78 @@ def test_exporting_the_same_step_twice_does_not_overwrite(
252
252
  def test_exporting_a_missing_step_is_refused(conn: sqlite3.Connection, tmp_path) -> None:
253
253
  with pytest.raises(ValueError):
254
254
  _training(conn, tmp_path).export_snapshot("run1", 999)
255
+
256
+
257
+ def test_a_snapshot_is_exported_as_soon_as_it_is_written(
258
+ conn: sqlite3.Connection, tmp_path, monkeypatch
259
+ ) -> None:
260
+ """Waiting for the run to finish defeats the point: the reason to snapshot at step 400 is to
261
+ test it while step 800 is still training, and the picker cannot see the working dir."""
262
+ from inline_core import config
263
+
264
+ models = tmp_path / "models"
265
+ monkeypatch.setattr(config, "models_dir", lambda: models)
266
+ monkeypatch.setattr("inline_core.studio.training.models_dir", lambda: models)
267
+
268
+ events: list[tuple[str, dict]] = []
269
+
270
+ class _Events:
271
+ def broadcast(self, channel: str, payload: dict) -> None:
272
+ events.append((channel, payload))
273
+
274
+ from inline_core.studio.training import Training
275
+
276
+ training = Training(_Store(conn, tmp_path), _Events())
277
+ _snapshot_files(tmp_path, "run1", [400])
278
+ written = tmp_path / "training_runs" / "run1" / "snapshots" / "step-000400.safetensors"
279
+
280
+ training._on_snapshot("run1", {"path": str(written), "step": 400})
281
+
282
+ (channel, payload) = next(e for e in events if e[0] == "events:trainingSnapshot")
283
+ assert channel == "events:trainingSnapshot"
284
+ # The event names where it landed, so the UI can say "added" without a round trip.
285
+ assert payload["loraPath"].startswith("loras/")
286
+ assert (models / payload["loraPath"]).is_file()
287
+
288
+
289
+ def test_a_failed_snapshot_export_never_stops_the_run(
290
+ conn: sqlite3.Connection, tmp_path, monkeypatch
291
+ ) -> None:
292
+ """Training is the expensive thing in flight; a copy that cannot land must not take it down."""
293
+ monkeypatch.setattr(
294
+ "inline_core.studio.training.models_dir",
295
+ lambda: (_ for _ in ()).throw(OSError("models dir is gone")),
296
+ )
297
+ events: list[dict] = []
298
+
299
+ class _Events:
300
+ def broadcast(self, _channel: str, payload: dict) -> None:
301
+ events.append(payload)
302
+
303
+ from inline_core.studio.training import Training
304
+
305
+ training = Training(_Store(conn, tmp_path), _Events())
306
+ _snapshot_files(tmp_path, "run1", [400])
307
+ written = tmp_path / "training_runs" / "run1" / "snapshots" / "step-000400.safetensors"
308
+
309
+ training._on_snapshot("run1", {"path": str(written), "step": 400})
310
+
311
+ assert events and "loraPath" not in events[-1]
312
+
313
+
314
+ def test_an_already_exported_snapshot_is_not_offered_again(
315
+ conn: sqlite3.Connection, tmp_path, monkeypatch
316
+ ) -> None:
317
+ """Without this, reopening the panel adds a second copy under a `-2` name."""
318
+ from inline_core import config
319
+
320
+ models = tmp_path / "models"
321
+ monkeypatch.setattr(config, "models_dir", lambda: models)
322
+ monkeypatch.setattr("inline_core.studio.training.models_dir", lambda: models)
323
+
324
+ training = _training(conn, tmp_path)
325
+ _snapshot_files(tmp_path, "run1", [400])
326
+
327
+ assert "loraPath" not in training.snapshots("run1")[0]
328
+ training.export_snapshot("run1", 400)
329
+ assert training.snapshots("run1")[0]["loraPath"].startswith("loras/")
File without changes
File without changes
File without changes
File without changes