freesolo-flash-dev 1.2.96__tar.gz → 1.2.98__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 (613) hide show
  1. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/PKG-INFO +1 -1
  2. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/cli/commands/__init__.py +30 -11
  3. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/cli/commands/train_cost.py +121 -15
  4. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/cli/commands/worker_output.py +20 -11
  5. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/plan/kv_sizing.py +31 -5
  6. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/plan/vram.py +41 -14
  7. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/opd_train_runner.py +1 -0
  8. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/train/rl/verl_config.py +9 -5
  9. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/envs/identity.py +10 -0
  10. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/schema/__init__.py +38 -7
  11. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/pyproject.toml +2 -2
  12. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_cli_commands.py +249 -10
  13. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_cli_commands_coverage.py +11 -3
  14. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_cli_estimate.py +204 -5
  15. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_kv_util.py +108 -4
  16. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_lora_rank_preflight.py +28 -3
  17. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_opd_train.py +2 -1
  18. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_rl_train.py +89 -1
  19. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_spec_and_validation.py +96 -0
  20. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_vram_architecture.py +39 -0
  21. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/uv.lock +1 -1
  22. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/.dockerignore +0 -0
  23. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/.env.example +0 -0
  24. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/.github/CODEOWNERS +0 -0
  25. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  26. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  27. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  28. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  29. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/.github/dependabot.yml +0 -0
  30. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/.github/workflows/auto-rebake.yml +0 -0
  31. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/.github/workflows/bake-kernel-cache.yml +0 -0
  32. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/.github/workflows/ci.yml +0 -0
  33. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/.github/workflows/dev-kernel-cache.yml +0 -0
  34. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/.github/workflows/main-source-guard.yml +0 -0
  35. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/.github/workflows/notify-tests-repo.yml +0 -0
  36. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/.github/workflows/production-kernel-cache-ready.yml +0 -0
  37. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/.github/workflows/publish-dev.yml +0 -0
  38. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/.github/workflows/publish-image.yml +0 -0
  39. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/.github/workflows/publish.yml +0 -0
  40. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/.github/workflows/version-parity.yml +0 -0
  41. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/.github/workflows/worker-image.yml +0 -0
  42. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/.gitignore +0 -0
  43. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/CHANGELOG.md +0 -0
  44. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/CODE_OF_CONDUCT.md +0 -0
  45. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/CONTRIBUTING.md +0 -0
  46. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/Dockerfile +0 -0
  47. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/Dockerfile.worker +0 -0
  48. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/LICENSE +0 -0
  49. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/NOTICE +0 -0
  50. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/README.md +0 -0
  51. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/SECURITY.md +0 -0
  52. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/SELF_HOSTING.md +0 -0
  53. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/build/kernel_cache/.gitignore +0 -0
  54. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/build/kernel_cache/.keep +0 -0
  55. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/deploy/infisical/README.md +0 -0
  56. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/deploy/infisical/entrypoint.sh +0 -0
  57. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/docker/Dockerfile.kernelcache +0 -0
  58. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/docker/Dockerfile.kernelcache.relayer +0 -0
  59. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/docker/bake_kernel_cache.py +0 -0
  60. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/docker/bake_pod_entry.py +0 -0
  61. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/docker/extract_cudart_fix.py +0 -0
  62. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/docker/kernel_fingerprint.py +0 -0
  63. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/docker/make_rp_handler.py +0 -0
  64. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/__init__.py +0 -0
  65. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/_internal/__init__.py +0 -0
  66. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/_internal/channel.py +0 -0
  67. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/_internal/diagnostics.py +0 -0
  68. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/_internal/fileio.py +0 -0
  69. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/_internal/logging.py +0 -0
  70. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/_internal/paths.py +0 -0
  71. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/adapters/__init__.py +0 -0
  72. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/adapters/artifacts.py +0 -0
  73. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/adapters/fused_experts.py +0 -0
  74. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/adapters/lora_rank.py +0 -0
  75. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/adapters/targets.py +0 -0
  76. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/cli/__init__.py +0 -0
  77. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/cli/__main__.py +0 -0
  78. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/cli/commands/deploy.py +0 -0
  79. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/cli/commands/env/__init__.py +0 -0
  80. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/cli/commands/env/episode.py +0 -0
  81. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/cli/commands/env/eval.py +0 -0
  82. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/cli/commands/env/eval_args.py +0 -0
  83. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/cli/commands/env/imports.py +0 -0
  84. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/cli/commands/env/list.py +0 -0
  85. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/cli/commands/env/push.py +0 -0
  86. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/cli/commands/env/retained.py +0 -0
  87. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/cli/commands/env/setup.py +0 -0
  88. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/cli/commands/env/setup_wandb.py +0 -0
  89. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/cli/commands/env/test.py +0 -0
  90. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/cli/commands/env/test_evaluations.py +0 -0
  91. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/cli/commands/env/test_params.py +0 -0
  92. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/cli/commands/env/test_warnings.py +0 -0
  93. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/cli/commands/prompt_budget.py +0 -0
  94. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/cli/commands/traces.py +0 -0
  95. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/cli/errors.py +0 -0
  96. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/cli/scaffold/TRAINING.md +0 -0
  97. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/cli/scaffold/__init__.py +0 -0
  98. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/cli/ui/__init__.py +0 -0
  99. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/cli/ui/cost.py +0 -0
  100. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/cli/ui/env_panels.py +0 -0
  101. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/cli/ui/heartbeat.py +0 -0
  102. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/cli/ui/render.py +0 -0
  103. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/cli/ui/tables.py +0 -0
  104. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/cli/ui/tty.py +0 -0
  105. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/client/__init__.py +0 -0
  106. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/client/config.py +0 -0
  107. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/client/freesolo_api.py +0 -0
  108. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/client/http.py +0 -0
  109. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/client/runtime_secrets.py +0 -0
  110. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/client/shapes.py +0 -0
  111. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/client/specs.py +0 -0
  112. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/client/streaming.py +0 -0
  113. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/content/__init__.py +0 -0
  114. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/content/image_descriptors.py +0 -0
  115. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/content/multimodal.py +0 -0
  116. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/content/structured_outputs.py +0 -0
  117. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/content/thinking.py +0 -0
  118. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/core/__init__.py +0 -0
  119. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/core/catalog.py +0 -0
  120. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/core/grpo.py +0 -0
  121. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/core/spec.py +0 -0
  122. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/core/spec_persistence.py +0 -0
  123. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/cost/__init__.py +0 -0
  124. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/cost/analytical.py +0 -0
  125. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/cost/facts.py +0 -0
  126. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/cost/spec.py +0 -0
  127. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/cost/types.py +0 -0
  128. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/__init__.py +0 -0
  129. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/huggingface.py +0 -0
  130. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/plan/__init__.py +0 -0
  131. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/plan/model_config_probe.py +0 -0
  132. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/plan/prompt_budget.py +0 -0
  133. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/plan/recipe.py +0 -0
  134. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/plan/steps.py +0 -0
  135. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/profiling/__init__.py +0 -0
  136. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/profiling/dataset_profile.py +0 -0
  137. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/profiling/image_tokens.py +0 -0
  138. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/profiling/reasoning_render.py +0 -0
  139. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/profiling/sft_image_rows.py +0 -0
  140. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/profiling/sft_workload.py +0 -0
  141. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/profiling/tokenizer.py +0 -0
  142. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/profiling/workload_profile.py +0 -0
  143. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/result/__init__.py +0 -0
  144. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/result/accounting.py +0 -0
  145. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/result/rollout_samples.py +0 -0
  146. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/__init__.py +0 -0
  147. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/__main__.py +0 -0
  148. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/backend_common.py +0 -0
  149. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/entry/__init__.py +0 -0
  150. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/entry/opd.py +0 -0
  151. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/entry/rl.py +0 -0
  152. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/entry/sft.py +0 -0
  153. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/io/__init__.py +0 -0
  154. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/io/heartbeat.py +0 -0
  155. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/io/hf.py +0 -0
  156. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/io/prefetch.py +0 -0
  157. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/io/wandb_log.py +0 -0
  158. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/model/__init__.py +0 -0
  159. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/model/adapter.py +0 -0
  160. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/model/chatml_mask.py +0 -0
  161. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/model/decoding.py +0 -0
  162. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/model/lora.py +0 -0
  163. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/model/packing.py +0 -0
  164. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/opd_train.py +0 -0
  165. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/perf/__init__.py +0 -0
  166. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/perf/diagnostics.py +0 -0
  167. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/perf/lifecycle.py +0 -0
  168. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/perf/liger.py +0 -0
  169. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/perf/memory.py +0 -0
  170. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/rl_train.py +0 -0
  171. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/rl_train_runner.py +0 -0
  172. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/runtime/__init__.py +0 -0
  173. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/runtime/kernel_warmup.py +0 -0
  174. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/runtime/pkg_proxy.py +0 -0
  175. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/runtime/rng.py +0 -0
  176. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/score_batcher.py +0 -0
  177. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/sft_train.py +0 -0
  178. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/sft_train_runner.py +0 -0
  179. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/teacher/__init__.py +0 -0
  180. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/teacher/client.py +0 -0
  181. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/teacher/encoding.py +0 -0
  182. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/teacher/tokenizer_align.py +0 -0
  183. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/train/__init__.py +0 -0
  184. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/train/core/__init__.py +0 -0
  185. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/train/core/checkpoint_lifecycle.py +0 -0
  186. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/train/core/child/__init__.py +0 -0
  187. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/train/core/child/glue.py +0 -0
  188. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/train/core/child/runtime.py +0 -0
  189. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/train/core/step_timing.py +0 -0
  190. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/train/finalize.py +0 -0
  191. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/train/opd/__init__.py +0 -0
  192. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/train/opd/batching.py +0 -0
  193. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/train/opd/bridge.py +0 -0
  194. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/train/opd/bridge_failures.py +0 -0
  195. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/train/opd/child/__init__.py +0 -0
  196. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/train/opd/child/bridge.py +0 -0
  197. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/train/opd/child/entry.py +0 -0
  198. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/train/opd/child/multiturn.py +0 -0
  199. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/train/opd/child/plugin.py +0 -0
  200. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/train/opd/child/replay_guard.py +0 -0
  201. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/train/opd/child/runtime.py +0 -0
  202. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/train/opd/child/structured.py +0 -0
  203. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/train/opd/failures.py +0 -0
  204. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/train/opd/gkd.py +0 -0
  205. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/train/opd/multiturn_media.py +0 -0
  206. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/train/opd/multiturn_validation.py +0 -0
  207. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/train/opd/overrides.py +0 -0
  208. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/train/opd/prompts.py +0 -0
  209. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/train/opd/reporting.py +0 -0
  210. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/train/opd/scoring.py +0 -0
  211. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/train/opd/state.py +0 -0
  212. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/train/opd/validation.py +0 -0
  213. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/train/rl/__init__.py +0 -0
  214. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/train/rl/checkpoints.py +0 -0
  215. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/train/rl/child/__init__.py +0 -0
  216. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/train/rl/child/entry.py +0 -0
  217. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/train/rl/child/multiturn.py +0 -0
  218. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/train/rl/child/patches.py +0 -0
  219. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/train/rl/child/plugin.py +0 -0
  220. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/train/rl/config.py +0 -0
  221. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/train/rl/identity.py +0 -0
  222. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/train/rl/inputs.py +0 -0
  223. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/train/rl/multi_turn.py +0 -0
  224. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/train/rl/reward_module.py +0 -0
  225. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/train/rl/scoring.py +0 -0
  226. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/train/rl/single_turn.py +0 -0
  227. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/train/sft/__init__.py +0 -0
  228. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/train/sft/checkpoints.py +0 -0
  229. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/train/sft/child/entry.py +0 -0
  230. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/train/sft/child/plugin.py +0 -0
  231. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/train/sft/config.py +0 -0
  232. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/verl/__init__.py +0 -0
  233. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/verl/capabilities.py +0 -0
  234. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/verl/checkpoints.py +0 -0
  235. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/verl/child_io.py +0 -0
  236. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/verl/diagnostics.py +0 -0
  237. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/verl/parallelism.py +0 -0
  238. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/verl/parent_work.py +0 -0
  239. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker/verl/process_census.py +0 -0
  240. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/engine/worker_entrypoint.py +0 -0
  241. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/envs/__init__.py +0 -0
  242. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/envs/adapter.py +0 -0
  243. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/envs/base.py +0 -0
  244. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/envs/cache_security.py +0 -0
  245. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/envs/dataset_selection.py +0 -0
  246. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/envs/evaluations.py +0 -0
  247. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/envs/loader.py +0 -0
  248. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/envs/namespace_listing.py +0 -0
  249. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/envs/package/__init__.py +0 -0
  250. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/envs/package/direct_tokens.py +0 -0
  251. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/envs/package/limits.py +0 -0
  252. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/envs/package/unpack.py +0 -0
  253. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/envs/pull.py +0 -0
  254. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/envs/staged.py +0 -0
  255. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/providers/__init__.py +0 -0
  256. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/providers/_lifecycle/__init__.py +0 -0
  257. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/providers/_lifecycle/auth.py +0 -0
  258. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/providers/_lifecycle/bootstrap.py +0 -0
  259. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/providers/_lifecycle/bootstrap_console.py +0 -0
  260. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/providers/_lifecycle/bootstrap_pip.py +0 -0
  261. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/providers/_lifecycle/bootstrap_secrets.py +0 -0
  262. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/providers/_lifecycle/deadline.py +0 -0
  263. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/providers/_lifecycle/host/__init__.py +0 -0
  264. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/providers/_lifecycle/host/deadline_sleep.py +0 -0
  265. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/providers/_lifecycle/host/failmark.py +0 -0
  266. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/providers/_lifecycle/host/hostlog.py +0 -0
  267. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/providers/_lifecycle/http.py +0 -0
  268. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/providers/_lifecycle/instance.py +0 -0
  269. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/providers/_lifecycle/poll.py +0 -0
  270. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/providers/_lifecycle/poll_instance.py +0 -0
  271. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/providers/_lifecycle/provider.py +0 -0
  272. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/providers/_lifecycle/terminal_artifacts.py +0 -0
  273. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/providers/_lifecycle/worker.py +0 -0
  274. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/providers/allocator.py +0 -0
  275. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/providers/artifacts/__init__.py +0 -0
  276. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/providers/artifacts/hf.py +0 -0
  277. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/providers/artifacts/preload_runpod.py +0 -0
  278. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/providers/artifacts/weight_cache.py +0 -0
  279. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/providers/base.py +0 -0
  280. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/providers/fit_errors.py +0 -0
  281. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/providers/lambda_/__init__.py +0 -0
  282. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/providers/lambda_/api.py +0 -0
  283. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/providers/lambda_/auth.py +0 -0
  284. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/providers/lambda_/gpus.py +0 -0
  285. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/providers/lambda_/jobs/__init__.py +0 -0
  286. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/providers/lambda_/jobs/builders.py +0 -0
  287. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/providers/lambda_/jobs/reap.py +0 -0
  288. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/providers/lambda_/preflight.py +0 -0
  289. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/providers/lambda_/pricing.py +0 -0
  290. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/providers/preflight.py +0 -0
  291. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/providers/realized.py +0 -0
  292. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/providers/runpod/__init__.py +0 -0
  293. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/providers/runpod/api.py +0 -0
  294. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/providers/runpod/auth.py +0 -0
  295. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/providers/runpod/cost.py +0 -0
  296. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/providers/runpod/gpus.py +0 -0
  297. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/providers/runpod/job_execution.py +0 -0
  298. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/providers/runpod/jobs.py +0 -0
  299. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/providers/runpod/preflight.py +0 -0
  300. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/providers/runpod/pricing.py +0 -0
  301. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/providers/runpod/resources.py +0 -0
  302. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/providers/runpod/serverless/__init__.py +0 -0
  303. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/providers/runpod/serverless/endpoints.py +0 -0
  304. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/providers/sharding.py +0 -0
  305. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/providers/vast/__init__.py +0 -0
  306. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/providers/vast/api.py +0 -0
  307. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/providers/vast/auth.py +0 -0
  308. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/providers/vast/jobs/__init__.py +0 -0
  309. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/providers/vast/jobs/builders.py +0 -0
  310. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/providers/vast/preflight.py +0 -0
  311. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/providers/vast/pricing.py +0 -0
  312. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/py.typed +0 -0
  313. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/runner/__init__.py +0 -0
  314. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/runner/artifacts.py +0 -0
  315. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/runner/attempts.py +0 -0
  316. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/runner/costs.py +0 -0
  317. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/runner/deadlines.py +0 -0
  318. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/runner/preparation.py +0 -0
  319. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/runner/reconciliation.py +0 -0
  320. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/runner/results/__init__.py +0 -0
  321. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/runner/results/checkpoints.py +0 -0
  322. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/runner/results/verified_revisions.py +0 -0
  323. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/runner/status.py +0 -0
  324. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/runner/submit.py +0 -0
  325. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/runner/supervise/__init__.py +0 -0
  326. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/runner/supervise/attach.py +0 -0
  327. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/runner/supervise/deploy.py +0 -0
  328. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/runner/supervise/lifecycle.py +0 -0
  329. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/runner/supervise/recovery.py +0 -0
  330. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/runner/supervise/retry_decision.py +0 -0
  331. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/runner/supervise/seed_submission.py +0 -0
  332. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/runner/supervise/transitions.py +0 -0
  333. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/runner/weight_cache.py +0 -0
  334. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/runtime_capsule/__init__.py +0 -0
  335. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/runtime_capsule/build.py +0 -0
  336. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/runtime_capsule/manifest.py +0 -0
  337. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/runtime_capsule/profiles.py +0 -0
  338. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/schema/fields.py +0 -0
  339. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/serve/__init__.py +0 -0
  340. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/serve/adapter_check.py +0 -0
  341. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/serve/deploy.py +0 -0
  342. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/serve/errors.py +0 -0
  343. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/serve/export.py +0 -0
  344. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/serve/preflight.py +0 -0
  345. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/serve/responses.py +0 -0
  346. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/serve/streaming.py +0 -0
  347. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/serve/thinking.py +0 -0
  348. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/serve/urls.py +0 -0
  349. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/server/__init__.py +0 -0
  350. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/server/__main__.py +0 -0
  351. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/server/app.py +0 -0
  352. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/server/billing/__init__.py +0 -0
  353. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/server/billing/charges.py +0 -0
  354. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/server/billing/retry.py +0 -0
  355. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/server/domain/__init__.py +0 -0
  356. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/server/domain/checkpoints.py +0 -0
  357. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/server/domain/environment_registry.py +0 -0
  358. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/server/domain/envs.py +0 -0
  359. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/server/domain/projects.py +0 -0
  360. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/server/domain/reconcile.py +0 -0
  361. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/server/domain/repo_cleanup.py +0 -0
  362. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/server/domain/run_registry.py +0 -0
  363. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/server/domain/teacher_broker.py +0 -0
  364. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/server/domain/teacher_errors.py +0 -0
  365. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/server/domain/teacher_requests.py +0 -0
  366. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/server/platform/__init__.py +0 -0
  367. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/server/platform/auth.py +0 -0
  368. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/server/platform/db.py +0 -0
  369. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/server/platform/deps.py +0 -0
  370. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/server/platform/internal_client.py +0 -0
  371. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/server/platform/locks.py +0 -0
  372. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/server/platform/runtime.py +0 -0
  373. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/server/routes/__init__.py +0 -0
  374. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/server/routes/envs.py +0 -0
  375. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/server/routes/meta.py +0 -0
  376. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/server/routes/runs.py +0 -0
  377. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/server/routes/serving.py +0 -0
  378. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/server/routes/serving_completion.py +0 -0
  379. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/server/routes/serving_revisions.py +0 -0
  380. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/server/routes/serving_smoke.py +0 -0
  381. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/server/routes/teacher.py +0 -0
  382. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/source_snapshot.py +0 -0
  383. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/teacher/__init__.py +0 -0
  384. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/teacher/limits.py +0 -0
  385. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/teacher/provider_status.py +0 -0
  386. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/flash/teacher/retry_contract.py +0 -0
  387. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/scripts/build_dev_dist.py +0 -0
  388. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/scripts/check_file_size.py +0 -0
  389. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/scripts/check_function_size.py +0 -0
  390. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/scripts/check_rollout_identity_actor.py +0 -0
  391. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/scripts/check_verl_pin_exists.py +0 -0
  392. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/scripts/scrub_history.sh +0 -0
  393. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/__init__.py +0 -0
  394. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/_helpers/__init__.py +0 -0
  395. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/_helpers/profile.py +0 -0
  396. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/_helpers/runner.py +0 -0
  397. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/_helpers/source_snapshot.py +0 -0
  398. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/_helpers/specs.py +0 -0
  399. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/_helpers/teacher.py +0 -0
  400. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/_helpers/vast.py +0 -0
  401. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/capture_image_sft_processor_oracle.py +0 -0
  402. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/conftest.py +0 -0
  403. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/fixtures/image_sft_processor_oracle.json +0 -0
  404. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/fixtures/qwen35_08b_target_metadata.json +0 -0
  405. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/live/__init__.py +0 -0
  406. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/live/conftest.py +0 -0
  407. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/live/test_lambda_live.py +0 -0
  408. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/live/test_runpod_live.py +0 -0
  409. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/live/test_sft_thinking_render_live.py +0 -0
  410. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/live/test_vast_live.py +0 -0
  411. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_accounting_coverage.py +0 -0
  412. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_adapter_shard_completeness.py +0 -0
  413. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_agent_flash_cli_contract.py +0 -0
  414. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_algorithms.py +0 -0
  415. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_allocator.py +0 -0
  416. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_backend_common.py +0 -0
  417. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_backend_jobspec_contract.py +0 -0
  418. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_bake_kernel_cache.py +0 -0
  419. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_base_model_provenance.py +0 -0
  420. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_billing_retry.py +0 -0
  421. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_build_context_contract.py +0 -0
  422. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_cancel_remote.py +0 -0
  423. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_catalog_consistency.py +0 -0
  424. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_catalog_only_models.py +0 -0
  425. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_charge_pricing.py +0 -0
  426. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_checkpoint_lifecycle.py +0 -0
  427. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_checkpoints.py +0 -0
  428. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_cli_credential_shadowing.py +0 -0
  429. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_cli_errors.py +0 -0
  430. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_cli_gpus_flag.py +0 -0
  431. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_cli_help.py +0 -0
  432. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_cli_main_coverage.py +0 -0
  433. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_cli_managed.py +0 -0
  434. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_cli_render_coverage.py +0 -0
  435. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_cli_render_theme.py +0 -0
  436. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_cli_traces.py +0 -0
  437. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_cli_wandb_warning.py +0 -0
  438. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_client.py +0 -0
  439. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_client_import_purity.py +0 -0
  440. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_client_server_integration.py +0 -0
  441. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_client_stream_reads.py +0 -0
  442. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_config_env_vars.py +0 -0
  443. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_config_overrides.py +0 -0
  444. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_console_upload.py +0 -0
  445. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_controlled_experiment_repairs.py +0 -0
  446. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_cost_analytical.py +0 -0
  447. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_cost_equation.py +0 -0
  448. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_cost_estimate.py +0 -0
  449. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_cost_hardware.py +0 -0
  450. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_cost_models.py +0 -0
  451. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_dataset_profile.py +0 -0
  452. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_deploy_alias_move_warning.py +0 -0
  453. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_deploy_latency.py +0 -0
  454. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_dev_channel.py +0 -0
  455. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_disk_gb.py +0 -0
  456. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_endpoint_name.py +0 -0
  457. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_env_cache_evict.py +0 -0
  458. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_env_delete.py +0 -0
  459. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_env_download.py +0 -0
  460. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_env_download_api.py +0 -0
  461. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_env_evaluations.py +0 -0
  462. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_env_list_api.py +0 -0
  463. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_env_list_cli.py +0 -0
  464. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_env_list_hub.py +0 -0
  465. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_env_no_install.py +0 -0
  466. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_env_publish.py +0 -0
  467. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_env_pull.py +0 -0
  468. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_env_pull_coverage.py +0 -0
  469. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_env_pull_loader_coverage.py +0 -0
  470. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_env_pull_managed_control_plane.py +0 -0
  471. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_env_push.py +0 -0
  472. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_env_rate_limit_resolve.py +0 -0
  473. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_env_ref_pinning.py +0 -0
  474. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_env_test.py +0 -0
  475. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_envs_coverage.py +0 -0
  476. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_export.py +0 -0
  477. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_flash_mvp.py +0 -0
  478. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_flash_worker.py +0 -0
  479. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_flashinfer_cache_dirs.py +0 -0
  480. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_freesolo_api_transport.py +0 -0
  481. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_fused_expert_warmstart.py +0 -0
  482. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_github_urlopen_retry.py +0 -0
  483. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_gpu_type_single_field.py +0 -0
  484. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_gpus.py +0 -0
  485. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_grpo_params.py +0 -0
  486. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_grpo_process_census.py +0 -0
  487. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_grpo_resident_sizing.py +0 -0
  488. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_grpo_reward_batching.py +0 -0
  489. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_grpo_rollout_contract.py +0 -0
  490. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_grpo_rollout_identity.py +0 -0
  491. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_health_liveness.py +0 -0
  492. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_hf_retry.py +0 -0
  493. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_idle_endpoint_reaper.py +0 -0
  494. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_image_environment_capability.py +0 -0
  495. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_image_incremental_processor.py +0 -0
  496. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_image_sft_markers.py +0 -0
  497. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_image_sft_processor_parity.py +0 -0
  498. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_image_tokens.py +0 -0
  499. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_infisical_secrets.py +0 -0
  500. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_instance_bootstrap_coverage.py +0 -0
  501. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_internal_client.py +0 -0
  502. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_jobs.py +0 -0
  503. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_kernel_cache.py +0 -0
  504. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_kernel_fingerprint.py +0 -0
  505. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_lambda_api_coverage.py +0 -0
  506. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_lambda_runner.py +0 -0
  507. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_logging.py +0 -0
  508. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_login_perms.py +0 -0
  509. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_lora_rank_coverage.py +0 -0
  510. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_lora_rank_nested_rung.py +0 -0
  511. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_lora_targeting.py +0 -0
  512. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_lora_targeting_pinned_verl.py +0 -0
  513. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_managed_config_fields.py +0 -0
  514. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_managed_hf_repo.py +0 -0
  515. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_metrics_schema_agent_contract.py +0 -0
  516. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_mig_guard.py +0 -0
  517. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_multi_gpu_gate.py +0 -0
  518. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_multimodal_training.py +0 -0
  519. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_named_reward_metrics.py +0 -0
  520. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_oom_escalate_gpu.py +0 -0
  521. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_opd.py +0 -0
  522. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_opd_limits.py +0 -0
  523. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_opd_multiturn_eos_boundary.py +0 -0
  524. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_opd_multiturn_failure_exit.py +0 -0
  525. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_opd_replay_guard.py +0 -0
  526. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_opd_resume_safety.py +0 -0
  527. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_orchestrator_flash.py +0 -0
  528. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_packing.py +0 -0
  529. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_packing_coverage.py +0 -0
  530. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_parasail_teacher.py +0 -0
  531. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_persisted_spec_envelope.py +0 -0
  532. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_poll_helpers.py +0 -0
  533. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_preflight.py +0 -0
  534. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_projects.py +0 -0
  535. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_prompt_budget.py +0 -0
  536. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_provider_preflight_coverage.py +0 -0
  537. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_provider_routing.py +0 -0
  538. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_provider_teardown_robustness.py +0 -0
  539. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_providers_symmetry.py +0 -0
  540. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_realized_cost.py +0 -0
  541. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_repo_cleanup.py +0 -0
  542. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_resolve_params_b.py +0 -0
  543. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_resume_on_retry.py +0 -0
  544. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_rollout_samples.py +0 -0
  545. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_runmgmt.py +0 -0
  546. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_runpod_api_delete.py +0 -0
  547. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_runpod_key_fingerprint.py +0 -0
  548. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_runpod_key_waterfall.py +0 -0
  549. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_runtime_capsule.py +0 -0
  550. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_serve.py +0 -0
  551. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_serve_reasoning_content.py +0 -0
  552. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_server_api.py +0 -0
  553. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_server_app_coverage.py +0 -0
  554. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_server_auth_singleflight.py +0 -0
  555. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_server_billing.py +0 -0
  556. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_server_checkpoints_coverage.py +0 -0
  557. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_server_db.py +0 -0
  558. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_server_envs_coverage.py +0 -0
  559. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_server_locks_coverage.py +0 -0
  560. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_server_standalone.py +0 -0
  561. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_serving_context_preflight.py +0 -0
  562. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_serving_contract.py +0 -0
  563. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_serving_schema_coverage.py +0 -0
  564. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_sft_chunked_nll.py +0 -0
  565. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_sft_example_selection.py +0 -0
  566. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_sft_gc_off.py +0 -0
  567. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_sft_max_context.py +0 -0
  568. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_sft_startup_block.py +0 -0
  569. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_sft_train.py +0 -0
  570. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_sft_workload.py +0 -0
  571. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_source_attestation_flow.py +0 -0
  572. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_source_snapshot.py +0 -0
  573. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_spec_contract_bytes.py +0 -0
  574. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_staged_environment.py +0 -0
  575. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_step_floor.py +0 -0
  576. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_step_metrics.py +0 -0
  577. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_step_timing.py +0 -0
  578. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_structured_outputs.py +0 -0
  579. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_teacher_broker.py +0 -0
  580. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_teacher_encoding_contract.py +0 -0
  581. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_terminal_artifacts.py +0 -0
  582. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_thinking_config.py +0 -0
  583. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_train_context_preflight.py +0 -0
  584. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_training_controls.py +0 -0
  585. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_type_comment_prose.py +0 -0
  586. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_vast_api.py +0 -0
  587. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_vast_api_coverage.py +0 -0
  588. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_vast_offers.py +0 -0
  589. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_vast_provider_coverage.py +0 -0
  590. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_vast_runner.py +0 -0
  591. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_verified_revisions.py +0 -0
  592. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_verifiers.py +0 -0
  593. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_verl_checkpoint_export.py +0 -0
  594. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_verl_child_plugins.py +0 -0
  595. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_verl_silence_watchdog.py +0 -0
  596. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_version.py +0 -0
  597. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_vl_warmstart_adapter_keys.py +0 -0
  598. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_wandb_link.py +0 -0
  599. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_wandb_naming.py +0 -0
  600. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_warmstart_adapter_download.py +0 -0
  601. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_warmstart_cross_repo.py +0 -0
  602. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_warmstart_error_attribution.py +0 -0
  603. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_warmstart_image_adapters.py +0 -0
  604. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_weight_cache.py +0 -0
  605. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_worker_dryrun.py +0 -0
  606. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_worker_hardexit.py +0 -0
  607. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_worker_image.py +0 -0
  608. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_worker_init_heartbeat.py +0 -0
  609. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_worker_stack.py +0 -0
  610. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_worker_thinking.py +0 -0
  611. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_workflow_contracts.py +0 -0
  612. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_workload_profile.py +0 -0
  613. {freesolo_flash_dev-1.2.96 → freesolo_flash_dev-1.2.98}/tests/test_zero2_sharding_gate.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: freesolo-flash-dev
