freesolo-flash-dev 1.4.20__tar.gz → 1.4.22__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 (1106) hide show
  1. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/.env.example +10 -0
  2. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/PKG-INFO +1 -1
  3. freesolo_flash_dev-1.4.22/SELF_HOSTING.md +80 -0
  4. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/commands/ops/catalog.py +10 -1
  5. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/scaffold/TRAINING.md +24 -1
  6. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/ui/tables.py +5 -1
  7. freesolo_flash_dev-1.4.22/flash/core/checkpoint_policy.py +20 -0
  8. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/core/spec.py +20 -0
  9. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cost/analytical.py +22 -6
  10. freesolo_flash_dev-1.4.22/flash/engine/worker/train/core/child/checkpoint_schedule.py +70 -0
  11. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/child/trainer.py +14 -2
  12. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/entry/sft_train.py +4 -0
  13. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/entry/sft_train_runner.py +5 -0
  14. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/rl/launch/inputs.py +3 -1
  15. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/sft/child/trainer.py +14 -2
  16. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/sft/setup/checkpoints.py +5 -0
  17. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/core/allocator.py +22 -3
  18. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/core/base.py +4 -2
  19. freesolo_flash_dev-1.4.22/flash/providers/core/handles.py +11 -0
  20. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/core/preflight.py +7 -2
  21. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/core/registry.py +16 -4
  22. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/modal/auth.py +6 -0
  23. freesolo_flash_dev-1.4.22/flash/providers/nebius/__init__.py +1 -0
  24. freesolo_flash_dev-1.4.22/flash/providers/nebius/api.py +268 -0
  25. freesolo_flash_dev-1.4.22/flash/providers/nebius/bootstrap.py +48 -0
  26. freesolo_flash_dev-1.4.22/flash/providers/nebius/config.py +31 -0
  27. freesolo_flash_dev-1.4.22/flash/providers/nebius/handles.py +56 -0
  28. freesolo_flash_dev-1.4.22/flash/providers/nebius/jobs.py +160 -0
  29. freesolo_flash_dev-1.4.22/flash/providers/nebius/prices.py +48 -0
  30. freesolo_flash_dev-1.4.22/flash/providers/nebius/pricing.py +54 -0
  31. freesolo_flash_dev-1.4.22/flash/providers/nebius/provider.py +127 -0
  32. freesolo_flash_dev-1.4.22/flash/providers/nebius/queue.py +30 -0
  33. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/runner/accounting/costs.py +11 -4
  34. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/runner/lifecycle/cleanup.py +4 -4
  35. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/runner/lifecycle/state.py +1 -0
  36. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/runner/lifecycle/status.py +1 -1
  37. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/runner/lifecycle/submit.py +5 -1
  38. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/runner/supervise/attach.py +1 -1
  39. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/runner/supervise/execution.py +32 -0
  40. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/runner/supervise/recovery.py +16 -11
  41. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/runner/supervise/retry_decision.py +23 -4
  42. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/schema/__init__.py +15 -0
  43. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/platform/runtime.py +1 -1
  44. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/app/modal_app.py +4 -26
  45. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/app/rollback.py +1 -4
  46. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/app/rollout.py +5 -17
  47. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/engine/boot.py +4 -0
  48. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/pyproject.toml +2 -2
  49. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/scripts/smoke_modal_sft.py +2 -2
  50. freesolo_flash_dev-1.4.22/scripts/smoke_nebius_sft.py +145 -0
  51. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_model_config.py +2 -3
  52. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_per_model_gpu.py +16 -31
  53. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_rollback_compatibility.py +3 -4
  54. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_rollout_readiness.py +5 -4
  55. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_usage_reporter.py +7 -16
  56. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_gpus.py +3 -1
  57. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_managed_config_fields.py +2 -1
  58. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_modal_provider.py +3 -2
  59. freesolo_flash_dev-1.4.22/tests/test_nebius_spot.py +557 -0
  60. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_persisted_spec_envelope.py +44 -0
  61. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_resume_on_retry.py +2 -2
  62. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_retry_decision.py +38 -0
  63. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_runmgmt.py +1 -1
  64. freesolo_flash_dev-1.4.22/tests/test_spot_billing.py +83 -0
  65. freesolo_flash_dev-1.4.22/tests/test_spot_checkpoint_schedule.py +210 -0
  66. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/uv.lock +1 -1
  67. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/.dockerignore +0 -0
  68. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/.github/CODEOWNERS +0 -0
  69. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  70. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  71. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  72. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/.github/dependabot.yml +0 -0
  73. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/.github/scripts/ci_sharding.py +0 -0
  74. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/.github/scripts/notify_tests_repo.py +0 -0
  75. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/.github/workflows/auto-rebake.yml +0 -0
  76. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/.github/workflows/bake-kernel-cache.yml +0 -0
  77. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/.github/workflows/ci.yml +0 -0
  78. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/.github/workflows/deploy-deepinfer.yml +0 -0
  79. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/.github/workflows/deploy-modal-dev.yml +0 -0
  80. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/.github/workflows/deploy-modal.yml +0 -0
  81. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/.github/workflows/dev-kernel-cache.yml +0 -0
  82. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/.github/workflows/main-source-guard.yml +0 -0
  83. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/.github/workflows/notify-tests-repo.yml +0 -0
  84. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/.github/workflows/production-kernel-cache-ready.yml +0 -0
  85. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/.github/workflows/publish-dev.yml +0 -0
  86. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/.github/workflows/publish-image.yml +0 -0
  87. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/.github/workflows/publish-serving-image.yml +0 -0
  88. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/.github/workflows/publish.yml +0 -0
  89. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/.github/workflows/version-parity.yml +0 -0
  90. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/.github/workflows/worker-image.yml +0 -0
  91. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/.gitignore +0 -0
  92. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/Dockerfile +0 -0
  93. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/Dockerfile.serve +0 -0
  94. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/Dockerfile.worker +0 -0
  95. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/LICENSE +0 -0
  96. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/NOTICE +0 -0
  97. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/build/kernel_cache/.gitignore +0 -0
  98. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/build/kernel_cache/.keep +0 -0
  99. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/deploy/infisical/entrypoint.sh +0 -0
  100. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/docker/Dockerfile.kernelcache +0 -0
  101. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/docker/Dockerfile.kernelcache.relayer +0 -0
  102. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/docker/bake_kernel_cache.py +0 -0
  103. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/docker/bake_sandbox_entry.py +0 -0
  104. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/docker/extract_cudart_fix.py +0 -0
  105. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/docker/kernel_fingerprint.py +0 -0
  106. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/docker/patch_vllm_moe_lora.py +0 -0
  107. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/__init__.py +0 -0
  108. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/_internal/__init__.py +0 -0
  109. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/_internal/background.py +0 -0
  110. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/_internal/channel.py +0 -0
  111. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/_internal/diagnostics.py +0 -0
  112. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/_internal/fileio.py +0 -0
  113. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/_internal/http.py +0 -0
  114. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/_internal/http_deadline.py +0 -0
  115. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/_internal/logging.py +0 -0
  116. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/_internal/openai_sse.py +0 -0
  117. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/_internal/paths.py +0 -0
  118. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/_internal/version.py +0 -0
  119. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/adapters/__init__.py +0 -0
  120. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/adapters/artifacts.py +0 -0
  121. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/adapters/config.py +0 -0
  122. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/adapters/fused_experts.py +0 -0
  123. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/adapters/lora_rank.py +0 -0
  124. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/adapters/targets.py +0 -0
  125. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/artifacts/__init__.py +0 -0
  126. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/artifacts/api.py +0 -0
  127. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/artifacts/config.py +0 -0
  128. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/artifacts/errors.py +0 -0
  129. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/artifacts/manifest.py +0 -0
  130. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/artifacts/storage.py +0 -0
  131. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/__init__.py +0 -0
  132. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/__main__.py +0 -0
  133. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/commands/__init__.py +0 -0
  134. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/commands/env/__init__.py +0 -0
  135. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/commands/env/ops/__init__.py +0 -0
  136. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/commands/env/ops/imports.py +0 -0
  137. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/commands/env/ops/list.py +0 -0
  138. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/commands/env/ops/push.py +0 -0
  139. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/commands/env/ops/retained.py +0 -0
  140. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/commands/env/ops/setup.py +0 -0
  141. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/commands/env/ops/setup_wandb.py +0 -0
  142. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/commands/env/testing/__init__.py +0 -0
  143. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/commands/env/testing/episode.py +0 -0
  144. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/commands/env/testing/eval.py +0 -0
  145. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/commands/env/testing/eval_args.py +0 -0
  146. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/commands/env/testing/evaluations.py +0 -0
  147. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/commands/env/testing/params.py +0 -0
  148. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/commands/env/testing/test.py +0 -0
  149. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/commands/env/testing/warnings.py +0 -0
  150. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/commands/ops/__init__.py +0 -0
  151. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/commands/ops/account.py +0 -0
  152. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/commands/ops/deploy.py +0 -0
  153. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/commands/ops/log_follow.py +0 -0
  154. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/commands/ops/prompt_budget.py +0 -0
  155. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/commands/ops/runs.py +0 -0
  156. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/commands/ops/traces.py +0 -0
  157. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/commands/ops/train.py +0 -0
  158. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/commands/ops/worker_output.py +0 -0
  159. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/commands/serving/__init__.py +0 -0
  160. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/commands/serving/deploy.py +0 -0
  161. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/commands/serving/identity.py +0 -0
  162. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/commands/serving/status.py +0 -0
  163. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/commands/serving/undeploy.py +0 -0
  164. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/parsing/__init__.py +0 -0
  165. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/parsing/account.py +0 -0
  166. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/parsing/custom.py +0 -0
  167. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/parsing/env.py +0 -0
  168. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/parsing/errors.py +0 -0
  169. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/parsing/main.py +0 -0
  170. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/parsing/models.py +0 -0
  171. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/parsing/serve_parser.py +0 -0
  172. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/parsing/traces.py +0 -0
  173. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/parsing/training.py +0 -0
  174. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/scaffold/__init__.py +0 -0
  175. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/ui/__init__.py +0 -0
  176. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/ui/cost.py +0 -0
  177. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/ui/env_panels.py +0 -0
  178. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/ui/heartbeat.py +0 -0
  179. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/ui/render.py +0 -0
  180. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/ui/tty.py +0 -0
  181. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/client/__init__.py +0 -0
  182. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/client/config.py +0 -0
  183. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/client/freesolo_api.py +0 -0
  184. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/client/http.py +0 -0
  185. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/client/runtime_secrets.py +0 -0
  186. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/client/shapes.py +0 -0
  187. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/client/specs.py +0 -0
  188. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/client/streaming.py +0 -0
  189. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/content/__init__.py +0 -0
  190. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/content/image_descriptors.py +0 -0
  191. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/content/multimodal.py +0 -0
  192. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/content/processor.py +0 -0
  193. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/content/reasoning_normalization.py +0 -0
  194. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/content/stop_tokens.py +0 -0
  195. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/content/structured_options.py +0 -0
  196. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/content/structured_outputs.py +0 -0
  197. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/content/thinking.py +0 -0
  198. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/content/training_template.py +0 -0
  199. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/core/__init__.py +0 -0
  200. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/core/catalog.py +0 -0
  201. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/core/grpo.py +0 -0
  202. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/core/spec_persistence.py +0 -0
  203. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cost/__init__.py +0 -0
  204. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cost/currency.py +0 -0
  205. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cost/facts.py +0 -0
  206. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cost/spec.py +0 -0
  207. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cost/types.py +0 -0
  208. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/custom/__init__.py +0 -0
  209. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/custom/async_client.py +0 -0
  210. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/custom/backend.py +0 -0
  211. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/custom/billing.py +0 -0
  212. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/custom/checkpoints.py +0 -0
  213. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/custom/client.py +0 -0
  214. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/custom/controller.py +0 -0
  215. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/custom/managed.py +0 -0
  216. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/custom/server.py +0 -0
  217. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/custom/session.py +0 -0
  218. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/custom/starter.py +0 -0
  219. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/custom/types.py +0 -0
  220. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/custom/validation.py +0 -0
  221. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/custom/worker.py +0 -0
  222. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/__init__.py +0 -0
  223. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/plan/__init__.py +0 -0
  224. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/plan/kv_sizing.py +0 -0
  225. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/plan/model_config_probe.py +0 -0
  226. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/plan/prompt_budget.py +0 -0
  227. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/plan/recipe.py +0 -0
  228. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/plan/steps.py +0 -0
  229. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/plan/vram.py +0 -0
  230. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/profiling/__init__.py +0 -0
  231. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/profiling/dataset_profile.py +0 -0
  232. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/profiling/image_tokens.py +0 -0
  233. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/profiling/reasoning_render.py +0 -0
  234. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/profiling/sft_image_rows.py +0 -0
  235. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/profiling/sft_rows.py +0 -0
  236. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/profiling/sft_tools.py +0 -0
  237. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/profiling/sft_workload.py +0 -0
  238. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/profiling/tokenizer.py +0 -0
  239. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/profiling/workload_profile.py +0 -0
  240. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/result/__init__.py +0 -0
  241. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/result/accounting.py +0 -0
  242. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/result/rollout_samples.py +0 -0
  243. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/support/__init__.py +0 -0
  244. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/support/checkpoint_transport.py +0 -0
  245. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/support/huggingface.py +0 -0
  246. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/support/model_snapshot.py +0 -0
  247. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/support/verl_checkpoint.py +0 -0
  248. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/support/worker_entrypoint.py +0 -0
  249. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/__init__.py +0 -0
  250. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/__main__.py +0 -0
  251. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/entry/__init__.py +0 -0
  252. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/entry/rl.py +0 -0
  253. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/entry/worker.py +0 -0
  254. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/io/__init__.py +0 -0
  255. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/io/artifacts.py +0 -0
  256. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/io/cpu_handoff.py +0 -0
  257. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/io/heartbeat.py +0 -0
  258. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/io/prefetch.py +0 -0
  259. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/io/transfer.py +0 -0
  260. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/io/wandb_log.py +0 -0
  261. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/model/__init__.py +0 -0
  262. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/model/adapter.py +0 -0
  263. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/model/chatml_mask.py +0 -0
  264. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/model/decoding.py +0 -0
  265. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/model/lora.py +0 -0
  266. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/model/packing.py +0 -0
  267. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/perf/__init__.py +0 -0
  268. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/perf/diagnostics.py +0 -0
  269. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/perf/lifecycle.py +0 -0
  270. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/perf/memory.py +0 -0
  271. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/perf/model_size.py +0 -0
  272. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/runtime/__init__.py +0 -0
  273. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/runtime/kernel_warmup.py +0 -0
  274. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/runtime/phases.py +0 -0
  275. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/runtime/rng.py +0 -0
  276. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/runtime/state.py +0 -0
  277. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/__init__.py +0 -0
  278. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/__init__.py +0 -0
  279. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/child/__init__.py +0 -0
  280. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/child/agents.yaml +0 -0
  281. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/child/batch.py +0 -0
  282. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/child/compact_checkpoint.py +0 -0
  283. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/child/configuration.py +0 -0
  284. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/child/engine.py +0 -0
  285. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/child/flashinfer_cache.py +0 -0
  286. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/child/glue.py +0 -0
  287. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/child/launch.py +0 -0
  288. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/child/model.py +0 -0
  289. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/child/observations.py +0 -0
  290. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/child/options.py +0 -0
  291. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/child/prompt_media.py +0 -0
  292. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/child/queue.py +0 -0
  293. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/child/readiness.py +0 -0
  294. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/child/reference.py +0 -0
  295. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/child/registration.py +0 -0
  296. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/child/replay.py +0 -0
  297. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/child/replay_guard.py +0 -0
  298. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/child/rollout.py +0 -0
  299. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/child/rollout_contract.py +0 -0
  300. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/child/startup.py +0 -0
  301. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/child/tool_messages.py +0 -0
  302. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/child/tracking.py +0 -0
  303. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/child/upstream.py +0 -0
  304. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/child/vllm_worker.py +0 -0
  305. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/child/worker.py +0 -0
  306. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/lifecycle/__init__.py +0 -0
  307. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/lifecycle/finalize.py +0 -0
  308. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/lifecycle/ledger.py +0 -0
  309. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/lifecycle/persistence.py +0 -0
  310. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/lifecycle/step_timing.py +0 -0
  311. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/lifecycle/timing.py +0 -0
  312. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/rollout/__init__.py +0 -0
  313. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/rollout/contract.py +0 -0
  314. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/rollout/episode.py +0 -0
  315. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/rollout/generation.py +0 -0
  316. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/rollout/identity.py +0 -0
  317. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/rollout/lifecycle.py +0 -0
  318. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/entry/__init__.py +0 -0
  319. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/entry/backend_common.py +0 -0
  320. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/entry/prompt_rows.py +0 -0
  321. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/entry/rl_train.py +0 -0
  322. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/entry/rl_train_runner.py +0 -0
  323. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/entry/score_batcher.py +0 -0
  324. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/rl/__init__.py +0 -0
  325. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/rl/child/__init__.py +0 -0
  326. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/rl/child/contract.py +0 -0
  327. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/rl/child/credit.py +0 -0
  328. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/rl/child/entry.py +0 -0
  329. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/rl/child/identity.py +0 -0
  330. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/rl/child/metrics.py +0 -0
  331. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/rl/child/multiturn.py +0 -0
  332. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/rl/child/reward.py +0 -0
  333. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/rl/child/rollout.py +0 -0
  334. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/rl/child/trainer.py +0 -0
  335. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/rl/child/transport.py +0 -0
  336. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/rl/launch/__init__.py +0 -0
  337. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/rl/launch/checkpoints.py +0 -0
  338. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/rl/launch/config.py +0 -0
  339. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/rl/launch/verl_config.py +0 -0
  340. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/rl/rollout/__init__.py +0 -0
  341. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/rl/rollout/identity.py +0 -0
  342. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/rl/rollout/multi_turn.py +0 -0
  343. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/rl/rollout/scoring.py +0 -0
  344. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/rl/rollout/single_turn.py +0 -0
  345. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/sft/__init__.py +0 -0
  346. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/sft/child/dataset.py +0 -0
  347. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/sft/child/entry.py +0 -0
  348. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/sft/child/loop.py +0 -0
  349. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/sft/child/schedule.py +0 -0
  350. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/sft/setup/__init__.py +0 -0
  351. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/sft/setup/config.py +0 -0
  352. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/verl/__init__.py +0 -0
  353. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/verl/adapter_merger.py +0 -0
  354. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/verl/capabilities.py +0 -0
  355. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/verl/checkpoints.py +0 -0
  356. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/verl/child_io.py +0 -0
  357. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/verl/diagnostics.py +0 -0
  358. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/verl/parallelism.py +0 -0
  359. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/verl/parent_work.py +0 -0
  360. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/envs/__init__.py +0 -0
  361. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/envs/loading/__init__.py +0 -0
  362. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/envs/loading/adapter.py +0 -0
  363. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/envs/loading/base.py +0 -0
  364. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/envs/loading/loader.py +0 -0
  365. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/envs/loading/pull.py +0 -0
  366. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/envs/loading/staged.py +0 -0
  367. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/envs/meta/__init__.py +0 -0
  368. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/envs/meta/cache_security.py +0 -0
  369. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/envs/meta/cache_storage.py +0 -0
  370. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/envs/meta/dataset_selection.py +0 -0
  371. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/envs/meta/evaluations.py +0 -0
  372. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/envs/meta/identity.py +0 -0
  373. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/envs/meta/namespace_listing.py +0 -0
  374. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/envs/package/__init__.py +0 -0
  375. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/envs/package/direct_tokens.py +0 -0
  376. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/envs/package/limits.py +0 -0
  377. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/envs/package/unpack.py +0 -0
  378. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/envs/registry/__init__.py +0 -0
  379. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/envs/registry/azure.py +0 -0
  380. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/envs/registry/packages.py +0 -0
  381. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/envs/scoring/__init__.py +0 -0
  382. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/envs/scoring/context.py +0 -0
  383. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/envs/scoring/response.py +0 -0
  384. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/__init__.py +0 -0
  385. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/_lifecycle/__init__.py +0 -0
  386. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/_lifecycle/bootstrapping/__init__.py +0 -0
  387. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/_lifecycle/bootstrapping/attempt.py +0 -0
  388. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/_lifecycle/bootstrapping/bootstrap.py +0 -0
  389. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/_lifecycle/bootstrapping/console.py +0 -0
  390. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/_lifecycle/bootstrapping/pip.py +0 -0
  391. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/_lifecycle/bootstrapping/processes.py +0 -0
  392. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/_lifecycle/bootstrapping/secrets.py +0 -0
  393. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/_lifecycle/instances/__init__.py +0 -0
  394. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/_lifecycle/instances/instance.py +0 -0
  395. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/_lifecycle/instances/poll.py +0 -0
  396. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/_lifecycle/instances/poll_instance.py +0 -0
  397. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/_lifecycle/instances/terminal_artifacts.py +0 -0
  398. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/_lifecycle/net/__init__.py +0 -0
  399. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/_lifecycle/net/auth.py +0 -0
  400. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/_lifecycle/net/deadline.py +0 -0
  401. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/_lifecycle/net/http.py +0 -0
  402. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/_lifecycle/net/worker.py +0 -0
  403. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/artifacts/__init__.py +0 -0
  404. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/artifacts/channel.py +0 -0
  405. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/artifacts/weight_cache.py +0 -0
  406. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/core/__init__.py +0 -0
  407. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/core/fit_errors.py +0 -0
  408. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/core/sharding.py +0 -0
  409. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/modal/__init__.py +0 -0
  410. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/modal/api.py +0 -0
  411. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/modal/checkpoint_upload.py +0 -0
  412. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/modal/handles.py +0 -0
  413. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/modal/jobs.py +0 -0
  414. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/modal/prefetch.py +0 -0
  415. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/modal/pricing.py +0 -0
  416. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/modal/provider.py +0 -0
  417. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/modal/startup.py +0 -0
  418. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/py.typed +0 -0
  419. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/runner/__init__.py +0 -0
  420. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/runner/accounting/__init__.py +0 -0
  421. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/runner/accounting/artifacts.py +0 -0
  422. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/runner/accounting/weight_cache.py +0 -0
  423. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/runner/lifecycle/__init__.py +0 -0
  424. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/runner/lifecycle/attempts.py +0 -0
  425. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/runner/lifecycle/claim_lock.py +0 -0
  426. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/runner/lifecycle/deadlines.py +0 -0
  427. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/runner/lifecycle/preparation.py +0 -0
  428. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/runner/lifecycle/reporting.py +0 -0
  429. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/runner/lifecycle/runtime_credentials.py +0 -0
  430. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/runner/results/__init__.py +0 -0
  431. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/runner/results/checkpoints.py +0 -0
  432. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/runner/results/deployments.py +0 -0
  433. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/runner/supervise/__init__.py +0 -0
  434. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/runner/supervise/deploy.py +0 -0
  435. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/runner/supervise/errors.py +0 -0
  436. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/runner/supervise/lifecycle.py +0 -0
  437. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/runner/supervise/transitions.py +0 -0
  438. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/runtime_capsule/__init__.py +0 -0
  439. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/runtime_capsule/build.py +0 -0
  440. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/runtime_capsule/manifest.py +0 -0
  441. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/runtime_capsule/profiles.py +0 -0
  442. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/schema/custom.py +0 -0
  443. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/schema/fields.py +0 -0
  444. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/__init__.py +0 -0
  445. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/app/__init__.py +0 -0
  446. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/app/__main__.py +0 -0
  447. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/app/bootstrap.py +0 -0
  448. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/app/chat_stream.py +0 -0
  449. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/app/http.py +0 -0
  450. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/app/hydration_credentials.py +0 -0
  451. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/app/launch.py +0 -0
  452. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/app/manifest.py +0 -0
  453. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/app/materialize.py +0 -0
  454. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/app/openai.py +0 -0
  455. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/app/progress.py +0 -0
  456. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/contract/__init__.py +0 -0
  457. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/contract/errors.py +0 -0
  458. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/contract/protocol.py +0 -0
  459. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/contract/provenance.py +0 -0
  460. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/contract/responses.py +0 -0
  461. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/contract/urls.py +0 -0
  462. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/control/__init__.py +0 -0
  463. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/control/_canonical.py +0 -0
  464. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/control/_serialization.py +0 -0
  465. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/control/_urls.py +0 -0
  466. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/control/credentials.py +0 -0
  467. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/control/planning.py +0 -0
  468. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/control/types.py +0 -0
  469. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/deployment/__init__.py +0 -0
  470. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/deployment/adapter_check.py +0 -0
  471. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/deployment/deploy.py +0 -0
  472. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/deployment/download.py +0 -0
  473. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/deployment/export.py +0 -0
  474. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/deployment/preflight.py +0 -0
  475. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/deployment/profiles.py +0 -0
  476. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/deployment/readiness.py +0 -0
  477. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/deployment/resolve.py +0 -0
  478. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/provisioning/__init__.py +0 -0
  479. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/provisioning/common/__init__.py +0 -0
  480. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/provisioning/common/records.py +0 -0
  481. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/provisioning/modal/__init__.py +0 -0
  482. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/provisioning/modal/execution/__init__.py +0 -0
  483. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/provisioning/modal/execution/deployment.py +0 -0
  484. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/provisioning/modal/execution/lifecycle.py +0 -0
  485. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/provisioning/modal/execution/operations.py +0 -0
  486. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/provisioning/modal/execution/sdk.py +0 -0
  487. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/provisioning/modal/planning/__init__.py +0 -0
  488. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/provisioning/modal/planning/plan.py +0 -0
  489. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/provisioning/modal/planning/resources.py +0 -0
  490. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/provisioning/modal/planning/wrapper.py +0 -0
  491. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/provisioning/modal/readiness_checks/__init__.py +0 -0
  492. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/provisioning/modal/readiness_checks/probe.py +0 -0
  493. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/provisioning/modal/readiness_checks/readiness.py +0 -0
  494. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/provisioning/modal/readiness_checks/teardown.py +0 -0
  495. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/request/__init__.py +0 -0
  496. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/request/openai.py +0 -0
  497. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/request/runtime_support.py +0 -0
  498. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/request/schema_types.py +0 -0
  499. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/request/streaming.py +0 -0
  500. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/request/text_scan.py +0 -0
  501. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/request/thinking.py +0 -0
  502. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/request/tool_calls.py +0 -0
  503. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/request/tool_template.py +0 -0
  504. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/request/transport.py +0 -0
  505. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/request/validation.py +0 -0
  506. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/runtime/__init__.py +0 -0
  507. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/runtime/adapters.py +0 -0
  508. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/runtime/cache_admission.py +0 -0
  509. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/runtime/cache_retention.py +0 -0
  510. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/runtime/cache_scheduler.py +0 -0
  511. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/runtime/engine.py +0 -0
  512. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/runtime/errors.py +0 -0
  513. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/runtime/hub.py +0 -0
  514. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/runtime/multimodal.py +0 -0
  515. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/runtime/prompt.py +0 -0
  516. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/runtime/prompt_cache.py +0 -0
  517. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/runtime/reasoning_tools.py +0 -0
  518. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/runtime/sampling.py +0 -0
  519. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/runtime/structured_outputs.py +0 -0
  520. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/runtime/token_batch.py +0 -0
  521. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/runtime/token_prefix_cache.py +0 -0
  522. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/runtime/tool_calls.py +0 -0
  523. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/runtime/types.py +0 -0
  524. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/__init__.py +0 -0
  525. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/__main__.py +0 -0
  526. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/asgi/__init__.py +0 -0
  527. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/asgi/app.py +0 -0
  528. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/asgi/cli.py +0 -0
  529. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/billing/__init__.py +0 -0
  530. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/billing/charges.py +0 -0
  531. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/billing/retry.py +0 -0
  532. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/domain/__init__.py +0 -0
  533. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/domain/ops/__init__.py +0 -0
  534. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/domain/ops/repo_cleanup.py +0 -0
  535. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/domain/ops/serving_resources.py +0 -0
  536. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/domain/registry/__init__.py +0 -0
  537. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/domain/registry/blob_envs.py +0 -0
  538. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/domain/registry/checkpoints.py +0 -0
  539. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/domain/registry/env_files.py +0 -0
  540. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/domain/registry/environment_registry.py +0 -0
  541. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/domain/registry/envs.py +0 -0
  542. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/domain/registry/projects.py +0 -0
  543. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/domain/registry/runs.py +0 -0
  544. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/platform/__init__.py +0 -0
  545. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/platform/auth.py +0 -0
  546. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/platform/db.py +0 -0
  547. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/platform/deployment_jobs.py +0 -0
  548. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/platform/deployment_state.py +0 -0
  549. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/platform/deps.py +0 -0
  550. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/platform/internal_client.py +0 -0
  551. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/platform/locks.py +0 -0
  552. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/platform/plane_lease.py +0 -0
  553. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/platform/submission_admission.py +0 -0
  554. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/routes/__init__.py +0 -0
  555. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/routes/adapter_download.py +0 -0
  556. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/routes/custom.py +0 -0
  557. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/routes/env_files.py +0 -0
  558. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/routes/envs.py +0 -0
  559. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/routes/meta.py +0 -0
  560. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/routes/runs.py +0 -0
  561. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/routes/serving.py +0 -0
  562. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/routes/serving_chat.py +0 -0
  563. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/routes/serving_completion.py +0 -0
  564. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/routes/serving_errors.py +0 -0
  565. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/routes/serving_revisions.py +0 -0
  566. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/routes/serving_smoke.py +0 -0
  567. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/routes/submissions.py +0 -0
  568. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/__init__.py +0 -0
  569. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/app/__init__.py +0 -0
  570. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/app/timeouts.py +0 -0
  571. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/deepinfer/__init__.py +0 -0
  572. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/deepinfer/app/__init__.py +0 -0
  573. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/deepinfer/app/autoscaling.py +0 -0
  574. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/deepinfer/app/client.py +0 -0
  575. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/deepinfer/app/events.py +0 -0
  576. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/deepinfer/app/http.py +0 -0
  577. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/deepinfer/app/modal_app.py +0 -0
  578. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/deepinfer/app/render.py +0 -0
  579. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/deepinfer/app/retries.py +0 -0
  580. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/deepinfer/app/rollout.py +0 -0
  581. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/deepinfer/contract/__init__.py +0 -0
  582. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/deepinfer/contract/config.py +0 -0
  583. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/deepinfer/contract/errors.py +0 -0
  584. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/deepinfer/contract/protocol.py +0 -0
  585. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/deepinfer/contract/tokenizer.py +0 -0
  586. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/deepinfer/native/__init__.py +0 -0
  587. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/deepinfer/native/engram_transport.py +0 -0
  588. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/deepinfer/native/image.py +0 -0
  589. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/deepinfer/native/patches.py +0 -0
  590. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/deepinfer/native/transport.py +0 -0
  591. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/deepinfer/runtime/__init__.py +0 -0
  592. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/deepinfer/runtime/bridge.py +0 -0
  593. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/deepinfer/runtime/kernel_cache.py +0 -0
  594. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/deepinfer/runtime/prefill_scheduler.py +0 -0
  595. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/deepinfer/runtime/prefix_cache.py +0 -0
  596. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/deepinfer/runtime/provenance.py +0 -0
  597. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/deepinfer/runtime/routing.py +0 -0
  598. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/deepinfer/runtime/snapshots.py +0 -0
  599. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/deepinfer/runtime/tiered_cache.py +0 -0
  600. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/deepinfer/runtime/warmup.py +0 -0
  601. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/deepinfer/runtime/worker.py +0 -0
  602. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/promotion/__init__.py +0 -0
  603. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/promotion/accounting_smoke_test.py +0 -0
  604. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/promotion/canary.py +0 -0
  605. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/promotion/evidence.py +0 -0
  606. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/promotion/gate.py +0 -0
  607. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/__init__.py +0 -0
  608. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/accounting/__init__.py +0 -0
  609. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/accounting/usage.py +0 -0
  610. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/accounting/usage_facts.py +0 -0
  611. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/accounting/usage_outbox.py +0 -0
  612. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/accounting/usage_retry.py +0 -0
  613. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/engine/__init__.py +0 -0
  614. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/engine/errors.py +0 -0
  615. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/engine/generation.py +0 -0
  616. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/engine/hub.py +0 -0
  617. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/engine/lora_engine.py +0 -0
  618. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/engine/lora_entries.py +0 -0
  619. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/engine/model_config.py +0 -0
  620. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/engine/prequant_config.py +0 -0
  621. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/engine/reasoning_usage.py +0 -0
  622. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/engine/support.py +0 -0
  623. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/engine/text_tokenizer.py +0 -0
  624. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/engine/warmup.py +0 -0
  625. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/http/__init__.py +0 -0
  626. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/http/adapter_routes.py +0 -0
  627. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/http/authorization_transport.py +0 -0
  628. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/http/body_limit.py +0 -0
  629. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/http/context.py +0 -0
  630. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/http/headers.py +0 -0
  631. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/http/inference_routes.py +0 -0
  632. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/http/key_rate_limit.py +0 -0
  633. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/http/rate_limit.py +0 -0
  634. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/http/router.py +0 -0
  635. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/http/routing.py +0 -0
  636. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/http/stream_response.py +0 -0
  637. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/io/__init__.py +0 -0
  638. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/io/cache_namespace.py +0 -0
  639. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/io/multimodal.py +0 -0
  640. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/io/openai_request.py +0 -0
  641. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/io/openai_stream.py +0 -0
  642. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/io/provenance.py +0 -0
  643. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/io/requests.py +0 -0
  644. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/io/responses.py +0 -0
  645. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/io/schemas.py +0 -0
  646. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/io/streaming.py +0 -0
  647. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/io/structured_outputs.py +0 -0
  648. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/store/__init__.py +0 -0
  649. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/store/access.py +0 -0
  650. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/store/lookup.py +0 -0
  651. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/store/persisted_columns.py +0 -0
  652. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/store/persistence.py +0 -0
  653. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/store/registration.py +0 -0
  654. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/store/registry.py +0 -0
  655. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/store/settings.py +0 -0
  656. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/store/supabase_rest.py +0 -0
  657. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/store/undeploy.py +0 -0
  658. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/stream_channel/__init__.py +0 -0
  659. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/stream_channel/_tasks.py +0 -0
  660. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/stream_channel/client.py +0 -0
  661. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/stream_channel/engine.py +0 -0
  662. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/stream_channel/protocol.py +0 -0
  663. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/snapshot/__init__.py +0 -0
  664. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/snapshot/archive.py +0 -0
  665. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/scripts/benchmark_qwen_serving.py +0 -0
  666. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/scripts/benchmark_router_resources.py +0 -0
  667. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/scripts/build_dev_dist.py +0 -0
  668. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/scripts/check_dev_release.py +0 -0
  669. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/scripts/check_file_size.py +0 -0
  670. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/scripts/check_function_size.py +0 -0
  671. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/scripts/check_rollout_identity_actor.py +0 -0
  672. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/scripts/check_source_layout.py +0 -0
  673. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/scripts/check_verl_pin_exists.py +0 -0
  674. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/scripts/fixtures/custom_algorithm.py +0 -0
  675. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/scripts/fixtures/modal_environment/dataset/train.jsonl +0 -0
  676. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/scripts/fixtures/modal_environment/environment.py +0 -0
  677. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/scripts/fixtures/modal_environment/evaluations.py +0 -0
  678. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/scripts/qualify_serving_profile.py +0 -0
  679. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/scripts/qualify_serving_rollout.py +0 -0
  680. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/scripts/quantize_qwen35_base.py +0 -0
  681. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/scripts/smoke_custom_training.py +0 -0
  682. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/scripts/smoke_modal_training.py +0 -0
  683. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/serve_launch.py +0 -0
  684. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/__init__.py +0 -0
  685. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/_helpers/__init__.py +0 -0
  686. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/_helpers/billing_precheck.py +0 -0
  687. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/_helpers/chat_provenance.py +0 -0
  688. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/_helpers/chat_transport.py +0 -0
  689. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/_helpers/deployments.py +0 -0
  690. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/_helpers/managed_chat.py +0 -0
  691. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/_helpers/modal.py +0 -0
  692. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/_helpers/profile.py +0 -0
  693. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/_helpers/runner.py +0 -0
  694. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/_helpers/server_api_plugin.py +0 -0
  695. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/_helpers/source_snapshot.py +0 -0
  696. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/_helpers/specs.py +0 -0
  697. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/_helpers/wire_headers.py +0 -0
  698. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/capture_image_sft_processor_oracle.py +0 -0
  699. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/capture_qwen38_27b_metadata.py +0 -0
  700. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/conftest.py +0 -0
  701. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/fixtures/image_sft_processor_oracle.json +0 -0
  702. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/fixtures/qwen35_9b_target_metadata.json +0 -0
  703. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/fixtures/qwen38_27b_target_metadata.json +0 -0
  704. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/fixtures/qwen3_5_9b_chat_template.jinja +0 -0
  705. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/fixtures/vllm_023_moe_lora/lora_context.py.gz +0 -0
  706. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/fixtures/vllm_023_moe_lora/modular_kernel.py.gz +0 -0
  707. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/fixtures/vllm_023_moe_lora/triton_moe.py.gz +0 -0
  708. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/live/__init__.py +0 -0
  709. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/live/conftest.py +0 -0
  710. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/live/test_sft_thinking_render_live.py +0 -0
  711. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/checkpoint_fixtures.py +0 -0
  712. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/conftest.py +0 -0
  713. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_adapter_hub.py +0 -0
  714. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_artifact_protections.py +0 -0
  715. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_authorization_rollout.py +0 -0
  716. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_authorization_transport.py +0 -0
  717. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_base_model_serving.py +0 -0
  718. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_chat_auth.py +0 -0
  719. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_chat_authorizer.py +0 -0
  720. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_checkpoint_fingerprint_validation.py +0 -0
  721. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_checkpoint_identity_repairs.py +0 -0
  722. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_checkpoint_model_validation.py +0 -0
  723. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_checkpoint_revocation.py +0 -0
  724. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_deepinfer.py +0 -0
  725. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_deepinfer_autoscaling.py +0 -0
  726. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_deepinfer_deadline.py +0 -0
  727. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_deepinfer_hosted.py +0 -0
  728. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_deepinfer_http_deadline.py +0 -0
  729. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_deepinfer_kernel_cache.py +0 -0
  730. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_deepinfer_latency.py +0 -0
  731. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_deepinfer_optimizations.py +0 -0
  732. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_deepinfer_parallel.py +0 -0
  733. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_deepinfer_prefill_scheduler.py +0 -0
  734. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_deepinfer_provenance.py +0 -0
  735. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_deepinfer_retention.py +0 -0
  736. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_deepinfer_retries.py +0 -0
  737. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_deepinfer_rollout.py +0 -0
  738. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_deepinfer_routing.py +0 -0
  739. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_deepinfer_tiering.py +0 -0
  740. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_engine_error_status.py +0 -0
  741. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_engine_shutdown.py +0 -0
  742. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_fp8_config.py +0 -0
  743. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_immutable_engine.py +0 -0
  744. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_immutable_revisions.py +0 -0
  745. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_immutable_schemas.py +0 -0
  746. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_inference_duration.py +0 -0
  747. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_internal_header_integrity.py +0 -0
  748. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_key_rate_limit.py +0 -0
  749. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_key_rate_limit_review.py +0 -0
  750. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_kv_namespace.py +0 -0
  751. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_latency_admission.py +0 -0
  752. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_mirror_sampling_parity.py +0 -0
  753. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_modal_deploy_identity.py +0 -0
  754. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_modal_image_paths.py +0 -0
  755. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_multimodal.py +0 -0
  756. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_openai_stream_options.py +0 -0
  757. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_persistence.py +0 -0
  758. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_pre_first_disconnect.py +0 -0
  759. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_prequant_config.py +0 -0
  760. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_promotion_accounting_smoke.py +0 -0
  761. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_promotion_canary.py +0 -0
  762. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_promotion_evidence.py +0 -0
  763. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_promotion_gate.py +0 -0
  764. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_promotion_release_handoff.py +0 -0
  765. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_qwen_warmup.py +0 -0
  766. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_rate_limit.py +0 -0
  767. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_reasoning_usage.py +0 -0
  768. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_registration_endpoint.py +0 -0
  769. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_registry.py +0 -0
  770. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_registry_coverage.py +0 -0
  771. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_request_body_limit.py +0 -0
  772. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_router.py +0 -0
  773. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_router_coverage.py +0 -0
  774. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_router_edge_coverage.py +0 -0
  775. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_schemas_coverage.py +0 -0
  776. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_serve_reasoning_split.py +0 -0
  777. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_serve_structured_outputs.py +0 -0
  778. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_serve_thinking.py +0 -0
  779. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_settings.py +0 -0
  780. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_stream_channel.py +0 -0
  781. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_stream_response_disconnect.py +0 -0
  782. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_stream_wait_cleanup.py +0 -0
  783. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_structured_outputs.py +0 -0
  784. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_structured_outputs_coverage.py +0 -0
  785. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_supabase_rest_coverage.py +0 -0
  786. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_token_prefix_cache.py +0 -0
  787. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_usage_delivery_concurrency.py +0 -0
  788. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_usage_integrity.py +0 -0
  789. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_usage_outbox.py +0 -0
  790. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving_conformance/__init__.py +0 -0
  791. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving_conformance/conftest.py +0 -0
  792. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving_conformance/test_contract.py +0 -0
  793. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_accounting_coverage.py +0 -0
  794. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_adapter_download.py +0 -0
  795. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_adapter_shard_completeness.py +0 -0
  796. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_agent_flash_cli_contract.py +0 -0
  797. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_algorithms.py +0 -0
  798. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_allocator.py +0 -0
  799. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_authenticated_redirects.py +0 -0
  800. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_azure_artifacts.py +0 -0
  801. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_azure_environment_registry.py +0 -0
  802. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_backend_common.py +0 -0
  803. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_backend_jobspec_contract.py +0 -0
  804. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_background_supervisor.py +0 -0
  805. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_bake_kernel_cache.py +0 -0
  806. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_bake_sandbox_entry.py +0 -0
  807. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_base_environment_integrity.py +0 -0
  808. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_base_model_provenance.py +0 -0
  809. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_billing_response_integrity.py +0 -0
  810. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_billing_retry.py +0 -0
  811. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_bootstrap_process_groups.py +0 -0
  812. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_bootstrap_reentry.py +0 -0
  813. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_bootstrap_worker_cleanup.py +0 -0
  814. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_build_context_contract.py +0 -0
  815. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_cache_admission.py +0 -0
  816. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_cache_retention.py +0 -0
  817. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_cache_scheduler.py +0 -0
  818. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_capture_qwen38_metadata.py +0 -0
  819. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_catalog_consistency.py +0 -0
  820. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_catalog_only_models.py +0 -0
  821. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_charge_pricing.py +0 -0
  822. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_chat_foundations.py +0 -0
  823. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_chat_stop_tokens.py +0 -0
  824. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_chat_worker_isolation.py +0 -0
  825. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_checkpoint_cancellation.py +0 -0
  826. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_checkpoint_deployment_inventory_api.py +0 -0
  827. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_checkpoint_deployments.py +0 -0
  828. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_checkpoint_lifecycle.py +0 -0
  829. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_checkpoint_listing_integrity.py +0 -0
  830. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_checkpoint_storage_overlap.py +0 -0
  831. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_checkpoint_transport.py +0 -0
  832. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_checkpoints.py +0 -0
  833. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_ci_sharding.py +0 -0
  834. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_cli_commands.py +0 -0
  835. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_cli_commands_coverage.py +0 -0
  836. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_cli_credential_shadowing.py +0 -0
  837. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_cli_errors.py +0 -0
  838. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_cli_estimate.py +0 -0
  839. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_cli_gpus_flag.py +0 -0
  840. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_cli_help.py +0 -0
  841. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_cli_main_coverage.py +0 -0
  842. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_cli_managed.py +0 -0
  843. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_cli_render_coverage.py +0 -0
  844. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_cli_render_theme.py +0 -0
  845. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_cli_serve_deploy.py +0 -0
  846. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_cli_serve_status.py +0 -0
  847. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_cli_serve_undeploy.py +0 -0
  848. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_cli_traces.py +0 -0
  849. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_cli_wandb_warning.py +0 -0
  850. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_client.py +0 -0
  851. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_client_deadline_integrity.py +0 -0
  852. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_client_import_purity.py +0 -0
  853. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_client_server_integration.py +0 -0
  854. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_client_stream_reads.py +0 -0
  855. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_compact_checkpoint.py +0 -0
  856. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_config_env_vars.py +0 -0
  857. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_config_overrides.py +0 -0
  858. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_console_upload.py +0 -0
  859. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_controlled_experiment_repairs.py +0 -0
  860. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_cost_analytical.py +0 -0
  861. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_cost_currency.py +0 -0
  862. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_cost_equation.py +0 -0
  863. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_cost_estimate.py +0 -0
  864. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_cost_hardware.py +0 -0
  865. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_cost_models.py +0 -0
  866. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_cpu_checkpoint_handoff.py +0 -0
  867. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_cpu_checkpoint_upload_retry.py +0 -0
  868. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_custom_checkpoints.py +0 -0
  869. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_custom_client.py +0 -0
  870. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_custom_controller_connect.py +0 -0
  871. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_custom_cuda_headroom.py +0 -0
  872. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_custom_gpu_selection.py +0 -0
  873. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_custom_gradients.py +0 -0
  874. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_custom_managed.py +0 -0
  875. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_custom_session.py +0 -0
  876. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_custom_worker.py +0 -0
  877. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_customer_serving_contract.py +0 -0
  878. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_dataset_profile.py +0 -0
  879. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_deploy_latency.py +0 -0
  880. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_deployment_cleanup_resilience.py +0 -0
  881. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_deployment_generation_completion.py +0 -0
  882. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_deployment_registration_cleanup.py +0 -0
  883. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_dev_channel.py +0 -0
  884. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_dev_publish_decision.py +0 -0
  885. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_disk_gb.py +0 -0
  886. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_env_cache_evict.py +0 -0
  887. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_env_delete.py +0 -0
  888. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_env_download.py +0 -0
  889. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_env_download_api.py +0 -0
  890. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_env_evaluations.py +0 -0
  891. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_env_glue_tool_replies.py +0 -0
  892. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_env_list_api.py +0 -0
  893. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_env_list_cli.py +0 -0
  894. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_env_list_registry.py +0 -0
  895. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_env_no_install.py +0 -0
  896. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_env_publish.py +0 -0
  897. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_env_pull.py +0 -0
  898. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_env_pull_coverage.py +0 -0
  899. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_env_pull_loader_coverage.py +0 -0
  900. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_env_pull_managed_control_plane.py +0 -0
  901. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_env_push.py +0 -0
  902. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_env_rate_limit_resolve.py +0 -0
  903. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_env_ref_pinning.py +0 -0
  904. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_env_test.py +0 -0
  905. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_environment_cache_integrity.py +0 -0
  906. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_environment_publish_integrity.py +0 -0
  907. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_envs_coverage.py +0 -0
  908. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_export.py +0 -0
  909. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_flash_mvp.py +0 -0
  910. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_flash_worker.py +0 -0
  911. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_flashinfer_aot_cache.py +0 -0
  912. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_flashinfer_cache_dirs.py +0 -0
  913. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_freesolo_api_transport.py +0 -0
  914. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_fused_expert_warmstart.py +0 -0
  915. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_generation_eos.py +0 -0
  916. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_github_urlopen_retry.py +0 -0
  917. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_gpu_type_single_field.py +0 -0
  918. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_grpo_checkpoint_durability.py +0 -0
  919. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_grpo_metric_stream.py +0 -0
  920. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_grpo_params.py +0 -0
  921. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_grpo_resident_sizing.py +0 -0
  922. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_grpo_reward_batching.py +0 -0
  923. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_grpo_reward_context.py +0 -0
  924. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_grpo_rollout_contract.py +0 -0
  925. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_grpo_rollout_identity.py +0 -0
  926. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_health_liveness.py +0 -0
  927. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_heartbeat_startup_cleanup.py +0 -0
  928. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_hf_retry.py +0 -0
  929. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_hosted_adapter_admission.py +0 -0
  930. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_idempotent_submissions.py +0 -0
  931. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_image_environment_capability.py +0 -0
  932. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_image_incremental_processor.py +0 -0
  933. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_image_sft_markers.py +0 -0
  934. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_image_sft_processor_parity.py +0 -0
  935. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_image_tokens.py +0 -0
  936. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_infisical_secrets.py +0 -0
  937. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_instance_bootstrap_coverage.py +0 -0
  938. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_internal_client.py +0 -0
  939. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_kernel_bake_build_contracts.py +0 -0
  940. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_kernel_cache.py +0 -0
  941. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_kernel_cache_promotion.py +0 -0
  942. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_kernel_fingerprint.py +0 -0
  943. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_kv_util.py +0 -0
  944. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_local_credential_integrity.py +0 -0
  945. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_logging.py +0 -0
  946. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_login_perms.py +0 -0
  947. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_lora_rank_coverage.py +0 -0
  948. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_lora_rank_nested_rung.py +0 -0
  949. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_lora_rank_preflight.py +0 -0
  950. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_lora_targeting.py +0 -0
  951. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_lora_targeting_pinned_verl.py +0 -0
  952. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_managed_hf_repo.py +0 -0
  953. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_metrics_schema_agent_contract.py +0 -0
  954. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_mig_guard.py +0 -0
  955. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_mirror_sampling_parity.py +0 -0
  956. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_modal_api_loop.py +0 -0
  957. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_modal_prefetch_snapshot.py +0 -0
  958. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_modal_startup.py +0 -0
  959. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_modal_training_lifecycle.py +0 -0
  960. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_modal_weight_warm.py +0 -0
  961. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_multi_gpu_gate.py +0 -0
  962. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_multimodal_boundary_integrity.py +0 -0
  963. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_multimodal_training.py +0 -0
  964. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_named_reward_metrics.py +0 -0
  965. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_notify_tests_repo.py +0 -0
  966. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_offline_http.py +0 -0
  967. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_oom_escalate_gpu.py +0 -0
  968. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_orchestrator_flash.py +0 -0
  969. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_packing.py +0 -0
  970. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_packing_coverage.py +0 -0
  971. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_plane_lease.py +0 -0
  972. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_poll_helpers.py +0 -0
  973. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_preflight.py +0 -0
  974. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_processor_chat_template.py +0 -0
  975. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_projects.py +0 -0
  976. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_prompt_budget.py +0 -0
  977. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_qwen9b_base.py +0 -0
  978. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_removed_algorithms.py +0 -0
  979. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_removed_training_settings.py +0 -0
  980. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_replay_guard.py +0 -0
  981. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_repo_cleanup.py +0 -0
  982. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_resolve_params_b.py +0 -0
  983. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_reward_server_cleanup.py +0 -0
  984. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_rl_native_tool_calls.py +0 -0
  985. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_rl_tool_validation.py +0 -0
  986. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_rl_train.py +0 -0
  987. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_rollout_engine_prompt.py +0 -0
  988. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_rollout_samples.py +0 -0
  989. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_run_log_integrity.py +0 -0
  990. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_run_registry_lifecycle.py +0 -0
  991. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_runtime_capsule.py +0 -0
  992. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_runtime_credentials.py +0 -0
  993. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_runtime_secret_integrity.py +0 -0
  994. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_schema_boundary_integrity.py +0 -0
  995. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_serve.py +0 -0
  996. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_serve_app_bootstrap_http.py +0 -0
  997. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_serve_app_launch.py +0 -0
  998. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_serve_app_manifest.py +0 -0
  999. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_serve_app_materialize.py +0 -0
  1000. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_serve_app_packaging.py +0 -0
  1001. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_serve_app_progress.py +0 -0
  1002. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_serve_cache_resource_cleanup.py +0 -0
  1003. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_serve_chat_transport.py +0 -0
  1004. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_serve_control.py +0 -0
  1005. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_serve_modal_contract_lock.py +0 -0
  1006. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_serve_modal_sdk.py +0 -0
  1007. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_serve_modal_sdk_deadlines.py +0 -0
  1008. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_serve_modal_teardown_identity.py +0 -0
  1009. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_serve_profile_qualification.py +0 -0
  1010. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_serve_profiles.py +0 -0
  1011. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_serve_provisioning_common.py +0 -0
  1012. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_serve_provisioning_modal.py +0 -0
  1013. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_serve_reasoning_content.py +0 -0
  1014. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_serve_resolve_provenance.py +0 -0
  1015. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_serve_runtime_adapters.py +0 -0
  1016. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_serve_runtime_engine.py +0 -0
  1017. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_serve_runtime_hub.py +0 -0
  1018. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_serve_runtime_package.py +0 -0
  1019. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_serve_runtime_types.py +0 -0
  1020. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_server_api.py +0 -0
  1021. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_server_app_coverage.py +0 -0
  1022. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_server_auth_singleflight.py +0 -0
  1023. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_server_billing.py +0 -0
  1024. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_server_checkpoints_coverage.py +0 -0
  1025. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_server_db.py +0 -0
  1026. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_server_envs_coverage.py +0 -0
  1027. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_server_locks_coverage.py +0 -0
  1028. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_server_managed_chat_requests.py +0 -0
  1029. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_server_serving_resources.py +0 -0
  1030. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_server_standalone.py +0 -0
  1031. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_serving_conformance_gate.py +0 -0
  1032. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_serving_context_preflight.py +0 -0
  1033. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_serving_contract.py +0 -0
  1034. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_serving_input_integrity.py +0 -0
  1035. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_serving_schema_coverage.py +0 -0
  1036. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_serving_unavailable_errors.py +0 -0
  1037. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_sft_batch_prefetch.py +0 -0
  1038. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_sft_cancel_profile_pricing.py +0 -0
  1039. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_sft_chunked_nll.py +0 -0
  1040. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_sft_cost_reduction.py +0 -0
  1041. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_sft_dataset_lazy_images.py +0 -0
  1042. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_sft_dataset_nulls.py +0 -0
  1043. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_sft_example_selection.py +0 -0
  1044. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_sft_gc_off.py +0 -0
  1045. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_sft_max_context.py +0 -0
  1046. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_sft_memory_policy.py +0 -0
  1047. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_sft_step_floor.py +0 -0
  1048. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_sft_tools.py +0 -0
  1049. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_sft_train.py +0 -0
  1050. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_sft_warmup_schedule.py +0 -0
  1051. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_sft_workload.py +0 -0
  1052. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_smoke_content_integrity.py +0 -0
  1053. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_source_attestation_flow.py +0 -0
  1054. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_source_layout.py +0 -0
  1055. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_source_snapshot.py +0 -0
  1056. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_spec_and_validation.py +0 -0
  1057. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_spec_contract_bytes.py +0 -0
  1058. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_staged_environment.py +0 -0
  1059. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_status_reporting.py +0 -0
  1060. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_status_updates.py +0 -0
  1061. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_step_floor.py +0 -0
  1062. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_step_metrics.py +0 -0
  1063. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_step_timing.py +0 -0
  1064. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_structured_option_safety.py +0 -0
  1065. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_structured_outputs.py +0 -0
  1066. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_structured_runtime_options.py +0 -0
  1067. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_submission_outcome.py +0 -0
  1068. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_terminal_artifacts.py +0 -0
  1069. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_thinking_config.py +0 -0
  1070. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_thinking_tool_calls.py +0 -0
  1071. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_tool_call_exact_parsing.py +0 -0
  1072. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_tool_scalar_unions.py +0 -0
  1073. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_train_context_preflight.py +0 -0
  1074. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_training_controls.py +0 -0
  1075. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_training_phases.py +0 -0
  1076. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_transfer_queue_init.py +0 -0
  1077. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_type_comment_prose.py +0 -0
  1078. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_upstream_rollout_contract.py +0 -0
  1079. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_upstream_runtime_policy.py +0 -0
  1080. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_upstream_verl_contract.py +0 -0
  1081. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_verifiers.py +0 -0
  1082. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_verl_checkpoint_export.py +0 -0
  1083. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_verl_child_plugins.py +0 -0
  1084. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_verl_silence_watchdog.py +0 -0
  1085. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_version.py +0 -0
  1086. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_versioned_rollout_contract.py +0 -0
  1087. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_vl_warmstart_adapter_keys.py +0 -0
  1088. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_vllm_moe_lora_backport.py +0 -0
  1089. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_vram_architecture.py +0 -0
  1090. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_wandb_link.py +0 -0
  1091. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_wandb_naming.py +0 -0
  1092. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_warmstart_adapter_download.py +0 -0
  1093. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_warmstart_cross_repo.py +0 -0
  1094. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_warmstart_error_attribution.py +0 -0
  1095. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_warmstart_image_adapters.py +0 -0
  1096. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_watchdog_startup_cleanup.py +0 -0
  1097. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_weight_cache.py +0 -0
  1098. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_worker_dryrun.py +0 -0
  1099. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_worker_hardexit.py +0 -0
  1100. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_worker_image.py +0 -0
  1101. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_worker_init_heartbeat.py +0 -0
  1102. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_worker_stack.py +0 -0
  1103. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_worker_thinking.py +0 -0
  1104. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_workflow_contracts.py +0 -0
  1105. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_workload_profile.py +0 -0
  1106. {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_zero2_sharding_gate.py +0 -0
@@ -114,3 +114,13 @@ GITHUB_TOKEN=
114
114
  # The worker container image is not configurable: every provider runs the published
115
115
  # ghcr.io/freesolo-co/flash-worker tags (per-GPU-arch kernel-cache variants, falling back to the
116
116
  # base :cu128), selected by GPU class in flash/providers/_lifecycle/net/worker.py.
117
+
118
+ # Optional Nebius-only Spot training. Install/authenticate the Nebius CLI on the control plane.
119
+ # Public config: [gpu] spot = true. Spot is never an implicit Modal fallback.
120
+ # Use a USD-billed project. Region must match the project/subnet and host image.
121
+ # Host image must include Docker, NVIDIA driver/container toolkit, and outbound internet.
122
+ # Worker images are the same curated per-GPU images used by Modal.
123
+ FLASH_NEBIUS_PROJECT_ID=
124
+ FLASH_NEBIUS_REGION=
125
+ FLASH_NEBIUS_SUBNET_ID=
126
+ FLASH_NEBIUS_IMAGE_ID=
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: freesolo-flash-dev
3
- Version: 1.4.20
3
+ Version: 1.4.22
4
4
  Summary: Flash — managed LoRA post-training (SFT/GRPO) for Freesolo environments, driven by the `flash` CLI
5
5
  Project-URL: Homepage, https://github.com/freesolo-co/flash
6
6
  Project-URL: Repository, https://github.com/freesolo-co/flash
@@ -0,0 +1,80 @@
1
+ # Nebius Spot training
2
+
3
+ Set `[gpu] spot = true` to opt into Nebius preemptible VMs. Modal remains
4
+ the default; Spot never falls back to Modal or Nebius on-demand instances. Only
5
+ H100, H200 and B200 are offered. RTX Pro 6000 and L40S are excluded.
6
+
7
+ | GPU | Start below / fixed estimate | Keep running through |
8
+ | --- | ---: | ---: |
9
+ | H100 | $1.00 | $1.50 |
10
+ | H200 | $1.00 | $2.00 |
11
+ | B200 | $4.00 | $5.00 |
12
+
13
+ The table lives in `flash/providers/nebius/pricing.py`. Live regional prices
14
+ admit fitting rentals in H100, H200, B200 priority order, even when H200 is cheaper.
15
+ The entry thresholds price Flash's estimates; running prices can be higher. Estimates exclude disk, network and taxes and are not Nebius invoices.
16
+ Nebius presets are 1 or 8 GPUs. All rented cards contribute to the price.
17
+
18
+ Customer charges use the accepted Spot-priced quote: $1 per GPU-hour for H100/H200
19
+ or $4 for B200 in the work estimate. Completion charges that quote; early completion
20
+ or cancellation charges its completed-work fraction, capped at the accepted quote.
21
+ Recovery preserves Spot pricing even when a saved resource record lacks its provider.
22
+ These are fixed Flash Spot rates, not a pass-through of fluctuating Nebius invoices.
23
+
24
+ Flash reads Nebius's public spot-price API and queues jobs if prices are over the
25
+ cap, absent, stale, or unavailable. It checks again every 60 seconds, without
26
+ consuming training retries or creating a VM. Queueing respects cancellation and
27
+ the run's wall-clock deadline. Admission is rechecked before launch, and every VM
28
+ also carries a Nebius maximum-price policy so a later price rise cannot silently
29
+ switch to uncapped pricing. On preemption, Flash provisions another eligible Spot
30
+ VM and resumes the latest durable trainer checkpoint using its existing retry
31
+ budget. Spot uses a greedy scheduler based on the latest completed step duration and checkpoints before another similar
32
+ step would exceed **10 minutes** of unsaved training (for example, every 2 five-minute
33
+ steps or 10 one-minute steps). It also saves the first and final completed step.
34
+ Steps lasting 10 minutes or longer checkpoint after every step. This is a recovery target: indivisible steps and asynchronous uploads can exceed it.
35
+ Do not set `train.save_every` for Spot. Optional `train.save_at_steps` exports
36
+ cannot suppress automatic recovery saves.
37
+ Work since the latest fully uploaded checkpoint may be repeated, including any
38
+ checkpoint whose upload was still in progress. Portal is not used.
39
+
40
+ On the control-plane host:
41
+
42
+ 1. Install and authenticate the current Nebius CLI with access to the intended
43
+ USD-billed project, compute resources and billing pricing policies.
44
+ 2. Set `FLASH_NEBIUS_PROJECT_ID`, `FLASH_NEBIUS_REGION`,
45
+ `FLASH_NEBIUS_SUBNET_ID`, and `FLASH_NEBIUS_IMAGE_ID`. The region must match
46
+ the project and subnet. The configured GPU host image must have Docker,
47
+ a suitable NVIDIA driver and NVIDIA container toolkit installed, plus outbound
48
+ access to the worker container registry and Azure Blob Storage. B200 requires the
49
+ driver/CUDA support of Flash's configured Blackwell worker image.
50
+ 3. Retain the existing worker image, artifact and runtime-secret configuration.
51
+ The VM launches the same Flash worker capsule and training container as Modal.
52
+ 4. Start the control plane and submit with `spot = true`. `flash gpus`
53
+ lists the fixed Spot estimates alongside Modal rates. Set `spot = false` for regular
54
+ Modal training. Legacy `provider = "spot"` is also accepted.
55
+
56
+ Supported platform IDs are `gpu-h100-sxm`, `gpu-h200-sxm`, and `gpu-b200-sxm`;
57
+ only platforms offered in the configured region can be admitted. Managed boot
58
+ disks use fast ephemeral Network SSD Non-replicated storage, rounded to 93-GiB
59
+ allocation units with a 279-GiB minimum for the image, model and checkpoints.
60
+ They are deleted with the VM; fully uploaded Azure Blob Storage checkpoints are the
61
+ durable recovery source. Runtime secrets are in root-only cloud-init files;
62
+ restrict access to VM metadata and the image accordingly. Use a dedicated project
63
+ for Flash training resources. The worker has a deadline shutdown, and normal
64
+ cancellation, completion and orphan reconciliation delete the VM and its disk.
65
+
66
+ References: [Nebius spot prices](https://docs.nebius.com/signup-billing/spot-prices),
67
+ [maximum-price policies](https://docs.nebius.com/signup-billing/manage-pricing-policy),
68
+ and [preemptible VM lifecycle](https://docs.nebius.com/compute/virtual-machines/preemptible).
69
+
70
+ To qualify a configured Nebius account, create a disposable private Azure artifact repository, configure Azure artifact storage locally, and run:
71
+
72
+ ```sh
73
+ python scripts/smoke_nebius_sft.py --run-paid-test --repo owner/private-test-dataset
74
+ ```
75
+
76
+ This rents one H100 at a time, interrupts a two-step SFT job after checkpoint 1
77
+ is fully uploaded, then verifies that a replacement VM resumes and finishes step 2. Each attempt is limited to 45 minutes to allow cold image downloads and full-state checkpoint transfers.
78
+ The harness deletes its VMs and managed disks; test artifacts remain in the private
79
+ repository. GPU quota and active billing are required. Price thresholds, GPU
80
+ priority, cancellation and adaptive checkpoint timing are covered by offline tests.
@@ -20,6 +20,7 @@ def cmd_gpus(args) -> int:
20
20
  """List validated managed GPU classes, VRAM, and estimated $/hr."""
21
21
  from flash.providers.core.base import GPU_INFO
22
22
  from flash.providers.modal.pricing import static_rates as modal_static_rates
23
+ from flash.providers.nebius.pricing import SPOT_GPUS
23
24
 
24
25
  modal_rates = modal_static_rates()
25
26
  infos = sorted(
@@ -28,10 +29,16 @@ def cmd_gpus(args) -> int:
28
29
  tip = (
29
30
  "Tip: GPU allocation is automatic by default.\n"
30
31
  "The allocator picks the cheapest validated class that fits. Pin a specific class by "
31
- 'adding type = "<CLASS>" to the [gpu] section.'
32
+ 'adding type = "<CLASS>" to the [gpu] section.\n'
33
+ "Set spot = true for Nebius only. Spot rates are entry estimates; jobs start strictly below them.\n"
34
+ "Spot priority: H100, H200, B200. Keep-running caps: $1.50, $2.00, $5.00 per GPU-hour."
32
35
  )
33
36
  if render.styled():
34
37
  rows = [(info.name, info.vram_gb, modal_rates.get(info.name)) for info in infos]
38
+ rows += [
39
+ (name + " (Spot)", GPU_INFO[name].vram_gb, float(shape.hourly_usd))
40
+ for name, shape in SPOT_GPUS.items()
41
+ ]
35
42
  print(tables.gpus_table(rows, tip))
36
43
  return 0
37
44
 
@@ -42,5 +49,7 @@ def cmd_gpus(args) -> int:
42
49
  for info in infos:
43
50
  modal_rate = modal_rates.get(info.name)
44
51
  print(f"{info.name:<16}{info.vram_gb:>5}G{fmt_rate(modal_rate):>11}")
52
+ for name, shape in SPOT_GPUS.items():
53
+ print(f"{name + ' (Spot)':<16}{GPU_INFO[name].vram_gb:>5}G{float(shape.hourly_usd):>11.3f}")
45
54
  print(f"\n{tip}")
46
55
  return 0
@@ -407,6 +407,17 @@ There is no "all" sentinel, so this number is duplicated from the data into the
407
407
  **can drift**: if the dataset later grows, a stale `max_examples` silently trains on a
408
408
  subset instead of erroring. Re-check it whenever the dataset or the params change.
409
409
 
410
+ Select Spot directly in your editable training TOML:
411
+
412
+ ```toml
413
+ [gpu]
414
+ spot = false # set true for Nebius Spot; false uses regular training
415
+ ```
416
+
417
+ Spot only uses Nebius and prefers fitting H100s, then H200s, then B200s.
418
+ It queues until the price is below $1, $1, or $4 per GPU-hour respectively.
419
+ Once running, the corresponding maximum prices are $1.50, $2, and $5.
420
+
410
421
  GPU allocation and Azure artifacts are **managed by default**: leave `[gpu] type` unset to
411
422
  let the allocator pick the cheapest fitting validated class, while `train.hf_repo` remains
412
423
  platform-managed. `[gpu] providers` takes an ordered list of provider names and prefers them in
@@ -941,7 +952,7 @@ an epoch is one pass over the retained prompt pool after `max_examples` and prom
941
952
  optimizer-step counts are derived from those epochs. A positive `[train] max_steps` replaces that
942
953
  derived count with an exact update horizon for every algorithm. `[train] save_at_steps`
943
954
  requires a positive `max_steps` so its horizon is authoritative even when SFT packing changes the
944
- realized batch shape. When non-empty, exact save steps suppress periodic `save_every` checkpoints, and the
955
+ realized batch shape. For Modal, non-empty exact save steps suppress periodic `save_every` checkpoints, and the
945
956
  run fails if a requested exact save cannot be saved and published.
946
957
 
947
958
  ---
@@ -1644,3 +1655,15 @@ See the full reference at https://docs.freesolo.co.
1644
1655
  LoRA+ and entropy-quantile filtering have been removed, including their stored configuration
1645
1656
  fields and resume support. Configs and stored job payloads containing either removed field are
1646
1657
  rejected as unknown settings; no legacy optimizer or loss shim is installed.
1658
+
1659
+ ### Spot recovery checkpoints
1660
+
1661
+ With `[gpu] spot = true`, Flash uses Nebius and manages recovery checkpoints automatically.
1662
+ A greedy scheduler uses the latest step duration, targeting at most 10 minutes of
1663
+ unsaved training: 5-minute steps save every 2 steps; 1-minute steps every 10.
1664
+ The first and final completed steps also save. Steps lasting 10 minutes or longer save after every step. Slow steps or uploads can exceed
1665
+ the recovery target. Omit `train.save_every`. Set `spot = false` for regular training.
1666
+ An optional `train.save_at_steps` schedule adds model exports to those automatic
1667
+ saves; it cannot disable them. After preemption, the replacement Nebius Spot VM
1668
+ resumes the latest fully uploaded trainer checkpoint. An interrupted upload is
1669
+ not a valid resume point.
@@ -60,7 +60,11 @@ def gpus_table(rows: list[tuple[str, int, float | None]], tip: str) -> str:
60
60
  """GPU classes: (name, vram_gb, $/hr or None)."""
61
61
  body = []
62
62
  for name, vram, rate in rows:
63
- rate_cell = (f"${rate:.2f}", _TEAL) if rate else ("-", _FAINT)
63
+ rate_cell = (
64
+ ((f"${rate:.3f}" if "(Spot)" in name else f"${rate:.2f}"), _TEAL)
65
+ if rate
66
+ else ("-", _FAINT)
67
+ )
64
68
  body.append([(name, _ACCENT2), (f"{vram} GB", _GRAY), rate_cell])
65
69
  table = _format_table(["GPU", "VRAM", "$/HR"], body, aligns=["l", "r", "r"])
66
70
  return _stdout_encodable_text(
@@ -0,0 +1,20 @@
1
+ """Automatic Spot recovery policy shared by all training backends."""
2
+
3
+ from dataclasses import replace
4
+
5
+ SPOT_CHECKPOINT_SECONDS = 600
6
+
7
+
8
+ def spot_checkpoint_train(train):
9
+ """Keep requested model exports separate from the runtime recovery clock.
10
+
11
+ Ten was the legacy automatic interval. Accept it on old persisted specs but
12
+ normalize it away; newly authored Spot jobs should omit save_every entirely.
13
+ """
14
+ if train.save_every not in (None, 10):
15
+ raise ValueError("Spot checkpointing is time-based and automatic; remove train.save_every")
16
+ return replace(train, save_every=None)
17
+
18
+
19
+ def is_spot_spec(spec) -> bool:
20
+ return bool(getattr(getattr(spec, "gpu", None), "spot", False))
@@ -424,6 +424,7 @@ class GpuSpec:
424
424
  # PLATFORM-MANAGED: runner assigns weight-cache volume; None = cold download.
425
425
  network_volume: str | None = None
426
426
  network_volume_gb: int = 100
427
+ spot: bool = False
427
428
  provider: str = ""
428
429
  providers: tuple[str, ...] = ()
429
430
  # number of cards of `type` a single training worker occupies (1..8). count > 1 provisions a
@@ -441,6 +442,17 @@ class GpuSpec:
441
442
  )
442
443
  if self.provider and providers:
443
444
  raise ValueError("gpu.provider and gpu.providers cannot both be set")
445
+ if type(self.spot) is not bool:
446
+ raise TypeError("gpu.spot must be a boolean")
447
+ if self.spot:
448
+ if self.provider not in ("", "spot") or providers not in ((), ("spot",)):
449
+ raise ValueError(
450
+ "gpu.spot=true requires Nebius Spot; remove other provider choices"
451
+ )
452
+ if not providers:
453
+ object.__setattr__(self, "provider", "spot")
454
+ if self.provider == "spot" or providers == ("spot",):
455
+ object.__setattr__(self, "spot", True)
444
456
  if not isinstance(self.type, str):
445
457
  raise TypeError("gpu.type must be a string")
446
458
  gpu_type = (
@@ -564,6 +576,10 @@ class JobSpec:
564
576
  custom: dict[str, Any] = field(default_factory=dict)
565
577
 
566
578
  def __post_init__(self) -> None:
579
+ if self.gpu.provider.strip().lower() == "spot" or self.gpu.providers == ("spot",):
580
+ from flash.core.checkpoint_policy import spot_checkpoint_train
581
+
582
+ object.__setattr__(self, "train", spot_checkpoint_train(self.train))
567
583
  object.__setattr__(self, "seed", parse_seed(self.seed))
568
584
  object.__setattr__(self, "model_revision", _model_revision(self.model_revision))
569
585
  for field_name in ("model_revision_auto", "model_revision_force_pin"):
@@ -687,6 +703,9 @@ class JobSpec:
687
703
  differently, so removing either pop would break existing digests.
688
704
  """
689
705
  data = asdict(self)
706
+ # Keep pre-Spot preparation digests stable while binding opt-in Spot to integrity checks.
707
+ if not self.gpu.spot:
708
+ data["gpu"].pop("spot", None)
690
709
  if not data["custom"]:
691
710
  data.pop("custom")
692
711
  # Preserve public and worker preparation digests for all existing runs.
@@ -818,6 +837,7 @@ class JobSpec:
818
837
  type=gpu_type,
819
838
  provider=provider,
820
839
  providers=providers,
840
+ spot=gpu.get("spot", False),
821
841
  disk_gb=int(gpu.get("disk_gb", 60)),
822
842
  max_wall_seconds=int(gpu.get("max_wall_seconds", 24 * 3600)),
823
843
  max_retries=int(gpu.get("max_retries", 5)),
@@ -438,6 +438,8 @@ def _quote_gpu_ceiling(
438
438
  return geometry_safe_gpu_cap(config.model_id, ceiling, model_revision=config.model_revision)
439
439
  from flash.providers.core.base import smallest_fitting_gpu_count
440
440
 
441
+ if config.provider == "spot":
442
+ return auto_cap
441
443
  return (
442
444
  smallest_fitting_gpu_count(
443
445
  need,
@@ -462,7 +464,7 @@ def _offline_preferred_gpu_shape(config: RunConfig) -> tuple[str, int, int, str,
462
464
  configured = available_providers()
463
465
  # an unconfigured plane (no credentials anywhere) has nothing to filter against; fall back to the
464
466
  # registered set so the quote keeps its historical structural answer instead of going empty.
465
- eligible = configured or PROVIDER_NAMES
467
+ eligible = tuple(name for name in (configured or PROVIDER_NAMES) if name != "spot")
466
468
  for provider in config.providers:
467
469
  if provider not in eligible:
468
470
  continue
@@ -497,6 +499,10 @@ def _offline_gpu_shape(config: RunConfig) -> tuple[str, int, int, str, float]:
497
499
  Preparation must not consume live-capacity failures before run creation. Rank rentable shapes
498
500
  offline, then replace the quote with the selected live candidate before provisioning.
499
501
  """
502
+ if config.providers == ("spot",):
503
+ from dataclasses import replace
504
+
505
+ return _offline_gpu_shape(replace(config, provider="spot", providers=()))
500
506
  if config.providers:
501
507
  return _offline_preferred_gpu_shape(config)
502
508
  # Fail closed on a model that cannot be sized at all. Curated entries answer from the catalog
@@ -522,7 +528,7 @@ def _offline_gpu_shape(config: RunConfig) -> tuple[str, int, int, str, float]:
522
528
  combined_vram_gb,
523
529
  )
524
530
 
525
- provider = config.provider if config.provider != "auto" else "auto"
531
+ provider = config.provider
526
532
  if config.gpu_type:
527
533
  # rank every class the author declared acceptable, not just the head. `allocate()` cost-ranks
528
534
  # the whole ordered set, so quoting the head alone prices a shape the run may never be given
@@ -547,7 +553,12 @@ def _offline_gpu_shape(config: RunConfig) -> tuple[str, int, int, str, float]:
547
553
  ranked = []
548
554
  for gpu in names:
549
555
  info = GPU_INFO[gpu]
550
- for count in rentable_gpu_counts(min(safe_gpu_count, info.max_count)):
556
+ counts = rentable_gpu_counts(min(safe_gpu_count, info.max_count))
557
+ if provider == "spot":
558
+ from flash.providers.nebius.pricing import SPOT_GPUS
559
+
560
+ counts = tuple(n for n in counts if n in SPOT_GPUS[gpu].counts)
561
+ for count in counts:
551
562
  # credit only the cards that JOIN the run, matching the allocator's `_fits`. quoting the
552
563
  # billed count here made the two disagree: a 27B at 128k over 10 rows was quoted 4x H200
553
564
  # (460 GB credited against a 422 GB need) while the allocator launches 2 ranks -- 234 GB
@@ -555,15 +566,20 @@ def _offline_gpu_shape(config: RunConfig) -> tuple[str, int, int, str, float]:
555
566
  launched = executed_gpu_count(config, count)
556
567
  if combined_vram_gb(info.vram_gb, launched) < need:
557
568
  continue
558
- from flash.providers.modal.pricing import hourly_rate
569
+ from flash.providers.core.registry import get_provider
559
570
 
560
- hourly = hourly_rate(gpu)
571
+ hourly = get_provider("modal" if provider == "auto" else provider).hourly_rate(gpu)
561
572
  step_seconds = sharded_step_seconds(
562
573
  config, gpu, count, "" if provider == "auto" else provider
563
574
  )
575
+ from flash.providers.nebius.pricing import priority as spot_priority
576
+
564
577
  ranked.append(
565
578
  (
566
- hourly * count * step_seconds,
579
+ (
580
+ spot_priority(gpu) if provider == "spot" else 0,
581
+ hourly * count * step_seconds,
582
+ ),
567
583
  count,
568
584
  combined_vram_gb(info.vram_gb, launched),
569
585
  info.vram_gb,
@@ -0,0 +1,70 @@
1
+ """Time-based checkpoint decisions; copied unchanged into isolated trainer children."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import os
6
+ import time
7
+
8
+ SPOT_RECOVERY_SECONDS = 600
9
+
10
+
11
+ def enabled() -> bool:
12
+ return os.environ.get("FLASH_SPOT_CHECKPOINT_SECONDS") == str(SPOT_RECOVERY_SECONDS)
13
+
14
+
15
+ class CheckpointClock:
16
+ """Observe completed steps and save before another typical step exceeds the target.
17
+
18
+ Save the first completed step after startup/resume to establish a safe baseline.
19
+ Greedily allow another step only when its latest measured duration fits the budget.
20
+ Steps at or above the target save after every completed step.
21
+ Local checkpoint-writing time is excluded from the step-duration samples.
22
+ """
23
+
24
+ def __init__(self, *, clock=time.monotonic, target_seconds=SPOT_RECOVERY_SECONDS):
25
+ self.clock = clock
26
+ self.target_seconds = target_seconds
27
+ self.last_step = None
28
+ self.last_end = None
29
+ self.last_save = None
30
+
31
+ def due(self, step: int, *, required=(), final_step: int) -> bool:
32
+ now = self.clock()
33
+ if step <= 0 or (self.last_step is not None and step <= self.last_step):
34
+ return False
35
+ step_seconds = (
36
+ max(0.001, (now - self.last_end) / (step - self.last_step))
37
+ if self.last_end is not None
38
+ else 0
39
+ )
40
+ self.last_step, self.last_end = step, now
41
+ if self.last_save is None or step in required or step == final_step:
42
+ return True
43
+ elapsed = now - self.last_save
44
+ return elapsed >= self.target_seconds or elapsed + step_seconds > self.target_seconds
45
+
46
+ def saved(self) -> None:
47
+ self.last_save = self.last_end = self.clock()
48
+
49
+
50
+ def should_save(owner, step: int, required, final_step: int, *, distributed=False) -> bool:
51
+ timer = getattr(owner, "_flash_checkpoint_clock", None)
52
+ if timer is None:
53
+ timer = owner._flash_checkpoint_clock = CheckpointClock()
54
+ decision = timer.due(step, required=required, final_step=final_step)
55
+ if distributed:
56
+ # SFT calls this on every FSDP rank. One rank's clock must decide for all
57
+ # ranks or some will skip a collective save while others enter it.
58
+ import torch
59
+ import torch.distributed as dist
60
+
61
+ if dist.is_initialized():
62
+ device = torch.cuda.current_device() if dist.get_backend() == "nccl" else "cpu"
63
+ flag = torch.tensor([int(decision)], dtype=torch.int32, device=device)
64
+ dist.broadcast(flag, src=0)
65
+ decision = bool(flag.item())
66
+ return decision
67
+
68
+
69
+ def saved(owner) -> None:
70
+ owner._flash_checkpoint_clock.saved()
@@ -7,6 +7,7 @@ from verl.trainer.ppo.utils import Role
7
7
  from verl.trainer.ppo.v1.trainer_sync import PPOTrainerSync
8
8
 
9
9
  from flash.engine.worker.runtime.phases import training_phase
10
+ from flash.engine.worker.train.core.child import checkpoint_schedule
10
11
  from flash.engine.worker.train.core.child.options import RuntimeOptions
11
12
  from flash.engine.worker.train.core.child.queue import _init_transfer_queue
12
13
  from flash.engine.worker.train.core.child.readiness import publish_ready
@@ -50,9 +51,20 @@ class FlashSyncTrainer(PPOTrainerSync):
50
51
  self.role_worker_mapping[role] = ray.remote(FlashActorRolloutWorker)
51
52
 
52
53
  def _save_checkpoint(self):
53
- if self.runtime.should_save(int(self.global_steps)):
54
+ adaptive = checkpoint_schedule.enabled()
55
+ due = (
56
+ checkpoint_schedule.should_save(
57
+ self, int(self.global_steps), self.runtime.save_at_steps, self.runtime.total_steps
58
+ )
59
+ if adaptive
60
+ else self.runtime.should_save(int(self.global_steps))
61
+ )
62
+ if due:
54
63
  with checkpoint_phase(int(self.global_steps), "capture"):
55
- return super()._save_checkpoint()
64
+ result = super()._save_checkpoint()
65
+ if adaptive:
66
+ checkpoint_schedule.saved(self)
67
+ return result
56
68
  return None
57
69
 
58
70
  def on_train_begin(self):
@@ -227,6 +227,10 @@ def _build_verl_child_env(*, wandb_enabled: bool, context: WorkerContext) -> dic
227
227
  for key, value in os.environ.items()
228
228
  if key in _CHILD_ENV_EXACT or key.startswith(_CHILD_ENV_PREFIXES)
229
229
  }
230
+ from flash.core.checkpoint_policy import SPOT_CHECKPOINT_SECONDS, is_spot_spec
231
+
232
+ if is_spot_spec(context.config.spec):
233
+ child["FLASH_SPOT_CHECKPOINT_SECONDS"] = str(SPOT_CHECKPOINT_SECONDS)
230
234
  if wandb_enabled:
231
235
  child.update({key: value for key, value in os.environ.items() if key.startswith("WANDB_")})
232
236
  # retained runtime namespaces are filtered by applied-secret provenance. authenticated child-side
@@ -405,6 +405,11 @@ def _prepare_sft_model(
405
405
  else max(1, min(options.save_every, update_horizon))
406
406
  )
407
407
 
408
+ from flash.core.checkpoint_policy import is_spot_spec
409
+
410
+ if is_spot_spec(options.spec):
411
+ save_freq = 1
412
+
408
413
  card_vram_gb = float(options.gpu_probe.get("memory_gb") or 0.0)
409
414
  info = MODELS.get(options.model_id)
410
415
  active_params_b = float(getattr(info, "active_params_b", 0.0) or 0.0) or None
@@ -521,7 +521,9 @@ def _assemble_grpo_inputs(
521
521
  "epochs": schedule["epochs"],
522
522
  "verl_total_epochs": schedule["verl_total_epochs"],
523
523
  "steps": schedule["steps"],
524
- "save_freq": schedule["save_freq"],
524
+ "save_freq": 1
525
+ if context.config.spec and context.config.spec.gpu.spot
526
+ else schedule["save_freq"],
525
527
  "save_at_steps": schedule["save_at_steps"],
526
528
  "ckpt_to_keep": schedule["ckpt_to_keep"],
527
529
  # verl's default preserves the update horizon and on-policy baseline; with no generation reuse, each
@@ -9,6 +9,7 @@ from verl.trainer.sft_trainer import SFTTrainer
9
9
  from verl.utils.checkpoint import CheckpointHandler
10
10
  from verl.utils.dataset.dataset_utils import SFTTensorCollator
11
11
 
12
+ from flash.engine.worker.train.core.child import checkpoint_schedule
12
13
  from flash.engine.worker.train.core.child.options import RuntimeOptions
13
14
  from flash.engine.worker.train.core.lifecycle.timing import checkpoint_phase
14
15
  from flash.engine.worker.train.sft.child.dataset import FlashTokenizedSFTDataset
@@ -21,11 +22,22 @@ class FlashCheckpointHandler(CheckpointHandler):
21
22
  super().__init__(**kwargs)
22
23
 
23
24
  def save_checkpoint(self, step):
24
- if self.runtime.should_save(step):
25
+ adaptive = checkpoint_schedule.enabled()
26
+ due = (
27
+ checkpoint_schedule.should_save(
28
+ self, step, self.runtime.save_at_steps, self.runtime.total_steps, distributed=True
29
+ )
30
+ if adaptive
31
+ else self.runtime.should_save(step)
32
+ )
33
+ if due:
25
34
  with checkpoint_phase(step, "retention_wait"):
26
35
  self._wait_for_publication(step)
27
36
  with checkpoint_phase(step, "capture"):
28
- return super().save_checkpoint(step)
37
+ result = super().save_checkpoint(step)
38
+ if adaptive:
39
+ checkpoint_schedule.saved(self)
40
+ return result
29
41
  return None
30
42
 
31
43
  def _wait_for_publication(self, step):
@@ -229,7 +229,12 @@ class _VerlCheckpointWatcher:
229
229
 
230
230
  def _publish(self, step: int, checkpoint_dir: str) -> None:
231
231
  if not self._should_publish(step):
232
+ from flash.core.checkpoint_policy import is_spot_spec
233
+
232
234
  self.lifecycle.mark_discovered(step)
235
+ if is_spot_spec(self.context.config.spec):
236
+ staged_dir = self._staged_source(step, checkpoint_dir)
237
+ self._persist_resume(step, staged_dir, job_label="sft")
233
238
  return
234
239
  staged_dir = self._staged_source(step, checkpoint_dir)
235
240
  try:
@@ -301,7 +301,12 @@ def _structurally_fits(available, need: int, cap: int, executed_width, acceptabl
301
301
  for gpu_class in classes:
302
302
  if allowed and gpu_class.name not in allowed:
303
303
  continue
304
- for count in rentable_gpu_counts(cap):
304
+ counts = rentable_gpu_counts(min(cap, gpu_class.max_count))
305
+ if name == "spot":
306
+ from flash.providers.nebius.pricing import SPOT_GPUS
307
+
308
+ counts = tuple(n for n in counts if n in SPOT_GPUS[gpu_class.name].counts)
309
+ for count in counts:
305
310
  if combined_vram_gb(gpu_class.vram_gb, executed_width(count)) >= need:
306
311
  return True
307
312
  return False
@@ -629,7 +634,7 @@ def _resolved_gpu_count(
629
634
  need, max_gpu_count=auto_cap, gpu_names=gpu_names, executed_width=executed_width
630
635
  )
631
636
  if fitting_count is not None:
632
- return fitting_count
637
+ return auto_cap if available == ("spot",) else fitting_count
633
638
  effective_count = auto_cap
634
639
  else:
635
640
  effective_count = geometry_safe_gpu_cap(
@@ -840,6 +845,10 @@ def allocate(
840
845
  if provider and providers:
841
846
  raise UnsupportedGpuError("provider and providers cannot both be set")
842
847
  available = available_providers()
848
+ if providers == ("spot",):
849
+ provider = "spot"
850
+ if provider != "spot":
851
+ available = tuple(name for name in available if name != "spot")
843
852
  # kept across the narrowing below so a rejection can ask what dropping the pin would restore.
844
853
  unpinned = None
845
854
  if provider:
@@ -923,7 +932,7 @@ def allocate(
923
932
  return _cheapest_allocation(
924
933
  candidates,
925
934
  need=need,
926
- cost_per_step=cost_per_step,
935
+ cost_per_step=None if provider == "spot" else cost_per_step,
927
936
  provider_rank=provider_rank,
928
937
  )
929
938
 
@@ -942,12 +951,15 @@ def _cheapest_allocation(
942
951
  matches. A run the cost model cannot price (``cost_per_step`` is ``None``) falls back to total
943
952
  $/hr.
944
953
  """
954
+ from flash.providers.nebius.pricing import priority as spot_priority
955
+
945
956
  primary = cost_per_step if cost_per_step is not None else (lambda c: c.total_hourly_usd)
946
957
  unnamed_rank = len(provider_rank)
947
958
  ranked = sorted(
948
959
  candidates,
949
960
  key=lambda c: (
950
961
  provider_rank.get(c.provider, unnamed_rank),
962
+ spot_priority(c.gpu) if c.provider == "spot" else 0,
951
963
  primary(c),
952
964
  c.total_hourly_usd,
953
965
  c.gpu_count,
@@ -955,6 +967,13 @@ def _cheapest_allocation(
955
967
  c.gpu,
956
968
  ),
957
969
  )
970
+ # Spot prioritizes GPU class, then current price; fixed entry rates price estimates.
971
+ from flash.providers.nebius.pricing import hourly_rate as spot_hourly_rate
972
+
973
+ ranked = [
974
+ replace(c, hourly_usd=spot_hourly_rate(c.gpu)) if c.provider == "spot" else c
975
+ for c in ranked
976
+ ]
958
977
  best = ranked[0]
959
978
  return Allocation(
960
979
  provider=best.provider,
@@ -175,8 +175,10 @@ def get_gpu_info(name: str) -> GpuClass:
175
175
 
176
176
  def providers_for(name: str) -> tuple[str, ...]:
177
177
  """The training substrate supporting this validated GPU class."""
178
- get_gpu_info(name)
179
- return ("modal",)
178
+ from flash.providers.nebius.pricing import SPOT_GPUS
179
+
180
+ gpu = get_gpu_info(name)
181
+ return ("modal", "spot") if gpu.name in SPOT_GPUS else ("modal",)
180
182
 
181
183
 
182
184
  def gpu_short(name: str) -> str:
@@ -0,0 +1,11 @@
1
+ """Validate persisted training identities before recovery and resource mutations."""
2
+
3
+
4
+ def parse_handle(data):
5
+ if data.get("provider") == "spot":
6
+ from flash.providers.nebius.handles import SpotJobHandle
7
+
8
+ return SpotJobHandle.from_dict(data)
9
+ from flash.providers.modal.handles import ModalJobHandle
10
+
11
+ return ModalJobHandle.from_dict(data)
@@ -19,7 +19,10 @@ __all__ = [
19
19
 
20
20
  logger = get_logger(__name__)
21
21
 
22
- _PROVIDER_SETUP = (("modal", "MODAL_TOKEN_ID + MODAL_TOKEN_SECRET", "Modal workspace credentials"),)
22
+ _PROVIDER_SETUP = (
23
+ ("modal", "MODAL_TOKEN_ID + MODAL_TOKEN_SECRET", "Modal workspace credentials"),
24
+ ("spot", "FLASH_NEBIUS_PROJECT_ID/REGION/SUBNET_ID/IMAGE_ID", "Nebius CLI and GPU host image"),
25
+ )
23
26
 
24
27
 
25
28
  def _present(var: str) -> bool:
@@ -121,4 +124,6 @@ def check_run_preflight() -> None:
121
124
  require_operator_config()
122
125
  if not _present("GITHUB_TOKEN"):
123
126
  logger.warning("GITHUB_TOKEN is not set; private environment repositories are unavailable.")
124
- logger.info("GPU provider configured: modal")
127
+ from flash.providers.core.registry import available_providers
128
+
129
+ logger.info("GPU providers configured: %s", ", ".join(available_providers()))