freesolo-flash-dev 1.2.48__tar.gz → 1.2.49__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 (564) hide show
  1. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/PKG-INFO +1 -1
  2. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/cli/scaffold/TRAINING.md +9 -0
  3. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/profiling/sft_workload.py +105 -18
  4. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/entry/sft.py +25 -9
  5. freesolo_flash_dev-1.2.49/flash/engine/worker/model/chatml_mask.py +551 -0
  6. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/model/packing.py +6 -1
  7. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/sft_train_runner.py +14 -4
  8. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/pyproject.toml +2 -2
  9. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_packing.py +36 -4
  10. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_sft_train.py +810 -6
  11. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_sft_workload.py +47 -28
  12. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/uv.lock +1 -1
  13. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/.dockerignore +0 -0
  14. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/.env.example +0 -0
  15. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/.github/CODEOWNERS +0 -0
  16. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  17. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  18. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  19. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  20. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/.github/dependabot.yml +0 -0
  21. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/.github/workflows/auto-rebake.yml +0 -0
  22. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/.github/workflows/bake-kernel-cache.yml +0 -0
  23. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/.github/workflows/ci.yml +0 -0
  24. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/.github/workflows/main-source-guard.yml +0 -0
  25. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/.github/workflows/notify-tests-repo.yml +0 -0
  26. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/.github/workflows/publish-dev.yml +0 -0
  27. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/.github/workflows/publish-image.yml +0 -0
  28. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/.github/workflows/publish.yml +0 -0
  29. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/.github/workflows/version-parity.yml +0 -0
  30. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/.github/workflows/worker-image.yml +0 -0
  31. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/.gitignore +0 -0
  32. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/CHANGELOG.md +0 -0
  33. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/CODE_OF_CONDUCT.md +0 -0
  34. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/CONTRIBUTING.md +0 -0
  35. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/Dockerfile +0 -0
  36. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/Dockerfile.worker +0 -0
  37. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/LICENSE +0 -0
  38. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/NOTICE +0 -0
  39. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/README.md +0 -0
  40. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/SECURITY.md +0 -0
  41. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/SELF_HOSTING.md +0 -0
  42. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/build/kernel_cache/.gitignore +0 -0
  43. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/build/kernel_cache/.keep +0 -0
  44. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/deploy/infisical/README.md +0 -0
  45. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/deploy/infisical/entrypoint.sh +0 -0
  46. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/docker/Dockerfile.kernelcache +0 -0
  47. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/docker/Dockerfile.kernelcache.relayer +0 -0
  48. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/docker/bake_kernel_cache.py +0 -0
  49. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/docker/bake_pod_entry.py +0 -0
  50. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/docker/extract_cudart_fix.py +0 -0
  51. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/docker/kernel_fingerprint.py +0 -0
  52. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/docker/make_rp_handler.py +0 -0
  53. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/__init__.py +0 -0
  54. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/_internal/__init__.py +0 -0
  55. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/_internal/channel.py +0 -0
  56. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/_internal/diagnostics.py +0 -0
  57. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/_internal/fileio.py +0 -0
  58. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/_internal/logging.py +0 -0
  59. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/_internal/paths.py +0 -0
  60. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/adapters/__init__.py +0 -0
  61. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/adapters/artifacts.py +0 -0
  62. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/adapters/fused_experts.py +0 -0
  63. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/adapters/lora_rank.py +0 -0
  64. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/cli/__init__.py +0 -0
  65. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/cli/__main__.py +0 -0
  66. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/cli/commands/__init__.py +0 -0
  67. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/cli/commands/deploy.py +0 -0
  68. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/cli/commands/env/__init__.py +0 -0
  69. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/cli/commands/env/episode.py +0 -0
  70. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/cli/commands/env/eval.py +0 -0
  71. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/cli/commands/env/eval_args.py +0 -0
  72. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/cli/commands/env/imports.py +0 -0
  73. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/cli/commands/env/list.py +0 -0
  74. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/cli/commands/env/push.py +0 -0
  75. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/cli/commands/env/retained.py +0 -0
  76. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/cli/commands/env/setup.py +0 -0
  77. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/cli/commands/env/test.py +0 -0
  78. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/cli/commands/env/test_evaluations.py +0 -0
  79. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/cli/commands/env/test_params.py +0 -0
  80. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/cli/commands/env/test_warnings.py +0 -0
  81. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/cli/commands/prompt_budget.py +0 -0
  82. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/cli/commands/traces.py +0 -0
  83. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/cli/commands/train_cost.py +0 -0
  84. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/cli/scaffold/__init__.py +0 -0
  85. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/cli/ui/__init__.py +0 -0
  86. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/cli/ui/cost.py +0 -0
  87. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/cli/ui/env_panels.py +0 -0
  88. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/cli/ui/heartbeat.py +0 -0
  89. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/cli/ui/render.py +0 -0
  90. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/cli/ui/tables.py +0 -0
  91. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/cli/ui/tty.py +0 -0
  92. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/client/__init__.py +0 -0
  93. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/client/config.py +0 -0
  94. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/client/freesolo_api.py +0 -0
  95. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/client/http.py +0 -0
  96. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/client/runtime_secrets.py +0 -0
  97. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/client/shapes.py +0 -0
  98. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/client/specs.py +0 -0
  99. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/client/streaming.py +0 -0
  100. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/content/__init__.py +0 -0
  101. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/content/multimodal.py +0 -0
  102. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/content/structured_outputs.py +0 -0
  103. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/content/thinking.py +0 -0
  104. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/core/__init__.py +0 -0
  105. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/core/catalog.py +0 -0
  106. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/core/spec.py +0 -0
  107. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/core/spec_persistence.py +0 -0
  108. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/cost/__init__.py +0 -0
  109. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/cost/analytical.py +0 -0
  110. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/cost/facts.py +0 -0
  111. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/cost/spec.py +0 -0
  112. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/cost/types.py +0 -0
  113. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/__init__.py +0 -0
  114. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/plan/__init__.py +0 -0
  115. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/plan/kv_sizing.py +0 -0
  116. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/plan/model_config_probe.py +0 -0
  117. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/plan/prompt_budget.py +0 -0
  118. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/plan/recipe.py +0 -0
  119. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/plan/steps.py +0 -0
  120. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/plan/vram.py +0 -0
  121. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/profiling/__init__.py +0 -0
  122. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/profiling/dataset_profile.py +0 -0
  123. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/profiling/reasoning_render.py +0 -0
  124. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/profiling/tokenizer.py +0 -0
  125. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/profiling/workload_profile.py +0 -0
  126. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/result/__init__.py +0 -0
  127. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/result/accounting.py +0 -0
  128. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/result/rollout_samples.py +0 -0
  129. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/__init__.py +0 -0
  130. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/__main__.py +0 -0
  131. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/backend_common.py +0 -0
  132. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/entry/__init__.py +0 -0
  133. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/entry/opd.py +0 -0
  134. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/entry/rl.py +0 -0
  135. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/io/__init__.py +0 -0
  136. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/io/heartbeat.py +0 -0
  137. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/io/hf.py +0 -0
  138. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/io/prefetch.py +0 -0
  139. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/io/wandb_log.py +0 -0
  140. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/model/__init__.py +0 -0
  141. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/model/adapter.py +0 -0
  142. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/model/decoding.py +0 -0
  143. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/model/lora.py +0 -0
  144. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/opd_train.py +0 -0
  145. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/opd_train_runner.py +0 -0
  146. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/perf/__init__.py +0 -0
  147. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/perf/diagnostics.py +0 -0
  148. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/perf/lifecycle.py +0 -0
  149. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/perf/liger.py +0 -0
  150. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/perf/memory.py +0 -0
  151. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/rl_train.py +0 -0
  152. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/rl_train_runner.py +0 -0
  153. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/runtime/__init__.py +0 -0
  154. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/runtime/kernel_warmup.py +0 -0
  155. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/runtime/pkg_proxy.py +0 -0
  156. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/runtime/rng.py +0 -0
  157. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/score_batcher.py +0 -0
  158. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/sft_train.py +0 -0
  159. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/teacher/__init__.py +0 -0
  160. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/teacher/client.py +0 -0
  161. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/teacher/encoding.py +0 -0
  162. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/teacher/tokenizer_align.py +0 -0
  163. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/train/__init__.py +0 -0
  164. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/train/core/__init__.py +0 -0
  165. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/train/core/checkpoint_lifecycle.py +0 -0
  166. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/train/core/child/__init__.py +0 -0
  167. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/train/core/child/glue.py +0 -0
  168. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/train/core/child/runtime.py +0 -0
  169. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/train/core/step_timing.py +0 -0
  170. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/train/finalize.py +0 -0
  171. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/train/opd/__init__.py +0 -0
  172. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/train/opd/batching.py +0 -0
  173. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/train/opd/bridge.py +0 -0
  174. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/train/opd/child/__init__.py +0 -0
  175. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/train/opd/child/bridge.py +0 -0
  176. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/train/opd/child/entry.py +0 -0
  177. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/train/opd/child/multiturn.py +0 -0
  178. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/train/opd/child/plugin.py +0 -0
  179. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/train/opd/child/replay_guard.py +0 -0
  180. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/train/opd/child/runtime.py +0 -0
  181. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/train/opd/child/structured.py +0 -0
  182. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/train/opd/failures.py +0 -0
  183. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/train/opd/gkd.py +0 -0
  184. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/train/opd/multiturn_validation.py +0 -0
  185. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/train/opd/overrides.py +0 -0
  186. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/train/opd/prompts.py +0 -0
  187. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/train/opd/reporting.py +0 -0
  188. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/train/opd/scoring.py +0 -0
  189. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/train/opd/state.py +0 -0
  190. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/train/opd/validation.py +0 -0
  191. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/train/rl/__init__.py +0 -0
  192. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/train/rl/checkpoints.py +0 -0
  193. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/train/rl/child/__init__.py +0 -0
  194. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/train/rl/child/entry.py +0 -0
  195. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/train/rl/child/multiturn.py +0 -0
  196. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/train/rl/child/patches.py +0 -0
  197. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/train/rl/child/plugin.py +0 -0
  198. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/train/rl/config.py +0 -0
  199. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/train/rl/inputs.py +0 -0
  200. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/train/rl/multi_turn.py +0 -0
  201. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/train/rl/reward_module.py +0 -0
  202. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/train/rl/scoring.py +0 -0
  203. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/train/rl/single_turn.py +0 -0
  204. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/train/rl/verl_config.py +0 -0
  205. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/train/sft/__init__.py +0 -0
  206. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/train/sft/checkpoints.py +0 -0
  207. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/train/sft/child/entry.py +0 -0
  208. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/train/sft/child/plugin.py +0 -0
  209. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/train/sft/config.py +0 -0
  210. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/verl/__init__.py +0 -0
  211. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/verl/capabilities.py +0 -0
  212. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/verl/checkpoints.py +0 -0
  213. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/verl/child_io.py +0 -0
  214. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/verl/diagnostics.py +0 -0
  215. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/verl/parallelism.py +0 -0
  216. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker/verl/parent_work.py +0 -0
  217. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/engine/worker_entrypoint.py +0 -0
  218. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/envs/__init__.py +0 -0
  219. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/envs/adapter.py +0 -0
  220. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/envs/base.py +0 -0
  221. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/envs/cache_security.py +0 -0
  222. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/envs/dataset_selection.py +0 -0
  223. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/envs/evaluations.py +0 -0
  224. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/envs/identity.py +0 -0
  225. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/envs/loader.py +0 -0
  226. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/envs/namespace_listing.py +0 -0
  227. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/envs/package/__init__.py +0 -0
  228. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/envs/package/limits.py +0 -0
  229. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/envs/package/unpack.py +0 -0
  230. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/envs/pull.py +0 -0
  231. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/providers/__init__.py +0 -0
  232. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/providers/_lifecycle/__init__.py +0 -0
  233. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/providers/_lifecycle/auth.py +0 -0
  234. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/providers/_lifecycle/bootstrap.py +0 -0
  235. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/providers/_lifecycle/bootstrap_console.py +0 -0
  236. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/providers/_lifecycle/bootstrap_pip.py +0 -0
  237. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/providers/_lifecycle/bootstrap_secrets.py +0 -0
  238. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/providers/_lifecycle/deadline.py +0 -0
  239. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/providers/_lifecycle/http.py +0 -0
  240. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/providers/_lifecycle/instance.py +0 -0
  241. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/providers/_lifecycle/poll.py +0 -0
  242. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/providers/_lifecycle/poll_instance.py +0 -0
  243. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/providers/_lifecycle/provider.py +0 -0
  244. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/providers/_lifecycle/worker.py +0 -0
  245. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/providers/allocator.py +0 -0
  246. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/providers/artifacts/__init__.py +0 -0
  247. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/providers/artifacts/hf.py +0 -0
  248. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/providers/artifacts/preload_runpod.py +0 -0
  249. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/providers/artifacts/weight_cache.py +0 -0
  250. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/providers/base.py +0 -0
  251. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/providers/fit_errors.py +0 -0
  252. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/providers/lambda_/__init__.py +0 -0
  253. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/providers/lambda_/api.py +0 -0
  254. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/providers/lambda_/auth.py +0 -0
  255. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/providers/lambda_/gpus.py +0 -0
  256. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/providers/lambda_/jobs/__init__.py +0 -0
  257. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/providers/lambda_/jobs/builders.py +0 -0
  258. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/providers/lambda_/jobs/reap.py +0 -0
  259. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/providers/lambda_/preflight.py +0 -0
  260. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/providers/lambda_/pricing.py +0 -0
  261. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/providers/preflight.py +0 -0
  262. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/providers/realized.py +0 -0
  263. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/providers/runpod/__init__.py +0 -0
  264. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/providers/runpod/api.py +0 -0
  265. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/providers/runpod/auth.py +0 -0
  266. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/providers/runpod/cost.py +0 -0
  267. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/providers/runpod/gpus.py +0 -0
  268. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/providers/runpod/job_execution.py +0 -0
  269. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/providers/runpod/jobs.py +0 -0
  270. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/providers/runpod/preflight.py +0 -0
  271. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/providers/runpod/pricing.py +0 -0
  272. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/providers/runpod/resources.py +0 -0
  273. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/providers/runpod/serverless/__init__.py +0 -0
  274. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/providers/runpod/serverless/endpoints.py +0 -0
  275. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/providers/sharding.py +0 -0
  276. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/providers/vast/__init__.py +0 -0
  277. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/providers/vast/api.py +0 -0
  278. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/providers/vast/auth.py +0 -0
  279. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/providers/vast/jobs/__init__.py +0 -0
  280. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/providers/vast/jobs/builders.py +0 -0
  281. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/providers/vast/preflight.py +0 -0
  282. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/providers/vast/pricing.py +0 -0
  283. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/py.typed +0 -0
  284. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/runner/__init__.py +0 -0
  285. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/runner/artifacts.py +0 -0
  286. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/runner/attempts.py +0 -0
  287. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/runner/costs.py +0 -0
  288. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/runner/deadlines.py +0 -0
  289. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/runner/preparation.py +0 -0
  290. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/runner/reconciliation.py +0 -0
  291. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/runner/results/__init__.py +0 -0
  292. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/runner/results/checkpoints.py +0 -0
  293. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/runner/results/verified_revisions.py +0 -0
  294. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/runner/status.py +0 -0
  295. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/runner/submit.py +0 -0
  296. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/runner/supervise/__init__.py +0 -0
  297. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/runner/supervise/attach.py +0 -0
  298. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/runner/supervise/deploy.py +0 -0
  299. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/runner/supervise/lifecycle.py +0 -0
  300. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/runner/supervise/recovery.py +0 -0
  301. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/runner/supervise/retry_decision.py +0 -0
  302. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/runner/supervise/seed_submission.py +0 -0
  303. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/runner/supervise/transitions.py +0 -0
  304. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/runner/weight_cache.py +0 -0
  305. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/schema/__init__.py +0 -0
  306. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/schema/fields.py +0 -0
  307. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/serve/__init__.py +0 -0
  308. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/serve/adapter_check.py +0 -0
  309. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/serve/deploy.py +0 -0
  310. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/serve/errors.py +0 -0
  311. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/serve/export.py +0 -0
  312. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/serve/preflight.py +0 -0
  313. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/serve/responses.py +0 -0
  314. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/serve/streaming.py +0 -0
  315. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/serve/thinking.py +0 -0
  316. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/serve/urls.py +0 -0
  317. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/server/__init__.py +0 -0
  318. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/server/__main__.py +0 -0
  319. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/server/app.py +0 -0
  320. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/server/billing/__init__.py +0 -0
  321. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/server/billing/charges.py +0 -0
  322. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/server/billing/retry.py +0 -0
  323. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/server/domain/__init__.py +0 -0
  324. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/server/domain/checkpoints.py +0 -0
  325. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/server/domain/environment_registry.py +0 -0
  326. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/server/domain/envs.py +0 -0
  327. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/server/domain/projects.py +0 -0
  328. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/server/domain/reconcile.py +0 -0
  329. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/server/domain/repo_cleanup.py +0 -0
  330. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/server/domain/run_registry.py +0 -0
  331. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/server/domain/teacher_broker.py +0 -0
  332. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/server/domain/teacher_errors.py +0 -0
  333. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/server/domain/teacher_requests.py +0 -0
  334. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/server/platform/__init__.py +0 -0
  335. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/server/platform/auth.py +0 -0
  336. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/server/platform/db.py +0 -0
  337. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/server/platform/deps.py +0 -0
  338. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/server/platform/internal_client.py +0 -0
  339. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/server/platform/locks.py +0 -0
  340. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/server/platform/runtime.py +0 -0
  341. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/server/routes/__init__.py +0 -0
  342. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/server/routes/envs.py +0 -0
  343. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/server/routes/meta.py +0 -0
  344. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/server/routes/runs.py +0 -0
  345. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/server/routes/serving.py +0 -0
  346. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/server/routes/serving_completion.py +0 -0
  347. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/server/routes/serving_revisions.py +0 -0
  348. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/server/routes/serving_smoke.py +0 -0
  349. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/server/routes/teacher.py +0 -0
  350. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/teacher/__init__.py +0 -0
  351. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/teacher/limits.py +0 -0
  352. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/flash/teacher/retry_contract.py +0 -0
  353. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/scripts/build_dev_dist.py +0 -0
  354. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/scripts/check_file_size.py +0 -0
  355. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/scripts/check_function_size.py +0 -0
  356. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/scripts/check_verl_pin_exists.py +0 -0
  357. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/scripts/scrub_history.sh +0 -0
  358. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/__init__.py +0 -0
  359. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/_helpers/__init__.py +0 -0
  360. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/_helpers/profile.py +0 -0
  361. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/_helpers/runner.py +0 -0
  362. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/_helpers/specs.py +0 -0
  363. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/_helpers/teacher.py +0 -0
  364. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/_helpers/vast.py +0 -0
  365. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/conftest.py +0 -0
  366. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/fixtures/math_eval.jsonl +0 -0
  367. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/fixtures/math_train.jsonl +0 -0
  368. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/live/__init__.py +0 -0
  369. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/live/conftest.py +0 -0
  370. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/live/test_lambda_live.py +0 -0
  371. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/live/test_runpod_live.py +0 -0
  372. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/live/test_sft_thinking_render_live.py +0 -0
  373. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/live/test_vast_live.py +0 -0
  374. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_accounting_coverage.py +0 -0
  375. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_adapter_shard_completeness.py +0 -0
  376. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_agent_flash_cli_contract.py +0 -0
  377. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_algorithms.py +0 -0
  378. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_allocator.py +0 -0
  379. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_backend_common.py +0 -0
  380. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_backend_jobspec_contract.py +0 -0
  381. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_bake_kernel_cache.py +0 -0
  382. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_base_model_provenance.py +0 -0
  383. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_billing_retry.py +0 -0
  384. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_build_context_contract.py +0 -0
  385. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_cancel_remote.py +0 -0
  386. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_catalog_consistency.py +0 -0
  387. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_catalog_only_models.py +0 -0
  388. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_charge_pricing.py +0 -0
  389. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_checkpoint_lifecycle.py +0 -0
  390. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_checkpoints.py +0 -0
  391. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_cli_commands.py +0 -0
  392. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_cli_commands_coverage.py +0 -0
  393. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_cli_credential_shadowing.py +0 -0
  394. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_cli_errors.py +0 -0
  395. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_cli_estimate.py +0 -0
  396. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_cli_gpus_flag.py +0 -0
  397. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_cli_help.py +0 -0
  398. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_cli_main_coverage.py +0 -0
  399. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_cli_managed.py +0 -0
  400. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_cli_render_coverage.py +0 -0
  401. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_cli_render_theme.py +0 -0
  402. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_cli_traces.py +0 -0
  403. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_cli_wandb_warning.py +0 -0
  404. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_client.py +0 -0
  405. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_client_import_purity.py +0 -0
  406. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_client_server_integration.py +0 -0
  407. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_client_stream_reads.py +0 -0
  408. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_config_env_vars.py +0 -0
  409. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_config_overrides.py +0 -0
  410. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_console_upload.py +0 -0
  411. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_controlled_experiment_repairs.py +0 -0
  412. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_cost_analytical.py +0 -0
  413. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_cost_equation.py +0 -0
  414. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_cost_estimate.py +0 -0
  415. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_cost_hardware.py +0 -0
  416. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_cost_models.py +0 -0
  417. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_dataset_profile.py +0 -0
  418. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_deploy_alias_move_warning.py +0 -0
  419. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_deploy_latency.py +0 -0
  420. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_dev_channel.py +0 -0
  421. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_disk_gb.py +0 -0
  422. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_endpoint_name.py +0 -0
  423. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_env_cache_evict.py +0 -0
  424. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_env_delete.py +0 -0
  425. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_env_download.py +0 -0
  426. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_env_download_api.py +0 -0
  427. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_env_evaluations.py +0 -0
  428. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_env_list_api.py +0 -0
  429. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_env_list_cli.py +0 -0
  430. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_env_list_hub.py +0 -0
  431. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_env_no_install.py +0 -0
  432. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_env_publish.py +0 -0
  433. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_env_pull.py +0 -0
  434. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_env_pull_coverage.py +0 -0
  435. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_env_pull_loader_coverage.py +0 -0
  436. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_env_pull_managed_control_plane.py +0 -0
  437. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_env_push.py +0 -0
  438. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_env_rate_limit_resolve.py +0 -0
  439. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_env_ref_pinning.py +0 -0
  440. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_env_test.py +0 -0
  441. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_envs_coverage.py +0 -0
  442. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_export.py +0 -0
  443. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_flash_mvp.py +0 -0
  444. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_flash_worker.py +0 -0
  445. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_flashinfer_cache_dirs.py +0 -0
  446. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_freesolo_api_transport.py +0 -0
  447. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_fused_expert_warmstart.py +0 -0
  448. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_github_urlopen_retry.py +0 -0
  449. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_gpu_type_single_field.py +0 -0
  450. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_gpus.py +0 -0
  451. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_grpo_params.py +0 -0
  452. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_grpo_resident_sizing.py +0 -0
  453. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_grpo_reward_batching.py +0 -0
  454. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_health_liveness.py +0 -0
  455. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_hf_retry.py +0 -0
  456. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_idle_endpoint_reaper.py +0 -0
  457. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_infisical_secrets.py +0 -0
  458. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_instance_bootstrap_coverage.py +0 -0
  459. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_internal_client.py +0 -0
  460. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_jobs.py +0 -0
  461. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_kernel_cache.py +0 -0
  462. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_kernel_fingerprint.py +0 -0
  463. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_kv_util.py +0 -0
  464. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_lambda_api_coverage.py +0 -0
  465. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_lambda_runner.py +0 -0
  466. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_logging.py +0 -0
  467. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_login_perms.py +0 -0
  468. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_lora_rank_coverage.py +0 -0
  469. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_lora_rank_preflight.py +0 -0
  470. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_managed_config_fields.py +0 -0
  471. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_managed_hf_repo.py +0 -0
  472. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_metrics_schema_agent_contract.py +0 -0
  473. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_mig_guard.py +0 -0
  474. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_multi_gpu_gate.py +0 -0
  475. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_multimodal_training.py +0 -0
  476. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_named_reward_metrics.py +0 -0
  477. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_oom_escalate_gpu.py +0 -0
  478. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_opd.py +0 -0
  479. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_opd_limits.py +0 -0
  480. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_opd_multiturn_eos_boundary.py +0 -0
  481. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_opd_multiturn_failure_exit.py +0 -0
  482. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_opd_replay_guard.py +0 -0
  483. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_opd_resume_safety.py +0 -0
  484. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_opd_train.py +0 -0
  485. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_orchestrator_flash.py +0 -0
  486. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_packing_coverage.py +0 -0
  487. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_parasail_teacher.py +0 -0
  488. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_poll_helpers.py +0 -0
  489. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_preflight.py +0 -0
  490. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_projects.py +0 -0
  491. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_prompt_budget.py +0 -0
  492. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_provider_preflight_coverage.py +0 -0
  493. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_provider_routing.py +0 -0
  494. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_provider_teardown_robustness.py +0 -0
  495. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_providers_symmetry.py +0 -0
  496. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_realized_cost.py +0 -0
  497. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_repo_cleanup.py +0 -0
  498. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_resolve_params_b.py +0 -0
  499. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_resume_on_retry.py +0 -0
  500. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_rl_train.py +0 -0
  501. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_rollout_samples.py +0 -0
  502. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_runmgmt.py +0 -0
  503. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_runpod_api_delete.py +0 -0
  504. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_runpod_key_fingerprint.py +0 -0
  505. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_runpod_key_waterfall.py +0 -0
  506. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_serve.py +0 -0
  507. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_serve_reasoning_content.py +0 -0
  508. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_server_api.py +0 -0
  509. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_server_app_coverage.py +0 -0
  510. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_server_auth_singleflight.py +0 -0
  511. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_server_billing.py +0 -0
  512. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_server_checkpoints_coverage.py +0 -0
  513. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_server_db.py +0 -0
  514. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_server_envs_coverage.py +0 -0
  515. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_server_locks_coverage.py +0 -0
  516. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_server_standalone.py +0 -0
  517. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_serving_context_preflight.py +0 -0
  518. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_serving_contract.py +0 -0
  519. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_serving_schema_coverage.py +0 -0
  520. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_sft_chunked_nll.py +0 -0
  521. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_sft_example_selection.py +0 -0
  522. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_sft_gc_off.py +0 -0
  523. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_sft_max_context.py +0 -0
  524. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_sft_startup_block.py +0 -0
  525. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_spec_and_validation.py +0 -0
  526. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_spec_contract_bytes.py +0 -0
  527. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_step_floor.py +0 -0
  528. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_step_metrics.py +0 -0
  529. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_step_timing.py +0 -0
  530. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_structured_outputs.py +0 -0
  531. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_teacher_broker.py +0 -0
  532. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_teacher_encoding_contract.py +0 -0
  533. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_thinking_config.py +0 -0
  534. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_train_context_preflight.py +0 -0
  535. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_training_controls.py +0 -0
  536. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_type_comment_prose.py +0 -0
  537. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_vast_api.py +0 -0
  538. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_vast_api_coverage.py +0 -0
  539. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_vast_offers.py +0 -0
  540. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_vast_provider_coverage.py +0 -0
  541. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_vast_runner.py +0 -0
  542. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_verified_revisions.py +0 -0
  543. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_verifiers.py +0 -0
  544. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_verl_checkpoint_export.py +0 -0
  545. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_verl_child_plugins.py +0 -0
  546. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_verl_silence_watchdog.py +0 -0
  547. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_version.py +0 -0
  548. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_vl_warmstart_adapter_keys.py +0 -0
  549. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_vram_architecture.py +0 -0
  550. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_wandb_link.py +0 -0
  551. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_wandb_naming.py +0 -0
  552. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_warmstart_adapter_download.py +0 -0
  553. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_warmstart_cross_repo.py +0 -0
  554. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_warmstart_error_attribution.py +0 -0
  555. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_weight_cache.py +0 -0
  556. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_worker_dryrun.py +0 -0
  557. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_worker_hardexit.py +0 -0
  558. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_worker_image.py +0 -0
  559. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_worker_init_heartbeat.py +0 -0
  560. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_worker_stack.py +0 -0
  561. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_worker_thinking.py +0 -0
  562. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_workflow_contracts.py +0 -0
  563. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/tests/test_workload_profile.py +0 -0
  564. {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.49}/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.48
3
+ Version: 1.2.49
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)