3
- Version: 1.2.96
3
+ Version: 1.2.98
4
4
  Summary: Flash — managed LoRA post-training (SFT/GRPO/OPD) 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
@@ -7,6 +7,7 @@ import os
7
7
  import sys
8
8
  import time
9
9
  import uuid
10
+ from typing import NamedTuple
10
11
 
11
12
  from flash import __version__
12
13
  from flash._internal.channel import BRAND_NAME, CLI_NAME
@@ -424,6 +425,8 @@ def cmd_train(args) -> int:
424
425
  )
425
426
  else:
426
427
  print(json.dumps(status, indent=2))
428
+ if spec.algorithm == "sft":
429
+ _print_published_sft_environment_note(status, spec)
427
430
  _print_unpacked_batch_warning(status, spec) # after the payload, so stdout stays parseable
428
431
  print_status_prompt_budget_warning(status)
429
432
  _print_reasoning_loss_warning(status)
@@ -599,12 +602,17 @@ def _log_follow_metric_rows(status: dict | None, seen_steps: set) -> list[str]:
599
602
  return rows
600
603
 
601
604
 
602
- def _poll_logs(client: ApiClient, run_id: str, interval: float) -> tuple[str, bool]:
603
- """Stream offset-paged logs until the run reaches a terminal state.
605
+ class _LogPollResult(NamedTuple):
606
+ state: str
607
+ printed_any: bool
608
+ live_attempt: int | None
604
609
 
605
- Returns (terminal state, whether any log bytes were printed)."""
610
+
611
+ def _poll_logs(client: ApiClient, run_id: str, interval: float) -> _LogPollResult:
612
+ """Stream logs until terminal and return the final state, output, and attempt snapshot."""
606
613
  offset = 0
