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