freesolo-flash-dev 1.2.48__tar.gz → 1.2.52__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 (566) hide show
  1. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/CHANGELOG.md +10 -0
  2. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/PKG-INFO +1 -1
  3. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/cli/scaffold/TRAINING.md +9 -0
  4. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/profiling/sft_workload.py +105 -18
  5. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/entry/sft.py +25 -9
  6. freesolo_flash_dev-1.2.52/flash/engine/worker/model/chatml_mask.py +551 -0
  7. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/model/packing.py +6 -1
  8. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/sft_train_runner.py +14 -4
  9. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/_lifecycle/poll_instance.py +79 -174
  10. freesolo_flash_dev-1.2.52/flash/providers/_lifecycle/terminal_artifacts.py +261 -0
  11. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/runner/supervise/recovery.py +33 -54
  12. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/pyproject.toml +2 -2
  13. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_packing.py +36 -4
  14. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_runmgmt.py +110 -0
  15. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_sft_train.py +810 -6
  16. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_sft_workload.py +47 -28
  17. freesolo_flash_dev-1.2.52/tests/test_terminal_artifacts.py +181 -0
  18. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/uv.lock +1 -1
  19. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/.dockerignore +0 -0
  20. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/.env.example +0 -0
  21. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/.github/CODEOWNERS +0 -0
  22. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  23. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  24. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  25. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  26. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/.github/dependabot.yml +0 -0
  27. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/.github/workflows/auto-rebake.yml +0 -0
  28. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/.github/workflows/bake-kernel-cache.yml +0 -0
  29. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/.github/workflows/ci.yml +0 -0
  30. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/.github/workflows/main-source-guard.yml +0 -0
  31. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/.github/workflows/notify-tests-repo.yml +0 -0
  32. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/.github/workflows/publish-dev.yml +0 -0
  33. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/.github/workflows/publish-image.yml +0 -0
  34. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/.github/workflows/publish.yml +0 -0
  35. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/.github/workflows/version-parity.yml +0 -0
  36. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/.github/workflows/worker-image.yml +0 -0
  37. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/.gitignore +0 -0
  38. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/CODE_OF_CONDUCT.md +0 -0
  39. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/CONTRIBUTING.md +0 -0
  40. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/Dockerfile +0 -0
  41. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/Dockerfile.worker +0 -0
  42. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/LICENSE +0 -0
  43. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/NOTICE +0 -0
  44. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/README.md +0 -0
  45. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/SECURITY.md +0 -0
  46. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/SELF_HOSTING.md +0 -0
  47. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/build/kernel_cache/.gitignore +0 -0
  48. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/build/kernel_cache/.keep +0 -0
  49. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/deploy/infisical/README.md +0 -0
  50. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/deploy/infisical/entrypoint.sh +0 -0
  51. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/docker/Dockerfile.kernelcache +0 -0
  52. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/docker/Dockerfile.kernelcache.relayer +0 -0
  53. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/docker/bake_kernel_cache.py +0 -0
  54. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/docker/bake_pod_entry.py +0 -0
  55. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/docker/extract_cudart_fix.py +0 -0
  56. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/docker/kernel_fingerprint.py +0 -0
  57. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/docker/make_rp_handler.py +0 -0
  58. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/__init__.py +0 -0
  59. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/_internal/__init__.py +0 -0
  60. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/_internal/channel.py +0 -0
  61. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/_internal/diagnostics.py +0 -0
  62. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/_internal/fileio.py +0 -0
  63. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/_internal/logging.py +0 -0
  64. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/_internal/paths.py +0 -0
  65. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/adapters/__init__.py +0 -0
  66. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/adapters/artifacts.py +0 -0
  67. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/adapters/fused_experts.py +0 -0
  68. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/adapters/lora_rank.py +0 -0
  69. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/cli/__init__.py +0 -0
  70. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/cli/__main__.py +0 -0
  71. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/cli/commands/__init__.py +0 -0
  72. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/cli/commands/deploy.py +0 -0
  73. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/cli/commands/env/__init__.py +0 -0
  74. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/cli/commands/env/episode.py +0 -0
  75. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/cli/commands/env/eval.py +0 -0
  76. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/cli/commands/env/eval_args.py +0 -0
  77. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/cli/commands/env/imports.py +0 -0
  78. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/cli/commands/env/list.py +0 -0
  79. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/cli/commands/env/push.py +0 -0
  80. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/cli/commands/env/retained.py +0 -0
  81. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/cli/commands/env/setup.py +0 -0
  82. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/cli/commands/env/test.py +0 -0
  83. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/cli/commands/env/test_evaluations.py +0 -0
  84. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/cli/commands/env/test_params.py +0 -0
  85. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/cli/commands/env/test_warnings.py +0 -0
  86. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/cli/commands/prompt_budget.py +0 -0
  87. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/cli/commands/traces.py +0 -0
  88. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/cli/commands/train_cost.py +0 -0
  89. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/cli/scaffold/__init__.py +0 -0
  90. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/cli/ui/__init__.py +0 -0
  91. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/cli/ui/cost.py +0 -0
  92. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/cli/ui/env_panels.py +0 -0
  93. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/cli/ui/heartbeat.py +0 -0
  94. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/cli/ui/render.py +0 -0
  95. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/cli/ui/tables.py +0 -0
  96. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/cli/ui/tty.py +0 -0
  97. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/client/__init__.py +0 -0
  98. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/client/config.py +0 -0
  99. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/client/freesolo_api.py +0 -0
  100. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/client/http.py +0 -0
  101. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/client/runtime_secrets.py +0 -0
  102. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/client/shapes.py +0 -0
  103. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/client/specs.py +0 -0
  104. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/client/streaming.py +0 -0
  105. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/content/__init__.py +0 -0
  106. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/content/multimodal.py +0 -0
  107. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/content/structured_outputs.py +0 -0
  108. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/content/thinking.py +0 -0
  109. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/core/__init__.py +0 -0
  110. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/core/catalog.py +0 -0
  111. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/core/spec.py +0 -0
  112. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/core/spec_persistence.py +0 -0
  113. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/cost/__init__.py +0 -0
  114. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/cost/analytical.py +0 -0
  115. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/cost/facts.py +0 -0
  116. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/cost/spec.py +0 -0
  117. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/cost/types.py +0 -0
  118. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/__init__.py +0 -0
  119. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/plan/__init__.py +0 -0
  120. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/plan/kv_sizing.py +0 -0
  121. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/plan/model_config_probe.py +0 -0
  122. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/plan/prompt_budget.py +0 -0
  123. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/plan/recipe.py +0 -0
  124. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/plan/steps.py +0 -0
  125. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/plan/vram.py +0 -0
  126. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/profiling/__init__.py +0 -0
  127. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/profiling/dataset_profile.py +0 -0
  128. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/profiling/reasoning_render.py +0 -0
  129. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/profiling/tokenizer.py +0 -0
  130. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/profiling/workload_profile.py +0 -0
  131. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/result/__init__.py +0 -0
  132. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/result/accounting.py +0 -0
  133. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/result/rollout_samples.py +0 -0
  134. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/__init__.py +0 -0
  135. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/__main__.py +0 -0
  136. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/backend_common.py +0 -0
  137. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/entry/__init__.py +0 -0
  138. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/entry/opd.py +0 -0
  139. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/entry/rl.py +0 -0
  140. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/io/__init__.py +0 -0
  141. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/io/heartbeat.py +0 -0
  142. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/io/hf.py +0 -0
  143. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/io/prefetch.py +0 -0
  144. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/io/wandb_log.py +0 -0
  145. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/model/__init__.py +0 -0
  146. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/model/adapter.py +0 -0
  147. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/model/decoding.py +0 -0
  148. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/model/lora.py +0 -0
  149. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/opd_train.py +0 -0
  150. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/opd_train_runner.py +0 -0
  151. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/perf/__init__.py +0 -0
  152. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/perf/diagnostics.py +0 -0
  153. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/perf/lifecycle.py +0 -0
  154. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/perf/liger.py +0 -0
  155. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/perf/memory.py +0 -0
  156. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/rl_train.py +0 -0
  157. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/rl_train_runner.py +0 -0
  158. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/runtime/__init__.py +0 -0
  159. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/runtime/kernel_warmup.py +0 -0
  160. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/runtime/pkg_proxy.py +0 -0
  161. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/runtime/rng.py +0 -0
  162. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/score_batcher.py +0 -0
  163. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/sft_train.py +0 -0
  164. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/teacher/__init__.py +0 -0
  165. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/teacher/client.py +0 -0
  166. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/teacher/encoding.py +0 -0
  167. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/teacher/tokenizer_align.py +0 -0
  168. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/__init__.py +0 -0
  169. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/core/__init__.py +0 -0
  170. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/core/checkpoint_lifecycle.py +0 -0
  171. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/core/child/__init__.py +0 -0
  172. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/core/child/glue.py +0 -0
  173. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/core/child/runtime.py +0 -0
  174. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/core/step_timing.py +0 -0
  175. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/finalize.py +0 -0
  176. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/opd/__init__.py +0 -0
  177. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/opd/batching.py +0 -0
  178. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/opd/bridge.py +0 -0
  179. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/opd/child/__init__.py +0 -0
  180. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/opd/child/bridge.py +0 -0
  181. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/opd/child/entry.py +0 -0
  182. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/opd/child/multiturn.py +0 -0
  183. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/opd/child/plugin.py +0 -0
  184. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/opd/child/replay_guard.py +0 -0
  185. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/opd/child/runtime.py +0 -0
  186. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/opd/child/structured.py +0 -0
  187. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/opd/failures.py +0 -0
  188. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/opd/gkd.py +0 -0
  189. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/opd/multiturn_validation.py +0 -0
  190. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/opd/overrides.py +0 -0
  191. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/opd/prompts.py +0 -0
  192. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/opd/reporting.py +0 -0
  193. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/opd/scoring.py +0 -0
  194. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/opd/state.py +0 -0
  195. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/opd/validation.py +0 -0
  196. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/rl/__init__.py +0 -0
  197. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/rl/checkpoints.py +0 -0
  198. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/rl/child/__init__.py +0 -0
  199. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/rl/child/entry.py +0 -0
  200. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/rl/child/multiturn.py +0 -0
  201. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/rl/child/patches.py +0 -0
  202. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/rl/child/plugin.py +0 -0
  203. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/rl/config.py +0 -0
  204. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/rl/inputs.py +0 -0
  205. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/rl/multi_turn.py +0 -0
  206. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/rl/reward_module.py +0 -0
  207. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/rl/scoring.py +0 -0
  208. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/rl/single_turn.py +0 -0
  209. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/rl/verl_config.py +0 -0
  210. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/sft/__init__.py +0 -0
  211. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/sft/checkpoints.py +0 -0
  212. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/sft/child/entry.py +0 -0
  213. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/sft/child/plugin.py +0 -0
  214. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/sft/config.py +0 -0
  215. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/verl/__init__.py +0 -0
  216. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/verl/capabilities.py +0 -0
  217. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/verl/checkpoints.py +0 -0
  218. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/verl/child_io.py +0 -0
  219. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/verl/diagnostics.py +0 -0
  220. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/verl/parallelism.py +0 -0
  221. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/verl/parent_work.py +0 -0
  222. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker_entrypoint.py +0 -0
  223. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/envs/__init__.py +0 -0
  224. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/envs/adapter.py +0 -0
  225. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/envs/base.py +0 -0
  226. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/envs/cache_security.py +0 -0
  227. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/envs/dataset_selection.py +0 -0
  228. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/envs/evaluations.py +0 -0
  229. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/envs/identity.py +0 -0
  230. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/envs/loader.py +0 -0
  231. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/envs/namespace_listing.py +0 -0
  232. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/envs/package/__init__.py +0 -0
  233. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/envs/package/limits.py +0 -0
  234. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/envs/package/unpack.py +0 -0
  235. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/envs/pull.py +0 -0
  236. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/__init__.py +0 -0
  237. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/_lifecycle/__init__.py +0 -0
  238. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/_lifecycle/auth.py +0 -0
  239. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/_lifecycle/bootstrap.py +0 -0
  240. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/_lifecycle/bootstrap_console.py +0 -0
  241. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/_lifecycle/bootstrap_pip.py +0 -0
  242. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/_lifecycle/bootstrap_secrets.py +0 -0
  243. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/_lifecycle/deadline.py +0 -0
  244. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/_lifecycle/http.py +0 -0
  245. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/_lifecycle/instance.py +0 -0
  246. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/_lifecycle/poll.py +0 -0
  247. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/_lifecycle/provider.py +0 -0
  248. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/_lifecycle/worker.py +0 -0
  249. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/allocator.py +0 -0
  250. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/artifacts/__init__.py +0 -0
  251. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/artifacts/hf.py +0 -0
  252. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/artifacts/preload_runpod.py +0 -0
  253. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/artifacts/weight_cache.py +0 -0
  254. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/base.py +0 -0
  255. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/fit_errors.py +0 -0
  256. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/lambda_/__init__.py +0 -0
  257. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/lambda_/api.py +0 -0
  258. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/lambda_/auth.py +0 -0
  259. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/lambda_/gpus.py +0 -0
  260. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/lambda_/jobs/__init__.py +0 -0
  261. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/lambda_/jobs/builders.py +0 -0
  262. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/lambda_/jobs/reap.py +0 -0
  263. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/lambda_/preflight.py +0 -0
  264. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/lambda_/pricing.py +0 -0
  265. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/preflight.py +0 -0
  266. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/realized.py +0 -0
  267. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/runpod/__init__.py +0 -0
  268. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/runpod/api.py +0 -0
  269. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/runpod/auth.py +0 -0
  270. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/runpod/cost.py +0 -0
  271. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/runpod/gpus.py +0 -0
  272. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/runpod/job_execution.py +0 -0
  273. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/runpod/jobs.py +0 -0
  274. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/runpod/preflight.py +0 -0
  275. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/runpod/pricing.py +0 -0
  276. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/runpod/resources.py +0 -0
  277. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/runpod/serverless/__init__.py +0 -0
  278. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/runpod/serverless/endpoints.py +0 -0
  279. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/sharding.py +0 -0
  280. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/vast/__init__.py +0 -0
  281. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/vast/api.py +0 -0
  282. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/vast/auth.py +0 -0
  283. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/vast/jobs/__init__.py +0 -0
  284. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/vast/jobs/builders.py +0 -0
  285. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/vast/preflight.py +0 -0
  286. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/vast/pricing.py +0 -0
  287. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/py.typed +0 -0
  288. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/runner/__init__.py +0 -0
  289. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/runner/artifacts.py +0 -0
  290. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/runner/attempts.py +0 -0
  291. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/runner/costs.py +0 -0
  292. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/runner/deadlines.py +0 -0
  293. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/runner/preparation.py +0 -0
  294. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/runner/reconciliation.py +0 -0
  295. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/runner/results/__init__.py +0 -0
  296. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/runner/results/checkpoints.py +0 -0
  297. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/runner/results/verified_revisions.py +0 -0
  298. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/runner/status.py +0 -0
  299. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/runner/submit.py +0 -0
  300. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/runner/supervise/__init__.py +0 -0
  301. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/runner/supervise/attach.py +0 -0
  302. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/runner/supervise/deploy.py +0 -0
  303. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/runner/supervise/lifecycle.py +0 -0
  304. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/runner/supervise/retry_decision.py +0 -0
  305. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/runner/supervise/seed_submission.py +0 -0
  306. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/runner/supervise/transitions.py +0 -0
  307. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/runner/weight_cache.py +0 -0
  308. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/schema/__init__.py +0 -0
  309. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/schema/fields.py +0 -0
  310. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/serve/__init__.py +0 -0
  311. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/serve/adapter_check.py +0 -0
  312. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/serve/deploy.py +0 -0
  313. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/serve/errors.py +0 -0
  314. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/serve/export.py +0 -0
  315. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/serve/preflight.py +0 -0
  316. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/serve/responses.py +0 -0
  317. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/serve/streaming.py +0 -0
  318. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/serve/thinking.py +0 -0
  319. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/serve/urls.py +0 -0
  320. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/server/__init__.py +0 -0
  321. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/server/__main__.py +0 -0
  322. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/server/app.py +0 -0
  323. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/server/billing/__init__.py +0 -0
  324. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/server/billing/charges.py +0 -0
  325. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/server/billing/retry.py +0 -0
  326. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/server/domain/__init__.py +0 -0
  327. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/server/domain/checkpoints.py +0 -0
  328. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/server/domain/environment_registry.py +0 -0
  329. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/server/domain/envs.py +0 -0
  330. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/server/domain/projects.py +0 -0
  331. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/server/domain/reconcile.py +0 -0
  332. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/server/domain/repo_cleanup.py +0 -0
  333. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/server/domain/run_registry.py +0 -0
  334. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/server/domain/teacher_broker.py +0 -0
  335. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/server/domain/teacher_errors.py +0 -0
  336. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/server/domain/teacher_requests.py +0 -0
  337. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/server/platform/__init__.py +0 -0
  338. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/server/platform/auth.py +0 -0
  339. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/server/platform/db.py +0 -0
  340. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/server/platform/deps.py +0 -0
  341. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/server/platform/internal_client.py +0 -0
  342. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/server/platform/locks.py +0 -0
  343. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/server/platform/runtime.py +0 -0
  344. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/server/routes/__init__.py +0 -0
  345. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/server/routes/envs.py +0 -0
  346. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/server/routes/meta.py +0 -0
  347. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/server/routes/runs.py +0 -0
  348. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/server/routes/serving.py +0 -0
  349. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/server/routes/serving_completion.py +0 -0
  350. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/server/routes/serving_revisions.py +0 -0
  351. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/server/routes/serving_smoke.py +0 -0
  352. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/server/routes/teacher.py +0 -0
  353. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/teacher/__init__.py +0 -0
  354. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/teacher/limits.py +0 -0
  355. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/teacher/retry_contract.py +0 -0
  356. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/scripts/build_dev_dist.py +0 -0
  357. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/scripts/check_file_size.py +0 -0
  358. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/scripts/check_function_size.py +0 -0
  359. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/scripts/check_verl_pin_exists.py +0 -0
  360. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/scripts/scrub_history.sh +0 -0
  361. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/__init__.py +0 -0
  362. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/_helpers/__init__.py +0 -0
  363. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/_helpers/profile.py +0 -0
  364. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/_helpers/runner.py +0 -0
  365. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/_helpers/specs.py +0 -0
  366. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/_helpers/teacher.py +0 -0
  367. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/_helpers/vast.py +0 -0
  368. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/conftest.py +0 -0
  369. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/fixtures/math_eval.jsonl +0 -0
  370. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/fixtures/math_train.jsonl +0 -0
  371. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/live/__init__.py +0 -0
  372. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/live/conftest.py +0 -0
  373. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/live/test_lambda_live.py +0 -0
  374. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/live/test_runpod_live.py +0 -0
  375. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/live/test_sft_thinking_render_live.py +0 -0
  376. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/live/test_vast_live.py +0 -0
  377. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_accounting_coverage.py +0 -0
  378. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_adapter_shard_completeness.py +0 -0
  379. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_agent_flash_cli_contract.py +0 -0
  380. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_algorithms.py +0 -0
  381. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_allocator.py +0 -0
  382. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_backend_common.py +0 -0
  383. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_backend_jobspec_contract.py +0 -0
  384. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_bake_kernel_cache.py +0 -0
  385. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_base_model_provenance.py +0 -0
  386. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_billing_retry.py +0 -0
  387. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_build_context_contract.py +0 -0
  388. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_cancel_remote.py +0 -0
  389. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_catalog_consistency.py +0 -0
  390. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_catalog_only_models.py +0 -0
  391. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_charge_pricing.py +0 -0
  392. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_checkpoint_lifecycle.py +0 -0
  393. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_checkpoints.py +0 -0
  394. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_cli_commands.py +0 -0
  395. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_cli_commands_coverage.py +0 -0
  396. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_cli_credential_shadowing.py +0 -0
  397. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_cli_errors.py +0 -0
  398. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_cli_estimate.py +0 -0
  399. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_cli_gpus_flag.py +0 -0
  400. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_cli_help.py +0 -0
  401. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_cli_main_coverage.py +0 -0
  402. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_cli_managed.py +0 -0
  403. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_cli_render_coverage.py +0 -0
  404. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_cli_render_theme.py +0 -0
  405. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_cli_traces.py +0 -0
  406. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_cli_wandb_warning.py +0 -0
  407. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_client.py +0 -0
  408. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_client_import_purity.py +0 -0
  409. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_client_server_integration.py +0 -0
  410. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_client_stream_reads.py +0 -0
  411. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_config_env_vars.py +0 -0
  412. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_config_overrides.py +0 -0
  413. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_console_upload.py +0 -0
  414. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_controlled_experiment_repairs.py +0 -0
  415. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_cost_analytical.py +0 -0
  416. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_cost_equation.py +0 -0
  417. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_cost_estimate.py +0 -0
  418. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_cost_hardware.py +0 -0
  419. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_cost_models.py +0 -0
  420. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_dataset_profile.py +0 -0
  421. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_deploy_alias_move_warning.py +0 -0
  422. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_deploy_latency.py +0 -0
  423. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_dev_channel.py +0 -0
  424. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_disk_gb.py +0 -0
  425. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_endpoint_name.py +0 -0
  426. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_env_cache_evict.py +0 -0
  427. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_env_delete.py +0 -0
  428. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_env_download.py +0 -0
  429. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_env_download_api.py +0 -0
  430. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_env_evaluations.py +0 -0
  431. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_env_list_api.py +0 -0
  432. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_env_list_cli.py +0 -0
  433. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_env_list_hub.py +0 -0
  434. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_env_no_install.py +0 -0
  435. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_env_publish.py +0 -0
  436. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_env_pull.py +0 -0
  437. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_env_pull_coverage.py +0 -0
  438. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_env_pull_loader_coverage.py +0 -0
  439. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_env_pull_managed_control_plane.py +0 -0
  440. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_env_push.py +0 -0
  441. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_env_rate_limit_resolve.py +0 -0
  442. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_env_ref_pinning.py +0 -0
  443. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_env_test.py +0 -0
  444. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_envs_coverage.py +0 -0
  445. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_export.py +0 -0
  446. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_flash_mvp.py +0 -0
  447. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_flash_worker.py +0 -0
  448. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_flashinfer_cache_dirs.py +0 -0
  449. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_freesolo_api_transport.py +0 -0
  450. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_fused_expert_warmstart.py +0 -0
  451. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_github_urlopen_retry.py +0 -0
  452. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_gpu_type_single_field.py +0 -0
  453. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_gpus.py +0 -0
  454. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_grpo_params.py +0 -0
  455. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_grpo_resident_sizing.py +0 -0
  456. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_grpo_reward_batching.py +0 -0
  457. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_health_liveness.py +0 -0
  458. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_hf_retry.py +0 -0
  459. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_idle_endpoint_reaper.py +0 -0
  460. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_infisical_secrets.py +0 -0
  461. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_instance_bootstrap_coverage.py +0 -0
  462. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_internal_client.py +0 -0
  463. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_jobs.py +0 -0
  464. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_kernel_cache.py +0 -0
  465. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_kernel_fingerprint.py +0 -0
  466. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_kv_util.py +0 -0
  467. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_lambda_api_coverage.py +0 -0
  468. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_lambda_runner.py +0 -0
  469. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_logging.py +0 -0
  470. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_login_perms.py +0 -0
  471. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_lora_rank_coverage.py +0 -0
  472. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_lora_rank_preflight.py +0 -0
  473. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_managed_config_fields.py +0 -0
  474. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_managed_hf_repo.py +0 -0
  475. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_metrics_schema_agent_contract.py +0 -0
  476. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_mig_guard.py +0 -0
  477. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_multi_gpu_gate.py +0 -0
  478. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_multimodal_training.py +0 -0
  479. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_named_reward_metrics.py +0 -0
  480. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_oom_escalate_gpu.py +0 -0
  481. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_opd.py +0 -0
  482. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_opd_limits.py +0 -0
  483. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_opd_multiturn_eos_boundary.py +0 -0
  484. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_opd_multiturn_failure_exit.py +0 -0
  485. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_opd_replay_guard.py +0 -0
  486. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_opd_resume_safety.py +0 -0
  487. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_opd_train.py +0 -0
  488. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_orchestrator_flash.py +0 -0
  489. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_packing_coverage.py +0 -0
  490. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_parasail_teacher.py +0 -0
  491. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_poll_helpers.py +0 -0
  492. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_preflight.py +0 -0
  493. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_projects.py +0 -0
  494. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_prompt_budget.py +0 -0
  495. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_provider_preflight_coverage.py +0 -0
  496. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_provider_routing.py +0 -0
  497. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_provider_teardown_robustness.py +0 -0
  498. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_providers_symmetry.py +0 -0
  499. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_realized_cost.py +0 -0
  500. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_repo_cleanup.py +0 -0
  501. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_resolve_params_b.py +0 -0
  502. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_resume_on_retry.py +0 -0
  503. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_rl_train.py +0 -0
  504. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_rollout_samples.py +0 -0
  505. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_runpod_api_delete.py +0 -0
  506. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_runpod_key_fingerprint.py +0 -0
  507. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_runpod_key_waterfall.py +0 -0
  508. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_serve.py +0 -0
  509. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_serve_reasoning_content.py +0 -0
  510. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_server_api.py +0 -0
  511. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_server_app_coverage.py +0 -0
  512. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_server_auth_singleflight.py +0 -0
  513. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_server_billing.py +0 -0
  514. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_server_checkpoints_coverage.py +0 -0
  515. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_server_db.py +0 -0
  516. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_server_envs_coverage.py +0 -0
  517. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_server_locks_coverage.py +0 -0
  518. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_server_standalone.py +0 -0
  519. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_serving_context_preflight.py +0 -0
  520. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_serving_contract.py +0 -0
  521. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_serving_schema_coverage.py +0 -0
  522. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_sft_chunked_nll.py +0 -0
  523. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_sft_example_selection.py +0 -0
  524. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_sft_gc_off.py +0 -0
  525. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_sft_max_context.py +0 -0
  526. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_sft_startup_block.py +0 -0
  527. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_spec_and_validation.py +0 -0
  528. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_spec_contract_bytes.py +0 -0
  529. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_step_floor.py +0 -0
  530. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_step_metrics.py +0 -0
  531. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_step_timing.py +0 -0
  532. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_structured_outputs.py +0 -0
  533. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_teacher_broker.py +0 -0
  534. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_teacher_encoding_contract.py +0 -0
  535. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_thinking_config.py +0 -0
  536. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_train_context_preflight.py +0 -0
  537. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_training_controls.py +0 -0
  538. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_type_comment_prose.py +0 -0
  539. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_vast_api.py +0 -0
  540. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_vast_api_coverage.py +0 -0
  541. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_vast_offers.py +0 -0
  542. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_vast_provider_coverage.py +0 -0
  543. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_vast_runner.py +0 -0
  544. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_verified_revisions.py +0 -0
  545. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_verifiers.py +0 -0
  546. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_verl_checkpoint_export.py +0 -0
  547. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_verl_child_plugins.py +0 -0
  548. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_verl_silence_watchdog.py +0 -0
  549. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_version.py +0 -0
  550. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_vl_warmstart_adapter_keys.py +0 -0
  551. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_vram_architecture.py +0 -0
  552. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_wandb_link.py +0 -0
  553. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_wandb_naming.py +0 -0
  554. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_warmstart_adapter_download.py +0 -0
  555. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_warmstart_cross_repo.py +0 -0
  556. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_warmstart_error_attribution.py +0 -0
  557. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_weight_cache.py +0 -0
  558. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_worker_dryrun.py +0 -0
  559. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_worker_hardexit.py +0 -0
  560. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_worker_image.py +0 -0
  561. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_worker_init_heartbeat.py +0 -0
  562. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_worker_stack.py +0 -0
  563. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_worker_thinking.py +0 -0
  564. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_workflow_contracts.py +0 -0
  565. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_workload_profile.py +0 -0
  566. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_zero2_sharding_gate.py +0 -0