607
614
  printed_any = False
615
+ attempt: int | None = None
608
616
  last_progress: str | None = None
609
617
  seen_metric_steps: set = set()
610
618
  spinner = _LogFollowSpinner(run_id)
@@ -620,6 +628,7 @@ def _poll_logs(client: ApiClient, run_id: str, interval: float) -> tuple[str, bo
620
628
  # from the run status endpoint. The log page's embedded state is only a fallback for
621
629
  # older servers or test doubles.
622
630
  status = client.get_run(run_id)
631
+ attempt = render.live_attempt(status) if isinstance(status, dict) else attempt
623
632
  state, progress = _log_follow_progress(status, str(page.get("state") or ""))
624
633
  metric_rows = _log_follow_metric_rows(status, seen_metric_steps)
625
634
  if metric_rows:
@@ -628,7 +637,7 @@ def _poll_logs(client: ApiClient, run_id: str, interval: float) -> tuple[str, bo
628
637
  print(row, file=sys.stderr, flush=True)
629
638
  if state in _CLI_DONE_STATES:
630
639
  spinner.clear()
631
- return state, printed_any
640
+ return _LogPollResult(state, printed_any, attempt)
632
641
  if not spinner.enabled and progress != last_progress:
633
642
  print(f"status: {progress}", file=sys.stderr, flush=True)
634
643
  last_progress = progress
@@ -677,12 +686,12 @@ def _print_detached_note(run_id: str) -> None:
677
686
  def _follow_run(client: ApiClient, run_id: str) -> int:
678
687
  """Poll logs until the run reaches a terminal state, then print the final status."""
679
688
  try:
680
- state, _ = _poll_logs(client, run_id, interval=2.0)
689
+ result = _poll_logs(client, run_id, interval=2.0)
681
690
  except KeyboardInterrupt:
682
691
  _print_detached_note(run_id)
683
692
  return 130
684
693
  print(_render_status(client.get_run(run_id)))
685
- return 0 if state in _OK_STATES else 1
694
+ return 0 if result.state in _OK_STATES else 1
686
695
 
687
696
 
688
697
  def _follow_status(
@@ -710,16 +719,23 @@ def cmd_log(args) -> int:
710
719
  client = client_from_config()
711
720
  if getattr(args, "follow", False):
712
721
  try:
713
- state, printed_any = _poll_logs(client, args.run_id, interval=2.0)
722
+ result = _poll_logs(client, args.run_id, interval=2.0)
714
723
  except KeyboardInterrupt:
715
724
  _print_detached_note(args.run_id)
716
725
  return 130
717
- _print_worker_output(client, args.run_id, printed_any=printed_any)
718
- return 0 if state in _OK_STATES else 1
726
+ sections = _worker_sections(client, args.run_id)
727
+ _print_worker_output(
728
+ sections,
729
+ printed_any=result.printed_any,
730
+ current_attempt=result.live_attempt,
731
+ )
732
+ return 0 if result.state in _OK_STATES else 1
719
733
  text = str(client.get_logs(args.run_id, offset=0).get("logs") or "")
720
734
  if text:
721
735
  print(text, end="" if text.endswith("\n") else "\n")
722
- _print_worker_output(client, args.run_id, printed_any=bool(text))
736
+ sections = _worker_sections(client, args.run_id)
737
+ attempt = _snapshot_live_attempt(client, args.run_id) if sections else None
738
+ _print_worker_output(sections, printed_any=bool(text), current_attempt=attempt)
723
739
  return 0
724
740
 
725
741
 
@@ -953,6 +969,7 @@ from flash.cli.commands.train_cost import ( # noqa: E402,F401
953
969
  _cmd_train_cost,
954
970
  _cmd_train_cost_offline,
955
971
  _cmd_train_cost_sft,
972
+ _print_published_sft_environment_note,
956
973
  _print_reasoning_loss_warning,
957
974
  _print_sft_cost,
958
975
  _print_train_schema_compatibility,
@@ -961,9 +978,11 @@ from flash.cli.commands.train_cost import ( # noqa: E402,F401
961
978
  _warn_if_wandb_requested_without_key,
962
979
  )
963
980
 
964
- # re-exported so `commands._print_worker_output(...)` keeps resolving for `cmd_log` and the CLI tests.
981
+ # re-exported because cmd_log and focused cli tests address these through the command package.
965
982
  from flash.cli.commands.worker_output import ( # noqa: E402,F401
966
983
  _artifact_attempt,
967
984
  _print_worker_output,
985
+ _snapshot_live_attempt,
968
986
  _worker_section_name,
987
+ _worker_sections,
969
988
  )
@@ -61,21 +61,30 @@ def _cmd_train_cost(args) -> int:
61
61
 
62
62
  def _cmd_train_cost_offline(spec) -> int:
63
63
  """Catalog-only quote for the algorithms that do not need workload evidence yet (grpo, opd)."""
64
+ from dataclasses import replace
65
+
64
66
  from flash.cost import estimate_cost
67
+ from flash.schema import MIN_LORA_RANK
65
68
 
69
+ config = runconfig_from_spec(spec)
66
70
  if spec.train.init_from_adapter:
67
- # --cost is offline/catalog-only and cannot read the source adapter, so the rank stays at the
68
- # local default. Warm starts train and are priced at the SOURCE adapter's authoritative rank
69
- # (resolved server-side at submit/dry-run), which can be higher — so this estimate may
70
- # under-quote. stderr keeps stdout clean for machine-readable callers.
71
+ # --cost is offline/catalog-only and cannot read the source adapter's rank, and the parser
72
+ # rejects an authored `lora_rank` alongside `init_from_adapter`, so there is never an
73
+ # authored rank to quote at. stderr keeps stdout clean for machine-readable callers.
74
+ #
75
+ # quote at rank 1 rather than at the serialization placeholder. the placeholder is not a
76
+ # measurement of anything, and `estimate_cost` reads the rank for both the exact-card fit and
77
+ # cost-ranked hardware selection. rank 1 is a vram lower bound, but not a dollar lower bound:
78
+ # a higher source rank can move the run onto a cheaper multi-card shape.
79
+ config = replace(config, lora_rank=MIN_LORA_RANK)
71
80
  print(
72
- "warning: warm-start (train.init_from_adapter) cost uses the default LoRA rank; the "
73
- "source adapter's rank is authoritative and resolved at submit, so a higher-rank source "
74
- f"may cost more than this estimate. Run `{_commands().CLI_NAME} train --dry-run` "
75
- "for a source-rank quote.",
81
+ "warning: warm-start (train.init_from_adapter) cost is a provisional rank-1 estimate. "
82
+ "The authoritative source adapter rank is resolved server-side and can change the "
83
+ "selected hardware and cost in either direction. Run "
84
+ f"`{_commands().CLI_NAME} train --dry-run` for a quote using the resolved source rank.",
76
85
  file=sys.stderr,
77
86
  )
78
- estimate = estimate_cost(runconfig_from_spec(spec))
87
+ estimate = estimate_cost(config)
79
88
  if render.styled():
80
89
  print(render.cost_panel(estimate))
81
90
  else:
@@ -114,8 +123,19 @@ def _client_train_schema(authored_train_keys: frozenset[str]) -> dict:
114
123
  }
115
124
 
116
125
 
126
+ def _has_inline_records(spec) -> bool:
127
+ """Whether this config supplied its SFT rows inline rather than from the resolved package.
128
+
129
+ One predicate for every surface that attributes the counts -- the cost rows and the provenance
130
+ note sit within a few lines of each other, so disagreeing about where the data came from would
131
+ print two contradictory answers in one quote.
132
+ """
133
+ params = getattr(getattr(spec, "environment", None), "params", None)
134
+ return isinstance(params, dict) and params.get("records") is not None
135
+
136
+
117
137
  def _sft_cost_rows(spec, profile: dict) -> list[tuple[str, str | None]]:
118
- """Rows describing the packaged-dataset estimate behind an SFT quote.
138
+ """Rows describing the published packaged-dataset estimate behind an SFT quote.
119
139
 
120
140
  Only aggregates the server actually returned are shown. A field that is absent is dropped
121
141
  rather than defaulted, so the panel never reports a count the profile did not compute.
@@ -125,19 +145,34 @@ def _sft_cost_rows(spec, profile: dict) -> list[tuple[str, str | None]]:
125
145
  value = profile.get(key)
126
146
  return value if isinstance(value, int) and not isinstance(value, bool) else None
127
147
 
148
+ def text(key: str) -> str:
149
+ value = profile.get(key)
150
+ return value.strip() if isinstance(value, str) else ""
151
+
128
152
  steps = count("authoritative_steps")
153
+ source = count("source_examples")
129
154
  retained, selected = count("retained_examples"), count("selected_examples")
130
155
  dropped = count("dropped_examples")
131
156
  compute, supervised = (
132
157
  count("authoritative_compute_tokens"),
133
158
  count("authoritative_supervised_tokens"),
134
159
  )
135
- packing = str(profile.get("packing_mode") or "")
136
- architecture = str(profile.get("architecture_mode") or "")
137
- digest = str(profile.get("content_digest") or "")
160
+ packing = text("packing_mode")
161
+ architecture = text("architecture_mode")
162
+ environment_id = text("environment_id")
163
+ environment_revision = text("environment_revision")
164
+ digest = text("content_digest")
165
+ # inline `[environment.params] records` supply the rows from the request body, so the resolved
166
+ # package contributed the environment but not the dataset. labelling those counts "published
167
+ # copy" names a source they did not come from. one adjective decides all three rows, so they
168
+ # cannot describe the same quote two different ways.
169
+ inline_records = _has_inline_records(spec)
170
+ origin = "inline records" if inline_records else "published copy"
171
+ resolved = "resolved" if inline_records else "published"
138
172
  examples = None
139
173
  if retained is not None and selected is not None:
140
- examples = f"{retained:,} trained of {selected:,} selected"
174
+ examples = f"{retained:,} trained of {selected:,} selected from "
175
+ examples += f"{source:,} source rows in {origin}" if source is not None else origin
141
176
  if dropped:
142
177
  examples += f" ({dropped:,} dropped)"
143
178
  tokens = None
@@ -147,10 +182,15 @@ def _sft_cost_rows(spec, profile: dict) -> list[tuple[str, str | None]]:
147
182
  tokens += f", {supervised:,} supervised"
148
183
  return [
149
184
  ("run", f"{spec.model} [SFT{f', {steps} steps' if steps is not None else ''}]"),
185
+ ("env", f"{resolved} environment {environment_id}" if environment_id else None),
186
+ (
187
+ "revision",
188
+ f"{environment_revision[:12]} ({resolved} commit)" if environment_revision else None,
189
+ ),
150
190
  ("workload", f"{packing} ({architecture})" if packing and architecture else None),
151
191
  ("examples", examples),
152
192
  ("tokens", tokens),
153
- ("profile", digest[:12] or None),
193
+ ("digest", digest[:12] or None),
154
194
  ]
155
195
 
156
196
 
@@ -218,6 +258,71 @@ def _print_reasoning_loss_warning(status: object) -> None:
218
258
  print(render.warn(message) if render.styled() else f"warning: {message}", file=sys.stderr)
219
259
 
220
260
 
261
+ def _print_published_sft_environment_note(status: object, spec) -> None:
262
+ """Warn when SFT counts came from a published managed or GitHub environment."""
263
+ if _has_inline_records(spec):
264
+ return
265
+
266
+ profile = status.get("workload_profile") if isinstance(status, dict) else None
267
+ if not isinstance(profile, dict):
268
+ return
269
+ environment_id = profile.get("environment_id")
270
+ revision = profile.get("environment_revision")
271
+ if not isinstance(environment_id, str) or not environment_id.strip():
272
+ return
273
+ if not isinstance(revision, str) or not revision.strip():
274
+ return
275
+
276
+ environment_id = environment_id.strip()
277
+ advice = _republish_advice(environment_id)
278
+ if advice is None:
279
+ return
280
+
281
+ source = profile.get("source_examples")
282
+ source_suffix = (
283
+ f" ({source:,} source rows)"
284
+ if isinstance(source, int) and not isinstance(source, bool)
285
+ else ""
286
+ )
287
+ message = (
288
+ f"published environment: {environment_id} @ {revision.strip()[:12]}{source_suffix}. "
289
+ "SFT dataset counts come from this resolved published copy, not local files. "
290
+ f"{advice}"
291
+ )
292
+ print(render.note(message) if render.styled() else message, file=sys.stderr)
293
+
294
+
295
+ def _republish_advice(environment_id: str) -> str | None:
296
+ """Return conditional remediation for a managed or GitHub environment id."""
297
+ from flash.envs.identity import (
298
+ canonical_managed_environment_slug,
299
+ github_environment_ref_is_pinned,
300
+ is_github_environment_ref,
301
+ )
302
+
303
+ prefix = "If you expected local dataset edits to be included, "
304
+ try:
305
+ managed_slug = canonical_managed_environment_slug(environment_id)
306
+ except ValueError:
307
+ return None
308
+ if managed_slug is not None:
309
+ return (
310
+ f"{prefix}run `{_commands().CLI_NAME} env push --name NAME "
311
+ "--project PROJECT_UUID [path]` again for this managed environment."
312
+ )
313
+ if not is_github_environment_ref(environment_id):
314
+ return None
315
+ if github_environment_ref_is_pinned(environment_id):
316
+ return (
317
+ f"{prefix}publish the new commit, then update [environment] id to the full new commit "
318
+ "SHA; the existing immutable SHA cannot move."
319
+ )
320
+ return (
321
+ f"{prefix}make the named remote branch or tag point at the new commit. A tag may instead "
322
+ "need a new tag and an updated [environment] id rather than moving the existing tag."
323
+ )
324
+
325
+
221
326
  def _print_sft_cost(status: dict, spec) -> None:
222
327
  total = status.get("estimated_cost_usd") if isinstance(status, dict) else None
223
328
  if not isinstance(total, (int, float)) or isinstance(total, bool):
@@ -234,6 +339,7 @@ def _print_sft_cost(status: dict, spec) -> None:
234
339
  if value is not None:
235
340
  print(f"{key.ljust(8)}: {value}")
236
341
  print(f"{'TOTAL'.ljust(8)}: ${float(total):.2f}")
342
+ _print_published_sft_environment_note(status, spec)
237
343
  print(
238
344
  "tokens, retained rows, truncation, and optimizer steps are estimated from packaged "
239
345
  "input/output fields plus contract_text, contract_path, or TRAINING_CONTRACT.md. other "
@@ -17,8 +17,11 @@ import re
17
17
  from typing import TYPE_CHECKING
18
18
 
19
19
  from flash.cli.ui import render
20
+ from flash.client import ClientError
20
21
 
21
22
  if TYPE_CHECKING:
23
+ from collections.abc import Mapping
24
+
22
25
  from flash.client import ApiClient
23
26
 
24
27
 
@@ -42,18 +45,24 @@ def _worker_section_name(name: str, current_attempt: int | None) -> str:
42
45
  return f"{name} (attempt={attempt}, current attempt)"
43
46
 
44
47
 
45
- def _print_worker_output(client: ApiClient, run_id: str, *, printed_any: bool = False) -> bool:
46
- worker_output = client.get_worker_output(run_id) or {}
47
- if not worker_output:
48
- return printed_any
48
+ def _worker_sections(client: ApiClient, run_id: str) -> dict[str, str]:
49
+ """Fetch only worker artifacts with printable text."""
50
+ return {name: text for name, text in (client.get_worker_output(run_id) or {}).items() if text}
51
+
52
+
53
+ def _snapshot_live_attempt(client: ApiClient, run_id: str) -> int | None:
54
+ """Read the live attempt without letting a heading lookup hide diagnostic artifacts."""
49
55
  try:
50
- current_attempt = render.live_attempt(client.get_run(run_id) or {})
51
- except Exception:
52
- # artifact text is best-effort diagnostic output; a status refresh failure must not hide it.
53
- current_attempt = None
54
- for name, text in worker_output.items():
55
- if not text:
56
- continue
56
+ return render.live_attempt(client.get_run(run_id) or {})
57
+ except ClientError:
58
+ return None
59
+
60
+
61
+ def _print_worker_output(
62
+ sections: Mapping[str, str], *, printed_any: bool = False, current_attempt: int | None = None
63
+ ) -> bool:
64
+ """Print worker artifacts under headings naming the attempt that produced them."""
65
+ for name, text in sections.items():
57
66
  # label provenance from the filename rather than letting the final section, which is merely
58
67
  # the last one appended, read as the live attempt's output.
59
68
  section_name = _worker_section_name(name, current_attempt)
@@ -132,6 +132,26 @@ def _colocate_util_cap(weights_gb: float, total_vram_gb: float) -> float:
132
132
  return 0.55 if (big_weight_copy and leaves_room_for_trainer_copy) else 0.45
133
133
 
134
134
 
135
+ def _capped_engine_util(
136
+ weights_gb: float,
137
+ adapter_gb: float,
138
+ requested_kv_gb: float,
139
+ total_vram_gb: float,
140
+ util_cap: float,
141
+ ) -> float:
142
+ """Fit weights, adapter, then KV into vllm's capped share of one card."""
143
+ card_gb = max(1.0, total_vram_gb)
144
+ max_engine_gb = util_cap * card_gb
145
+ # gpu_memory_utilization is vllm's whole allocation, and its lora weights live inside it. reserve
146
+ # weights plus adapter first; only a cap collision may reduce the requested kv pool. spelling out
147
+ # fitted_kv_gb makes that loss visible instead of incidentally subtracting adapter bytes from a
148
+ # weights-plus-kv fraction. if weights plus adapter alone exceed the cap, kv reaches zero and the
149
+ # returned cap truthfully exposes that this engine shape has no viable cache budget.
150
+ fitted_kv_gb = max(0.0, min(requested_kv_gb, max_engine_gb - weights_gb - adapter_gb))
151
+ fitted_engine_gb = weights_gb + adapter_gb + fitted_kv_gb
152
+ return min(util_cap, fitted_engine_gb / card_gb)
153
+
154
+
135
155
  def colocate_kv_util(
136
156
  params_b: float | None,
137
157
  vllm_max_len: int,
@@ -143,14 +163,19 @@ def colocate_kv_util(
143
163
  model_info=None,
144
164
  preserve_legacy_floor: bool = False,
145
165
  tensor_parallel: int = 1,
166
+ lora_rank: int = 0,
146
167
  ) -> float:
147
168
  """vllm_gpu_memory_utilization for one colocated rollout tensor-parallel rank.
148
169
 
149
- Budget the rank's weight shard plus a conservative full KV cache. Catalog models use geometry
150
- with measured overhead and an 8 GB floor; uncataloged models retain the legacy KV equation.
170
+ budget the rank's weight shard, rank-local bf16 lora footprint, and conservative full kv cache.
171
+ catalog models use geometry with measured overhead and an 8 gb floor; uncataloged models retain
172
+ the legacy kv equation and no unverified adapter margin.
151
173
  """
174
+ from flash.engine.plan.vram import _lora_weight_memory_gb
175
+
152
176
  total_weights_gb = max(0.5, float(params_b or 1.0)) * 2.0
153
177
  tp_size = max(1, int(tensor_parallel))
178
+ adapter_gb = _lora_weight_memory_gb(lora_rank, model_info, tensor_parallel=tp_size) or 0.0
154
179
  # tensor parallelism shards vllm's bf16 weights, but kv heads can replicate when tp is wider than
155
180
  # the model's kv-head count. shard only the weight term and keep the full kv budget on every rank.
156
181
  weights_gb = total_weights_gb if tp_size == 1 else total_weights_gb / tp_size
@@ -162,7 +187,7 @@ def colocate_kv_util(
162
187
  # but not H200. `_NvidiaSmiPeakSampler` verifies runtime headroom.
163
188
  _util_cap = _colocate_util_cap(weights_gb, total_vram_gb)
164
189
  if not sleep_mode:
165
- # `gpu_memory_utilization` covers weights plus KV, so budget both. scale KV with
190
+ # `gpu_memory_utilization` covers weights, adapter, and kv, so budget all three. scale kv with
166
191
  # context and group, floor at `_KV_CAP`, and keep the 0.45 cap aligned with
167
192
  # `estimate_vram_gb(..., sleep_offload=False)`.
168
193
  kv_gb = max(
@@ -176,7 +201,8 @@ def colocate_kv_util(
176
201
  preserve_legacy_floor=preserve_legacy_floor,
177
202
  ),
178
203
  )
179
- return max(_MIN_ENGINE_UTIL, min(_util_cap, (weights_gb + kv_gb) / max(1.0, total_vram_gb)))
204
+ sized = _capped_engine_util(weights_gb, adapter_gb, kv_gb, total_vram_gb, _util_cap)
205
+ return max(_MIN_ENGINE_UTIL, sized)
180
206
  # Sleep mode keeps a larger pool (1.5x margin): the engine is offloaded during the backward, so a
181
207
  # bigger rollout-phase KV does not compete with the training peak.
182
208
  kv_pool_gb = max(
@@ -191,7 +217,7 @@ def colocate_kv_util(
191
217
  preserve_legacy_floor=preserve_legacy_floor,
192
218
  ),
193
219
  )
194
- sized = min(_util_cap, (weights_gb + kv_pool_gb) / max(1.0, total_vram_gb))
220
+ sized = _capped_engine_util(weights_gb, adapter_gb, kv_pool_gb, total_vram_gb, _util_cap)
195
221
  # sharding the weight term can drive a small model's rank budget low enough that vllm has no
196
222
  # room left for its own runtime once the kv pool is carved out -- a 4B model on 2 cards prices
197
223
  # under this floor. single-rank sizing carries the whole weight copy and never gets that small,
@@ -129,6 +129,33 @@ def _legacy_lora_floor_gb(lora_rank: int, effective_params_b: float) -> float:
129
129
  return (lora_rank / 16.0) * (0.3 + 0.04 * effective_params_b)
130
130
 
131
131
 
132
+ def _lora_parameter_count(
133
+ lora_rank: int, model_info=None, *, tensor_parallel: int = 1
134
+ ) -> int | None:
135
+ """lora parameters resident on one tensor-parallel rank from concrete target geometry."""
136
+ shapes = tuple(getattr(model_info, "lora_target_shapes", ()) or ())
137
+ rank = int(lora_rank)
138
+ if not shapes or rank <= 0:
139
+ return None
140
+ tp_size = max(1, int(tensor_parallel))
141
+ if tp_size == 1:
142
+ return rank * sum((int(i) + int(o)) * int(count) for i, o, count in shapes)
143
+ # vllm shards one factor, except the current min-dim-1 gate keeps that factor whole. integer shard
144
+ # sizing covers that catalog shape exactly; this is not a general replicated-layer classifier.
145
+ return sum(
146
+ rank * int(count) * (max(int(i), int(o)) + math.ceil(min(int(i), int(o)) / tp_size))
147
+ for i, o, count in shapes
148
+ )
149
+
150
+
151
+ def _lora_weight_memory_gb(
152
+ lora_rank: int, model_info=None, *, tensor_parallel: int = 1
153
+ ) -> float | None:
154
+ """rank-local resident bf16 lora weights, or none without catalog target geometry."""
155
+ params = _lora_parameter_count(lora_rank, model_info, tensor_parallel=tensor_parallel)
156
+ return None if params is None else params * _BYTES_PER_PARAM["bf16"] / 1e9
157
+
158
+
132
159
  def _lora_memory_gb(
133
160
  lora_rank: int,
134
161
  effective_params_b: float,
@@ -137,14 +164,9 @@ def _lora_memory_gb(
137
164
  ) -> float:
138
165
  """Adapter, gradient, and optimizer memory for the actual PEFT all-linear targets."""
139
166
  floor = _legacy_lora_floor_gb(lora_rank, effective_params_b)
140
- shapes = tuple(getattr(model_info, "lora_target_shapes", ()) or ())
141
- if not shapes:
167
+ trainable_params = _lora_parameter_count(lora_rank, model_info)
168
+ if trainable_params is None:
142
169
  return floor
143
- target_dims = sum(
144
- (int(in_features) + int(out_features)) * int(count)
145
- for in_features, out_features, count in shapes
146
- )
147
- trainable_params = max(1, int(lora_rank)) * target_dims
148
170
  bytes_per_param = (
149
171
  _LORA_PAGED_BYTES_PER_PARAM
150
172
  if (algorithm or "").lower() in ("grpo", "rl")
@@ -225,15 +247,15 @@ def grpo_kv_floor_gb(
225
247
  fp8_kv: bool = False,
226
248
  model_info=None,
227
249
  preserve_legacy_floor: bool = False,
250
+ lora_rank: int = 0,
251
+ tensor_parallel: int = 1,
228
252
  ) -> int:
229
- """Smallest card (GB) whose colocated vLLM executor budget still leaves a viable KV pool.
230
-
231
- The 0.45/0.55 cap must hold the weight copy plus half the concurrent group's KV; otherwise
232
- vLLM can fail with "No available memory for the cache blocks".
233
- """
253
+ """Smallest card whose cap holds rank-local weights, adapter, and half the KV pool."""
234
254
  kv_params_b = float(active_params_b) if active_params_b else float(params_b)
235
- weights_gb = max(0.5, float(params_b)) * 2.0
236
- need = weights_gb + 0.5 * _resident_kv_gb(
255
+ tp_size = max(1, int(tensor_parallel))
256
+ weights_gb = max(0.5, float(params_b)) * 2.0 / tp_size
257
+ adapter_gb = _lora_weight_memory_gb(lora_rank, model_info, tensor_parallel=tp_size) or 0.0
258
+ kv_gb = _resident_kv_gb(
237
259
  kv_params_b,
238
260
  vllm_max_len,
239
261
  group_size,
@@ -241,6 +263,7 @@ def grpo_kv_floor_gb(
241
263
  model_info=model_info,
242
264
  preserve_legacy_floor=preserve_legacy_floor,
243
265
  )
266
+ need = weights_gb + adapter_gb + 0.5 * kv_gb
244
267
  lower = math.ceil(need / 0.55)
245
268
  upper = math.ceil(need / 0.45)
246
269
  for total_vram_gb in range(lower, upper + 1):
@@ -295,6 +318,7 @@ def _rollout_kv_floor_gb(
295
318
  model_info=None,
296
319
  model_id: str = "",
297
320
  preserve_legacy_floor: bool = False,
321
+ lora_rank: int = 0,
298
322
  ) -> int:
299
323
  floor = grpo_kv_floor_gb(
300
324
  params_b,
@@ -303,6 +327,7 @@ def _rollout_kv_floor_gb(
303
327
  active_params_b=active_params_b,
304
328
  model_info=model_info,
305
329
  preserve_legacy_floor=preserve_legacy_floor,
330
+ lora_rank=lora_rank,
306
331
  )
307
332
  from flash.providers.base import max_non_fp8_kv_vram_gb
308
333
 
@@ -323,6 +348,7 @@ def _rollout_kv_floor_gb(
323
348
  fp8_kv=True,
324
349
  model_info=model_info,
325
350
  preserve_legacy_floor=preserve_legacy_floor,
351
+ lora_rank=lora_rank,
326
352
  )
327
353
  return max(fp8_floor, ceiling + 1)
328
354
 
@@ -838,6 +864,7 @@ def _catalog_model_required_vram_gb(
838
864
  model_info=sizing_info,
839
865
  model_id=model_id,
840
866
  preserve_legacy_floor=is_opd,
867
+ lora_rank=lora_rank,
841
868
  ),
842
869
  )
843
870
  return need
@@ -560,6 +560,7 @@ def _resolve_opd_gpu_mem_util(
560
560
  "model_id": model_id,
561
561
  "model_revision": str(getattr(request, "model_revision", "") or ""),
562
562
  "engine_len": int(prompt_state.max_model_len),
563
+ "lora_rank": int(workload.lora_rank),
563
564
  # opd submits prompts_per_step * group_size generations to the rollout engine together.
564
565
  # grpo's concurrency is group_size because its resolver receives one prompt group here.
565
566
  "group_size": int(workload.prompts_per_step) * int(request.knobs.group_size),
@@ -503,13 +503,16 @@ def resolve_gpu_mem_util(
503
503
  ) -> float:
504
504
  """size vllm's colocated executor budget from this run's geometry.
505
505
 
506
- ``gpu_memory_utilization`` covers the second bf16 weight copy plus kv pool. using
506
+ ``gpu_memory_utilization`` covers the second bf16 weight copy, lora adapter, and kv pool. using
507
507
  ``colocate_kv_util`` keeps worker allocation aligned with preflight admission.
508
508
 
509
- for multi-gpu runs, vllm shards its bf16 weight copy across tensor-parallel ranks. the kv term
510
- remains unsharded here because vllm can replicate kv heads when tensor parallelism is wider than
511
- the model's kv-head count. the result is explicitly capped at the old 0.5 constant, so this path
512
- can only lower a rank's reservation and cannot create a new over-reservation.
509
+ for multi-gpu runs, vllm shards its bf16 weight copy across tensor-parallel ranks. its default
510
+ lora layout shards only one factor of each projection's a/b pair, so the rank-local adapter uses
511
+ the larger safe orientation from catalog geometry rather than dividing the full adapter evenly.
512
+ the kv term remains unsharded here because vllm can replicate kv heads when tensor parallelism is
513
+ wider than the model's kv-head count. the adapter lives inside vllm's reservation, and the result
514
+ is explicitly capped at the old 0.5 constant, so this path can only lower a rank's reservation
515
+ and cannot create a new over-reservation.
513
516
 
514
517
  the flat constant is kept where the model does not apply, because a wrong number is worse than
515
518
  a conservative one:
@@ -564,6 +567,7 @@ def resolve_gpu_mem_util(
564
567
  model_info=info,
565
568
  preserve_legacy_floor=preserve_legacy_floor,
566
569
  tensor_parallel=n_gpus,
570
+ lora_rank=int(inp["lora_rank"]),
567
571
  )
568
572
  # multi-rank sizing is strictly one-directional against the previous worker contract: it may
569
573
  # free memory but can never claim more than the flat reservation a working run already used.
@@ -255,3 +255,13 @@ def _is_safe_github_path_parts(parts: list[str] | tuple[str, ...]) -> bool:
255
255
  def is_commit_sha(value: str) -> bool:
256
256
  """True when value is a full 40-hex-char git commit id (an immutable ref)."""
257
257
  return _COMMIT_SHA_RE.fullmatch(value) is not None
258
+
259
+
260
+ def github_environment_ref_is_pinned(value: str) -> bool:
261
+ """True when a ``github:`` environment id names an immutable commit.
262
+
263
+ Only the SHA case is decidable from the id. Branches and tags share one string shape, so callers
264
+ must give symbolic-ref advice that is valid for either rather than assuming the ref is movable.
265
+ """
266
+ parsed = _parse_github_environment_ref(value)
267
+ return parsed is not None and is_commit_sha(parsed.ref)