freesolo-flash-dev 1.2.36__tar.gz → 1.2.37__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 (541) hide show
  1. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/PKG-INFO +1 -1
  2. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/cli/commands/__init__.py +13 -5
  3. freesolo_flash_dev-1.2.37/flash/cli/commands/prompt_budget.py +146 -0
  4. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/cli/commands/train_cost.py +3 -0
  5. freesolo_flash_dev-1.2.37/flash/engine/plan/prompt_budget.py +63 -0
  6. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/opd_train_runner.py +6 -2
  7. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/train/rl/inputs.py +5 -5
  8. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/runner/__init__.py +7 -0
  9. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/runner/preparation.py +5 -4
  10. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/runner/submit.py +17 -5
  11. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/pyproject.toml +2 -2
  12. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_client_server_integration.py +5 -0
  13. freesolo_flash_dev-1.2.37/tests/test_prompt_budget.py +392 -0
  14. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_warmstart_cross_repo.py +13 -3
  15. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/uv.lock +1 -1
  16. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/.dockerignore +0 -0
  17. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/.env.example +0 -0
  18. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/.github/CODEOWNERS +0 -0
  19. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  20. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  21. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  22. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  23. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/.github/dependabot.yml +0 -0
  24. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/.github/workflows/auto-rebake.yml +0 -0
  25. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/.github/workflows/bake-kernel-cache.yml +0 -0
  26. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/.github/workflows/ci.yml +0 -0
  27. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/.github/workflows/main-source-guard.yml +0 -0
  28. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/.github/workflows/notify-tests-repo.yml +0 -0
  29. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/.github/workflows/publish-dev.yml +0 -0
  30. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/.github/workflows/publish-image.yml +0 -0
  31. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/.github/workflows/publish.yml +0 -0
  32. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/.github/workflows/version-parity.yml +0 -0
  33. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/.github/workflows/worker-image.yml +0 -0
  34. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/.gitignore +0 -0
  35. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/CHANGELOG.md +0 -0
  36. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/CODE_OF_CONDUCT.md +0 -0
  37. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/CONTRIBUTING.md +0 -0
  38. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/Dockerfile +0 -0
  39. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/Dockerfile.worker +0 -0
  40. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/LICENSE +0 -0
  41. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/NOTICE +0 -0
  42. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/README.md +0 -0
  43. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/SECURITY.md +0 -0
  44. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/SELF_HOSTING.md +0 -0
  45. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/build/kernel_cache/.gitignore +0 -0
  46. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/build/kernel_cache/.keep +0 -0
  47. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/deploy/infisical/README.md +0 -0
  48. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/deploy/infisical/entrypoint.sh +0 -0
  49. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/docker/Dockerfile.kernelcache +0 -0
  50. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/docker/Dockerfile.kernelcache.relayer +0 -0
  51. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/docker/bake_kernel_cache.py +0 -0
  52. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/docker/bake_pod_entry.py +0 -0
  53. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/docker/extract_cudart_fix.py +0 -0
  54. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/docker/kernel_fingerprint.py +0 -0
  55. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/docker/make_rp_handler.py +0 -0
  56. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/__init__.py +0 -0
  57. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/_internal/__init__.py +0 -0
  58. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/_internal/channel.py +0 -0
  59. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/_internal/diagnostics.py +0 -0
  60. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/_internal/fileio.py +0 -0
  61. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/_internal/logging.py +0 -0
  62. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/_internal/paths.py +0 -0
  63. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/adapters/__init__.py +0 -0
  64. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/adapters/artifacts.py +0 -0
  65. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/adapters/lora_rank.py +0 -0
  66. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/cli/__init__.py +0 -0
  67. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/cli/__main__.py +0 -0
  68. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/cli/commands/deploy.py +0 -0
  69. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/cli/commands/env/__init__.py +0 -0
  70. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/cli/commands/env/episode.py +0 -0
  71. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/cli/commands/env/eval.py +0 -0
  72. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/cli/commands/env/eval_args.py +0 -0
  73. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/cli/commands/env/imports.py +0 -0
  74. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/cli/commands/env/list.py +0 -0
  75. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/cli/commands/env/push.py +0 -0
  76. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/cli/commands/env/retained.py +0 -0
  77. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/cli/commands/env/setup.py +0 -0
  78. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/cli/commands/env/test.py +0 -0
  79. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/cli/commands/env/test_evaluations.py +0 -0
  80. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/cli/commands/env/test_params.py +0 -0
  81. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/cli/commands/env/test_warnings.py +0 -0
  82. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/cli/commands/traces.py +0 -0
  83. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/cli/scaffold/TRAINING.md +0 -0
  84. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/cli/scaffold/__init__.py +0 -0
  85. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/cli/ui/__init__.py +0 -0
  86. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/cli/ui/cost.py +0 -0
  87. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/cli/ui/env_panels.py +0 -0
  88. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/cli/ui/heartbeat.py +0 -0
  89. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/cli/ui/render.py +0 -0
  90. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/cli/ui/tables.py +0 -0
  91. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/cli/ui/tty.py +0 -0
  92. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/client/__init__.py +0 -0
  93. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/client/config.py +0 -0
  94. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/client/freesolo_api.py +0 -0
  95. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/client/http.py +0 -0
  96. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/client/runtime_secrets.py +0 -0
  97. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/client/shapes.py +0 -0
  98. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/client/specs.py +0 -0
  99. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/client/streaming.py +0 -0
  100. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/content/__init__.py +0 -0
  101. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/content/multimodal.py +0 -0
  102. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/content/structured_outputs.py +0 -0
  103. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/content/thinking.py +0 -0
  104. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/core/__init__.py +0 -0
  105. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/core/catalog.py +0 -0
  106. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/core/spec.py +0 -0
  107. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/cost/__init__.py +0 -0
  108. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/cost/analytical.py +0 -0
  109. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/cost/facts.py +0 -0
  110. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/cost/spec.py +0 -0
  111. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/cost/types.py +0 -0
  112. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/__init__.py +0 -0
  113. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/plan/__init__.py +0 -0
  114. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/plan/kv_sizing.py +0 -0
  115. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/plan/model_config_probe.py +0 -0
  116. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/plan/recipe.py +0 -0
  117. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/plan/steps.py +0 -0
  118. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/plan/vram.py +0 -0
  119. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/profiling/__init__.py +0 -0
  120. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/profiling/dataset_profile.py +0 -0
  121. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/profiling/reasoning_render.py +0 -0
  122. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/profiling/sft_workload.py +0 -0
  123. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/profiling/tokenizer.py +0 -0
  124. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/profiling/workload_profile.py +0 -0
  125. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/result/__init__.py +0 -0
  126. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/result/accounting.py +0 -0
  127. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/result/rollout_samples.py +0 -0
  128. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/__init__.py +0 -0
  129. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/__main__.py +0 -0
  130. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/backend_common.py +0 -0
  131. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/entry/__init__.py +0 -0
  132. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/entry/opd.py +0 -0
  133. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/entry/rl.py +0 -0
  134. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/entry/sft.py +0 -0
  135. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/io/__init__.py +0 -0
  136. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/io/heartbeat.py +0 -0
  137. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/io/hf.py +0 -0
  138. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/io/prefetch.py +0 -0
  139. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/io/wandb_log.py +0 -0
  140. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/model/__init__.py +0 -0
  141. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/model/adapter.py +0 -0
  142. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/model/decoding.py +0 -0
  143. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/model/lora.py +0 -0
  144. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/model/packing.py +0 -0
  145. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/opd_train.py +0 -0
  146. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/perf/__init__.py +0 -0
  147. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/perf/diagnostics.py +0 -0
  148. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/perf/lifecycle.py +0 -0
  149. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/perf/liger.py +0 -0
  150. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/perf/memory.py +0 -0
  151. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/rl_train.py +0 -0
  152. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/rl_train_runner.py +0 -0
  153. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/runtime/__init__.py +0 -0
  154. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/runtime/kernel_warmup.py +0 -0
  155. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/runtime/pkg_proxy.py +0 -0
  156. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/runtime/rng.py +0 -0
  157. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/score_batcher.py +0 -0
  158. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/sft_train.py +0 -0
  159. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/sft_train_runner.py +0 -0
  160. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/teacher/__init__.py +0 -0
  161. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/teacher/client.py +0 -0
  162. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/teacher/encoding.py +0 -0
  163. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/teacher/tokenizer_align.py +0 -0
  164. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/train/__init__.py +0 -0
  165. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/train/core/__init__.py +0 -0
  166. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/train/core/child/__init__.py +0 -0
  167. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/train/core/child/glue.py +0 -0
  168. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/train/core/step_timing.py +0 -0
  169. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/train/finalize.py +0 -0
  170. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/train/opd/__init__.py +0 -0
  171. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/train/opd/batching.py +0 -0
  172. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/train/opd/bridge.py +0 -0
  173. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/train/opd/child/__init__.py +0 -0
  174. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/train/opd/child/bridge.py +0 -0
  175. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/train/opd/child/multiturn.py +0 -0
  176. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/train/opd/child/plugin.py +0 -0
  177. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/train/opd/child/structured.py +0 -0
  178. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/train/opd/failures.py +0 -0
  179. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/train/opd/gkd.py +0 -0
  180. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/train/opd/multiturn_validation.py +0 -0
  181. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/train/opd/overrides.py +0 -0
  182. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/train/opd/prompts.py +0 -0
  183. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/train/opd/reporting.py +0 -0
  184. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/train/opd/scoring.py +0 -0
  185. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/train/opd/state.py +0 -0
  186. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/train/opd/validation.py +0 -0
  187. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/train/rl/__init__.py +0 -0
  188. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/train/rl/checkpoints.py +0 -0
  189. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/train/rl/child/__init__.py +0 -0
  190. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/train/rl/child/multiturn.py +0 -0
  191. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/train/rl/child/plugin.py +0 -0
  192. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/train/rl/config.py +0 -0
  193. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/train/rl/multi_turn.py +0 -0
  194. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/train/rl/scoring.py +0 -0
  195. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/train/rl/shims.py +0 -0
  196. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/train/rl/single_turn.py +0 -0
  197. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/train/rl/verl_config.py +0 -0
  198. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/train/sft/__init__.py +0 -0
  199. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/train/sft/checkpoints.py +0 -0
  200. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/train/sft/config.py +0 -0
  201. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/verl/__init__.py +0 -0
  202. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/verl/capabilities.py +0 -0
  203. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/verl/checkpoints.py +0 -0
  204. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/verl/child_io.py +0 -0
  205. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/verl/diagnostics.py +0 -0
  206. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker/verl/parallelism.py +0 -0
  207. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/engine/worker_entrypoint.py +0 -0
  208. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/envs/__init__.py +0 -0
  209. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/envs/adapter.py +0 -0
  210. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/envs/base.py +0 -0
  211. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/envs/cache_security.py +0 -0
  212. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/envs/dataset_selection.py +0 -0
  213. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/envs/evaluations.py +0 -0
  214. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/envs/identity.py +0 -0
  215. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/envs/loader.py +0 -0
  216. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/envs/namespace_listing.py +0 -0
  217. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/envs/package/__init__.py +0 -0
  218. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/envs/package/limits.py +0 -0
  219. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/envs/package/unpack.py +0 -0
  220. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/envs/pull.py +0 -0
  221. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/providers/__init__.py +0 -0
  222. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/providers/_lifecycle/__init__.py +0 -0
  223. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/providers/_lifecycle/auth.py +0 -0
  224. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/providers/_lifecycle/bootstrap.py +0 -0
  225. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/providers/_lifecycle/bootstrap_pip.py +0 -0
  226. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/providers/_lifecycle/bootstrap_secrets.py +0 -0
  227. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/providers/_lifecycle/deadline.py +0 -0
  228. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/providers/_lifecycle/http.py +0 -0
  229. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/providers/_lifecycle/instance.py +0 -0
  230. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/providers/_lifecycle/poll.py +0 -0
  231. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/providers/_lifecycle/poll_instance.py +0 -0
  232. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/providers/_lifecycle/provider.py +0 -0
  233. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/providers/_lifecycle/worker.py +0 -0
  234. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/providers/allocator.py +0 -0
  235. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/providers/artifacts/__init__.py +0 -0
  236. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/providers/artifacts/hf.py +0 -0
  237. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/providers/artifacts/preload_runpod.py +0 -0
  238. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/providers/artifacts/weight_cache.py +0 -0
  239. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/providers/base.py +0 -0
  240. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/providers/fit_errors.py +0 -0
  241. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/providers/lambda_/__init__.py +0 -0
  242. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/providers/lambda_/api.py +0 -0
  243. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/providers/lambda_/auth.py +0 -0
  244. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/providers/lambda_/gpus.py +0 -0
  245. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/providers/lambda_/jobs/__init__.py +0 -0
  246. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/providers/lambda_/jobs/builders.py +0 -0
  247. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/providers/lambda_/jobs/reap.py +0 -0
  248. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/providers/lambda_/preflight.py +0 -0
  249. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/providers/lambda_/pricing.py +0 -0
  250. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/providers/preflight.py +0 -0
  251. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/providers/realized.py +0 -0
  252. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/providers/runpod/__init__.py +0 -0
  253. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/providers/runpod/api.py +0 -0
  254. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/providers/runpod/auth.py +0 -0
  255. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/providers/runpod/cost.py +0 -0
  256. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/providers/runpod/gpus.py +0 -0
  257. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/providers/runpod/job_execution.py +0 -0
  258. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/providers/runpod/jobs.py +0 -0
  259. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/providers/runpod/preflight.py +0 -0
  260. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/providers/runpod/pricing.py +0 -0
  261. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/providers/runpod/resources.py +0 -0
  262. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/providers/runpod/serverless/__init__.py +0 -0
  263. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/providers/runpod/serverless/endpoints.py +0 -0
  264. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/providers/sharding.py +0 -0
  265. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/providers/vast/__init__.py +0 -0
  266. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/providers/vast/api.py +0 -0
  267. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/providers/vast/auth.py +0 -0
  268. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/providers/vast/jobs/__init__.py +0 -0
  269. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/providers/vast/jobs/builders.py +0 -0
  270. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/providers/vast/preflight.py +0 -0
  271. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/providers/vast/pricing.py +0 -0
  272. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/py.typed +0 -0
  273. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/runner/artifacts.py +0 -0
  274. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/runner/attempts.py +0 -0
  275. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/runner/costs.py +0 -0
  276. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/runner/deadlines.py +0 -0
  277. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/runner/reconciliation.py +0 -0
  278. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/runner/results/__init__.py +0 -0
  279. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/runner/results/checkpoints.py +0 -0
  280. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/runner/results/verified_revisions.py +0 -0
  281. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/runner/status.py +0 -0
  282. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/runner/supervise/__init__.py +0 -0
  283. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/runner/supervise/attach.py +0 -0
  284. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/runner/supervise/deploy.py +0 -0
  285. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/runner/supervise/lifecycle.py +0 -0
  286. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/runner/supervise/recovery.py +0 -0
  287. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/runner/supervise/retry_decision.py +0 -0
  288. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/runner/supervise/seed_submission.py +0 -0
  289. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/runner/supervise/transitions.py +0 -0
  290. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/runner/weight_cache.py +0 -0
  291. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/schema/__init__.py +0 -0
  292. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/schema/fields.py +0 -0
  293. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/serve/__init__.py +0 -0
  294. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/serve/adapter_check.py +0 -0
  295. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/serve/deploy.py +0 -0
  296. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/serve/errors.py +0 -0
  297. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/serve/export.py +0 -0
  298. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/serve/preflight.py +0 -0
  299. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/serve/responses.py +0 -0
  300. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/serve/streaming.py +0 -0
  301. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/serve/thinking.py +0 -0
  302. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/serve/urls.py +0 -0
  303. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/server/__init__.py +0 -0
  304. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/server/__main__.py +0 -0
  305. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/server/app.py +0 -0
  306. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/server/billing/__init__.py +0 -0
  307. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/server/billing/charges.py +0 -0
  308. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/server/billing/retry.py +0 -0
  309. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/server/domain/__init__.py +0 -0
  310. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/server/domain/checkpoints.py +0 -0
  311. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/server/domain/environment_registry.py +0 -0
  312. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/server/domain/envs.py +0 -0
  313. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/server/domain/projects.py +0 -0
  314. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/server/domain/reconcile.py +0 -0
  315. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/server/domain/repo_cleanup.py +0 -0
  316. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/server/domain/run_registry.py +0 -0
  317. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/server/domain/teacher_broker.py +0 -0
  318. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/server/domain/teacher_errors.py +0 -0
  319. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/server/domain/teacher_requests.py +0 -0
  320. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/server/platform/__init__.py +0 -0
  321. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/server/platform/auth.py +0 -0
  322. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/server/platform/db.py +0 -0
  323. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/server/platform/deps.py +0 -0
  324. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/server/platform/internal_client.py +0 -0
  325. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/server/platform/locks.py +0 -0
  326. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/server/platform/runtime.py +0 -0
  327. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/server/routes/__init__.py +0 -0
  328. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/server/routes/envs.py +0 -0
  329. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/server/routes/meta.py +0 -0
  330. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/server/routes/runs.py +0 -0
  331. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/server/routes/serving.py +0 -0
  332. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/server/routes/serving_completion.py +0 -0
  333. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/server/routes/serving_revisions.py +0 -0
  334. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/server/routes/serving_smoke.py +0 -0
  335. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/server/routes/teacher.py +0 -0
  336. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/teacher/__init__.py +0 -0
  337. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/teacher/limits.py +0 -0
  338. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/flash/teacher/retry_contract.py +0 -0
  339. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/scripts/build_dev_dist.py +0 -0
  340. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/scripts/check_file_size.py +0 -0
  341. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/scripts/check_function_size.py +0 -0
  342. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/scripts/check_verl_pin_exists.py +0 -0
  343. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/scripts/scrub_history.sh +0 -0
  344. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/__init__.py +0 -0
  345. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/_helpers/__init__.py +0 -0
  346. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/_helpers/profile.py +0 -0
  347. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/_helpers/runner.py +0 -0
  348. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/_helpers/specs.py +0 -0
  349. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/_helpers/teacher.py +0 -0
  350. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/_helpers/vast.py +0 -0
  351. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/conftest.py +0 -0
  352. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/fixtures/math_eval.jsonl +0 -0
  353. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/fixtures/math_train.jsonl +0 -0
  354. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/live/__init__.py +0 -0
  355. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/live/conftest.py +0 -0
  356. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/live/test_lambda_live.py +0 -0
  357. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/live/test_runpod_live.py +0 -0
  358. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/live/test_sft_thinking_render_live.py +0 -0
  359. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/live/test_vast_live.py +0 -0
  360. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_accounting_coverage.py +0 -0
  361. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_adapter_shard_completeness.py +0 -0
  362. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_agent_flash_cli_contract.py +0 -0
  363. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_algorithms.py +0 -0
  364. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_allocator.py +0 -0
  365. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_backend_common.py +0 -0
  366. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_backend_jobspec_contract.py +0 -0
  367. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_bake_kernel_cache.py +0 -0
  368. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_base_model_provenance.py +0 -0
  369. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_billing_retry.py +0 -0
  370. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_build_context_contract.py +0 -0
  371. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_cancel_remote.py +0 -0
  372. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_catalog_consistency.py +0 -0
  373. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_catalog_only_models.py +0 -0
  374. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_charge_pricing.py +0 -0
  375. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_checkpoints.py +0 -0
  376. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_cli_commands.py +0 -0
  377. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_cli_commands_coverage.py +0 -0
  378. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_cli_credential_shadowing.py +0 -0
  379. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_cli_errors.py +0 -0
  380. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_cli_estimate.py +0 -0
  381. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_cli_gpus_flag.py +0 -0
  382. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_cli_help.py +0 -0
  383. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_cli_main_coverage.py +0 -0
  384. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_cli_managed.py +0 -0
  385. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_cli_render_coverage.py +0 -0
  386. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_cli_render_theme.py +0 -0
  387. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_cli_traces.py +0 -0
  388. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_cli_wandb_warning.py +0 -0
  389. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_client.py +0 -0
  390. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_client_import_purity.py +0 -0
  391. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_client_stream_reads.py +0 -0
  392. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_config_env_vars.py +0 -0
  393. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_config_overrides.py +0 -0
  394. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_controlled_experiment_repairs.py +0 -0
  395. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_cost_analytical.py +0 -0
  396. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_cost_equation.py +0 -0
  397. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_cost_estimate.py +0 -0
  398. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_cost_hardware.py +0 -0
  399. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_cost_models.py +0 -0
  400. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_dataset_profile.py +0 -0
  401. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_deploy_alias_move_warning.py +0 -0
  402. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_deploy_latency.py +0 -0
  403. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_dev_channel.py +0 -0
  404. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_disk_gb.py +0 -0
  405. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_endpoint_name.py +0 -0
  406. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_env_cache_evict.py +0 -0
  407. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_env_delete.py +0 -0
  408. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_env_download.py +0 -0
  409. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_env_download_api.py +0 -0
  410. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_env_evaluations.py +0 -0
  411. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_env_list_api.py +0 -0
  412. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_env_list_cli.py +0 -0
  413. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_env_list_hub.py +0 -0
  414. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_env_no_install.py +0 -0
  415. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_env_publish.py +0 -0
  416. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_env_pull.py +0 -0
  417. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_env_pull_coverage.py +0 -0
  418. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_env_pull_loader_coverage.py +0 -0
  419. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_env_pull_managed_control_plane.py +0 -0
  420. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_env_push.py +0 -0
  421. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_env_rate_limit_resolve.py +0 -0
  422. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_env_ref_pinning.py +0 -0
  423. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_env_test.py +0 -0
  424. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_envs_coverage.py +0 -0
  425. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_export.py +0 -0
  426. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_flash_mvp.py +0 -0
  427. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_flash_worker.py +0 -0
  428. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_flashinfer_cache_dirs.py +0 -0
  429. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_freesolo_api_transport.py +0 -0
  430. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_github_urlopen_retry.py +0 -0
  431. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_gpu_type_single_field.py +0 -0
  432. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_gpus.py +0 -0
  433. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_grpo_params.py +0 -0
  434. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_grpo_resident_sizing.py +0 -0
  435. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_grpo_reward_batching.py +0 -0
  436. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_health_liveness.py +0 -0
  437. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_hf_retry.py +0 -0
  438. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_idle_endpoint_reaper.py +0 -0
  439. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_infisical_secrets.py +0 -0
  440. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_instance_bootstrap_coverage.py +0 -0
  441. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_internal_client.py +0 -0
  442. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_jobs.py +0 -0
  443. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_kernel_cache.py +0 -0
  444. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_kernel_fingerprint.py +0 -0
  445. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_kv_util.py +0 -0
  446. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_lambda_api_coverage.py +0 -0
  447. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_lambda_runner.py +0 -0
  448. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_logging.py +0 -0
  449. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_login_perms.py +0 -0
  450. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_lora_rank_coverage.py +0 -0
  451. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_lora_rank_preflight.py +0 -0
  452. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_managed_config_fields.py +0 -0
  453. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_managed_hf_repo.py +0 -0
  454. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_metrics_schema_agent_contract.py +0 -0
  455. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_mig_guard.py +0 -0
  456. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_multi_gpu_gate.py +0 -0
  457. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_multimodal_training.py +0 -0
  458. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_named_reward_metrics.py +0 -0
  459. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_oom_escalate_gpu.py +0 -0
  460. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_opd.py +0 -0
  461. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_opd_limits.py +0 -0
  462. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_opd_multiturn_eos_boundary.py +0 -0
  463. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_opd_resume_safety.py +0 -0
  464. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_opd_train.py +0 -0
  465. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_orchestrator_flash.py +0 -0
  466. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_packing.py +0 -0
  467. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_packing_coverage.py +0 -0
  468. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_parasail_teacher.py +0 -0
  469. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_poll_helpers.py +0 -0
  470. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_preflight.py +0 -0
  471. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_projects.py +0 -0
  472. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_provider_preflight_coverage.py +0 -0
  473. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_provider_routing.py +0 -0
  474. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_provider_teardown_robustness.py +0 -0
  475. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_providers_symmetry.py +0 -0
  476. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_realized_cost.py +0 -0
  477. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_repo_cleanup.py +0 -0
  478. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_resolve_params_b.py +0 -0
  479. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_resume_on_retry.py +0 -0
  480. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_rl_train.py +0 -0
  481. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_rollout_samples.py +0 -0
  482. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_runmgmt.py +0 -0
  483. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_runpod_api_delete.py +0 -0
  484. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_runpod_key_fingerprint.py +0 -0
  485. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_runpod_key_waterfall.py +0 -0
  486. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_serve.py +0 -0
  487. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_serve_reasoning_content.py +0 -0
  488. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_server_api.py +0 -0
  489. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_server_app_coverage.py +0 -0
  490. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_server_auth_singleflight.py +0 -0
  491. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_server_billing.py +0 -0
  492. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_server_checkpoints_coverage.py +0 -0
  493. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_server_db.py +0 -0
  494. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_server_envs_coverage.py +0 -0
  495. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_server_locks_coverage.py +0 -0
  496. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_server_standalone.py +0 -0
  497. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_serving_context_preflight.py +0 -0
  498. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_serving_contract.py +0 -0
  499. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_serving_schema_coverage.py +0 -0
  500. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_sft_chunked_nll.py +0 -0
  501. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_sft_example_selection.py +0 -0
  502. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_sft_gc_off.py +0 -0
  503. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_sft_max_context.py +0 -0
  504. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_sft_startup_block.py +0 -0
  505. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_sft_train.py +0 -0
  506. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_sft_workload.py +0 -0
  507. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_spec_and_validation.py +0 -0
  508. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_step_floor.py +0 -0
  509. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_step_metrics.py +0 -0
  510. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_step_timing.py +0 -0
  511. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_structured_outputs.py +0 -0
  512. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_teacher_broker.py +0 -0
  513. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_teacher_encoding_contract.py +0 -0
  514. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_thinking_config.py +0 -0
  515. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_train_context_preflight.py +0 -0
  516. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_training_controls.py +0 -0
  517. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_type_comment_prose.py +0 -0
  518. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_vast_api.py +0 -0
  519. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_vast_api_coverage.py +0 -0
  520. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_vast_offers.py +0 -0
  521. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_vast_provider_coverage.py +0 -0
  522. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_vast_runner.py +0 -0
  523. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_verified_revisions.py +0 -0
  524. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_verifiers.py +0 -0
  525. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_version.py +0 -0
  526. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_vl_warmstart_adapter_keys.py +0 -0
  527. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_vram_architecture.py +0 -0
  528. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_wandb_link.py +0 -0
  529. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_wandb_naming.py +0 -0
  530. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_warmstart_adapter_download.py +0 -0
  531. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_warmstart_error_attribution.py +0 -0
  532. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_weight_cache.py +0 -0
  533. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_worker_dryrun.py +0 -0
  534. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_worker_hardexit.py +0 -0
  535. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_worker_image.py +0 -0
  536. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_worker_init_heartbeat.py +0 -0
  537. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_worker_stack.py +0 -0
  538. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_worker_thinking.py +0 -0
  539. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_workflow_contracts.py +0 -0
  540. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/tests/test_workload_profile.py +0 -0
  541. {freesolo_flash_dev-1.2.36 → freesolo_flash_dev-1.2.37}/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.36