@@ -21,6 +21,16 @@ This file starts at 1.1.35. Earlier releases are not reconstructed here; use
21
21
 
22
22
  ### Changed
23
23
 
24
+ - An attempt's terminal artifacts (its strict marker plus `metrics.json`) are now interpreted by
25
+ one shared protocol instead of being decoded separately by live instance polling and by each
26
+ recovery path. The two decoders disagreed about identical bytes. A marker that could not be tied
27
+ to the attempt was a terminal failure to the live poller but indistinguishable from "no marker
28
+ yet" to recovery, so the same corrupt artifact produced a different story depending on which
29
+ layer happened to observe it; recovery now names it rather than logging silence. Neither path
30
+ ever adopted such a marker as completed work, and neither does now. Recovery also computed a
31
+ fresh observation window for the marker and then another for `metrics.json`, so the real ceiling
32
+ was their sum and moved with however long the first read took; both reads now share one window,
33
+ which makes the bound the cutoff rather than the sum.
24
34
  - CI runs the offline test suite on both supported interpreters (3.11 and 3.12) rather than
25
35
  3.11 alone, and sets `HF_HUB_OFFLINE` / `TRANSFORMERS_OFFLINE` so a test that reaches the
26
36
  network fails deterministically instead of depending on runner connectivity.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: freesolo-flash-dev
