freesolo-flash-dev 1.4.18__tar.gz → 1.4.20__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 (1089) hide show
  1. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/.github/workflows/deploy-modal-dev.yml +6 -6
  2. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/.github/workflows/deploy-modal.yml +30 -8
  3. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/PKG-INFO +1 -1
  4. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/scaffold/TRAINING.md +60 -2
  5. freesolo_flash_dev-1.4.20/flash/content/processor.py +37 -0
  6. freesolo_flash_dev-1.4.20/flash/content/training_template.py +16 -0
  7. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/core/catalog.py +3 -2
  8. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/profiling/sft_tools.py +3 -13
  9. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/child/glue.py +91 -46
  10. freesolo_flash_dev-1.4.20/flash/engine/worker/train/core/child/tool_messages.py +63 -0
  11. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/entry/rl_train_runner.py +1 -0
  12. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/rl/child/multiturn.py +7 -3
  13. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/rl/launch/inputs.py +78 -6
  14. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/rl/rollout/multi_turn.py +15 -2
  15. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/envs/loading/adapter.py +57 -2
  16. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/core/base.py +7 -0
  17. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/modal/api.py +2 -2
  18. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/runner/supervise/execution.py +5 -1
  19. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/request/tool_calls.py +11 -7
  20. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/runtime/prompt.py +2 -1
  21. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/routes/serving_errors.py +7 -1
  22. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/app/modal_app.py +43 -33
  23. freesolo_flash_dev-1.4.20/flash/serving/app/rollback.py +208 -0
  24. freesolo_flash_dev-1.4.20/flash/serving/app/rollout.py +62 -0
  25. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/promotion/canary.py +31 -6
  26. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/promotion/gate.py +6 -4
  27. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/accounting/usage_outbox.py +21 -0
  28. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/engine/boot.py +4 -1
  29. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/engine/lora_engine.py +23 -1
  30. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/engine/model_config.py +2 -2
  31. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/http/authorization_transport.py +39 -8
  32. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/http/inference_routes.py +2 -0
  33. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/pyproject.toml +2 -2
  34. freesolo_flash_dev-1.4.20/scripts/qualify_serving_rollout.py +264 -0
  35. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_authorization_transport.py +71 -1
  36. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_chat_authorizer.py +26 -0
  37. freesolo_flash_dev-1.4.20/tests/serving/test_engine_shutdown.py +66 -0
  38. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_modal_deploy_identity.py +15 -0
  39. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_multimodal.py +44 -0
  40. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_per_model_gpu.py +39 -16
  41. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_promotion_canary.py +13 -1
  42. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_promotion_gate.py +2 -0
  43. freesolo_flash_dev-1.4.20/tests/serving/test_promotion_release_handoff.py +97 -0
  44. freesolo_flash_dev-1.4.20/tests/serving/test_rollback_compatibility.py +239 -0
  45. freesolo_flash_dev-1.4.20/tests/serving/test_rollout_readiness.py +136 -0
  46. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_usage_outbox.py +53 -2
  47. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_usage_reporter.py +16 -6
  48. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_modal_provider.py +20 -1
  49. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_processor_chat_template.py +29 -0
  50. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_qwen9b_base.py +3 -1
  51. freesolo_flash_dev-1.4.20/tests/test_rl_native_tool_calls.py +610 -0
  52. freesolo_flash_dev-1.4.20/tests/test_rl_tool_validation.py +68 -0
  53. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_serve_profiles.py +1 -1
  54. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_serving_unavailable_errors.py +13 -0
  55. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_workflow_contracts.py +71 -3
  56. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/uv.lock +1 -1
  57. freesolo_flash_dev-1.4.18/flash/content/processor.py +0 -17
  58. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/.dockerignore +0 -0
  59. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/.env.example +0 -0
  60. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/.github/CODEOWNERS +0 -0
  61. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  62. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  63. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  64. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/.github/dependabot.yml +0 -0
  65. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/.github/scripts/ci_sharding.py +0 -0
  66. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/.github/scripts/notify_tests_repo.py +0 -0
  67. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/.github/workflows/auto-rebake.yml +0 -0
  68. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/.github/workflows/bake-kernel-cache.yml +0 -0
  69. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/.github/workflows/ci.yml +0 -0
  70. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/.github/workflows/deploy-deepinfer.yml +0 -0
  71. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/.github/workflows/dev-kernel-cache.yml +0 -0
  72. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/.github/workflows/main-source-guard.yml +0 -0
  73. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/.github/workflows/notify-tests-repo.yml +0 -0
  74. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/.github/workflows/production-kernel-cache-ready.yml +0 -0
  75. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/.github/workflows/publish-dev.yml +0 -0
  76. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/.github/workflows/publish-image.yml +0 -0
  77. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/.github/workflows/publish-serving-image.yml +0 -0
  78. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/.github/workflows/publish.yml +0 -0
  79. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/.github/workflows/version-parity.yml +0 -0
  80. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/.github/workflows/worker-image.yml +0 -0
  81. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/.gitignore +0 -0
  82. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/Dockerfile +0 -0
  83. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/Dockerfile.serve +0 -0
  84. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/Dockerfile.worker +0 -0
  85. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/LICENSE +0 -0
  86. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/NOTICE +0 -0
  87. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/build/kernel_cache/.gitignore +0 -0
  88. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/build/kernel_cache/.keep +0 -0
  89. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/deploy/infisical/entrypoint.sh +0 -0
  90. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/docker/Dockerfile.kernelcache +0 -0
  91. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/docker/Dockerfile.kernelcache.relayer +0 -0
  92. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/docker/bake_kernel_cache.py +0 -0
  93. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/docker/bake_sandbox_entry.py +0 -0
  94. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/docker/extract_cudart_fix.py +0 -0
  95. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/docker/kernel_fingerprint.py +0 -0
  96. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/docker/patch_vllm_moe_lora.py +0 -0
  97. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/__init__.py +0 -0
  98. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/_internal/__init__.py +0 -0
  99. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/_internal/background.py +0 -0
  100. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/_internal/channel.py +0 -0
  101. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/_internal/diagnostics.py +0 -0
  102. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/_internal/fileio.py +0 -0
  103. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/_internal/http.py +0 -0
  104. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/_internal/http_deadline.py +0 -0
  105. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/_internal/logging.py +0 -0
  106. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/_internal/openai_sse.py +0 -0
  107. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/_internal/paths.py +0 -0
  108. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/_internal/version.py +0 -0
  109. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/adapters/__init__.py +0 -0
  110. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/adapters/artifacts.py +0 -0
  111. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/adapters/config.py +0 -0
  112. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/adapters/fused_experts.py +0 -0
  113. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/adapters/lora_rank.py +0 -0
  114. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/adapters/targets.py +0 -0
  115. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/artifacts/__init__.py +0 -0
  116. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/artifacts/api.py +0 -0
  117. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/artifacts/config.py +0 -0
  118. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/artifacts/errors.py +0 -0
  119. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/artifacts/manifest.py +0 -0
  120. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/artifacts/storage.py +0 -0
  121. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/__init__.py +0 -0
  122. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/__main__.py +0 -0
  123. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/commands/__init__.py +0 -0
  124. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/commands/env/__init__.py +0 -0
  125. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/commands/env/ops/__init__.py +0 -0
  126. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/commands/env/ops/imports.py +0 -0
  127. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/commands/env/ops/list.py +0 -0
  128. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/commands/env/ops/push.py +0 -0
  129. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/commands/env/ops/retained.py +0 -0
  130. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/commands/env/ops/setup.py +0 -0
  131. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/commands/env/ops/setup_wandb.py +0 -0
  132. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/commands/env/testing/__init__.py +0 -0
  133. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/commands/env/testing/episode.py +0 -0
  134. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/commands/env/testing/eval.py +0 -0
  135. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/commands/env/testing/eval_args.py +0 -0
  136. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/commands/env/testing/evaluations.py +0 -0
  137. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/commands/env/testing/params.py +0 -0
  138. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/commands/env/testing/test.py +0 -0
  139. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/commands/env/testing/warnings.py +0 -0
  140. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/commands/ops/__init__.py +0 -0
  141. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/commands/ops/account.py +0 -0
  142. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/commands/ops/catalog.py +0 -0
  143. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/commands/ops/deploy.py +0 -0
  144. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/commands/ops/log_follow.py +0 -0
  145. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/commands/ops/prompt_budget.py +0 -0
  146. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/commands/ops/runs.py +0 -0
  147. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/commands/ops/traces.py +0 -0
  148. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/commands/ops/train.py +0 -0
  149. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/commands/ops/worker_output.py +0 -0
  150. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/commands/serving/__init__.py +0 -0
  151. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/commands/serving/deploy.py +0 -0
  152. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/commands/serving/identity.py +0 -0
  153. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/commands/serving/status.py +0 -0
  154. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/commands/serving/undeploy.py +0 -0
  155. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/parsing/__init__.py +0 -0
  156. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/parsing/account.py +0 -0
  157. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/parsing/custom.py +0 -0
  158. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/parsing/env.py +0 -0
  159. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/parsing/errors.py +0 -0
  160. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/parsing/main.py +0 -0
  161. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/parsing/models.py +0 -0
  162. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/parsing/serve_parser.py +0 -0
  163. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/parsing/traces.py +0 -0
  164. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/parsing/training.py +0 -0
  165. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/scaffold/__init__.py +0 -0
  166. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/ui/__init__.py +0 -0
  167. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/ui/cost.py +0 -0
  168. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/ui/env_panels.py +0 -0
  169. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/ui/heartbeat.py +0 -0
  170. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/ui/render.py +0 -0
  171. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/ui/tables.py +0 -0
  172. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/ui/tty.py +0 -0
  173. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/client/__init__.py +0 -0
  174. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/client/config.py +0 -0
  175. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/client/freesolo_api.py +0 -0
  176. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/client/http.py +0 -0
  177. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/client/runtime_secrets.py +0 -0
  178. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/client/shapes.py +0 -0
  179. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/client/specs.py +0 -0
  180. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/client/streaming.py +0 -0
  181. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/content/__init__.py +0 -0
  182. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/content/image_descriptors.py +0 -0
  183. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/content/multimodal.py +0 -0
  184. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/content/reasoning_normalization.py +0 -0
  185. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/content/stop_tokens.py +0 -0
  186. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/content/structured_options.py +0 -0
  187. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/content/structured_outputs.py +0 -0
  188. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/content/thinking.py +0 -0
  189. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/core/__init__.py +0 -0
  190. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/core/grpo.py +0 -0
  191. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/core/spec.py +0 -0
  192. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/core/spec_persistence.py +0 -0
  193. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cost/__init__.py +0 -0
  194. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cost/analytical.py +0 -0
  195. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cost/currency.py +0 -0
  196. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cost/facts.py +0 -0
  197. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cost/spec.py +0 -0
  198. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cost/types.py +0 -0
  199. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/custom/__init__.py +0 -0
  200. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/custom/async_client.py +0 -0
  201. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/custom/backend.py +0 -0
  202. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/custom/billing.py +0 -0
  203. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/custom/checkpoints.py +0 -0
  204. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/custom/client.py +0 -0
  205. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/custom/controller.py +0 -0
  206. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/custom/managed.py +0 -0
  207. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/custom/server.py +0 -0
  208. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/custom/session.py +0 -0
  209. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/custom/starter.py +0 -0
  210. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/custom/types.py +0 -0
  211. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/custom/validation.py +0 -0
  212. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/custom/worker.py +0 -0
  213. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/__init__.py +0 -0
  214. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/plan/__init__.py +0 -0
  215. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/plan/kv_sizing.py +0 -0
  216. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/plan/model_config_probe.py +0 -0
  217. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/plan/prompt_budget.py +0 -0
  218. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/plan/recipe.py +0 -0
  219. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/plan/steps.py +0 -0
  220. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/plan/vram.py +0 -0
  221. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/profiling/__init__.py +0 -0
  222. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/profiling/dataset_profile.py +0 -0
  223. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/profiling/image_tokens.py +0 -0
  224. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/profiling/reasoning_render.py +0 -0
  225. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/profiling/sft_image_rows.py +0 -0
  226. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/profiling/sft_rows.py +0 -0
  227. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/profiling/sft_workload.py +0 -0
  228. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/profiling/tokenizer.py +0 -0
  229. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/profiling/workload_profile.py +0 -0
  230. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/result/__init__.py +0 -0
  231. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/result/accounting.py +0 -0
  232. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/result/rollout_samples.py +0 -0
  233. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/support/__init__.py +0 -0
  234. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/support/checkpoint_transport.py +0 -0
  235. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/support/huggingface.py +0 -0
  236. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/support/model_snapshot.py +0 -0
  237. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/support/verl_checkpoint.py +0 -0
  238. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/support/worker_entrypoint.py +0 -0
  239. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/__init__.py +0 -0
  240. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/__main__.py +0 -0
  241. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/entry/__init__.py +0 -0
  242. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/entry/rl.py +0 -0
  243. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/entry/worker.py +0 -0
  244. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/io/__init__.py +0 -0
  245. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/io/artifacts.py +0 -0
  246. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/io/cpu_handoff.py +0 -0
  247. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/io/heartbeat.py +0 -0
  248. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/io/prefetch.py +0 -0
  249. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/io/transfer.py +0 -0
  250. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/io/wandb_log.py +0 -0
  251. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/model/__init__.py +0 -0
  252. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/model/adapter.py +0 -0
  253. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/model/chatml_mask.py +0 -0
  254. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/model/decoding.py +0 -0
  255. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/model/lora.py +0 -0
  256. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/model/packing.py +0 -0
  257. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/perf/__init__.py +0 -0
  258. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/perf/diagnostics.py +0 -0
  259. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/perf/lifecycle.py +0 -0
  260. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/perf/memory.py +0 -0
  261. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/perf/model_size.py +0 -0
  262. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/runtime/__init__.py +0 -0
  263. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/runtime/kernel_warmup.py +0 -0
  264. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/runtime/phases.py +0 -0
  265. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/runtime/rng.py +0 -0
  266. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/runtime/state.py +0 -0
  267. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/__init__.py +0 -0
  268. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/__init__.py +0 -0
  269. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/child/__init__.py +0 -0
  270. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/child/agents.yaml +0 -0
  271. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/child/batch.py +0 -0
  272. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/child/compact_checkpoint.py +0 -0
  273. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/child/configuration.py +0 -0
  274. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/child/engine.py +0 -0
  275. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/child/flashinfer_cache.py +0 -0
  276. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/child/launch.py +0 -0
  277. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/child/model.py +0 -0
  278. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/child/observations.py +0 -0
  279. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/child/options.py +0 -0
  280. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/child/prompt_media.py +0 -0
  281. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/child/queue.py +0 -0
  282. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/child/readiness.py +0 -0
  283. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/child/reference.py +0 -0
  284. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/child/registration.py +0 -0
  285. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/child/replay.py +0 -0
  286. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/child/replay_guard.py +0 -0
  287. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/child/rollout.py +0 -0
  288. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/child/rollout_contract.py +0 -0
  289. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/child/startup.py +0 -0
  290. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/child/tracking.py +0 -0
  291. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/child/trainer.py +0 -0
  292. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/child/upstream.py +0 -0
  293. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/child/vllm_worker.py +0 -0
  294. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/child/worker.py +0 -0
  295. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/lifecycle/__init__.py +0 -0
  296. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/lifecycle/finalize.py +0 -0
  297. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/lifecycle/ledger.py +0 -0
  298. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/lifecycle/persistence.py +0 -0
  299. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/lifecycle/step_timing.py +0 -0
  300. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/lifecycle/timing.py +0 -0
  301. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/rollout/__init__.py +0 -0
  302. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/rollout/contract.py +0 -0
  303. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/rollout/episode.py +0 -0
  304. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/rollout/generation.py +0 -0
  305. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/rollout/identity.py +0 -0
  306. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/rollout/lifecycle.py +0 -0
  307. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/entry/__init__.py +0 -0
  308. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/entry/backend_common.py +0 -0
  309. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/entry/prompt_rows.py +0 -0
  310. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/entry/rl_train.py +0 -0
  311. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/entry/score_batcher.py +0 -0
  312. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/entry/sft_train.py +0 -0
  313. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/entry/sft_train_runner.py +0 -0
  314. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/rl/__init__.py +0 -0
  315. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/rl/child/__init__.py +0 -0
  316. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/rl/child/contract.py +0 -0
  317. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/rl/child/credit.py +0 -0
  318. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/rl/child/entry.py +0 -0
  319. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/rl/child/identity.py +0 -0
  320. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/rl/child/metrics.py +0 -0
  321. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/rl/child/reward.py +0 -0
  322. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/rl/child/rollout.py +0 -0
  323. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/rl/child/trainer.py +0 -0
  324. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/rl/child/transport.py +0 -0
  325. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/rl/launch/__init__.py +0 -0
  326. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/rl/launch/checkpoints.py +0 -0
  327. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/rl/launch/config.py +0 -0
  328. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/rl/launch/verl_config.py +0 -0
  329. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/rl/rollout/__init__.py +0 -0
  330. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/rl/rollout/identity.py +0 -0
  331. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/rl/rollout/scoring.py +0 -0
  332. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/rl/rollout/single_turn.py +0 -0
  333. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/sft/__init__.py +0 -0
  334. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/sft/child/dataset.py +0 -0
  335. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/sft/child/entry.py +0 -0
  336. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/sft/child/loop.py +0 -0
  337. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/sft/child/schedule.py +0 -0
  338. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/sft/child/trainer.py +0 -0
  339. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/sft/setup/__init__.py +0 -0
  340. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/sft/setup/checkpoints.py +0 -0
  341. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/sft/setup/config.py +0 -0
  342. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/verl/__init__.py +0 -0
  343. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/verl/adapter_merger.py +0 -0
  344. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/verl/capabilities.py +0 -0
  345. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/verl/checkpoints.py +0 -0
  346. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/verl/child_io.py +0 -0
  347. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/verl/diagnostics.py +0 -0
  348. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/verl/parallelism.py +0 -0
  349. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/verl/parent_work.py +0 -0
  350. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/envs/__init__.py +0 -0
  351. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/envs/loading/__init__.py +0 -0
  352. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/envs/loading/base.py +0 -0
  353. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/envs/loading/loader.py +0 -0
  354. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/envs/loading/pull.py +0 -0
  355. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/envs/loading/staged.py +0 -0
  356. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/envs/meta/__init__.py +0 -0
  357. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/envs/meta/cache_security.py +0 -0
  358. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/envs/meta/cache_storage.py +0 -0
  359. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/envs/meta/dataset_selection.py +0 -0
  360. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/envs/meta/evaluations.py +0 -0
  361. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/envs/meta/identity.py +0 -0
  362. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/envs/meta/namespace_listing.py +0 -0
  363. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/envs/package/__init__.py +0 -0
  364. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/envs/package/direct_tokens.py +0 -0
  365. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/envs/package/limits.py +0 -0
  366. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/envs/package/unpack.py +0 -0
  367. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/envs/registry/__init__.py +0 -0
  368. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/envs/registry/azure.py +0 -0
  369. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/envs/registry/packages.py +0 -0
  370. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/envs/scoring/__init__.py +0 -0
  371. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/envs/scoring/context.py +0 -0
  372. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/envs/scoring/response.py +0 -0
  373. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/__init__.py +0 -0
  374. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/_lifecycle/__init__.py +0 -0
  375. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/_lifecycle/bootstrapping/__init__.py +0 -0
  376. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/_lifecycle/bootstrapping/attempt.py +0 -0
  377. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/_lifecycle/bootstrapping/bootstrap.py +0 -0
  378. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/_lifecycle/bootstrapping/console.py +0 -0
  379. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/_lifecycle/bootstrapping/pip.py +0 -0
  380. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/_lifecycle/bootstrapping/processes.py +0 -0
  381. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/_lifecycle/bootstrapping/secrets.py +0 -0
  382. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/_lifecycle/instances/__init__.py +0 -0
  383. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/_lifecycle/instances/instance.py +0 -0
  384. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/_lifecycle/instances/poll.py +0 -0
  385. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/_lifecycle/instances/poll_instance.py +0 -0
  386. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/_lifecycle/instances/terminal_artifacts.py +0 -0
  387. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/_lifecycle/net/__init__.py +0 -0
  388. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/_lifecycle/net/auth.py +0 -0
  389. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/_lifecycle/net/deadline.py +0 -0
  390. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/_lifecycle/net/http.py +0 -0
  391. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/_lifecycle/net/worker.py +0 -0
  392. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/artifacts/__init__.py +0 -0
  393. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/artifacts/channel.py +0 -0
  394. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/artifacts/weight_cache.py +0 -0
  395. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/core/__init__.py +0 -0
  396. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/core/allocator.py +0 -0
  397. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/core/fit_errors.py +0 -0
  398. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/core/preflight.py +0 -0
  399. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/core/registry.py +0 -0
  400. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/core/sharding.py +0 -0
  401. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/modal/__init__.py +0 -0
  402. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/modal/auth.py +0 -0
  403. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/modal/checkpoint_upload.py +0 -0
  404. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/modal/handles.py +0 -0
  405. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/modal/jobs.py +0 -0
  406. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/modal/prefetch.py +0 -0
  407. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/modal/pricing.py +0 -0
  408. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/modal/provider.py +0 -0
  409. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/modal/startup.py +0 -0
  410. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/py.typed +0 -0
  411. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/runner/__init__.py +0 -0
  412. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/runner/accounting/__init__.py +0 -0
  413. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/runner/accounting/artifacts.py +0 -0
  414. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/runner/accounting/costs.py +0 -0
  415. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/runner/accounting/weight_cache.py +0 -0
  416. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/runner/lifecycle/__init__.py +0 -0
  417. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/runner/lifecycle/attempts.py +0 -0
  418. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/runner/lifecycle/claim_lock.py +0 -0
  419. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/runner/lifecycle/cleanup.py +0 -0
  420. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/runner/lifecycle/deadlines.py +0 -0
  421. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/runner/lifecycle/preparation.py +0 -0
  422. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/runner/lifecycle/reporting.py +0 -0
  423. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/runner/lifecycle/runtime_credentials.py +0 -0
  424. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/runner/lifecycle/state.py +0 -0
  425. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/runner/lifecycle/status.py +0 -0
  426. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/runner/lifecycle/submit.py +0 -0
  427. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/runner/results/__init__.py +0 -0
  428. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/runner/results/checkpoints.py +0 -0
  429. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/runner/results/deployments.py +0 -0
  430. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/runner/supervise/__init__.py +0 -0
  431. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/runner/supervise/attach.py +0 -0
  432. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/runner/supervise/deploy.py +0 -0
  433. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/runner/supervise/errors.py +0 -0
  434. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/runner/supervise/lifecycle.py +0 -0
  435. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/runner/supervise/recovery.py +0 -0
  436. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/runner/supervise/retry_decision.py +0 -0
  437. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/runner/supervise/transitions.py +0 -0
  438. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/runtime_capsule/__init__.py +0 -0
  439. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/runtime_capsule/build.py +0 -0
  440. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/runtime_capsule/manifest.py +0 -0
  441. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/runtime_capsule/profiles.py +0 -0
  442. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/schema/__init__.py +0 -0
  443. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/schema/custom.py +0 -0
  444. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/schema/fields.py +0 -0
  445. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/__init__.py +0 -0
  446. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/app/__init__.py +0 -0
  447. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/app/__main__.py +0 -0
  448. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/app/bootstrap.py +0 -0
  449. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/app/chat_stream.py +0 -0
  450. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/app/http.py +0 -0
  451. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/app/hydration_credentials.py +0 -0
  452. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/app/launch.py +0 -0
  453. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/app/manifest.py +0 -0
  454. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/app/materialize.py +0 -0
  455. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/app/openai.py +0 -0
  456. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/app/progress.py +0 -0
  457. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/contract/__init__.py +0 -0
  458. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/contract/errors.py +0 -0
  459. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/contract/protocol.py +0 -0
  460. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/contract/provenance.py +0 -0
  461. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/contract/responses.py +0 -0
  462. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/contract/urls.py +0 -0
  463. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/control/__init__.py +0 -0
  464. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/control/_canonical.py +0 -0
  465. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/control/_serialization.py +0 -0
  466. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/control/_urls.py +0 -0
  467. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/control/credentials.py +0 -0
  468. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/control/planning.py +0 -0
  469. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/control/types.py +0 -0
  470. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/deployment/__init__.py +0 -0
  471. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/deployment/adapter_check.py +0 -0
  472. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/deployment/deploy.py +0 -0
  473. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/deployment/download.py +0 -0
  474. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/deployment/export.py +0 -0
  475. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/deployment/preflight.py +0 -0
  476. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/deployment/profiles.py +0 -0
  477. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/deployment/readiness.py +0 -0
  478. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/deployment/resolve.py +0 -0
  479. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/provisioning/__init__.py +0 -0
  480. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/provisioning/common/__init__.py +0 -0
  481. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/provisioning/common/records.py +0 -0
  482. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/provisioning/modal/__init__.py +0 -0
  483. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/provisioning/modal/execution/__init__.py +0 -0
  484. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/provisioning/modal/execution/deployment.py +0 -0
  485. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/provisioning/modal/execution/lifecycle.py +0 -0
  486. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/provisioning/modal/execution/operations.py +0 -0
  487. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/provisioning/modal/execution/sdk.py +0 -0
  488. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/provisioning/modal/planning/__init__.py +0 -0
  489. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/provisioning/modal/planning/plan.py +0 -0
  490. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/provisioning/modal/planning/resources.py +0 -0
  491. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/provisioning/modal/planning/wrapper.py +0 -0
  492. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/provisioning/modal/readiness_checks/__init__.py +0 -0
  493. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/provisioning/modal/readiness_checks/probe.py +0 -0
  494. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/provisioning/modal/readiness_checks/readiness.py +0 -0
  495. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/provisioning/modal/readiness_checks/teardown.py +0 -0
  496. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/request/__init__.py +0 -0
  497. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/request/openai.py +0 -0
  498. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/request/runtime_support.py +0 -0
  499. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/request/schema_types.py +0 -0
  500. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/request/streaming.py +0 -0
  501. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/request/text_scan.py +0 -0
  502. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/request/thinking.py +0 -0
  503. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/request/tool_template.py +0 -0
  504. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/request/transport.py +0 -0
  505. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/request/validation.py +0 -0
  506. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/runtime/__init__.py +0 -0
  507. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/runtime/adapters.py +0 -0
  508. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/runtime/cache_admission.py +0 -0
  509. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/runtime/cache_retention.py +0 -0
  510. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/runtime/cache_scheduler.py +0 -0
  511. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/runtime/engine.py +0 -0
  512. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/runtime/errors.py +0 -0
  513. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/runtime/hub.py +0 -0
  514. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/runtime/multimodal.py +0 -0
  515. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/runtime/prompt_cache.py +0 -0
  516. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/runtime/reasoning_tools.py +0 -0
  517. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/runtime/sampling.py +0 -0
  518. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/runtime/structured_outputs.py +0 -0
  519. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/runtime/token_batch.py +0 -0
  520. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/runtime/token_prefix_cache.py +0 -0
  521. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/runtime/tool_calls.py +0 -0
  522. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/runtime/types.py +0 -0
  523. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/__init__.py +0 -0
  524. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/__main__.py +0 -0
  525. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/asgi/__init__.py +0 -0
  526. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/asgi/app.py +0 -0
  527. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/asgi/cli.py +0 -0
  528. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/billing/__init__.py +0 -0
  529. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/billing/charges.py +0 -0
  530. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/billing/retry.py +0 -0
  531. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/domain/__init__.py +0 -0
  532. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/domain/ops/__init__.py +0 -0
  533. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/domain/ops/repo_cleanup.py +0 -0
  534. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/domain/ops/serving_resources.py +0 -0
  535. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/domain/registry/__init__.py +0 -0
  536. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/domain/registry/blob_envs.py +0 -0
  537. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/domain/registry/checkpoints.py +0 -0
  538. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/domain/registry/env_files.py +0 -0
  539. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/domain/registry/environment_registry.py +0 -0
  540. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/domain/registry/envs.py +0 -0
  541. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/domain/registry/projects.py +0 -0
  542. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/domain/registry/runs.py +0 -0
  543. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/platform/__init__.py +0 -0
  544. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/platform/auth.py +0 -0
  545. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/platform/db.py +0 -0
  546. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/platform/deployment_jobs.py +0 -0
  547. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/platform/deployment_state.py +0 -0
  548. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/platform/deps.py +0 -0
  549. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/platform/internal_client.py +0 -0
  550. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/platform/locks.py +0 -0
  551. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/platform/plane_lease.py +0 -0
  552. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/platform/runtime.py +0 -0
  553. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/platform/submission_admission.py +0 -0
  554. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/routes/__init__.py +0 -0
  555. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/routes/adapter_download.py +0 -0
  556. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/routes/custom.py +0 -0
  557. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/routes/env_files.py +0 -0
  558. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/routes/envs.py +0 -0
  559. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/routes/meta.py +0 -0
  560. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/routes/runs.py +0 -0
  561. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/routes/serving.py +0 -0
  562. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/routes/serving_chat.py +0 -0
  563. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/routes/serving_completion.py +0 -0
  564. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/routes/serving_revisions.py +0 -0
  565. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/routes/serving_smoke.py +0 -0
  566. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/routes/submissions.py +0 -0
  567. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/__init__.py +0 -0
  568. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/app/__init__.py +0 -0
  569. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/app/timeouts.py +0 -0
  570. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/deepinfer/__init__.py +0 -0
  571. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/deepinfer/app/__init__.py +0 -0
  572. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/deepinfer/app/autoscaling.py +0 -0
  573. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/deepinfer/app/client.py +0 -0
  574. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/deepinfer/app/events.py +0 -0
  575. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/deepinfer/app/http.py +0 -0
  576. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/deepinfer/app/modal_app.py +0 -0
  577. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/deepinfer/app/render.py +0 -0
  578. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/deepinfer/app/retries.py +0 -0
  579. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/deepinfer/app/rollout.py +0 -0
  580. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/deepinfer/contract/__init__.py +0 -0
  581. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/deepinfer/contract/config.py +0 -0
  582. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/deepinfer/contract/errors.py +0 -0
  583. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/deepinfer/contract/protocol.py +0 -0
  584. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/deepinfer/contract/tokenizer.py +0 -0
  585. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/deepinfer/native/__init__.py +0 -0
  586. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/deepinfer/native/engram_transport.py +0 -0
  587. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/deepinfer/native/image.py +0 -0
  588. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/deepinfer/native/patches.py +0 -0
  589. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/deepinfer/native/transport.py +0 -0
  590. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/deepinfer/runtime/__init__.py +0 -0
  591. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/deepinfer/runtime/bridge.py +0 -0
  592. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/deepinfer/runtime/kernel_cache.py +0 -0
  593. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/deepinfer/runtime/prefill_scheduler.py +0 -0
  594. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/deepinfer/runtime/prefix_cache.py +0 -0
  595. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/deepinfer/runtime/provenance.py +0 -0
  596. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/deepinfer/runtime/routing.py +0 -0
  597. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/deepinfer/runtime/snapshots.py +0 -0
  598. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/deepinfer/runtime/tiered_cache.py +0 -0
  599. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/deepinfer/runtime/warmup.py +0 -0
  600. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/deepinfer/runtime/worker.py +0 -0
  601. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/promotion/__init__.py +0 -0
  602. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/promotion/accounting_smoke_test.py +0 -0
  603. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/promotion/evidence.py +0 -0
  604. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/__init__.py +0 -0
  605. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/accounting/__init__.py +0 -0
  606. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/accounting/usage.py +0 -0
  607. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/accounting/usage_facts.py +0 -0
  608. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/accounting/usage_retry.py +0 -0
  609. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/engine/__init__.py +0 -0
  610. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/engine/errors.py +0 -0
  611. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/engine/generation.py +0 -0
  612. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/engine/hub.py +0 -0
  613. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/engine/lora_entries.py +0 -0
  614. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/engine/prequant_config.py +0 -0
  615. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/engine/reasoning_usage.py +0 -0
  616. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/engine/support.py +0 -0
  617. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/engine/text_tokenizer.py +0 -0
  618. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/engine/warmup.py +0 -0
  619. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/http/__init__.py +0 -0
  620. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/http/adapter_routes.py +0 -0
  621. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/http/body_limit.py +0 -0
  622. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/http/context.py +0 -0
  623. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/http/headers.py +0 -0
  624. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/http/key_rate_limit.py +0 -0
  625. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/http/rate_limit.py +0 -0
  626. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/http/router.py +0 -0
  627. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/http/routing.py +0 -0
  628. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/http/stream_response.py +0 -0
  629. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/io/__init__.py +0 -0
  630. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/io/cache_namespace.py +0 -0
  631. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/io/multimodal.py +0 -0
  632. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/io/openai_request.py +0 -0
  633. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/io/openai_stream.py +0 -0
  634. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/io/provenance.py +0 -0
  635. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/io/requests.py +0 -0
  636. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/io/responses.py +0 -0
  637. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/io/schemas.py +0 -0
  638. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/io/streaming.py +0 -0
  639. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/io/structured_outputs.py +0 -0
  640. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/store/__init__.py +0 -0
  641. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/store/access.py +0 -0
  642. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/store/lookup.py +0 -0
  643. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/store/persisted_columns.py +0 -0
  644. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/store/persistence.py +0 -0
  645. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/store/registration.py +0 -0
  646. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/store/registry.py +0 -0
  647. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/store/settings.py +0 -0
  648. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/store/supabase_rest.py +0 -0
  649. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/store/undeploy.py +0 -0
  650. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/stream_channel/__init__.py +0 -0
  651. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/stream_channel/_tasks.py +0 -0
  652. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/stream_channel/client.py +0 -0
  653. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/stream_channel/engine.py +0 -0
  654. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/stream_channel/protocol.py +0 -0
  655. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/snapshot/__init__.py +0 -0
  656. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/snapshot/archive.py +0 -0
  657. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/scripts/benchmark_qwen_serving.py +0 -0
  658. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/scripts/benchmark_router_resources.py +0 -0
  659. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/scripts/build_dev_dist.py +0 -0
  660. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/scripts/check_dev_release.py +0 -0
  661. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/scripts/check_file_size.py +0 -0
  662. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/scripts/check_function_size.py +0 -0
  663. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/scripts/check_rollout_identity_actor.py +0 -0
  664. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/scripts/check_source_layout.py +0 -0
  665. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/scripts/check_verl_pin_exists.py +0 -0
  666. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/scripts/fixtures/custom_algorithm.py +0 -0
  667. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/scripts/fixtures/modal_environment/dataset/train.jsonl +0 -0
  668. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/scripts/fixtures/modal_environment/environment.py +0 -0
  669. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/scripts/fixtures/modal_environment/evaluations.py +0 -0
  670. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/scripts/qualify_serving_profile.py +0 -0
  671. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/scripts/quantize_qwen35_base.py +0 -0
  672. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/scripts/smoke_custom_training.py +0 -0
  673. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/scripts/smoke_modal_sft.py +0 -0
  674. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/scripts/smoke_modal_training.py +0 -0
  675. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/serve_launch.py +0 -0
  676. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/__init__.py +0 -0
  677. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/_helpers/__init__.py +0 -0
  678. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/_helpers/billing_precheck.py +0 -0
  679. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/_helpers/chat_provenance.py +0 -0
  680. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/_helpers/chat_transport.py +0 -0
  681. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/_helpers/deployments.py +0 -0
  682. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/_helpers/managed_chat.py +0 -0
  683. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/_helpers/modal.py +0 -0
  684. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/_helpers/profile.py +0 -0
  685. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/_helpers/runner.py +0 -0
  686. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/_helpers/server_api_plugin.py +0 -0
  687. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/_helpers/source_snapshot.py +0 -0
  688. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/_helpers/specs.py +0 -0
  689. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/_helpers/wire_headers.py +0 -0
  690. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/capture_image_sft_processor_oracle.py +0 -0
  691. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/capture_qwen38_27b_metadata.py +0 -0
  692. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/conftest.py +0 -0
  693. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/fixtures/image_sft_processor_oracle.json +0 -0
  694. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/fixtures/qwen35_9b_target_metadata.json +0 -0
  695. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/fixtures/qwen38_27b_target_metadata.json +0 -0
  696. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/fixtures/qwen3_5_9b_chat_template.jinja +0 -0
  697. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/fixtures/vllm_023_moe_lora/lora_context.py.gz +0 -0
  698. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/fixtures/vllm_023_moe_lora/modular_kernel.py.gz +0 -0
  699. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/fixtures/vllm_023_moe_lora/triton_moe.py.gz +0 -0
  700. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/live/__init__.py +0 -0
  701. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/live/conftest.py +0 -0
  702. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/live/test_sft_thinking_render_live.py +0 -0
  703. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/checkpoint_fixtures.py +0 -0
  704. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/conftest.py +0 -0
  705. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_adapter_hub.py +0 -0
  706. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_artifact_protections.py +0 -0
  707. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_authorization_rollout.py +0 -0
  708. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_base_model_serving.py +0 -0
  709. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_chat_auth.py +0 -0
  710. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_checkpoint_fingerprint_validation.py +0 -0
  711. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_checkpoint_identity_repairs.py +0 -0
  712. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_checkpoint_model_validation.py +0 -0
  713. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_checkpoint_revocation.py +0 -0
  714. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_deepinfer.py +0 -0
  715. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_deepinfer_autoscaling.py +0 -0
  716. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_deepinfer_deadline.py +0 -0
  717. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_deepinfer_hosted.py +0 -0
  718. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_deepinfer_http_deadline.py +0 -0
  719. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_deepinfer_kernel_cache.py +0 -0
  720. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_deepinfer_latency.py +0 -0
  721. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_deepinfer_optimizations.py +0 -0
  722. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_deepinfer_parallel.py +0 -0
  723. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_deepinfer_prefill_scheduler.py +0 -0
  724. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_deepinfer_provenance.py +0 -0
  725. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_deepinfer_retention.py +0 -0
  726. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_deepinfer_retries.py +0 -0
  727. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_deepinfer_rollout.py +0 -0
  728. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_deepinfer_routing.py +0 -0
  729. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_deepinfer_tiering.py +0 -0
  730. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_engine_error_status.py +0 -0
  731. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_fp8_config.py +0 -0
  732. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_immutable_engine.py +0 -0
  733. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_immutable_revisions.py +0 -0
  734. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_immutable_schemas.py +0 -0
  735. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_inference_duration.py +0 -0
  736. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_internal_header_integrity.py +0 -0
  737. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_key_rate_limit.py +0 -0
  738. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_key_rate_limit_review.py +0 -0
  739. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_kv_namespace.py +0 -0
  740. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_latency_admission.py +0 -0
  741. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_mirror_sampling_parity.py +0 -0
  742. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_modal_image_paths.py +0 -0
  743. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_model_config.py +0 -0
  744. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_openai_stream_options.py +0 -0
  745. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_persistence.py +0 -0
  746. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_pre_first_disconnect.py +0 -0
  747. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_prequant_config.py +0 -0
  748. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_promotion_accounting_smoke.py +0 -0
  749. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_promotion_evidence.py +0 -0
  750. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_qwen_warmup.py +0 -0
  751. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_rate_limit.py +0 -0
  752. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_reasoning_usage.py +0 -0
  753. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_registration_endpoint.py +0 -0
  754. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_registry.py +0 -0
  755. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_registry_coverage.py +0 -0
  756. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_request_body_limit.py +0 -0
  757. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_router.py +0 -0
  758. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_router_coverage.py +0 -0
  759. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_router_edge_coverage.py +0 -0
  760. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_schemas_coverage.py +0 -0
  761. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_serve_reasoning_split.py +0 -0
  762. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_serve_structured_outputs.py +0 -0
  763. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_serve_thinking.py +0 -0
  764. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_settings.py +0 -0
  765. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_stream_channel.py +0 -0
  766. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_stream_response_disconnect.py +0 -0
  767. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_stream_wait_cleanup.py +0 -0
  768. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_structured_outputs.py +0 -0
  769. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_structured_outputs_coverage.py +0 -0
  770. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_supabase_rest_coverage.py +0 -0
  771. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_token_prefix_cache.py +0 -0
  772. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_usage_delivery_concurrency.py +0 -0
  773. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_usage_integrity.py +0 -0
  774. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving_conformance/__init__.py +0 -0
  775. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving_conformance/conftest.py +0 -0
  776. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving_conformance/test_contract.py +0 -0
  777. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_accounting_coverage.py +0 -0
  778. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_adapter_download.py +0 -0
  779. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_adapter_shard_completeness.py +0 -0
  780. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_agent_flash_cli_contract.py +0 -0
  781. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_algorithms.py +0 -0
  782. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_allocator.py +0 -0
  783. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_authenticated_redirects.py +0 -0
  784. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_azure_artifacts.py +0 -0
  785. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_azure_environment_registry.py +0 -0
  786. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_backend_common.py +0 -0
  787. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_backend_jobspec_contract.py +0 -0
  788. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_background_supervisor.py +0 -0
  789. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_bake_kernel_cache.py +0 -0
  790. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_bake_sandbox_entry.py +0 -0
  791. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_base_environment_integrity.py +0 -0
  792. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_base_model_provenance.py +0 -0
  793. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_billing_response_integrity.py +0 -0
  794. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_billing_retry.py +0 -0
  795. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_bootstrap_process_groups.py +0 -0
  796. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_bootstrap_reentry.py +0 -0
  797. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_bootstrap_worker_cleanup.py +0 -0
  798. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_build_context_contract.py +0 -0
  799. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_cache_admission.py +0 -0
  800. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_cache_retention.py +0 -0
  801. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_cache_scheduler.py +0 -0
  802. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_capture_qwen38_metadata.py +0 -0
  803. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_catalog_consistency.py +0 -0
  804. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_catalog_only_models.py +0 -0
  805. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_charge_pricing.py +0 -0
  806. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_chat_foundations.py +0 -0
  807. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_chat_stop_tokens.py +0 -0
  808. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_chat_worker_isolation.py +0 -0
  809. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_checkpoint_cancellation.py +0 -0
  810. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_checkpoint_deployment_inventory_api.py +0 -0
  811. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_checkpoint_deployments.py +0 -0
  812. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_checkpoint_lifecycle.py +0 -0
  813. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_checkpoint_listing_integrity.py +0 -0
  814. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_checkpoint_storage_overlap.py +0 -0
  815. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_checkpoint_transport.py +0 -0
  816. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_checkpoints.py +0 -0
  817. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_ci_sharding.py +0 -0
  818. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_cli_commands.py +0 -0
  819. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_cli_commands_coverage.py +0 -0
  820. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_cli_credential_shadowing.py +0 -0
  821. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_cli_errors.py +0 -0
  822. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_cli_estimate.py +0 -0
  823. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_cli_gpus_flag.py +0 -0
  824. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_cli_help.py +0 -0
  825. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_cli_main_coverage.py +0 -0
  826. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_cli_managed.py +0 -0
  827. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_cli_render_coverage.py +0 -0
  828. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_cli_render_theme.py +0 -0
  829. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_cli_serve_deploy.py +0 -0
  830. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_cli_serve_status.py +0 -0
  831. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_cli_serve_undeploy.py +0 -0
  832. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_cli_traces.py +0 -0
  833. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_cli_wandb_warning.py +0 -0
  834. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_client.py +0 -0
  835. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_client_deadline_integrity.py +0 -0
  836. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_client_import_purity.py +0 -0
  837. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_client_server_integration.py +0 -0
  838. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_client_stream_reads.py +0 -0
  839. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_compact_checkpoint.py +0 -0
  840. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_config_env_vars.py +0 -0
  841. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_config_overrides.py +0 -0
  842. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_console_upload.py +0 -0
  843. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_controlled_experiment_repairs.py +0 -0
  844. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_cost_analytical.py +0 -0
  845. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_cost_currency.py +0 -0
  846. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_cost_equation.py +0 -0
  847. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_cost_estimate.py +0 -0
  848. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_cost_hardware.py +0 -0
  849. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_cost_models.py +0 -0
  850. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_cpu_checkpoint_handoff.py +0 -0
  851. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_cpu_checkpoint_upload_retry.py +0 -0
  852. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_custom_checkpoints.py +0 -0
  853. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_custom_client.py +0 -0
  854. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_custom_controller_connect.py +0 -0
  855. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_custom_cuda_headroom.py +0 -0
  856. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_custom_gpu_selection.py +0 -0
  857. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_custom_gradients.py +0 -0
  858. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_custom_managed.py +0 -0
  859. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_custom_session.py +0 -0
  860. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_custom_worker.py +0 -0
  861. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_customer_serving_contract.py +0 -0
  862. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_dataset_profile.py +0 -0
  863. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_deploy_latency.py +0 -0
  864. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_deployment_cleanup_resilience.py +0 -0
  865. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_deployment_generation_completion.py +0 -0
  866. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_deployment_registration_cleanup.py +0 -0
  867. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_dev_channel.py +0 -0
  868. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_dev_publish_decision.py +0 -0
  869. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_disk_gb.py +0 -0
  870. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_env_cache_evict.py +0 -0
  871. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_env_delete.py +0 -0
  872. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_env_download.py +0 -0
  873. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_env_download_api.py +0 -0
  874. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_env_evaluations.py +0 -0
  875. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_env_glue_tool_replies.py +0 -0
  876. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_env_list_api.py +0 -0
  877. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_env_list_cli.py +0 -0
  878. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_env_list_registry.py +0 -0
  879. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_env_no_install.py +0 -0
  880. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_env_publish.py +0 -0
  881. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_env_pull.py +0 -0
  882. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_env_pull_coverage.py +0 -0
  883. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_env_pull_loader_coverage.py +0 -0
  884. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_env_pull_managed_control_plane.py +0 -0
  885. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_env_push.py +0 -0
  886. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_env_rate_limit_resolve.py +0 -0
  887. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_env_ref_pinning.py +0 -0
  888. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_env_test.py +0 -0
  889. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_environment_cache_integrity.py +0 -0
  890. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_environment_publish_integrity.py +0 -0
  891. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_envs_coverage.py +0 -0
  892. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_export.py +0 -0
  893. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_flash_mvp.py +0 -0
  894. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_flash_worker.py +0 -0
  895. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_flashinfer_aot_cache.py +0 -0
  896. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_flashinfer_cache_dirs.py +0 -0
  897. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_freesolo_api_transport.py +0 -0
  898. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_fused_expert_warmstart.py +0 -0
  899. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_generation_eos.py +0 -0
  900. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_github_urlopen_retry.py +0 -0
  901. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_gpu_type_single_field.py +0 -0
  902. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_gpus.py +0 -0
  903. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_grpo_checkpoint_durability.py +0 -0
  904. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_grpo_metric_stream.py +0 -0
  905. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_grpo_params.py +0 -0
  906. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_grpo_resident_sizing.py +0 -0
  907. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_grpo_reward_batching.py +0 -0
  908. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_grpo_reward_context.py +0 -0
  909. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_grpo_rollout_contract.py +0 -0
  910. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_grpo_rollout_identity.py +0 -0
  911. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_health_liveness.py +0 -0
  912. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_heartbeat_startup_cleanup.py +0 -0
  913. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_hf_retry.py +0 -0
  914. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_hosted_adapter_admission.py +0 -0
  915. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_idempotent_submissions.py +0 -0
  916. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_image_environment_capability.py +0 -0
  917. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_image_incremental_processor.py +0 -0
  918. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_image_sft_markers.py +0 -0
  919. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_image_sft_processor_parity.py +0 -0
  920. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_image_tokens.py +0 -0
  921. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_infisical_secrets.py +0 -0
  922. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_instance_bootstrap_coverage.py +0 -0
  923. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_internal_client.py +0 -0
  924. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_kernel_bake_build_contracts.py +0 -0
  925. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_kernel_cache.py +0 -0
  926. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_kernel_cache_promotion.py +0 -0
  927. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_kernel_fingerprint.py +0 -0
  928. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_kv_util.py +0 -0
  929. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_local_credential_integrity.py +0 -0
  930. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_logging.py +0 -0
  931. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_login_perms.py +0 -0
  932. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_lora_rank_coverage.py +0 -0
  933. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_lora_rank_nested_rung.py +0 -0
  934. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_lora_rank_preflight.py +0 -0
  935. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_lora_targeting.py +0 -0
  936. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_lora_targeting_pinned_verl.py +0 -0
  937. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_managed_config_fields.py +0 -0
  938. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_managed_hf_repo.py +0 -0
  939. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_metrics_schema_agent_contract.py +0 -0
  940. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_mig_guard.py +0 -0
  941. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_mirror_sampling_parity.py +0 -0
  942. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_modal_api_loop.py +0 -0
  943. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_modal_prefetch_snapshot.py +0 -0
  944. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_modal_startup.py +0 -0
  945. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_modal_training_lifecycle.py +0 -0
  946. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_modal_weight_warm.py +0 -0
  947. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_multi_gpu_gate.py +0 -0
  948. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_multimodal_boundary_integrity.py +0 -0
  949. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_multimodal_training.py +0 -0
  950. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_named_reward_metrics.py +0 -0
  951. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_notify_tests_repo.py +0 -0
  952. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_offline_http.py +0 -0
  953. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_oom_escalate_gpu.py +0 -0
  954. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_orchestrator_flash.py +0 -0
  955. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_packing.py +0 -0
  956. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_packing_coverage.py +0 -0
  957. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_persisted_spec_envelope.py +0 -0
  958. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_plane_lease.py +0 -0
  959. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_poll_helpers.py +0 -0
  960. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_preflight.py +0 -0
  961. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_projects.py +0 -0
  962. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_prompt_budget.py +0 -0
  963. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_removed_algorithms.py +0 -0
  964. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_removed_training_settings.py +0 -0
  965. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_replay_guard.py +0 -0
  966. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_repo_cleanup.py +0 -0
  967. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_resolve_params_b.py +0 -0
  968. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_resume_on_retry.py +0 -0
  969. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_retry_decision.py +0 -0
  970. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_reward_server_cleanup.py +0 -0
  971. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_rl_train.py +0 -0
  972. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_rollout_engine_prompt.py +0 -0
  973. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_rollout_samples.py +0 -0
  974. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_run_log_integrity.py +0 -0
  975. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_run_registry_lifecycle.py +0 -0
  976. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_runmgmt.py +0 -0
  977. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_runtime_capsule.py +0 -0
  978. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_runtime_credentials.py +0 -0
  979. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_runtime_secret_integrity.py +0 -0
  980. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_schema_boundary_integrity.py +0 -0
  981. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_serve.py +0 -0
  982. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_serve_app_bootstrap_http.py +0 -0
  983. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_serve_app_launch.py +0 -0
  984. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_serve_app_manifest.py +0 -0
  985. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_serve_app_materialize.py +0 -0
  986. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_serve_app_packaging.py +0 -0
  987. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_serve_app_progress.py +0 -0
  988. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_serve_cache_resource_cleanup.py +0 -0
  989. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_serve_chat_transport.py +0 -0
  990. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_serve_control.py +0 -0
  991. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_serve_modal_contract_lock.py +0 -0
  992. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_serve_modal_sdk.py +0 -0
  993. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_serve_modal_sdk_deadlines.py +0 -0
  994. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_serve_modal_teardown_identity.py +0 -0
  995. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_serve_profile_qualification.py +0 -0
  996. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_serve_provisioning_common.py +0 -0
  997. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_serve_provisioning_modal.py +0 -0
  998. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_serve_reasoning_content.py +0 -0
  999. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_serve_resolve_provenance.py +0 -0
  1000. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_serve_runtime_adapters.py +0 -0
  1001. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_serve_runtime_engine.py +0 -0
  1002. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_serve_runtime_hub.py +0 -0
  1003. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_serve_runtime_package.py +0 -0
  1004. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_serve_runtime_types.py +0 -0
  1005. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_server_api.py +0 -0
  1006. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_server_app_coverage.py +0 -0
  1007. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_server_auth_singleflight.py +0 -0
  1008. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_server_billing.py +0 -0
  1009. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_server_checkpoints_coverage.py +0 -0
  1010. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_server_db.py +0 -0
  1011. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_server_envs_coverage.py +0 -0
  1012. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_server_locks_coverage.py +0 -0
  1013. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_server_managed_chat_requests.py +0 -0
  1014. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_server_serving_resources.py +0 -0
  1015. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_server_standalone.py +0 -0
  1016. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_serving_conformance_gate.py +0 -0
  1017. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_serving_context_preflight.py +0 -0
  1018. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_serving_contract.py +0 -0
  1019. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_serving_input_integrity.py +0 -0
  1020. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_serving_schema_coverage.py +0 -0
  1021. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_sft_batch_prefetch.py +0 -0
  1022. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_sft_cancel_profile_pricing.py +0 -0
  1023. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_sft_chunked_nll.py +0 -0
  1024. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_sft_cost_reduction.py +0 -0
  1025. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_sft_dataset_lazy_images.py +0 -0
  1026. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_sft_dataset_nulls.py +0 -0
  1027. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_sft_example_selection.py +0 -0
  1028. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_sft_gc_off.py +0 -0
  1029. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_sft_max_context.py +0 -0
  1030. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_sft_memory_policy.py +0 -0
  1031. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_sft_step_floor.py +0 -0
  1032. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_sft_tools.py +0 -0
  1033. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_sft_train.py +0 -0
  1034. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_sft_warmup_schedule.py +0 -0
  1035. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_sft_workload.py +0 -0
  1036. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_smoke_content_integrity.py +0 -0
  1037. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_source_attestation_flow.py +0 -0
  1038. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_source_layout.py +0 -0
  1039. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_source_snapshot.py +0 -0
  1040. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_spec_and_validation.py +0 -0
  1041. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_spec_contract_bytes.py +0 -0
  1042. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_staged_environment.py +0 -0
  1043. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_status_reporting.py +0 -0
  1044. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_status_updates.py +0 -0
  1045. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_step_floor.py +0 -0
  1046. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_step_metrics.py +0 -0
  1047. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_step_timing.py +0 -0
  1048. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_structured_option_safety.py +0 -0
  1049. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_structured_outputs.py +0 -0
  1050. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_structured_runtime_options.py +0 -0
  1051. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_submission_outcome.py +0 -0
  1052. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_terminal_artifacts.py +0 -0
  1053. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_thinking_config.py +0 -0
  1054. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_thinking_tool_calls.py +0 -0
  1055. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_tool_call_exact_parsing.py +0 -0
  1056. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_tool_scalar_unions.py +0 -0
  1057. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_train_context_preflight.py +0 -0
  1058. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_training_controls.py +0 -0
  1059. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_training_phases.py +0 -0
  1060. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_transfer_queue_init.py +0 -0
  1061. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_type_comment_prose.py +0 -0
  1062. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_upstream_rollout_contract.py +0 -0
  1063. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_upstream_runtime_policy.py +0 -0
  1064. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_upstream_verl_contract.py +0 -0
  1065. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_verifiers.py +0 -0
  1066. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_verl_checkpoint_export.py +0 -0
  1067. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_verl_child_plugins.py +0 -0
  1068. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_verl_silence_watchdog.py +0 -0
  1069. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_version.py +0 -0
  1070. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_versioned_rollout_contract.py +0 -0
  1071. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_vl_warmstart_adapter_keys.py +0 -0
  1072. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_vllm_moe_lora_backport.py +0 -0
  1073. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_vram_architecture.py +0 -0
  1074. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_wandb_link.py +0 -0
  1075. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_wandb_naming.py +0 -0
  1076. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_warmstart_adapter_download.py +0 -0
  1077. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_warmstart_cross_repo.py +0 -0
  1078. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_warmstart_error_attribution.py +0 -0
  1079. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_warmstart_image_adapters.py +0 -0
  1080. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_watchdog_startup_cleanup.py +0 -0
  1081. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_weight_cache.py +0 -0
  1082. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_worker_dryrun.py +0 -0
  1083. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_worker_hardexit.py +0 -0
  1084. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_worker_image.py +0 -0
  1085. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_worker_init_heartbeat.py +0 -0
  1086. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_worker_stack.py +0 -0
  1087. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_worker_thinking.py +0 -0
  1088. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_workload_profile.py +0 -0
  1089. {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_zero2_sharding_gate.py +0 -0
@@ -11,9 +11,8 @@ jobs:
11
11
  name: Deploy development serving Modal app
12
12
  if: github.ref == 'refs/heads/dev'
13
13
  runs-on: ubuntu-latest
14
- # same bound as the production deploy: its own readiness polls plus the remote image build fit
15
- # well inside this, and a wedged job releases the runner instead of holding it for 6 hours.
16
- timeout-minutes: 30
14
+ # Allow active GPU pools to warm before router readiness, plus image builds.
15
+ timeout-minutes: 90
17
16
  # github can replace a pending run even though a running deploy is preserved. compare against the
18
17
  # sha reported by the deployed app so the replacement repeats every change not actually deployed.
19
18
  concurrency:
@@ -233,7 +232,7 @@ jobs:
233
232
 
234
233
  - name: Deploy development serving
235
234
  if: steps.gate.outputs.deploy == 'true'
236
- run: modal deploy --env dev flash/serving/app/modal_app.py
235
+ run: modal deploy --strategy rolling --env dev flash/serving/app/modal_app.py
237
236
 
238
237
  - name: Verify development serving URL
239
238
  if: steps.gate.outputs.deploy == 'true'
@@ -272,12 +271,13 @@ jobs:
272
271
  expected_deployment_id="${GITHUB_RUN_ID}-${GITHUB_RUN_ATTEMPT}"
273
272
  response_file="$(mktemp)"
274
273
  trap 'rm -f "$response_file"' EXIT
275
- deadline=$((SECONDS + 300))
274
+ # Match router startup: its full engine budget plus 60 seconds of headroom.
275
+ deadline=$((SECONDS + 3660))
276
276
 
277
277
  while true; do
278
278
  remaining=$((deadline - SECONDS))
279
279
  if (( remaining <= 0 )); then
280
- echo "::error::Development serving custom domain did not become DNS-, TLS-, and health-ready within 300 seconds."
280
+ echo "::error::Development serving custom domain did not become DNS-, TLS-, and health-ready within 3660 seconds."
281
281
  exit 1
282
282
  fi
283
283
 
@@ -44,7 +44,7 @@ jobs:
44
44
  # accounting settlement, image builds, and a rollback with its own readiness
45
45
  # poll. The workflow contract test sums these budgets so rollback is never
46
46
  # cut off by the job timeout.
47
- timeout-minutes: 180
47
+ timeout-minutes: 300
48
48
  # serialize serving deploys across runs because each deploy mutates the live app. github can still
49
49
  # replace a pending run, so the gate compares against the sha reported by the deployed app rather
50
50
  # than assuming every push predecessor was deployed.
@@ -325,7 +325,7 @@ jobs:
325
325
  env:
326
326
  FREESOLO_DEPLOYMENT_SHA: ${{ github.sha }}
327
327
  FREESOLO_DEPLOYMENT_ID: ${{ github.run_id }}-${{ github.run_attempt }}
328
- run: modal deploy flash/serving/app/modal_app.py
328
+ run: modal deploy --strategy rolling flash/serving/app/modal_app.py
329
329
 
330
330
  - name: Wait for production serving readiness
331
331
  if: steps.gate.outputs.deploy == 'true'
@@ -335,12 +335,13 @@ jobs:
335
335
  expected_deployment_id="${GITHUB_RUN_ID}-${GITHUB_RUN_ATTEMPT}"
336
336
  response_file="$(mktemp)"
337
337
  trap 'rm -f "$response_file"' EXIT
338
- deadline=$((SECONDS + 300))
338
+ # Match router startup: its full engine budget plus 60 seconds of headroom.
339
+ deadline=$((SECONDS + 3660))
339
340
 
340
341
  while true; do
341
342
  remaining=$((deadline - SECONDS))
342
343
  if (( remaining <= 0 )); then
343
- echo "::error::Production serving health check did not become ready within 300 seconds."
344
+ echo "::error::Production serving health check did not become ready within 3660 seconds."
344
345
  exit 1
345
346
  fi
346
347
 
@@ -462,6 +463,7 @@ jobs:
462
463
  ROLLBACK_DEPLOYMENT_ID: ${{ github.run_id }}-${{ github.run_attempt }}-rollback
463
464
  HEALTH_URL: https://serve.freesolo.co/healthz
464
465
  run: |
466
+ set -euo pipefail
465
467
  if [ -z "$PREVIOUS_SHA" ]; then
466
468
  echo "::error::Promotion failed and NO previous release was recorded, so the broken release is still live. Restore production manually."
467
469
  exit 1
@@ -473,6 +475,15 @@ jobs:
473
475
  exit 1
474
476
  fi
475
477
 
478
+ # Capture the forward dispatch contract before checkout removes its code.
479
+ # A bare predecessor deploy deletes new engine handles held by live routers.
480
+ rollback_bundle="$(mktemp -d)"
481
+ trap 'rm -rf "$rollback_bundle"' EXIT
482
+ if ! python -m flash.serving.app.rollback snapshot \
483
+ --source-sha "$CURRENT_SHA" --directory "$rollback_bundle"; then
484
+ echo "::error::Cannot preserve forward engine identities; refusing unsafe rollback."
485
+ exit 1
486
+ fi
476
487
  echo "Promotion failed; restoring ${PREVIOUS_SHA}."
477
488
  git checkout --quiet --force "$PREVIOUS_SHA"
478
489
 
@@ -504,14 +515,25 @@ jobs:
504
515
  exit 1
505
516
  fi
506
517
 
507
- # the restored app must report the RESTORED sha, deployed from the restored tree.
518
+ # Build a compatibility artifact from the predecessor: retain forward handles,
519
+ # restore the predecessor's engine implementation, and gate router startup on
520
+ # active restored pools. Failure occurs before Modal mutates the deployment.
521
+ if ! python "$rollback_bundle/rollback.py" prepare \
522
+ --manifest "$rollback_bundle/manifest.json" --entrypoint "$rollback_app"; then
523
+ echo "::error::Previous release cannot retain active engine handles; refusing unsafe rollback."
524
+ exit 1
525
+ fi
526
+
527
+ # The source behavior is the predecessor; the distinct attempt identifies
528
+ # this rollback artifact and its forward-handle compatibility overlay.
508
529
  FREESOLO_DEPLOYMENT_SHA="$PREVIOUS_SHA" \
509
530
  FREESOLO_DEPLOYMENT_ID="$ROLLBACK_DEPLOYMENT_ID" \
510
- modal deploy "$rollback_app"
531
+ modal deploy --strategy rolling "$rollback_app"
511
532
 
512
533
  response_file="$(mktemp)"
513
- trap 'rm -f "$response_file"' EXIT
514
- deadline=$((SECONDS + 300))
534
+ trap 'rm -f "$response_file"; rm -rf "$rollback_bundle"' EXIT
535
+ # Match router startup: its full engine budget plus 60 seconds of headroom.
536
+ deadline=$((SECONDS + 3660))
515
537
  restored=false
516
538
  while (( SECONDS < deadline )); do
517
539
  if curl --silent --show-error --output "$response_file" --fail \
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: freesolo-flash-dev
3
- Version: 1.4.18
3
+ Version: 1.4.20
4
4
  Summary: Flash — managed LoRA post-training (SFT/GRPO) for Freesolo environments, driven by the `flash` CLI
5
5
  Project-URL: Homepage, https://github.com/freesolo-co/flash
6
6
  Project-URL: Repository, https://github.com/freesolo-co/flash
@@ -138,6 +138,62 @@ def load_environment(**kwargs) -> MyEnv:
138
138
  For tool use, dialogue, or games, subclass `EnvironmentMultiTurn` instead and drive the
139
139
  conversation across turns. The reward is the same `RewardResult` contract either way.
140
140
 
141
+ **Native tool calling (multi-turn GRPO).** Declare the tools the model may call as
142
+ `tool_schemas` on the environment — a list of OpenAI function declarations (the `tools` array of
143
+ a chat request), as a class attribute or a zero-argument method. Do not render them into the system
144
+ prompt yourself and do not parse `<tool_call>` text yourself:
145
+
146
+ ```python
147
+ class RetailEnv(EnvironmentMultiTurn):
148
+ tool_schemas = [
149
+ {
150
+ "type": "function",
151
+ "function": {
152
+ "name": "get_order_details",
153
+ "description": "Look up one order by id.",
154
+ "parameters": {
155
+ "type": "object",
156
+ "properties": {"order_id": {"type": "string"}},
157
+ "required": ["order_id"],
158
+ "additionalProperties": False,
159
+ },
160
+ },
161
+ }
162
+ ]
163
+
164
+ def step_episode(self, example, messages, assistant_response):
165
+ turn = messages[-1] # {"role": "assistant", "content": ..., "tool_calls": [...]}
166
+ replies = [
167
+ {
168
+ "role": "tool",
169
+ "tool_call_id": call["id"],
170
+ "name": call["function"]["name"],
171
+ "content": run_tool(
172
+ call["function"]["name"], json.loads(call["function"]["arguments"])
173
+ ),
174
+ }
175
+ for call in turn.get("tool_calls", [])
176
+ ]
177
+ return EnvironmentStepResult(done=not replies, messages=tuple(replies))
178
+ ```
179
+
180
+ - Declarations are validated exactly as a serving chat request's `tools` are (closed object schemas
181
+ with `"additionalProperties": false`, no `strict`); a malformed one fails at load.
182
+ - Flash renders them with the chat template's own `tools=` into the first prompt, every
183
+ generation prefix, and the glue for every environment reply, so the policy trains on exactly the
184
+ prompt serving renders for the same conversation (and that SFT renders for a row's `tools`).
185
+ - After each turn Flash parses the text with the serving tool-call parser. `messages[-1]` is the
186
+ OpenAI assistant message: `content` is the text before the call (`""` when none) and
187
+ `tool_calls[].function.arguments` is a JSON string. `assistant_response` stays the raw text, so
188
+ for a call it no longer equals `messages[-1]["content"]`. Text that is not a well-formed call of a
189
+ declared tool stays plain `content` with no `tool_calls`, as serving would return it.
190
+ - Reply with `{"role": "tool", "tool_call_id": ..., "name": ..., "content": ...}` messages (and/or
191
+ `user` messages); the template renders them in its native tool-response format. Only environment
192
+ replies carry these fields — the initial prompt stays role/content.
193
+ - Supported on text-only multi-turn GRPO. Single-turn and image-bearing runs with `tool_schemas`
194
+ are refused at startup, as are `[train].stop_sequences` that overlap the tool-call grammar. A
195
+ dataset row may also carry `tools` (as SFT rows do), but it must equal `tool_schemas`.
196
+
141
197
  If the environment class can return image-bearing user observations from `step_episode`, declare
142
198
  `image_observations = True` on that class. This is a class capability, not a TOML setting: Flash uses
143
199
  it to reject a text-only model before model work. Set it only for environments that
@@ -971,8 +1027,10 @@ is never killed for being slow.
971
1027
  ### `credit_assignment = "per_turn"` is inert unless your environment emits `per_turn_rewards`
972
1028
 
973
1029
  **First, check that per-turn credit is available to you at all.** It is supported on the
974
- pure multi-turn rollout path — an `EnvironmentMultiTurn` that drives its own turn loop. A
975
- multi-turn environment that exposes **tools** is not supported at all: the worker raises
1030
+ pure multi-turn rollout path — an `EnvironmentMultiTurn` that drives its own turn loop
1031
+ (including one that declares native `tool_schemas` and executes the calls in `step_episode`). An
1032
+ environment whose **callables Flash would execute** (trl-style function calling) is not supported
1033
+ at all: the worker raises
976
1034
  `verl grpo does not support openai function-calling tool environments; this env reports
977
1035
  is_tool_env` and the run dies at startup. Nothing catches this earlier —
978
1036
  `flash train --dry-run` accepts the config, because the check depends on the environment
@@ -0,0 +1,37 @@
1
+ """Normalize chat-template metadata from a checkpoint's own processor and tokenizer."""
2
+
3
+ from typing import Any
4
+
5
+
6
+ def inherit_tokenizer_chat_template(processor: Any) -> None:
7
+ """Support checkpoints that publish their template only in tokenizer_config.json.
8
+
9
+ Transformers loads that template onto the tokenizer but not AutoProcessor.
10
+ Preserve explicit processor templates and never substitute another model's tokenizer.
11
+ Missing templates remain missing so the normal request validation can reject them.
12
+ """
13
+ if getattr(processor, "chat_template", None) is None:
14
+ tokenizer = getattr(processor, "tokenizer", None)
15
+ template = getattr(tokenizer, "chat_template", None)
16
+ if template is not None:
17
+ processor.chat_template = template
18
+
19
+
20
+ def processor_template_kwargs(processor: Any, kwargs: dict[str, Any]) -> dict[str, Any]:
21
+ """Keep rendering options out of Transformers' legacy processor-kwargs path.
22
+
23
+ Serving renders text only: vLLM processes the decoded images separately. Options
24
+ unused by the selected Jinja template (often preserve_thinking) must not be
25
+ interpreted as image/tokenization options. Keep tools, an explicit HF argument.
26
+ Use HF's cached introspection so the classification matches its warning check.
27
+ """
28
+ from transformers.utils.chat_template_utils import _get_template_variables
29
+
30
+ template = getattr(processor, "chat_template", None)
31
+ if isinstance(template, dict):
32
+ template = template.get("default")
33
+ if not isinstance(template, str):
34
+ # Let the processor report missing/ambiguous template metadata as usual.
35
+ return kwargs
36
+ variables = _get_template_variables(template)
37
+ return {key: value for key, value in kwargs.items() if key == "tools" or key in variables}
@@ -0,0 +1,16 @@
1
+ """Chat-template options shared by supervised and reinforcement learning."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Any
6
+
7
+
8
+ def training_template_kwargs(thinking: bool, tools: list[dict[str, Any]] | None) -> dict[str, Any]:
9
+ """Shared chat-template options for SFT rows and RL prompts and reply glue.
10
+
11
+ Tools are normalized wire declarations. Omit the key for tool-free renders.
12
+ """
13
+ kwargs: dict[str, Any] = {"enable_thinking": thinking, "preserve_thinking": False}
14
+ if tools is not None:
15
+ kwargs["tools"] = tools
16
+ return kwargs
@@ -543,7 +543,7 @@ MODELS["Qwen/Qwen3.5-9B-Base"] = replace(
543
543
  display_name="Qwen3.5 9B Base (pretrained)",
544
544
  managed_revision="68c46c4b3498877f3ef123c856ecfde50c39f404",
545
545
  serving=ServingCapacity(
546
- gpu="H100",
546
+ gpu="L40S",
547
547
  serve_model_id="Qwen/Qwen3.5-9B-Base",
548
548
  max_loras=16,
549
549
  max_cpu_loras=16,
@@ -556,7 +556,8 @@ MODELS["Qwen/Qwen3.5-9B-Base"] = replace(
556
556
  ),
557
557
  notes="Pretrained-only Qwen3.5 9B; bf16 LoRA SFT/GRPO. Uses its own weights and "
558
558
  "tokenizer, not the post-trained 9B. Native chat/thinking formatting is available for "
559
- "fine-tuning; instruction following and reasoning are not post-trained. BF16 serving on H100.",
559
+ "fine-tuning; instruction following and reasoning are not post-trained. Hosted FP8 serving "
560
+ "on L40S; customer-owned BF16 serving on H100.",
560
561
  )
561
562
 
562
563
 
@@ -12,8 +12,11 @@ from __future__ import annotations
12
12
 
13
13
  from typing import Any
14
14
 
15
+ from flash.content.training_template import training_template_kwargs as sft_template_kwargs
15
16
  from flash.serve.request.tool_calls import normalize_tools, tools_wire
16
17
 
18
+ __all__ = ["reject_image_row_tools", "sft_row_tools", "sft_template_kwargs"]
19
+
17
20
 
18
21
  def sft_row_tools(example) -> list[dict[str, Any]] | None:
19
22
  """The row's tools in the form serving renders them, or None when it declares none."""
@@ -25,19 +28,6 @@ def sft_row_tools(example) -> list[dict[str, Any]] | None:
25
28
  raise ValueError(f"sft tools: {exc}") from exc
26
29
 
27
30
 
28
- def sft_template_kwargs(thinking: bool, tools: list[dict[str, Any]] | None) -> dict[str, Any]:
29
- """Chat-template kwargs for every training view of a row.
30
-
31
- The transcript, the prompt boundary, the reasoning probe and the loss mask's field probe all
32
- render with these, so the supervised tokens are located in exactly the text that is trained on.
33
- Without tools this is the pre-existing thinking-only render.
34
- """
35
- kwargs: dict[str, Any] = {"enable_thinking": thinking, "preserve_thinking": False}
36
- if tools is not None:
37
- kwargs["tools"] = tools
38
- return kwargs
39
-
40
-
41
31
  def reject_image_row_tools(example, *, image_bearing: bool) -> None:
42
32
  """Refuse tools on an image row before any tokenizer or processor is resolved.
43
33
 
@@ -17,8 +17,17 @@ from flash.content.image_descriptors import MAX_IMAGES_PER_CONVERSATION
17
17
  from flash.content.reasoning_normalization import (
18
18
  messages_for_chat_template as _messages_for_chat_template,
19
19
  )
20
+ from flash.content.training_template import training_template_kwargs
21
+ from flash.engine.worker.train.core.child.tool_messages import (
22
+ TOOL_MESSAGE_KEYS,
23
+ template_tool_messages,
24
+ tool_message_fields,
25
+ )
20
26
 
21
27
  _ALLOWED_MESSAGE_KEYS = frozenset({"role", "content", "reasoning_content"})
28
+ # the processor glue path renders without tools, and a tool environment's images would need it to
29
+ # render with them; refuse rather than glue a reply whose declarations silently disappeared.
30
+ _TOOL_IMAGE_REPLY_ERROR = "environment replies with images are not supported for tool environments"
22
31
  _PROBE_PREFIX = "flash-env-glue-probe"
23
32
  # the media block types verl's own dataset parser substitutes for a placeholder, and the exact set
24
33
  # it then extracts (rl_dataset.py `_build_messages`: `<image>`/`<video>`/`<audio>` become blocks of
@@ -122,7 +131,36 @@ def content_block_text(content, *, source: str, position: int) -> str:
122
131
  return "".join(parts)
123
132
 
124
133
 
125
- def validate_structured_messages(messages: list[dict], *, source: str) -> list[dict]:
134
+ def _message_metadata(message: dict, *, source: str, position: int, tools: bool) -> dict:
135
+ """the validated non-content fields one transcript message keeps.
136
+
137
+ ``tools`` admits the openai tool-call fields, and only for an environment that declares tools:
138
+ without them the template cannot render a call natively, so a tool-free transcript keeps
139
+ rejecting them rather than training on a turn the model never saw.
140
+ """
141
+ allowed = _ALLOWED_MESSAGE_KEYS | TOOL_MESSAGE_KEYS if tools else _ALLOWED_MESSAGE_KEYS
142
+ extras = sorted(key for key in message if key not in allowed)
143
+ if extras:
144
+ raise ValueError(
145
+ f"{source} message {position} carries unsupported transcript metadata {extras}; "
146
+ "tool names, call ids, tool calls, and other message fields cannot be represented "
147
+ "in a role/content multi-turn transcript"
148
+ )
149
+ role = message.get("role")
150
+ reasoning = message.get("reasoning_content")
151
+ if not isinstance(role, str) or not role.strip():
152
+ raise ValueError(f"{source} message {position} has an invalid role")
153
+ if "reasoning_content" in message and not isinstance(reasoning, str):
154
+ raise ValueError(f"{source} message {position} reasoning_content must be text")
155
+ metadata = {"reasoning_content": reasoning} if reasoning is not None else {}
156
+ if tools:
157
+ metadata.update(tool_message_fields(message, source=source, position=position))
158
+ return metadata
159
+
160
+
161
+ def validate_structured_messages(
162
+ messages: list[dict], *, source: str, tools: bool = False
163
+ ) -> list[dict]:
126
164
  """validate and canonicalize role/content messages without dropping media placement."""
127
165
  if not isinstance(messages, list):
128
166
  raise ValueError(f"{source} messages must be a list")
@@ -130,21 +168,12 @@ def validate_structured_messages(messages: list[dict], *, source: str) -> list[d
130
168
  for position, message in enumerate(messages):
131
169
  if not isinstance(message, dict):
132
170
  raise ValueError(f"{source} message {position} must be an object")
133
- extras = sorted(key for key in message if key not in _ALLOWED_MESSAGE_KEYS)
134
- if extras:
135
- raise ValueError(
136
- f"{source} message {position} carries unsupported transcript metadata {extras}; "
137
- "tool names, call ids, tool calls, and other message fields cannot be represented "
138
- "in a role/content multi-turn transcript"
139
- )
140
- role = message.get("role")
171
+ metadata = _message_metadata(message, source=source, position=position, tools=tools)
172
+ role = message["role"]
141
173
  content = message.get("content")
142
- reasoning = message.get("reasoning_content")
143
- if not isinstance(role, str) or not role.strip():
144
- raise ValueError(f"{source} message {position} has an invalid role")
145
- if "reasoning_content" in message and not isinstance(reasoning, str):
146
- raise ValueError(f"{source} message {position} reasoning_content must be text")
147
- metadata = {"reasoning_content": reasoning} if reasoning is not None else {}
174
+ if content is None and "tool_calls" in metadata:
175
+ # an openai assistant turn that only calls tools may carry null content.
176
+ content = ""
148
177
  if isinstance(content, str):
149
178
  normalized.append({"role": role, "content": content, **metadata})
150
179
  continue
@@ -190,7 +219,7 @@ def validate_structured_messages(messages: list[dict], *, source: str) -> list[d
190
219
 
191
220
 
192
221
  def validate_transcript_messages(
193
- messages: list[dict], *, source: str, allow_content_blocks: bool = False
222
+ messages: list[dict], *, source: str, allow_content_blocks: bool = False, tools: bool = False
194
223
  ) -> list[dict]:
195
224
  """require the exact role/content transcript shape the child rollout loops can represent.
196
225
 
@@ -206,30 +235,19 @@ def validate_transcript_messages(
206
235
  for position, message in enumerate(messages):
207
236
  if not isinstance(message, dict):
208
237
  raise ValueError(f"{source} message {position} must be an object")
209
- extras = sorted(key for key in message if key not in _ALLOWED_MESSAGE_KEYS)
210
- if extras:
211
- raise ValueError(
212
- f"{source} message {position} carries unsupported transcript metadata {extras}; "
213
- "tool names, call ids, tool calls, and other message fields cannot be represented "
214
- "in a role/content multi-turn transcript"
215
- )
216
- role = message.get("role")
238
+ metadata = _message_metadata(message, source=source, position=position, tools=tools)
239
+ role = message["role"]
217
240
  content = message.get("content")
218
- reasoning = message.get("reasoning_content")
219
- if not isinstance(role, str) or not role.strip():
220
- raise ValueError(f"{source} message {position} has an invalid role")
221
- if "reasoning_content" in message and not isinstance(reasoning, str):
222
- raise ValueError(f"{source} message {position} reasoning_content must be text")
241
+ if content is None and "tool_calls" in metadata:
242
+ # an openai assistant turn that only calls tools may carry null content.
243
+ content = ""
223
244
  if allow_content_blocks and isinstance(content, list):
224
245
  # a multimodal prompt arrives as content BLOCKS, not a string; flatten to the text this
225
246
  # transcript can represent. the media rides separately as decoded pixels.
226
247
  content = content_block_text(content, source=source, position=position)
227
248
  elif not isinstance(content, str):
228
249
  raise ValueError(f"{source} message {position} content must be text for multi-turn")
229
- normalized_message = {"role": role, "content": content}
230
- if reasoning is not None:
231
- normalized_message["reasoning_content"] = reasoning
232
- normalized.append(normalized_message)
250
+ normalized.append({"role": role, "content": content, **metadata})
233
251
  return normalized
234
252
 
235
253
 
@@ -268,25 +286,36 @@ def dedup_seam_terminator(response_ids: list[int], glue_ids: list[int]) -> list[
268
286
  class EnvGlueTokenizer:
269
287
  """derive exact inter-turn glue without re-rendering accepted transcript history."""
270
288
 
271
- def __init__(self, tokenizer, *, thinking: bool, cache_size: int = 8192) -> None:
289
+ def __init__(
290
+ self,
291
+ tokenizer,
292
+ *,
293
+ thinking: bool,
294
+ tools: list[dict] | None = None,
295
+ cache_size: int = 8192,
296
+ ) -> None:
272
297
  self.tokenizer = tokenizer
273
298
  self.thinking = bool(thinking)
299
+ self.tools = tools
274
300
  self.cache_size = int(cache_size)
275
301
  self.cache: dict[str, list[int]] = {}
276
302
 
277
303
  def __call__(self, env_messages: list[dict]) -> list[int]:
278
- messages = validate_transcript_messages(env_messages, source="environment reply")
304
+ messages = validate_transcript_messages(
305
+ env_messages, source="environment reply", tools=self.tools is not None
306
+ )
279
307
  key = json.dumps(messages, sort_keys=True, separators=(",", ":"))
280
308
  cached = self.cache.get(key)
281
309
  if cached is not None:
282
310
  return list(cached)
283
311
  probe = _unique_glue_probe(messages)
284
312
  text = self.tokenizer.apply_chat_template(
285
- _messages_for_chat_template(_glue_conversation(probe, messages)),
313
+ template_tool_messages(
314
+ _messages_for_chat_template(_glue_conversation(probe, messages))
315
+ ),
286
316
  add_generation_prompt=True,
287
317
  tokenize=False,
288
- enable_thinking=self.thinking,
289
- preserve_thinking=False,
318
+ **training_template_kwargs(self.thinking, self.tools),
290
319
  )
291
320
  first = text.find(probe)
292
321
  if first == -1 or text.find(probe, first + len(probe)) != -1:
@@ -580,16 +609,22 @@ def parent_environment_glue(
580
609
  package_root: str | None,
581
610
  *,
582
611
  thinking: bool,
612
+ tools: list[dict] | None = None,
583
613
  ) -> tuple[list[int], list[str]]:
584
614
  """derive the authenticated parent copy of one reply's glue and ordered image digests."""
585
- structured = validate_structured_messages(messages, source="environment reply")
615
+ structured = validate_structured_messages(
616
+ messages, source="environment reply", tools=tools is not None
617
+ )
586
618
  if not image_descriptors:
587
619
  transcript = validate_transcript_messages(
588
620
  structured,
589
621
  source="environment reply",
590
622
  allow_content_blocks=True,
623
+ tools=tools is not None,
591
624
  )
592
- return EnvGlueTokenizer(tokenizer, thinking=thinking)(transcript), []
625
+ return EnvGlueTokenizer(tokenizer, thinking=thinking, tools=tools)(transcript), []
626
+ if tools is not None:
627
+ raise ValueError(_TOOL_IMAGE_REPLY_ERROR)
593
628
  if processor is None:
594
629
  raise ValueError("environment reply carries images but the parent has no processor")
595
630
  from flash.content.multimodal import decode_image_descriptors
@@ -625,9 +660,10 @@ class EnvironmentReplyGlue:
625
660
  class EnvGlueProcessor:
626
661
  """derive text or processor-aware environment glue and decode only newly transported images."""
627
662
 
628
- def __init__(self, loop_self, *, thinking: bool) -> None:
663
+ def __init__(self, loop_self, *, thinking: bool, tools: list[dict] | None = None) -> None:
629
664
  self.loop_self = loop_self
630
- self.text = EnvGlueTokenizer(loop_self.tokenizer, thinking=thinking)
665
+ self.tools = tools
666
+ self.text = EnvGlueTokenizer(loop_self.tokenizer, thinking=thinking, tools=tools)
631
667
  self.apply_chat_template_kwargs = dict(
632
668
  getattr(loop_self, "apply_chat_template_kwargs", {}) or {}
633
669
  )
@@ -640,15 +676,19 @@ class EnvGlueProcessor:
640
676
  image_data_uris: list[str] | None = None,
641
677
  ) -> EnvironmentReplyGlue:
642
678
  image_data_uris = list(image_data_uris or ())
643
- structured = validate_structured_messages(messages, source="environment reply")
679
+ tools = self.tools is not None
680
+ structured = validate_structured_messages(messages, source="environment reply", tools=tools)
644
681
  _validate_reply_image_count(structured, image_data_uris)
645
682
  if not image_data_uris:
646
683
  text_messages = validate_transcript_messages(
647
684
  structured,
648
685
  source="environment reply",
649
686
  allow_content_blocks=True,
687
+ tools=tools,
650
688
  )
651
689
  return EnvironmentReplyGlue(self.text(text_messages), [], [])
690
+ if tools:
691
+ raise ValueError(_TOOL_IMAGE_REPLY_ERROR)
652
692
  processor = getattr(self.loop_self, "processor", None)
653
693
  if processor is None:
654
694
  raise ValueError("environment reply carries images but the rollout has no processor")
@@ -673,9 +713,9 @@ class EnvGlueProcessor:
673
713
  raise
674
714
 
675
715
 
676
- def validate_glue_template(tokenizer, *, thinking: bool) -> None:
716
+ def validate_glue_template(tokenizer, *, thinking: bool, tools: list[dict] | None = None) -> None:
677
717
  """fail before rollout when assistant content cannot round-trip through the template."""
678
- EnvGlueTokenizer(tokenizer, thinking=thinking)(
718
+ EnvGlueTokenizer(tokenizer, thinking=thinking, tools=tools)(
679
719
  [{"role": "user", "content": "flash multi-turn glue validation"}]
680
720
  )
681
721
 
@@ -848,12 +888,16 @@ class EpisodePrompt:
848
888
  return snapshot
849
889
 
850
890
 
851
- async def prepare_episode_prompt(loop_self, raw_prompt) -> EpisodePrompt:
891
+ async def prepare_episode_prompt(
892
+ loop_self, raw_prompt, *, tools: list[dict] | None = None
893
+ ) -> EpisodePrompt:
852
894
  """extract media and ids before building the canonical structured prompt view.
853
895
 
854
896
  order matters: an image prompt arrives as content blocks, so the media and block-rendered ids
855
897
  must be captured before structured validation. the canonical view preserves media placement for
856
898
  bridge authentication and rejects unsupported blocks and message metadata before rollout.
899
+ ``tools`` reaches verl's native ``tools=`` render, the same declarations the parent froze the
900
+ prompt ids with, so a tool environment's first prompt matches serving's.
857
901
  """
858
902
  messages = [dict(message) for message in raw_prompt]
859
903
  for message in messages:
@@ -877,6 +921,7 @@ async def prepare_episode_prompt(loop_self, raw_prompt) -> EpisodePrompt:
877
921
  mm_processor_kwargs = loop_self._get_mm_processor_kwargs(audios)
878
922
  prompt_ids = await loop_self.ct_build_initial_tokens(
879
923
  messages,
924
+ tools=tools,
880
925
  images=images,
881
926
  videos=videos,
882
927
  audios=audios,
@@ -0,0 +1,63 @@
1
+ """OpenAI tool-call message fields in a multi-turn transcript for an environment that declares tools.
2
+
3
+ An environment without tools keeps the role/content transcript and its rejection of every other
4
+ field. One that declares tools renders them natively, the way serving does, so its transcript may
5
+ also carry the two shapes serving accepts in history: an assistant turn's ``tool_calls`` and a
6
+ tool result's ``tool_call_id``/``name``. Only those fields, on those roles, are admitted here; the
7
+ call arguments stay the JSON string the wire carries, and are decoded into the mapping the chat
8
+ template iterates only at render time, exactly as serving's ``detached_template_messages`` does.
9
+ """
10
+
11
+ from __future__ import annotations
12
+
13
+ from copy import deepcopy
14
+ from typing import Any
15
+
16
+ TOOL_MESSAGE_KEYS = frozenset({"tool_calls", "tool_call_id", "name"})
17
+
18
+
19
+ def _call_text(value, *, source: str, position: int, field: str) -> str:
20
+ if not isinstance(value, str) or not value:
21
+ raise ValueError(f"{source} message {position} {field} must be a nonempty string")
22
+ return value
23
+
24
+
25
+ def tool_message_fields(message: dict, *, source: str, position: int) -> dict[str, Any]:
26
+ """the validated tool fields one message carries, or {} when it carries none.
27
+
28
+ ``tool_calls`` belongs to an assistant turn and ``tool_call_id``/``name`` to a tool result,
29
+ matching serving's ``validate_tool_history``; on any other role they are rejected rather than
30
+ carried, because the template would silently drop them. Call validation is shared with serving;
31
+ full-history validation cannot run here because a rollout validates calls before results exist.
32
+ """
33
+ role = message.get("role")
34
+ fields: dict[str, Any] = {}
35
+ if message.get("tool_calls") is not None:
36
+ if role != "assistant":
37
+ raise ValueError(f"{source} message {position} tool_calls require the assistant role")
38
+ from flash.serve.request.tool_calls import validate_tool_calls
39
+
40
+ try:
41
+ validate_tool_calls(message["tool_calls"], message_index=position)
42
+ except ValueError as error:
43
+ raise ValueError(f"{source} {error}") from error
44
+ fields["tool_calls"] = deepcopy(message["tool_calls"])
45
+ for key in ("tool_call_id", "name"):
46
+ if message.get(key) is None:
47
+ continue
48
+ if role != "tool":
49
+ raise ValueError(f"{source} message {position} {key} requires the tool role")
50
+ fields[key] = _call_text(message[key], source=source, position=position, field=key)
51
+ return fields
52
+
53
+
54
+ def template_tool_messages(messages: list[dict]) -> list[dict]:
55
+ """decode call arguments into the mapping the qwen template iterates, as serving does."""
56
+ if not any(message.get("tool_calls") for message in messages):
57
+ return messages
58
+ from flash.serve.request.tool_calls import detached_template_messages
59
+
60
+ return detached_template_messages(messages)
61
+
62
+
63
+ __all__ = ["TOOL_MESSAGE_KEYS", "template_tool_messages", "tool_message_fields"]