3
+ Version: 1.2.37
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
@@ -399,6 +399,7 @@ def cmd_train(args) -> int:
399
399
  # equally not a verification -- so treat anything but an explicit True as unverified.
400
400
  affordability_verified = status.pop("affordability_verified", None) is True
401
401
  cost = "and cost" if affordability_verified else "but NOT cost"
402
+ budget_validated = prompt_budget_validation_suffix(status)
402
403
  environment = (
403
404
  "it did NOT import or run your environment.py. packaged input/output fields and the "
404
405
  "statically readable training contract were tokenized together; tokens, retention, "
@@ -411,8 +412,8 @@ def cmd_train(args) -> int:
411
412
  )
412
413
  print(
413
414
  "dry-run validated: config/schema, model+algorithm compatibility, lora rank, "
414
- f"runtime-secret presence, warm-start source, serving context cap, {cost}. "
415
- f"{environment}",
415
+ f"runtime-secret presence, warm-start source, serving context cap{budget_validated}, "
416
+ f"{cost}. {environment}",
416
417
  file=sys.stderr,
417
418
  )
418
419
  if not affordability_verified:
@@ -430,8 +431,10 @@ def cmd_train(args) -> int:
430
431
  else:
431
432
  print(json.dumps(status, indent=2))
432
433
  _print_unpacked_batch_warning(status, spec) # after the payload, so stdout stays parseable