3
- Version: 1.2.48
3
+ Version: 1.2.52
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
@@ -844,6 +844,15 @@ Pick SFT when you already have good answers and want the model to imitate them.
844
844
  `max_context_tokens` that plausibly fits prompt + completion, and only raise it when you see
845
845
  truncation (outputs cut off mid-thought, degraded loss). A bigger context just costs
846
846
  more.
847
+ - **Multi-turn targets train on the assistant turns only.** When `sft_completion` returns a
848
+ full target transcript (assistant turns interleaved with the environment's tool/user
849
+ observations), Flash supervises the assistant turns and masks the observations out of the
850
+ loss — the model is trained to produce its own replies, not to predict the environment's.
851
+ For every ChatML target, including a single assistant turn, control strings `<|im_start|>` and
852
+ `<|im_end|>` are reserved in every message field the active template renders into the body,
853
+ including text content, reasoning, and tool-call serialization. They are indistinguishable from
854
+ structural turn delimiters after tokenization. The run logs role-aware masked rows and any
855
+ completion-only fallback rows separately.
847
856
  - **For Qwen3.5 thinking multi-turn SFT, put reasoning only in the final assistant
848
857
  turn.** Qwen3.5's chat template strips literal `<think>` blocks from prior assistant
849
858
  history and pre-opens `<think>\n` in the next generation prompt. If every assistant
@@ -50,6 +50,8 @@ class PreparedSftWorkload:
50
50
  sampled_texts: list[str]
51
51
  multiturn_targets: int
52
52
  coerced_singleturn_targets: int
53
+ role_aware_multiturn_targets: int
54
+ fallback_multiturn_targets: int
53
55
  authored_reasoning_turns: int
54
56
  rendered_reasoning_spans: int
55
57
  truncated_reasoning_spans: int
@@ -104,7 +106,8 @@ def _processor_tokenized_row(
104
106
  *,
105
107
  max_length: int,
106
108
  thinking: bool,
107
- ) -> tuple[list[int], list[int], bytes, int]:
109
+ ) -> tuple[list[int], list[int], bytes, int, bool]:
110
+ from flash.engine.worker.model.chatml_mask import assistant_only_mask
108
111
  from flash.engine.worker.model.packing import completion_mask_from_ids
109
112
 
110
113
  prepared_prompt = _multimodal_messages_with_images(prompt_messages, images)
@@ -143,9 +146,22 @@ def _processor_tokenized_row(
143
146
  untruncated_length = len(untruncated_ids)
144
147
  input_ids = untruncated_ids[:max_length]
145
148
  prompt_ids = ids(prompt["input_ids"])[:max_length]
146
- loss_mask = completion_mask_from_ids(prompt_ids, input_ids)
149
+ # the span reader needs the text tokenizer's vocabulary; a processor exposes it as .tokenizer.
150
+ mask, role_aware = assistant_only_mask(
151
+ completion_mask_from_ids(prompt_ids, input_ids),
152
+ input_ids,
153
+ getattr(processor, "tokenizer", processor),
154
+ completion_messages,
155
+ # this path appends nothing of its own, so there is no appended EOS to preserve.
156
+ appended_eos=False,
157
+ template_source=processor,
158
+ # the IMAGE-PREPARED messages, which is what the processor actually rendered: probing the
159
+ # unprepared list would validate a different transcript than the one being masked.
160
+ source_messages=full_messages,
161
+ template_kwargs={"enable_thinking": thinking},
162
+ )
147
163
  full.pop("attention_mask", None)
148
- return input_ids, loss_mask, _serialize_multimodal_inputs(full), untruncated_length
164
+ return input_ids, mask, _serialize_multimodal_inputs(full), untruncated_length, role_aware
149
165
 
150
166
 
151
167
  def _materialize_verl_images(
@@ -269,6 +285,10 @@ class _TokenizedSftRows:
269
285
  sampled_texts: list[str]
270
286
  multiturn_targets: int
271
287
  coerced_singleturn_targets: int
288
+ # multi-turn rows only: present means the row has a multi-turn target, and the value says whether
289
+ # its mask was role-aware or fell back to the contiguous span. one map rather than a set plus a
290
+ # parallel dict, so a row can never be counted as multi-turn while its mask status is missing.
291
+ multiturn_mask_applied: dict[int, bool]
272
292
  reasoning_by_index: dict[int, _RowReasoning]
273
293
  dropped: int
274
294
 
@@ -280,6 +300,8 @@ class _RetainedSftRows:
280
300
  authored_reasoning_turns: int
281
301
  rendered_reasoning_spans: int
282
302
  truncated_reasoning_spans: int
303
+ role_aware_multiturn_targets: int
304
+ fallback_multiturn_targets: int
283
305
  dropped: int
284
306
  # kept PER ROW, in the retained order, so the warning can be bounded to the rows the optimizer
285
307
  # actually consumes. the totals above describe the whole retained dataset, which is what the
@@ -386,6 +408,48 @@ def _row_reasoning(
386
408
  return _RowReasoning(authored, rendered, truncated)
387
409
 
388
410
 
411
+ def _text_sft_row_spec(
412
+ spec,
413
+ prompt_messages: list[dict],
414
+ completion_messages: list[dict],
415
+ *,
416
+ tokenizer,
417
+ render_transcript: Callable[[list[dict]], str],
418
+ max_length: int,
419
+ row_index: int,
420
+ multiturn: bool,
421
+ ) -> tuple[str, _RowReasoning, dict[str, Any]]:
422
+ text = render_transcript([*prompt_messages, *completion_messages])
423
+ prompt_text = tokenizer.apply_chat_template(
424
+ prompt_messages,
425
+ tokenize=False,
426
+ add_generation_prompt=True,
427
+ enable_thinking=spec.thinking,
428
+ )
429
+ reasoning = _row_reasoning(
430
+ prompt_messages,
431
+ completion_messages,
432
+ render=render_transcript,
433
+ tokenizer=tokenizer,
434
+ max_length=max_length,
435
+ )
436
+ return (
437
+ text,
438
+ reasoning,
439
+ {
440
+ "text": text,
441
+ "prompt_text": prompt_text,
442
+ "target_messages": completion_messages,
443
+ "source_messages": [*prompt_messages, *completion_messages],
444
+ "template_kwargs": {"enable_thinking": spec.thinking},
445
+ # measurement carried alongside the row rather than in it: the parquet row is built from
446
+ # an explicit key list below, so neither key reaches verl.
447
+ "row_index": row_index,
448
+ "multiturn": multiturn,
449
+ },
450
+ )
451
+
452
+
389
453
  def _tokenize_prompt_rows(
390
454
  spec,
391
455
  prompt_rows: list[tuple[Any, list[dict], list[dict], bool]],
@@ -409,6 +473,7 @@ def _tokenize_prompt_rows(
409
473
  sampled_texts: list[str] = []
410
474
  multiturn_targets = 0
411
475
  coerced_singleturn_targets = 0
476
+ multiturn_mask_applied: dict[int, bool] = {}
412
477
  # kept per row rather than summed here, for the same reason as `untruncated_by_index`: rows that
413
478
  # lose their whole completion to the cap are dropped below, and folding their reasoning into a
414
479
  # running total would report loss from rows the run never trains on against a retained-row
@@ -430,7 +495,9 @@ def _tokenize_prompt_rows(
430
495
  coerced_scalar_output,
431
496
  ) in enumerate(prompt_rows):
432
497
  _reject_image_completion(completion_messages)
433
- if len(completion_messages) > 1:
498
+ # read before the image branch rewrites `completion_messages` to its text-only form.
499
+ multiturn = len(completion_messages) > 1
500
+ if multiturn:
434
501
  multiturn_targets += 1
435
502
  elif (
436
503
  coerced_scalar_output
@@ -444,7 +511,13 @@ def _tokenize_prompt_rows(
444
511
  normalized = normalize_prompt_images(example, prompt_messages, package_root)
445
512
  completion_messages = text_only_prompt_messages(completion_messages)
446
513
  decoded_images = decode_image_descriptors(normalized.descriptors, package_root)
447
- input_ids, loss_mask, multimodal_inputs, untruncated_length = _processor_tokenized_row(
514
+ (
515
+ input_ids,
516
+ loss_mask,
517
+ multimodal_inputs,
518
+ untruncated_length,
519
+ assistant_mask_applied,
520
+ ) = _processor_tokenized_row(
448
521
  processor,
449
522
  normalized.messages,
450
523
  completion_messages,
@@ -453,6 +526,8 @@ def _tokenize_prompt_rows(
453
526
  thinking=bool(spec.thinking),
454
527
  )
455
528
  untruncated_by_index[row_index] = untruncated_length
529
+ if multiturn:
530
+ multiturn_mask_applied[row_index] = assistant_mask_applied
456
531
  row_by_index[row_index] = {
457
532
  "input_ids": input_ids,
458
533
  "loss_mask": loss_mask,
@@ -480,22 +555,19 @@ def _tokenize_prompt_rows(
480
555
  max_length=max_length - visual_inflation,
481
556
  )
482
557
  else:
483
- text = render_transcript([*prompt_messages, *completion_messages])
484
- prompt_text = tokenizer.apply_chat_template(
485
- prompt_messages,
486
- tokenize=False,
487
- add_generation_prompt=True,
488
- enable_thinking=spec.thinking,
489
- )
490
- sampled_texts.append(text)
491
- reasoning_by_index[row_index] = _row_reasoning(
558
+ text, reasoning, text_spec = _text_sft_row_spec(
559
+ spec,
492
560
  prompt_messages,
493
561
  completion_messages,
494
- render=render_transcript,
495
562
  tokenizer=tokenizer,
563
+ render_transcript=render_transcript,
496
564
  max_length=max_length,
565
+ row_index=row_index,
566
+ multiturn=multiturn,
497
567
  )
498
- text_specs.append({"text": text, "prompt_text": prompt_text, "row_index": row_index})
568
+ sampled_texts.append(text)
569
+ reasoning_by_index[row_index] = reasoning
570
+ text_specs.append(text_spec)
499
571
 
500
572
  dropped = 0
501
573
  if text_specs:
@@ -506,9 +578,12 @@ def _tokenize_prompt_rows(
506
578
  )
507
579
  dropped += text_dropped
508
580
  for spec_row, tokenized in zip(kept_specs, tokenized_rows, strict=True):
581
+ row_index = spec_row["row_index"]
509
582
  input_ids = tokenized["input_ids"]
510
- untruncated_by_index[spec_row["row_index"]] = tokenized["untruncated_length"]
511
- row_by_index[spec_row["row_index"]] = {
583
+ untruncated_by_index[row_index] = tokenized["untruncated_length"]
584
+ if spec_row["multiturn"]:
585
+ multiturn_mask_applied[row_index] = tokenized["assistant_mask_applied"]
586
+ row_by_index[row_index] = {
512
587
  "input_ids": input_ids,
513
588
  "loss_mask": tokenized["completion_mask"],
514
589
  "images": [],
@@ -520,6 +595,7 @@ def _tokenize_prompt_rows(
520
595
  sampled_texts=sampled_texts,
521
596
  multiturn_targets=multiturn_targets,
522
597
  coerced_singleturn_targets=coerced_singleturn_targets,
598
+ multiturn_mask_applied=multiturn_mask_applied,
523
599
  reasoning_by_index=reasoning_by_index,
524
600
  dropped=dropped,
525
601
  )
@@ -533,6 +609,8 @@ def _filter_retained_rows(tokenized: _TokenizedSftRows, tokenizer) -> _RetainedS
533
609
  authored_reasoning = 0
534
610
  rendered_reasoning = 0
535
611
  truncated_reasoning = 0
612
+ role_aware_multiturn_targets = 0
613
+ fallback_multiturn_targets = 0
536
614
  per_row: list[_RowReasoning] = []
537
615
  dropped = tokenized.dropped
538
616
  for row_index in sorted(tokenized.row_by_index):
@@ -542,6 +620,11 @@ def _filter_retained_rows(tokenized: _TokenizedSftRows, tokenizer) -> _RetainedS
542
620
  # appended in lockstep with the row it measures, so the truncation counts below describe
543
621
  # the rows that are actually trained on rather than the ones that were dropped.
544
622
  retained_untruncated.append(tokenized.untruncated_by_index[row_index])
623
+ if row_index in tokenized.multiturn_mask_applied:
624
+ if tokenized.multiturn_mask_applied[row_index]:
625
+ role_aware_multiturn_targets += 1
626
+ else:
627
+ fallback_multiturn_targets += 1
545
628
  # summed here for the same reason, so the reasoning-loss warning describes the rows the
546
629
  # run trains on. a dropped row contributes neither its authored reasoning nor its
547
630
  # survivors, which would otherwise be reported against a retained-row denominator.
@@ -566,6 +649,8 @@ def _filter_retained_rows(tokenized: _TokenizedSftRows, tokenizer) -> _RetainedS
566
649
  authored_reasoning_turns=authored_reasoning,
567
650
  rendered_reasoning_spans=rendered_reasoning,
568
651
  truncated_reasoning_spans=truncated_reasoning,
652
+ role_aware_multiturn_targets=role_aware_multiturn_targets,
653
+ fallback_multiturn_targets=fallback_multiturn_targets,
569
654
  dropped=dropped,
570
655
  row_reasoning=per_row,
571
656
  )
@@ -895,6 +980,8 @@ def prepare_sft_workload(
895
980
  sampled_texts=tokenized.sampled_texts,
896
981
  multiturn_targets=tokenized.multiturn_targets,
897
982
  coerced_singleturn_targets=tokenized.coerced_singleturn_targets,
983
+ role_aware_multiturn_targets=retained.role_aware_multiturn_targets,
984
+ fallback_multiturn_targets=retained.fallback_multiturn_targets,
898
985
  authored_reasoning_turns=retained.authored_reasoning_turns,
899
986
  rendered_reasoning_spans=retained.rendered_reasoning_spans,
900
987
  truncated_reasoning_spans=retained.truncated_reasoning_spans,
@@ -10,8 +10,10 @@ from __future__ import annotations
10
10
 
11
11
  import random
12
12
 
13
+ from flash.engine.worker.model.chatml_mask import assistant_only_mask
13
14
  from flash.engine.worker.model.packing import (
14
15
  completion_mask_from_ids,
16
+ packing_appends_eos,
15
17
  tokenize_for_packing,
16
18
  untruncated_lengths_for_packing,
17
19
  )
@@ -37,7 +39,8 @@ def _pretokenize_completion_only(texts, tokenizer, max_length):
37
39
 
38
40
  Returns ``(kept_texts, pretok, n_dropped)``. Each pretok row also carries
39
41
  ``untruncated_length``: its token count BEFORE the cap. The post-slice length can never exceed
40
- max_length, so it cannot say whether the cap actually bound; this can.
42
+ max_length, so it cannot say whether the cap actually bound; this can. It also carries
43
+ ``assistant_mask_applied``: whether the render was readable enough to mask non-assistant turns.
41
44
  """
42
45
  full_ids = tokenize_for_packing([t["text"] for t in texts], tokenizer, max_length)
43
46
  # the same encode without the cap, so a truncated row reports its real size rather than the cap.
@@ -45,14 +48,27 @@ def _pretokenize_completion_only(texts, tokenizer, max_length):
45
48
  prompt_ids = tokenizer(
46
49
  [t["prompt_text"] for t in texts], truncation=True, max_length=max_length
47
50
  )["input_ids"]
48
- pretok = [
49
- {
50
- "input_ids": ids,
51
- "completion_mask": completion_mask_from_ids(pids, ids),
52
- "untruncated_length": length,
53
- }
54
- for ids, pids, length in zip(full_ids, prompt_ids, untruncated, strict=True)
55
- ]
51
+ pretok = []
52
+ for text, ids, pids, length in zip(texts, full_ids, prompt_ids, untruncated, strict=True):
53
+ mask, role_aware = assistant_only_mask(
54
+ completion_mask_from_ids(pids, ids),
55
+ ids,
56
+ tokenizer,
57
+ text["target_messages"],
58
+ # the appended EOS counts only when it SURVIVED the cap: an equal-length row proves the
59
+ # token that terminates the example is still there to supervise.
60
+ appended_eos=packing_appends_eos(text["text"], tokenizer) and len(ids) == length,
61
+ source_messages=text["source_messages"],
62
+ template_kwargs=text["template_kwargs"],
63
+ )
64
+ pretok.append(
65
+ {
66
+ "input_ids": ids,
67
+ "completion_mask": mask,
68
+ "assistant_mask_applied": role_aware,
69
+ "untruncated_length": length,
70
+ }
71
+ )
56
72
  special_ids = set(getattr(tokenizer, "all_special_ids", None) or [])
57
73
  kept = [
58
74
  (t, r)