434
+ print_status_prompt_budget_warning(status)
433
435
  _print_reasoning_loss_warning(status)
434
436
  return 0
437
+ local_budget = warn_before_paid_submit(client, spec)
435
438
  status = client.create_run(
436
439
  payload,
437
440
  runtime_secrets=runtime_secrets,
@@ -440,6 +443,7 @@ def cmd_train(args) -> int:
440
443
  run_id = status["run_id"]
441
444
  _print_unpacked_batch_warning(status, spec) # a real submit overrides batch_size the same way
442
445
  _print_reasoning_loss_warning(status) # and trains on whatever reasoning the template kept
446
+ print_warmstart_context_supplement(local_budget, status)
443
447
  logger.info(
444
448
  "submitted run %s: model=%s algorithm=%s gpu=%s",
445
449
  run_id,
@@ -963,9 +967,13 @@ from flash.cli.commands.deploy import ( # noqa: E402,F401
963
967
  cmd_undeploy,
964
968
  )
965
969
 
966
- # re-exported at the bottom rather than imported at the top: `train_cost` resolves names back
967
- # through this package, so a top import would be circular. `cmd_train` below calls these, and the
968
- # estimate tests import `_warn_if_wandb_requested_without_key` from this package by name.
970
+ # imported at the bottom because the train helpers resolve patched command-package names lazily.
971
+ from flash.cli.commands.prompt_budget import ( # noqa: E402
972
+ print_status_prompt_budget_warning,
973
+ print_warmstart_context_supplement,
974
+ prompt_budget_validation_suffix,
975
+ warn_before_paid_submit,
976
+ )
969
977
  from flash.cli.commands.train_cost import ( # noqa: E402,F401
970
978
  _client_train_schema,
971
979
  _cmd_train_cost,
@@ -0,0 +1,146 @@
1
+ """prompt-budget warnings and warm-start context lookup for training commands."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import sys
6
+ from typing import TypeGuard, cast
7
+
8
+ from flash import __version__
9
+ from flash.cli.ui import render
10
+ from flash.engine.plan.prompt_budget import PromptBudget, rl_prompt_budget
11
+
12
+
13
+ def _positive_int(value: object) -> TypeGuard[int]:
14
+ return isinstance(value, int) and not isinstance(value, bool) and value > 0
15
+
16
+
17
+ def _budget_from_status(status: object) -> PromptBudget | None:
18
+ budget = status.get("prompt_budget") if isinstance(status, dict) else None
19
+ if not isinstance(budget, dict):
20
+ return None
21
+ if budget.get("algorithm") not in {"grpo", "opd", "rl"}:
22
+ return None
23
+ if budget.get("context_source") not in {"authored", "recipe_default"}:
24
+ return None
25
+ if budget.get("prompt_budget_is_upper_bound") is not True:
26
+ return None
27
+ engine_len = budget.get("engine_len")
28
+ max_completion = budget.get("max_completion")
29
+ prompt_budget = budget.get("prompt_budget")
30
+ if not _positive_int(engine_len):
31
+ return None
32
+ if not _positive_int(max_completion):
33
+ return None
34
+ if not _positive_int(prompt_budget):
35
+ return None
36
+ if prompt_budget != engine_len - max_completion:
37
+ return None
38
+ source_context = budget.get("warm_start_context")
39
+ if source_context is not None and not _positive_int(source_context):
40
+ return None
41
+ return cast("PromptBudget", budget)
42
+
43
+
44
+ def prompt_budget_validation_suffix(status: object) -> str:
45
+ """qualify a dry-run summary only when the server returned a budget."""
46
+ return ", prompt budget (upper bound)" if _budget_from_status(status) is not None else ""
47
+
48
+
49
+ def warmstart_source_context(client, spec) -> int | None:
50
+ """read a warm-start source's authored context through the cli's authenticated client."""
51
+ from flash.core.catalog import samples_on_policy
52
+ from flash.schema import parse_checkpoint_ref
53
+
54
+ ref = getattr(spec.train, "init_from_adapter", "")
55
+ if not ref or not samples_on_policy(spec.algorithm):
56
+ return None
57
+ parsed = parse_checkpoint_ref(ref)
58
+ if parsed is None:
59
+ return None
60
+ try:
61
+ source = client.get_run(parsed[0])
62
+ # reporting is best-effort and must never block a valid submission
63
+ except Exception:
64
+ return None
65
+ train = (source or {}).get("spec", {}).get("train", {}) if isinstance(source, dict) else {}
66
+ context = train.get("max_context_tokens") if isinstance(train, dict) else None
67
+ if isinstance(context, bool) or not isinstance(context, int) or context <= 0:
68
+ return None
69
+ return context
70
+
71
+
72
+ def _warmstart_context_sentence(context: object) -> str | None:
73
+ if isinstance(context, bool) or not isinstance(context, int) or context <= 0:
74
+ return None
75
+ return (
76
+ f"The warm-start source was configured with max_context_tokens={context}; "
77
+ "it is NOT inherited."
78
+ )
79
+
80
+
81
+ def prompt_budget_warning(
82
+ budget: object,
83
+ *,
84
+ derived_locally: bool = False,
85
+ include_warm_start_context: bool = True,
86
+ ) -> str | None:
87
+ """render the defaulted-budget warning for one prompt-budget descriptor."""
88
+ if not isinstance(budget, dict) or budget.get("context_source") != "recipe_default":
89
+ return None
90
+ try:
91
+ prompt_budget = int(budget["prompt_budget"])
92
+ max_completion = int(budget["max_completion"])
93
+ except (KeyError, TypeError, ValueError):
94
+ return None
95
+ algorithm = str(budget.get("algorithm") or "").upper() or "RL"
96
+ message = (
97
+ f"train.max_context_tokens is unset, so {algorithm} derives a prompt budget of at most "
98
+ f"{prompt_budget} tokens from the recipe default (engine {budget.get('engine_len')} minus "
99
+ f"max_completion_tokens {max_completion}), not from the model's context. The worker clamps "
100
+ "the engine length to the model architecture first, so its budget can be smaller than "
101
+ "this. Prompts over the budget are DROPPED, not truncated, so the run trains on a "
102
+ "shorter, biased subset."
103
+ )
104
+ if derived_locally:
105
+ message += (
106
+ f" (Derived locally by this CLI {__version__}; if the control plane is on a "
107
+ "different release its recipe default may differ.)"
108
+ )
109
+ if include_warm_start_context:
110
+ source = _warmstart_context_sentence(budget.get("warm_start_context"))
111
+ if source:
112
+ message += f" {source}"
113
+ return message + " Set train.max_context_tokens explicitly to choose the budget."
114
+
115
+
116
+ def _print_warning(message: str | None) -> None:
117
+ if message:
118
+ print(render.warn(message) if render.styled() else f"warning: {message}", file=sys.stderr)
119
+
120
+
121
+ def print_status_prompt_budget_warning(status: object) -> None:
122
+ """print the server-derived warning carried by a submit or dry-run response."""
123
+ _print_warning(prompt_budget_warning(_budget_from_status(status)))
124
+
125
+
126
+ def warn_before_paid_submit(client, spec) -> PromptBudget | None:
127
+ """print the locally derived warning before create_run can start provisioning."""
128
+ budget = rl_prompt_budget(spec, warm_start_context=warmstart_source_context(client, spec))
129
+ _print_warning(prompt_budget_warning(budget, derived_locally=True))
130
+ return budget
131
+
132
+
133
+ def print_warmstart_context_supplement(local_budget: PromptBudget | None, status: object) -> None:
134
+ """print only context the server resolved after the generic pre-submit warning."""
135
+ served_budget = _budget_from_status(status)
136
+ if served_budget is None or (
137
+ local_budget is not None and local_budget.get("warm_start_context")
138
+ ):
139
+ return
140
+ _print_warning(_warmstart_context_sentence(served_budget.get("warm_start_context")))
141
+
142
+
143
+ def warn_cost_prompt_budget(spec) -> None:
144
+ """print the local prompt-budget warning for the offline ``--cost`` path."""
145
+ budget = rl_prompt_budget(spec)
146
+ _print_warning(prompt_budget_warning(budget, derived_locally=True))
@@ -91,6 +91,9 @@ def _cmd_train_cost_offline(spec) -> int:
91
91
  print(render.cost_panel(estimate))
92
92
  else:
93
93
  print(estimate.breakdown())
94
+ from flash.cli.commands.prompt_budget import warn_cost_prompt_budget
95
+
96
+ warn_cost_prompt_budget(spec)
94
97
  return 0
95
98
 
96
99
 
@@ -0,0 +1,63 @@
1
+ """derived grpo/opd prompt-budget data reported before paid training."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Literal, NotRequired, TypedDict
6
+
7
+ from flash.engine.plan.vram import (
8
+ grpo_completion_len,
9
+ grpo_rollout_seq_len,
10
+ opd_completion_len,
11
+ opd_rollout_seq_len,
12
+ )
13
+
14
+
15
+ class PromptBudget(TypedDict):
16
+ """serialized prompt-budget descriptor carried by prepared and persisted runs."""
17
+
18
+ algorithm: Literal["grpo", "opd", "rl"]
19
+ engine_len: int
20
+ max_completion: int
21
+ prompt_budget: int
22
+ context_source: Literal["authored", "recipe_default"]
23
+ prompt_budget_is_upper_bound: Literal[True]
24
+ warm_start_context: NotRequired[int]
25
+
26
+
27
+ def rl_prompt_budget(spec, *, warm_start_context: int | None = None) -> PromptBudget | None:
28
+ """derive the pre-clamp prompt budget used by a grpo/opd worker.
29
+
30
+ the worker clamps ``engine_len`` to the model architecture before subtracting the completion
31
+ allowance, so this control-plane value is an upper bound. sft returns ``None`` because it
32
+ truncates over-long rows and reports that behavior through its workload profile instead.
33
+ """
34
+ from typing import cast
35
+
36
+ from flash.core.catalog import samples_on_policy
37
+
38
+ raw_algorithm = getattr(spec, "algorithm", "")
39
+ if not samples_on_policy(raw_algorithm):
40
+ return None
41
+ algorithm = cast("Literal['grpo', 'opd', 'rl']", raw_algorithm)
42
+ train = spec.train
43
+ authored = int(getattr(train, "max_context_tokens", 0) or 0)
44
+ max_tokens = getattr(train, "max_completion_tokens", None)
45
+ thinking = bool(getattr(spec, "thinking", False))
46
+ if algorithm == "opd":
47
+ max_completion = opd_completion_len(max_tokens, thinking)
48
+ engine_len = opd_rollout_seq_len(authored, max_tokens, thinking)
49
+ else:
50
+ max_completion = grpo_completion_len(max_tokens, thinking)
51
+ engine_len = grpo_rollout_seq_len(authored, max_tokens, thinking)
52
+ budget: PromptBudget = {
53
+ "algorithm": algorithm,
54
+ "engine_len": int(engine_len),
55
+ "max_completion": int(max_completion),
56
+ "prompt_budget": int(engine_len) - int(max_completion),
57
+ "context_source": "authored" if authored else "recipe_default",
58
+ "prompt_budget_is_upper_bound": True,
59
+ }
60
+ source_context = int(warm_start_context or 0)
61
+ if source_context > 0:
62
+ budget["warm_start_context"] = source_context
63
+ return budget
@@ -157,8 +157,12 @@ def _prepare_prompts(
157
157
  if tokenizer.pad_token is None:
158
158
  tokenizer.pad_token = tokenizer.eos_token
159
159
  thinking_prefill = _opd_train._thinking_prefill_text(tokenizer)
160
- requested_len = request.knobs.max_length or (
161
- _opd_train.RECIPE.opd.max_prompt_len + request.knobs.max_completion
160
+ from flash.engine.plan.vram import opd_rollout_seq_len
161
+
162
+ requested_len = opd_rollout_seq_len(
163
+ request.knobs.max_length,
164
+ request.knobs.max_completion,
165
+ bool(_opd_train._w.THINKING),
162
166
  )
163
167
  # clamp to the architecture BEFORE deriving the prompt budget, so every downstream length agrees.
164
168
  # clamping only the engine would admit prompts sized against the unclamped budget and then fail
@@ -208,15 +208,15 @@ def _grpo_is_multimodal(train, message_prompts):
208
208
 
209
209
 
210
210
  def _resolve_sequence_lengths(model_id, model_revision, train_spec, rl, gcfg, tok, multi_turn):
211
- # same resolver the spec-parse prompt-budget guard uses, so a run rejected at submit is exactly
212
- # the run this would have failed here after the gpu was already paid for.
213
- from flash.engine.plan.vram import grpo_completion_len
211
+ from flash.engine.plan.vram import grpo_completion_len, grpo_rollout_seq_len
214
212
 
215
- max_completion = grpo_completion_len(gcfg.get("max_tokens"), bool(_w.THINKING))
213
+ thinking = bool(_w.THINKING)
214
+ max_tokens = gcfg.get("max_tokens")
215
+ max_completion = grpo_completion_len(max_tokens, thinking)
216
216
  train_ctx = (
217
217
  train_spec.max_context_tokens if (train_spec and train_spec.max_context_tokens) else 0
218
218
  )
219
- requested_len = int(train_ctx or max(1024, rl.max_prompt_len + max_completion))
219
+ requested_len = grpo_rollout_seq_len(train_ctx, max_tokens, thinking)
220
220
  # clamp to the architecture BEFORE deriving the prompt budget, so every downstream length agrees.
221
221
  # clamping only the engine would admit prompts up to the unclamped budget and then fail them at
222
222
  # rollout, and would let the token budget pack more than the one-sequence memory floor intends.
@@ -34,6 +34,7 @@ from flash.core.spec import ( # noqa: F401
34
34
  GpuSpec,
35
35
  JobSpec,
36
36
  )
37
+ from flash.engine.plan.prompt_budget import PromptBudget
37
38
  from flash.providers._lifecycle.poll import _attempt_int as _attempt_int
38
39
  from flash.teacher.retry_contract import (
39
40
  OPD_RETRY_CONTRACT_STATUS_KEY,
@@ -190,6 +191,10 @@ class RunStatus:
190
191
  gpu_status: dict | None = None
191
192
  workload_profile_input_digest: str | None = None
192
193
  workload_profile: dict | None = None
194
+ # submit-time derived grpo/opd prompt budget from flash.engine.plan.prompt_budget. workers drop
195
+ # over-budget prompts rather than truncating them, so record the value before gpu allocation.
196
+ # none for sft, which reports truncation through workload_profile, and for older records.
197
+ prompt_budget: PromptBudget | None = None
193
198
  effective_preparation: dict | None = None
194
199
 
195
200
  def to_dict(self) -> dict:
@@ -424,6 +429,8 @@ class PreparedJob:
424
429
  worker_spec: JobSpec
425
430
  estimated_cost_usd: float
426
431
  adapter_identity: dict | None = None
432
+ # derived grpo/opd prompt budget, resolved where the warm-start source is authorized and read.
433
+ prompt_budget: PromptBudget | None = None
427
434
 
428
435
 
429
436
  _BILLING_FIELDS = frozenset({"billing_state", "billing_error", "billing_charge"})
@@ -143,7 +143,7 @@ def _prepare_init_from_adapter(
143
143
  owner_org_id: str = "",
144
144
  owner_key_id: int | None = None,
145
145
  token: str | None = None,
146
- ) -> tuple[JobSpec, JobSpec, dict | None]:
146
+ ) -> tuple[JobSpec, JobSpec, dict | None, int | None]:
147
147
  """prepare public and worker specs with source-authoritative adapter metadata.
148
148
 
149
149
  Failures here are genuinely about the warm-start source, so they are tagged
@@ -168,11 +168,11 @@ def _prepare_init_from_adapter_inner(
168
168
  owner_org_id: str = "",
169
169
  owner_key_id: int | None = None,
170
170
  token: str | None = None,
171
- ) -> tuple[JobSpec, JobSpec, dict | None]:
171
+ ) -> tuple[JobSpec, JobSpec, dict | None, int | None]:
172
172
  _runner()._require_supported_adapter_continuation(spec)
173
173
  ref = spec.train.init_from_adapter
174
174
  if not ref:
175
- return spec, spec, None
175
+ return spec, spec, None, None
176
176
  from flash.adapters.lora_rank import (
177
177
  adapter_artifact_identity,
178
178
  load_hf_adapter_config,
@@ -265,7 +265,8 @@ def _prepare_init_from_adapter_inner(
265
265
  worker_spec,
266
266
  train=replace(worker_spec.train, lora_rank=metadata.rank, lora_alpha=metadata.alpha),
267
267
  )
268
- return public_spec, worker_spec, identity
268
+ source_context = int(getattr(src_spec.train, "max_context_tokens", 0) or 0) or None
269
+ return public_spec, worker_spec, identity, source_context
269
270
 
270
271
 
271
272
  def _mark_warmstart_source(worker_spec: JobSpec, child_run_id: str) -> None:
@@ -127,11 +127,13 @@ def prepare_job(
127
127
  owner_org_id = _runner()._context_org_id(billing_context) or _runner()._context_org_id(
128
128
  platform_context
129
129
  )
130
- public_spec, worker_spec, adapter_identity = _runner()._prepare_init_from_adapter(
131
- spec,
132
- owner_org_id=owner_org_id,
133
- owner_key_id=owner_key_id,
134
- token=os.environ.get("HF_TOKEN"),
130
+ public_spec, worker_spec, adapter_identity, warm_start_context = (
131
+ _runner()._prepare_init_from_adapter(
132
+ spec,
133
+ owner_org_id=owner_org_id,
134
+ owner_key_id=owner_key_id,
135
+ token=os.environ.get("HF_TOKEN"),
136
+ )
135
137
  )
136
138
  # these read-only gates belong to preparation: every submit path passes here exactly once, and
137
139
  # callers receive the pinned worker spec before quoting, affordability, persistence, or allocation.
@@ -149,11 +151,20 @@ def prepare_job(
149
151
  from flash.cost.spec import estimate_for_spec
150
152
 
151
153
  estimated_cost_usd = float(estimate_for_spec(worker_spec).total_usd)
154
+ # derive the rl prompt budget from the same resolved spec the quote is built from, so the
155
+ # reported budget describes the run that was actually priced and submitted.
156
+ from flash.engine.plan.prompt_budget import rl_prompt_budget
157
+
158
+ prompt_budget = rl_prompt_budget(
159
+ worker_spec,
160
+ warm_start_context=warm_start_context,
161
+ )
152
162
  return _runner().PreparedJob(
153
163
  public_spec=public_spec,
154
164
  worker_spec=worker_spec,
155
165
  estimated_cost_usd=estimated_cost_usd,
156
166
  adapter_identity=adapter_identity,
167
+ prompt_budget=prompt_budget,
157
168
  )
158
169
 
159
170
 
@@ -267,6 +278,7 @@ def submit_job(
267
278
  platform_context=platform_context,
268
279
  workload_profile_input_digest=worker_spec.workload_profile_input_digest or None,
269
280
  workload_profile=worker_spec.workload_profile or None,
281
+ prompt_budget=prepared.prompt_budget,
270
282
  effective_preparation={
271
283
  "worker_spec": worker_spec.to_internal_dict(),
272
284
  "workload_profile": worker_spec.workload_profile or None,
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "freesolo-flash-dev"
3
- version = "1.2.36"
3
+ version = "1.2.37"
4
4
  description ="Flash — managed LoRA post-training (SFT/GRPO/OPD) for Freesolo environments, driven by the `flash` CLI"
5
5
  readme = "README.md"
6
6
  # RunPod Flash supports Python 3.11-3.12 (not 3.13 yet).
@@ -137,7 +137,7 @@ artifacts = ["flash/py.typed"]
137
137
  # auto-published by .github/workflows/publish-dev.yml: a push to `dev` whose version isn't yet on
138
138
  # PyPI publishes it; pushes that don't change it find it already published and no-op. So cutting a
139
139
  # dev-channel release = bump this (and [project].version) and merge to `dev`.
140
- version = "1.2.36"
140
+ version = "1.2.37"
141
141
 
142
142
  [tool.pytest.ini_options]
143
143
  pythonpath = ["."]
@@ -237,6 +237,11 @@ def test_dry_run_create_previews_on_the_server(make_client) -> None:
237
237
  # Persisted like any run — retrievable and listed — but no GPU was ever allocated.
238
238
  assert client.get_run(run_id)["state"] == "dry_run"
239
239
  assert run_id in [r["run_id"] for r in client.list_runs()]
240
+ # the derived prompt budget travels with the preview and remains visible through runs status.
241
+ budget = created["prompt_budget"]
242
+ assert budget["context_source"] == "recipe_default"
243
+ assert budget["prompt_budget"] == budget["engine_len"] - budget["max_completion"]
244
+ assert client.get_run(run_id)["prompt_budget"] == budget
240
245
 
241
246
 
242
247
  def test_logs_offset_paging_roundtrip(make_client) -> None: