freesolo-flash-dev 1.2.128__tar.gz → 1.2.129__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 (926) hide show
  1. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/.env.example +3 -0
  2. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/.github/workflows/deploy-modal.yml +146 -8
  3. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/CHANGELOG.md +5 -0
  4. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/PKG-INFO +1 -1
  5. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/SELF_HOSTING.md +6 -0
  6. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/docs/serving-contract.md +52 -0
  7. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/client/http.py +25 -0
  8. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/entry/score_batcher.py +47 -24
  9. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/opd/bridging/batching.py +3 -3
  10. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/opd/bridging/bridge.py +21 -7
  11. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/core/preflight.py +7 -0
  12. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/vast/client/api.py +6 -6
  13. freesolo_flash_dev-1.2.129/flash/providers/vast/client/result.py +125 -0
  14. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serve/app/bootstrap.py +2 -0
  15. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serve/app/chat_stream.py +15 -0
  16. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serve/app/http.py +6 -1
  17. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serve/app/openai.py +19 -2
  18. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serve/contract/protocol.py +5 -0
  19. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serve/deployment/deploy.py +15 -0
  20. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serve/deployment/profiles.py +1 -1
  21. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serve/request/openai.py +91 -4
  22. freesolo_flash_dev-1.2.129/flash/serve/request/text_scan.py +100 -0
  23. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serve/request/thinking.py +1 -1
  24. freesolo_flash_dev-1.2.129/flash/serve/request/tool_calls.py +999 -0
  25. freesolo_flash_dev-1.2.129/flash/serve/request/tool_template.py +92 -0
  26. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serve/request/transport.py +27 -0
  27. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serve/request/validation.py +96 -16
  28. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serve/runtime/engine.py +91 -24
  29. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serve/runtime/prompt.py +13 -1
  30. freesolo_flash_dev-1.2.129/flash/serve/runtime/tool_calls.py +687 -0
  31. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serve/runtime/types.py +96 -3
  32. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/server/routes/serving_chat.py +29 -0
  33. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serving/app/README.md +39 -0
  34. freesolo_flash_dev-1.2.129/flash/serving/promotion/__init__.py +10 -0
  35. freesolo_flash_dev-1.2.129/flash/serving/promotion/canary.py +194 -0
  36. freesolo_flash_dev-1.2.129/flash/serving/promotion/evidence.py +261 -0
  37. freesolo_flash_dev-1.2.129/flash/serving/promotion/gate.py +329 -0
  38. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serving/src/engine/generation.py +182 -37
  39. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serving/src/engine/lora_engine.py +23 -9
  40. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serving/src/engine/model_config.py +8 -0
  41. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serving/src/engine/support.py +3 -0
  42. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serving/src/http/inference_routes.py +8 -0
  43. freesolo_flash_dev-1.2.129/flash/serving/src/io/openai_request.py +119 -0
  44. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serving/src/io/openai_stream.py +11 -2
  45. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serving/src/io/responses.py +10 -1
  46. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/pyproject.toml +2 -2
  47. freesolo_flash_dev-1.2.129/tests/serving/test_mirror_sampling_parity.py +925 -0
  48. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/serving/test_model_config.py +6 -0
  49. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/serving/test_multimodal.py +15 -2
  50. freesolo_flash_dev-1.2.129/tests/serving/test_promotion_canary.py +243 -0
  51. freesolo_flash_dev-1.2.129/tests/serving/test_promotion_evidence.py +276 -0
  52. freesolo_flash_dev-1.2.129/tests/serving/test_promotion_gate.py +361 -0
  53. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/serving/test_router.py +46 -1
  54. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/serving/test_serve_structured_outputs.py +0 -1
  55. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/serving/test_usage_reporter.py +44 -0
  56. freesolo_flash_dev-1.2.129/tests/test_chat_foundations.py +1022 -0
  57. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_cli_serve_deploy.py +5 -1
  58. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_client.py +46 -0
  59. freesolo_flash_dev-1.2.129/tests/test_grpo_reward_batching.py +719 -0
  60. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_mirror_sampling_parity.py +311 -0
  61. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_opd_train.py +211 -14
  62. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_preflight.py +39 -1
  63. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_serve_app_bootstrap_http.py +202 -5
  64. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_serve_chat_transport.py +86 -8
  65. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_serve_reasoning_content.py +9 -0
  66. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_serve_runtime_engine.py +326 -1
  67. freesolo_flash_dev-1.2.129/tests/test_serve_runtime_types.py +1527 -0
  68. freesolo_flash_dev-1.2.129/tests/test_server_managed_chat_requests.py +261 -0
  69. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_server_standalone.py +1 -0
  70. freesolo_flash_dev-1.2.129/tests/test_tool_call_exact_parsing.py +5021 -0
  71. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_vast_api_coverage.py +60 -48
  72. freesolo_flash_dev-1.2.129/tests/test_vast_result.py +251 -0
  73. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_workflow_contracts.py +301 -0
  74. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/uv.lock +1 -1
  75. freesolo_flash_dev-1.2.128/flash/serving/src/io/openai_request.py +0 -63
  76. freesolo_flash_dev-1.2.128/tests/serving/test_mirror_sampling_parity.py +0 -405
  77. freesolo_flash_dev-1.2.128/tests/test_chat_foundations.py +0 -379
  78. freesolo_flash_dev-1.2.128/tests/test_grpo_reward_batching.py +0 -334
  79. freesolo_flash_dev-1.2.128/tests/test_serve_runtime_types.py +0 -583
  80. freesolo_flash_dev-1.2.128/tests/test_server_managed_chat_requests.py +0 -91
  81. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/.dockerignore +0 -0
  82. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/.github/CODEOWNERS +0 -0
  83. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  84. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  85. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  86. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  87. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/.github/dependabot.yml +0 -0
  88. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/.github/workflows/auto-rebake.yml +0 -0
  89. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/.github/workflows/bake-kernel-cache.yml +0 -0
  90. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/.github/workflows/ci.yml +0 -0
  91. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/.github/workflows/deploy-modal-dev.yml +0 -0
  92. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/.github/workflows/dev-kernel-cache.yml +0 -0
  93. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/.github/workflows/main-source-guard.yml +0 -0
  94. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/.github/workflows/notify-tests-repo.yml +0 -0
  95. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/.github/workflows/production-kernel-cache-ready.yml +0 -0
  96. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/.github/workflows/publish-dev.yml +0 -0
  97. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/.github/workflows/publish-image.yml +0 -0
  98. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/.github/workflows/publish-serving-image.yml +0 -0
  99. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/.github/workflows/publish.yml +0 -0
  100. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/.github/workflows/version-parity.yml +0 -0
  101. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/.github/workflows/worker-image.yml +0 -0
  102. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/.gitignore +0 -0
  103. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/CODE_OF_CONDUCT.md +0 -0
  104. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/CONTRIBUTING.md +0 -0
  105. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/Dockerfile +0 -0
  106. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/Dockerfile.serve +0 -0
  107. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/Dockerfile.worker +0 -0
  108. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/LICENSE +0 -0
  109. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/NOTICE +0 -0
  110. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/README.md +0 -0
  111. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/SECURITY.md +0 -0
  112. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/build/kernel_cache/.gitignore +0 -0
  113. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/build/kernel_cache/.keep +0 -0
  114. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/deploy/infisical/README.md +0 -0
  115. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/deploy/infisical/entrypoint.sh +0 -0
  116. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/docker/Dockerfile.kernelcache +0 -0
  117. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/docker/Dockerfile.kernelcache.relayer +0 -0
  118. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/docker/bake_kernel_cache.py +0 -0
  119. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/docker/bake_pod_entry.py +0 -0
  120. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/docker/extract_cudart_fix.py +0 -0
  121. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/docker/kernel_fingerprint.py +0 -0
  122. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/docker/make_rp_handler.py +0 -0
  123. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/docker/patch_vllm_moe_lora.py +0 -0
  124. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/docs/hosted-inference-load-testing.md +0 -0
  125. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/__init__.py +0 -0
  126. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/_internal/__init__.py +0 -0
  127. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/_internal/channel.py +0 -0
  128. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/_internal/diagnostics.py +0 -0
  129. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/_internal/fileio.py +0 -0
  130. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/_internal/http.py +0 -0
  131. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/_internal/logging.py +0 -0
  132. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/_internal/openai_sse.py +0 -0
  133. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/_internal/paths.py +0 -0
  134. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/_internal/version.py +0 -0
  135. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/adapters/__init__.py +0 -0
  136. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/adapters/artifacts.py +0 -0
  137. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/adapters/fused_experts.py +0 -0
  138. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/adapters/lora_rank.py +0 -0
  139. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/adapters/targets.py +0 -0
  140. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/cli/__init__.py +0 -0
  141. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/cli/__main__.py +0 -0
  142. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/cli/commands/__init__.py +0 -0
  143. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/cli/commands/env/__init__.py +0 -0
  144. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/cli/commands/env/ops/__init__.py +0 -0
  145. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/cli/commands/env/ops/imports.py +0 -0
  146. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/cli/commands/env/ops/list.py +0 -0
  147. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/cli/commands/env/ops/push.py +0 -0
  148. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/cli/commands/env/ops/retained.py +0 -0
  149. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/cli/commands/env/ops/setup.py +0 -0
  150. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/cli/commands/env/ops/setup_wandb.py +0 -0
  151. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/cli/commands/env/testing/__init__.py +0 -0
  152. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/cli/commands/env/testing/episode.py +0 -0
  153. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/cli/commands/env/testing/eval.py +0 -0
  154. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/cli/commands/env/testing/eval_args.py +0 -0
  155. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/cli/commands/env/testing/evaluations.py +0 -0
  156. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/cli/commands/env/testing/params.py +0 -0
  157. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/cli/commands/env/testing/test.py +0 -0
  158. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/cli/commands/env/testing/warnings.py +0 -0
  159. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/cli/commands/ops/__init__.py +0 -0
  160. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/cli/commands/ops/account.py +0 -0
  161. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/cli/commands/ops/catalog.py +0 -0
  162. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/cli/commands/ops/deploy.py +0 -0
  163. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/cli/commands/ops/log_follow.py +0 -0
  164. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/cli/commands/ops/prompt_budget.py +0 -0
  165. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/cli/commands/ops/runs.py +0 -0
  166. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/cli/commands/ops/traces.py +0 -0
  167. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/cli/commands/ops/train.py +0 -0
  168. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/cli/commands/ops/worker_output.py +0 -0
  169. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/cli/commands/serving/__init__.py +0 -0
  170. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/cli/commands/serving/deploy.py +0 -0
  171. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/cli/commands/serving/identity.py +0 -0
  172. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/cli/commands/serving/status.py +0 -0
  173. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/cli/commands/serving/undeploy.py +0 -0
  174. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/cli/parsing/__init__.py +0 -0
  175. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/cli/parsing/account.py +0 -0
  176. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/cli/parsing/env.py +0 -0
  177. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/cli/parsing/errors.py +0 -0
  178. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/cli/parsing/main.py +0 -0
  179. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/cli/parsing/models.py +0 -0
  180. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/cli/parsing/serve_parser.py +0 -0
  181. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/cli/parsing/traces.py +0 -0
  182. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/cli/parsing/training.py +0 -0
  183. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/cli/scaffold/TRAINING.md +0 -0
  184. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/cli/scaffold/__init__.py +0 -0
  185. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/cli/ui/__init__.py +0 -0
  186. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/cli/ui/cost.py +0 -0
  187. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/cli/ui/env_panels.py +0 -0
  188. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/cli/ui/heartbeat.py +0 -0
  189. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/cli/ui/render.py +0 -0
  190. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/cli/ui/tables.py +0 -0
  191. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/cli/ui/tty.py +0 -0
  192. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/client/__init__.py +0 -0
  193. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/client/config.py +0 -0
  194. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/client/freesolo_api.py +0 -0
  195. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/client/runtime_secrets.py +0 -0
  196. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/client/shapes.py +0 -0
  197. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/client/specs.py +0 -0
  198. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/client/streaming.py +0 -0
  199. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/content/__init__.py +0 -0
  200. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/content/image_descriptors.py +0 -0
  201. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/content/multimodal.py +0 -0
  202. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/content/reasoning_normalization.py +0 -0
  203. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/content/structured_outputs.py +0 -0
  204. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/content/thinking.py +0 -0
  205. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/core/__init__.py +0 -0
  206. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/core/catalog.py +0 -0
  207. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/core/grpo.py +0 -0
  208. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/core/spec.py +0 -0
  209. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/core/spec_persistence.py +0 -0
  210. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/cost/__init__.py +0 -0
  211. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/cost/analytical.py +0 -0
  212. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/cost/currency.py +0 -0
  213. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/cost/facts.py +0 -0
  214. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/cost/spec.py +0 -0
  215. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/cost/types.py +0 -0
  216. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/__init__.py +0 -0
  217. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/plan/__init__.py +0 -0
  218. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/plan/kv_sizing.py +0 -0
  219. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/plan/model_config_probe.py +0 -0
  220. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/plan/prompt_budget.py +0 -0
  221. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/plan/recipe.py +0 -0
  222. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/plan/steps.py +0 -0
  223. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/plan/vram.py +0 -0
  224. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/profiling/__init__.py +0 -0
  225. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/profiling/dataset_profile.py +0 -0
  226. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/profiling/image_tokens.py +0 -0
  227. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/profiling/reasoning_render.py +0 -0
  228. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/profiling/sft_image_rows.py +0 -0
  229. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/profiling/sft_workload.py +0 -0
  230. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/profiling/tokenizer.py +0 -0
  231. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/profiling/workload_profile.py +0 -0
  232. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/result/__init__.py +0 -0
  233. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/result/accounting.py +0 -0
  234. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/result/rollout_samples.py +0 -0
  235. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/support/__init__.py +0 -0
  236. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/support/huggingface.py +0 -0
  237. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/support/verl_checkpoint.py +0 -0
  238. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/support/verl_policy.py +0 -0
  239. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/support/worker_entrypoint.py +0 -0
  240. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/__init__.py +0 -0
  241. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/__main__.py +0 -0
  242. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/entry/__init__.py +0 -0
  243. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/entry/opd.py +0 -0
  244. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/entry/rl.py +0 -0
  245. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/entry/sft.py +0 -0
  246. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/entry/worker.py +0 -0
  247. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/io/__init__.py +0 -0
  248. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/io/heartbeat.py +0 -0
  249. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/io/hf.py +0 -0
  250. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/io/prefetch.py +0 -0
  251. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/io/wandb_log.py +0 -0
  252. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/model/__init__.py +0 -0
  253. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/model/adapter.py +0 -0
  254. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/model/chatml_mask.py +0 -0
  255. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/model/decoding.py +0 -0
  256. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/model/lora.py +0 -0
  257. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/model/packing.py +0 -0
  258. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/perf/__init__.py +0 -0
  259. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/perf/diagnostics.py +0 -0
  260. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/perf/lifecycle.py +0 -0
  261. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/perf/liger.py +0 -0
  262. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/perf/memory.py +0 -0
  263. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/runtime/__init__.py +0 -0
  264. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/runtime/kernel_warmup.py +0 -0
  265. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/runtime/rng.py +0 -0
  266. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/runtime/state.py +0 -0
  267. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/teacher/__init__.py +0 -0
  268. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/teacher/client.py +0 -0
  269. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/teacher/encoding.py +0 -0
  270. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/teacher/tokenizer_align.py +0 -0
  271. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/__init__.py +0 -0
  272. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/core/__init__.py +0 -0
  273. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/core/child/__init__.py +0 -0
  274. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/core/child/glue.py +0 -0
  275. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/core/child/runtime.py +0 -0
  276. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/core/lifecycle/__init__.py +0 -0
  277. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/core/lifecycle/finalize.py +0 -0
  278. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/core/lifecycle/ledger.py +0 -0
  279. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/core/lifecycle/step_timing.py +0 -0
  280. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/entry/__init__.py +0 -0
  281. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/entry/backend_common.py +0 -0
  282. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/entry/opd_train.py +0 -0
  283. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/entry/opd_train_runner.py +0 -0
  284. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/entry/prompt_rows.py +0 -0
  285. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/entry/rl_train.py +0 -0
  286. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/entry/rl_train_runner.py +0 -0
  287. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/entry/sft_train.py +0 -0
  288. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/entry/sft_train_runner.py +0 -0
  289. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/opd/__init__.py +0 -0
  290. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/opd/bridging/__init__.py +0 -0
  291. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/opd/bridging/failures.py +0 -0
  292. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/opd/bridging/prompts.py +0 -0
  293. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/opd/bridging/scoring.py +0 -0
  294. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/opd/child/__init__.py +0 -0
  295. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/opd/child/bridge.py +0 -0
  296. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/opd/child/entry.py +0 -0
  297. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/opd/child/multiturn.py +0 -0
  298. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/opd/child/plugin.py +0 -0
  299. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/opd/child/replay_guard.py +0 -0
  300. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/opd/child/runtime.py +0 -0
  301. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/opd/child/structured.py +0 -0
  302. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/opd/child/tensors.py +0 -0
  303. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/opd/multiturn/__init__.py +0 -0
  304. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/opd/multiturn/media.py +0 -0
  305. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/opd/multiturn/validation.py +0 -0
  306. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/opd/orchestration/__init__.py +0 -0
  307. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/opd/orchestration/failures.py +0 -0
  308. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/opd/orchestration/gkd.py +0 -0
  309. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/opd/orchestration/overrides.py +0 -0
  310. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/opd/orchestration/progress.py +0 -0
  311. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/opd/orchestration/prompt_preparation.py +0 -0
  312. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/opd/orchestration/protocol.py +0 -0
  313. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/opd/orchestration/reporting.py +0 -0
  314. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/opd/orchestration/state.py +0 -0
  315. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/opd/orchestration/validation.py +0 -0
  316. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/rl/__init__.py +0 -0
  317. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/rl/child/__init__.py +0 -0
  318. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/rl/child/entry.py +0 -0
  319. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/rl/child/multiturn.py +0 -0
  320. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/rl/child/patches.py +0 -0
  321. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/rl/child/plugin.py +0 -0
  322. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/rl/launch/__init__.py +0 -0
  323. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/rl/launch/checkpoints.py +0 -0
  324. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/rl/launch/config.py +0 -0
  325. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/rl/launch/inputs.py +0 -0
  326. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/rl/launch/verl_config.py +0 -0
  327. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/rl/rollout/__init__.py +0 -0
  328. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/rl/rollout/identity.py +0 -0
  329. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/rl/rollout/multi_turn.py +0 -0
  330. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/rl/rollout/reward_module.py +0 -0
  331. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/rl/rollout/scoring.py +0 -0
  332. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/rl/rollout/single_turn.py +0 -0
  333. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/sft/__init__.py +0 -0
  334. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/sft/child/entry.py +0 -0
  335. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/sft/child/plugin.py +0 -0
  336. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/sft/setup/__init__.py +0 -0
  337. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/sft/setup/checkpoints.py +0 -0
  338. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/train/sft/setup/config.py +0 -0
  339. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/verl/__init__.py +0 -0
  340. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/verl/capabilities.py +0 -0
  341. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/verl/checkpoints.py +0 -0
  342. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/verl/child_io.py +0 -0
  343. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/verl/diagnostics.py +0 -0
  344. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/verl/parallelism.py +0 -0
  345. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/verl/parent_work.py +0 -0
  346. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/engine/worker/verl/process_census.py +0 -0
  347. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/envs/__init__.py +0 -0
  348. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/envs/loading/__init__.py +0 -0
  349. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/envs/loading/adapter.py +0 -0
  350. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/envs/loading/base.py +0 -0
  351. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/envs/loading/loader.py +0 -0
  352. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/envs/loading/pull.py +0 -0
  353. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/envs/loading/staged.py +0 -0
  354. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/envs/meta/__init__.py +0 -0
  355. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/envs/meta/cache_security.py +0 -0
  356. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/envs/meta/dataset_selection.py +0 -0
  357. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/envs/meta/evaluations.py +0 -0
  358. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/envs/meta/identity.py +0 -0
  359. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/envs/meta/namespace_listing.py +0 -0
  360. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/envs/package/__init__.py +0 -0
  361. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/envs/package/direct_tokens.py +0 -0
  362. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/envs/package/limits.py +0 -0
  363. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/envs/package/unpack.py +0 -0
  364. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/__init__.py +0 -0
  365. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/_lifecycle/__init__.py +0 -0
  366. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/_lifecycle/bootstrapping/__init__.py +0 -0
  367. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/_lifecycle/bootstrapping/bootstrap.py +0 -0
  368. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/_lifecycle/bootstrapping/console.py +0 -0
  369. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/_lifecycle/bootstrapping/pip.py +0 -0
  370. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/_lifecycle/bootstrapping/processes.py +0 -0
  371. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/_lifecycle/bootstrapping/secrets.py +0 -0
  372. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/_lifecycle/host/__init__.py +0 -0
  373. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/_lifecycle/host/deadline_sleep.py +0 -0
  374. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/_lifecycle/host/failmark.py +0 -0
  375. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/_lifecycle/host/hostlog.py +0 -0
  376. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/_lifecycle/instances/__init__.py +0 -0
  377. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/_lifecycle/instances/instance.py +0 -0
  378. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/_lifecycle/instances/poll.py +0 -0
  379. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/_lifecycle/instances/poll_instance.py +0 -0
  380. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/_lifecycle/instances/provider.py +0 -0
  381. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/_lifecycle/instances/terminal_artifacts.py +0 -0
  382. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/_lifecycle/net/__init__.py +0 -0
  383. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/_lifecycle/net/auth.py +0 -0
  384. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/_lifecycle/net/deadline.py +0 -0
  385. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/_lifecycle/net/http.py +0 -0
  386. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/_lifecycle/net/worker.py +0 -0
  387. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/artifacts/__init__.py +0 -0
  388. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/artifacts/hf.py +0 -0
  389. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/artifacts/preload_runpod.py +0 -0
  390. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/artifacts/weight_cache.py +0 -0
  391. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/core/__init__.py +0 -0
  392. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/core/allocator.py +0 -0
  393. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/core/base.py +0 -0
  394. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/core/fit_errors.py +0 -0
  395. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/core/realized.py +0 -0
  396. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/core/registry.py +0 -0
  397. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/core/sharding.py +0 -0
  398. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/lambda_/__init__.py +0 -0
  399. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/lambda_/client/__init__.py +0 -0
  400. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/lambda_/client/api.py +0 -0
  401. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/lambda_/client/auth.py +0 -0
  402. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/lambda_/client/gpus.py +0 -0
  403. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/lambda_/client/preflight.py +0 -0
  404. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/lambda_/client/pricing.py +0 -0
  405. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/lambda_/execution/__init__.py +0 -0
  406. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/lambda_/execution/provider.py +0 -0
  407. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/lambda_/jobs/__init__.py +0 -0
  408. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/lambda_/jobs/builders.py +0 -0
  409. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/lambda_/jobs/reap.py +0 -0
  410. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/runpod/__init__.py +0 -0
  411. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/runpod/client/__init__.py +0 -0
  412. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/runpod/client/api.py +0 -0
  413. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/runpod/client/auth.py +0 -0
  414. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/runpod/client/cost.py +0 -0
  415. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/runpod/client/gpus.py +0 -0
  416. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/runpod/client/preflight.py +0 -0
  417. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/runpod/client/pricing.py +0 -0
  418. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/runpod/execution/__init__.py +0 -0
  419. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/runpod/execution/job_execution.py +0 -0
  420. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/runpod/execution/jobs.py +0 -0
  421. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/runpod/execution/polling.py +0 -0
  422. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/runpod/execution/provider.py +0 -0
  423. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/runpod/execution/resources.py +0 -0
  424. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/runpod/serverless/__init__.py +0 -0
  425. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/runpod/serverless/endpoints.py +0 -0
  426. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/runpod/serverless/naming.py +0 -0
  427. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/vast/__init__.py +0 -0
  428. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/vast/client/__init__.py +0 -0
  429. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/vast/client/auth.py +0 -0
  430. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/vast/client/preflight.py +0 -0
  431. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/vast/client/pricing.py +0 -0
  432. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/vast/execution/__init__.py +0 -0
  433. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/vast/execution/provider.py +0 -0
  434. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/vast/jobs/__init__.py +0 -0
  435. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/providers/vast/jobs/builders.py +0 -0
  436. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/py.typed +0 -0
  437. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/runner/__init__.py +0 -0
  438. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/runner/accounting/__init__.py +0 -0
  439. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/runner/accounting/artifacts.py +0 -0
  440. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/runner/accounting/costs.py +0 -0
  441. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/runner/accounting/reconciliation.py +0 -0
  442. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/runner/accounting/weight_cache.py +0 -0
  443. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/runner/lifecycle/__init__.py +0 -0
  444. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/runner/lifecycle/attempts.py +0 -0
  445. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/runner/lifecycle/claim_lock.py +0 -0
  446. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/runner/lifecycle/deadlines.py +0 -0
  447. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/runner/lifecycle/preparation.py +0 -0
  448. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/runner/lifecycle/reporting.py +0 -0
  449. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/runner/lifecycle/state.py +0 -0
  450. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/runner/lifecycle/status.py +0 -0
  451. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/runner/lifecycle/submit.py +0 -0
  452. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/runner/results/__init__.py +0 -0
  453. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/runner/results/checkpoints.py +0 -0
  454. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/runner/results/verified_revisions.py +0 -0
  455. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/runner/supervise/__init__.py +0 -0
  456. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/runner/supervise/attach.py +0 -0
  457. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/runner/supervise/attach_reconcile.py +0 -0
  458. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/runner/supervise/attempt_supervision.py +0 -0
  459. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/runner/supervise/deploy.py +0 -0
  460. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/runner/supervise/errors.py +0 -0
  461. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/runner/supervise/lifecycle.py +0 -0
  462. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/runner/supervise/recovery.py +0 -0
  463. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/runner/supervise/retry_decision.py +0 -0
  464. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/runner/supervise/transitions.py +0 -0
  465. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/runtime_capsule/__init__.py +0 -0
  466. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/runtime_capsule/build.py +0 -0
  467. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/runtime_capsule/manifest.py +0 -0
  468. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/runtime_capsule/profiles.py +0 -0
  469. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/schema/__init__.py +0 -0
  470. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/schema/fields.py +0 -0
  471. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serve/__init__.py +0 -0
  472. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serve/app/__init__.py +0 -0
  473. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serve/app/__main__.py +0 -0
  474. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serve/app/launch.py +0 -0
  475. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serve/app/manifest.py +0 -0
  476. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serve/app/materialize.py +0 -0
  477. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serve/app/progress.py +0 -0
  478. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serve/contract/__init__.py +0 -0
  479. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serve/contract/errors.py +0 -0
  480. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serve/contract/provenance.py +0 -0
  481. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serve/contract/responses.py +0 -0
  482. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serve/contract/urls.py +0 -0
  483. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serve/control/__init__.py +0 -0
  484. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serve/control/_canonical.py +0 -0
  485. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serve/control/_serialization.py +0 -0
  486. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serve/control/_urls.py +0 -0
  487. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serve/control/credentials.py +0 -0
  488. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serve/control/planning.py +0 -0
  489. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serve/control/types.py +0 -0
  490. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serve/deployment/__init__.py +0 -0
  491. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serve/deployment/adapter_check.py +0 -0
  492. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serve/deployment/export.py +0 -0
  493. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serve/deployment/preflight.py +0 -0
  494. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serve/deployment/readiness.py +0 -0
  495. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serve/deployment/resolve.py +0 -0
  496. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serve/provisioning/__init__.py +0 -0
  497. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serve/provisioning/common/__init__.py +0 -0
  498. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serve/provisioning/common/records.py +0 -0
  499. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serve/provisioning/modal/__init__.py +0 -0
  500. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serve/provisioning/modal/execution/__init__.py +0 -0
  501. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serve/provisioning/modal/execution/deployment.py +0 -0
  502. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serve/provisioning/modal/execution/lifecycle.py +0 -0
  503. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serve/provisioning/modal/execution/operations.py +0 -0
  504. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serve/provisioning/modal/execution/sdk.py +0 -0
  505. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serve/provisioning/modal/planning/__init__.py +0 -0
  506. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serve/provisioning/modal/planning/plan.py +0 -0
  507. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serve/provisioning/modal/planning/resources.py +0 -0
  508. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serve/provisioning/modal/planning/wrapper.py +0 -0
  509. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serve/provisioning/modal/readiness_checks/__init__.py +0 -0
  510. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serve/provisioning/modal/readiness_checks/probe.py +0 -0
  511. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serve/provisioning/modal/readiness_checks/readiness.py +0 -0
  512. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serve/provisioning/modal/readiness_checks/teardown.py +0 -0
  513. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serve/request/__init__.py +0 -0
  514. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serve/request/runtime_support.py +0 -0
  515. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serve/request/streaming.py +0 -0
  516. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serve/runtime/__init__.py +0 -0
  517. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serve/runtime/adapters.py +0 -0
  518. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serve/runtime/errors.py +0 -0
  519. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serve/runtime/multimodal.py +0 -0
  520. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serve/runtime/sampling.py +0 -0
  521. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serve/runtime/structured_outputs.py +0 -0
  522. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/server/__init__.py +0 -0
  523. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/server/__main__.py +0 -0
  524. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/server/asgi/__init__.py +0 -0
  525. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/server/asgi/app.py +0 -0
  526. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/server/asgi/cli.py +0 -0
  527. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/server/billing/__init__.py +0 -0
  528. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/server/billing/charges.py +0 -0
  529. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/server/billing/retry.py +0 -0
  530. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/server/domain/__init__.py +0 -0
  531. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/server/domain/ops/__init__.py +0 -0
  532. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/server/domain/ops/reconcile.py +0 -0
  533. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/server/domain/ops/repo_cleanup.py +0 -0
  534. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/server/domain/ops/serving_resources.py +0 -0
  535. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/server/domain/registry/__init__.py +0 -0
  536. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/server/domain/registry/checkpoints.py +0 -0
  537. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/server/domain/registry/environment_registry.py +0 -0
  538. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/server/domain/registry/envs.py +0 -0
  539. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/server/domain/registry/projects.py +0 -0
  540. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/server/domain/registry/runs.py +0 -0
  541. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/server/domain/teacher/__init__.py +0 -0
  542. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/server/domain/teacher/broker.py +0 -0
  543. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/server/domain/teacher/errors.py +0 -0
  544. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/server/domain/teacher/requests.py +0 -0
  545. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/server/platform/__init__.py +0 -0
  546. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/server/platform/auth.py +0 -0
  547. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/server/platform/db.py +0 -0
  548. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/server/platform/deps.py +0 -0
  549. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/server/platform/internal_client.py +0 -0
  550. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/server/platform/locks.py +0 -0
  551. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/server/platform/runtime.py +0 -0
  552. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/server/routes/__init__.py +0 -0
  553. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/server/routes/envs.py +0 -0
  554. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/server/routes/meta.py +0 -0
  555. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/server/routes/runs.py +0 -0
  556. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/server/routes/serving.py +0 -0
  557. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/server/routes/serving_completion.py +0 -0
  558. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/server/routes/serving_revisions.py +0 -0
  559. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/server/routes/serving_smoke.py +0 -0
  560. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/server/routes/teacher.py +0 -0
  561. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serving/__init__.py +0 -0
  562. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serving/app/__init__.py +0 -0
  563. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serving/app/modal_app.py +0 -0
  564. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serving/loadtest/__init__.py +0 -0
  565. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serving/loadtest/__main__.py +0 -0
  566. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serving/loadtest/artifacts.py +0 -0
  567. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serving/loadtest/cli.py +0 -0
  568. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serving/loadtest/metrics.py +0 -0
  569. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serving/loadtest/protocol.py +0 -0
  570. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serving/loadtest/runner.py +0 -0
  571. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serving/loadtest/schedule.py +0 -0
  572. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serving/loadtest/schema.py +0 -0
  573. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serving/src/__init__.py +0 -0
  574. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serving/src/accounting/__init__.py +0 -0
  575. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serving/src/accounting/usage.py +0 -0
  576. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serving/src/accounting/usage_facts.py +0 -0
  577. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serving/src/accounting/usage_outbox.py +0 -0
  578. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serving/src/engine/__init__.py +0 -0
  579. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serving/src/engine/boot.py +0 -0
  580. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serving/src/engine/errors.py +0 -0
  581. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serving/src/engine/lora_entries.py +0 -0
  582. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serving/src/engine/prequant_config.py +0 -0
  583. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serving/src/http/__init__.py +0 -0
  584. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serving/src/http/adapter_routes.py +0 -0
  585. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serving/src/http/body_limit.py +0 -0
  586. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serving/src/http/context.py +0 -0
  587. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serving/src/http/headers.py +0 -0
  588. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serving/src/http/router.py +0 -0
  589. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serving/src/http/routing.py +0 -0
  590. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serving/src/io/__init__.py +0 -0
  591. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serving/src/io/multimodal.py +0 -0
  592. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serving/src/io/provenance.py +0 -0
  593. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serving/src/io/requests.py +0 -0
  594. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serving/src/io/schemas.py +0 -0
  595. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serving/src/io/streaming.py +0 -0
  596. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serving/src/io/structured_outputs.py +0 -0
  597. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serving/src/store/__init__.py +0 -0
  598. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serving/src/store/access.py +0 -0
  599. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serving/src/store/lookup.py +0 -0
  600. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serving/src/store/persisted_columns.py +0 -0
  601. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serving/src/store/persistence.py +0 -0
  602. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serving/src/store/registration.py +0 -0
  603. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serving/src/store/registry.py +0 -0
  604. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serving/src/store/settings.py +0 -0
  605. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serving/src/store/supabase_rest.py +0 -0
  606. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/serving/src/store/undeploy.py +0 -0
  607. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/snapshot/__init__.py +0 -0
  608. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/snapshot/archive.py +0 -0
  609. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/teacher/__init__.py +0 -0
  610. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/teacher/limits.py +0 -0
  611. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/teacher/provider_status.py +0 -0
  612. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/flash/teacher/retry_contract.py +0 -0
  613. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/scripts/build_dev_dist.py +0 -0
  614. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/scripts/check_file_size.py +0 -0
  615. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/scripts/check_function_size.py +0 -0
  616. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/scripts/check_rollout_identity_actor.py +0 -0
  617. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/scripts/check_source_layout.py +0 -0
  618. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/scripts/check_verl_pin_exists.py +0 -0
  619. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/scripts/qualify_serving_profile.py +0 -0
  620. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/scripts/scrub_history.sh +0 -0
  621. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/serve_launch.py +0 -0
  622. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/__init__.py +0 -0
  623. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/_helpers/__init__.py +0 -0
  624. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/_helpers/chat_provenance.py +0 -0
  625. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/_helpers/chat_transport.py +0 -0
  626. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/_helpers/managed_chat.py +0 -0
  627. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/_helpers/profile.py +0 -0
  628. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/_helpers/runner.py +0 -0
  629. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/_helpers/server_api_plugin.py +0 -0
  630. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/_helpers/source_snapshot.py +0 -0
  631. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/_helpers/specs.py +0 -0
  632. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/_helpers/teacher.py +0 -0
  633. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/_helpers/vast.py +0 -0
  634. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/_helpers/wire_headers.py +0 -0
  635. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/capture_image_sft_processor_oracle.py +0 -0
  636. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/capture_qwen38_27b_metadata.py +0 -0
  637. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/conftest.py +0 -0
  638. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/fixtures/image_sft_processor_oracle.json +0 -0
  639. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/fixtures/qwen35_9b_target_metadata.json +0 -0
  640. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/fixtures/qwen38_27b_target_metadata.json +0 -0
  641. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/fixtures/vllm_023_moe_lora/lora_context.py.gz +0 -0
  642. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/fixtures/vllm_023_moe_lora/modular_kernel.py.gz +0 -0
  643. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/fixtures/vllm_023_moe_lora/triton_moe.py.gz +0 -0
  644. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/live/__init__.py +0 -0
  645. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/live/conftest.py +0 -0
  646. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/live/test_lambda_live.py +0 -0
  647. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/live/test_runpod_live.py +0 -0
  648. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/live/test_sft_thinking_render_live.py +0 -0
  649. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/live/test_vast_live.py +0 -0
  650. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/serving/checkpoint_fixtures.py +0 -0
  651. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/serving/conftest.py +0 -0
  652. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/serving/hosted_loadtest_fake_scenario.json +0 -0
  653. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/serving/test_base_model_serving.py +0 -0
  654. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/serving/test_chat_auth.py +0 -0
  655. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/serving/test_chat_authorizer.py +0 -0
  656. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/serving/test_checkpoint_identity_repairs.py +0 -0
  657. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/serving/test_checkpoint_model_validation.py +0 -0
  658. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/serving/test_engine_error_status.py +0 -0
  659. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/serving/test_fp8_config.py +0 -0
  660. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/serving/test_immutable_engine.py +0 -0
  661. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/serving/test_immutable_revisions.py +0 -0
  662. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/serving/test_immutable_schemas.py +0 -0
  663. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/serving/test_loadtest_artifacts.py +0 -0
  664. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/serving/test_loadtest_metrics.py +0 -0
  665. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/serving/test_loadtest_protocol.py +0 -0
  666. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/serving/test_loadtest_runner.py +0 -0
  667. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/serving/test_loadtest_schedule.py +0 -0
  668. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/serving/test_loadtest_schema.py +0 -0
  669. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/serving/test_modal_deploy_identity.py +0 -0
  670. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/serving/test_modal_image_paths.py +0 -0
  671. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/serving/test_openai_stream_options.py +0 -0
  672. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/serving/test_per_model_gpu.py +0 -0
  673. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/serving/test_persistence.py +0 -0
  674. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/serving/test_pre_first_disconnect.py +0 -0
  675. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/serving/test_prequant_config.py +0 -0
  676. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/serving/test_registry.py +0 -0
  677. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/serving/test_registry_coverage.py +0 -0
  678. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/serving/test_request_body_limit.py +0 -0
  679. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/serving/test_router_coverage.py +0 -0
  680. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/serving/test_router_edge_coverage.py +0 -0
  681. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/serving/test_schemas_coverage.py +0 -0
  682. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/serving/test_serve_reasoning_split.py +0 -0
  683. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/serving/test_serve_thinking.py +0 -0
  684. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/serving/test_settings.py +0 -0
  685. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/serving/test_structured_outputs.py +0 -0
  686. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/serving/test_structured_outputs_coverage.py +0 -0
  687. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/serving/test_supabase_rest_coverage.py +0 -0
  688. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/serving/test_usage_outbox.py +0 -0
  689. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/serving_conformance/__init__.py +0 -0
  690. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/serving_conformance/conftest.py +0 -0
  691. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/serving_conformance/test_contract.py +0 -0
  692. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_accounting_coverage.py +0 -0
  693. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_adapter_shard_completeness.py +0 -0
  694. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_agent_flash_cli_contract.py +0 -0
  695. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_algorithms.py +0 -0
  696. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_allocator.py +0 -0
  697. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_authenticated_redirects.py +0 -0
  698. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_backend_common.py +0 -0
  699. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_backend_jobspec_contract.py +0 -0
  700. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_bake_kernel_cache.py +0 -0
  701. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_base_model_provenance.py +0 -0
  702. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_billing_retry.py +0 -0
  703. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_bootstrap_process_groups.py +0 -0
  704. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_build_context_contract.py +0 -0
  705. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_cancel_remote.py +0 -0
  706. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_capture_qwen38_metadata.py +0 -0
  707. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_catalog_consistency.py +0 -0
  708. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_catalog_only_models.py +0 -0
  709. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_charge_pricing.py +0 -0
  710. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_checkpoint_lifecycle.py +0 -0
  711. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_checkpoints.py +0 -0
  712. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_cli_commands.py +0 -0
  713. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_cli_commands_coverage.py +0 -0
  714. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_cli_credential_shadowing.py +0 -0
  715. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_cli_errors.py +0 -0
  716. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_cli_estimate.py +0 -0
  717. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_cli_gpus_flag.py +0 -0
  718. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_cli_help.py +0 -0
  719. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_cli_main_coverage.py +0 -0
  720. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_cli_managed.py +0 -0
  721. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_cli_render_coverage.py +0 -0
  722. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_cli_render_theme.py +0 -0
  723. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_cli_serve_status.py +0 -0
  724. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_cli_serve_undeploy.py +0 -0
  725. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_cli_traces.py +0 -0
  726. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_cli_wandb_warning.py +0 -0
  727. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_client_import_purity.py +0 -0
  728. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_client_server_integration.py +0 -0
  729. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_client_stream_reads.py +0 -0
  730. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_config_env_vars.py +0 -0
  731. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_config_overrides.py +0 -0
  732. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_console_upload.py +0 -0
  733. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_controlled_experiment_repairs.py +0 -0
  734. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_cost_analytical.py +0 -0
  735. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_cost_currency.py +0 -0
  736. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_cost_equation.py +0 -0
  737. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_cost_estimate.py +0 -0
  738. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_cost_hardware.py +0 -0
  739. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_cost_models.py +0 -0
  740. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_dataset_profile.py +0 -0
  741. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_deploy_latency.py +0 -0
  742. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_dev_channel.py +0 -0
  743. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_disk_gb.py +0 -0
  744. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_endpoint_name.py +0 -0
  745. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_env_cache_evict.py +0 -0
  746. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_env_delete.py +0 -0
  747. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_env_download.py +0 -0
  748. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_env_download_api.py +0 -0
  749. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_env_evaluations.py +0 -0
  750. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_env_git_auth.py +0 -0
  751. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_env_list_api.py +0 -0
  752. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_env_list_cli.py +0 -0
  753. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_env_list_hub.py +0 -0
  754. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_env_no_install.py +0 -0
  755. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_env_publish.py +0 -0
  756. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_env_pull.py +0 -0
  757. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_env_pull_coverage.py +0 -0
  758. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_env_pull_loader_coverage.py +0 -0
  759. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_env_pull_managed_control_plane.py +0 -0
  760. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_env_push.py +0 -0
  761. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_env_rate_limit_resolve.py +0 -0
  762. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_env_ref_pinning.py +0 -0
  763. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_env_test.py +0 -0
  764. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_envs_coverage.py +0 -0
  765. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_export.py +0 -0
  766. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_flash_mvp.py +0 -0
  767. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_flash_worker.py +0 -0
  768. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_flashinfer_cache_dirs.py +0 -0
  769. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_freesolo_api_transport.py +0 -0
  770. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_fused_expert_warmstart.py +0 -0
  771. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_github_urlopen_retry.py +0 -0
  772. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_gpu_type_single_field.py +0 -0
  773. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_gpus.py +0 -0
  774. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_grpo_checkpoint_durability.py +0 -0
  775. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_grpo_params.py +0 -0
  776. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_grpo_process_census.py +0 -0
  777. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_grpo_resident_sizing.py +0 -0
  778. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_grpo_rollout_contract.py +0 -0
  779. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_grpo_rollout_identity.py +0 -0
  780. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_health_liveness.py +0 -0
  781. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_hf_retry.py +0 -0
  782. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_idle_endpoint_reaper.py +0 -0
  783. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_image_environment_capability.py +0 -0
  784. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_image_incremental_processor.py +0 -0
  785. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_image_sft_markers.py +0 -0
  786. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_image_sft_processor_parity.py +0 -0
  787. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_image_tokens.py +0 -0
  788. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_infisical_secrets.py +0 -0
  789. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_instance_bootstrap_coverage.py +0 -0
  790. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_internal_client.py +0 -0
  791. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_jobs.py +0 -0
  792. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_kernel_cache.py +0 -0
  793. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_kernel_fingerprint.py +0 -0
  794. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_kv_util.py +0 -0
  795. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_lambda_api_coverage.py +0 -0
  796. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_lambda_runner.py +0 -0
  797. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_logging.py +0 -0
  798. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_login_perms.py +0 -0
  799. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_lora_rank_coverage.py +0 -0
  800. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_lora_rank_nested_rung.py +0 -0
  801. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_lora_rank_preflight.py +0 -0
  802. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_lora_targeting.py +0 -0
  803. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_lora_targeting_pinned_verl.py +0 -0
  804. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_managed_config_fields.py +0 -0
  805. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_managed_hf_repo.py +0 -0
  806. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_metrics_schema_agent_contract.py +0 -0
  807. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_mig_guard.py +0 -0
  808. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_multi_gpu_gate.py +0 -0
  809. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_multimodal_training.py +0 -0
  810. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_named_reward_metrics.py +0 -0
  811. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_oom_escalate_gpu.py +0 -0
  812. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_opd.py +0 -0
  813. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_opd_limits.py +0 -0
  814. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_opd_multiturn_eos_boundary.py +0 -0
  815. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_opd_multiturn_failure_exit.py +0 -0
  816. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_opd_replay_guard.py +0 -0
  817. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_opd_resume_safety.py +0 -0
  818. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_orchestrator_flash.py +0 -0
  819. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_packing.py +0 -0
  820. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_packing_coverage.py +0 -0
  821. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_parasail_teacher.py +0 -0
  822. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_persisted_spec_envelope.py +0 -0
  823. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_poll_helpers.py +0 -0
  824. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_projects.py +0 -0
  825. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_prompt_budget.py +0 -0
  826. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_provider_preflight_coverage.py +0 -0
  827. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_provider_routing.py +0 -0
  828. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_provider_teardown_robustness.py +0 -0
  829. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_providers_symmetry.py +0 -0
  830. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_realized_cost.py +0 -0
  831. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_repo_cleanup.py +0 -0
  832. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_resolve_params_b.py +0 -0
  833. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_resume_on_retry.py +0 -0
  834. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_retry_decision.py +0 -0
  835. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_rl_train.py +0 -0
  836. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_rollout_samples.py +0 -0
  837. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_run_registry_lifecycle.py +0 -0
  838. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_runmgmt.py +0 -0
  839. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_runpod_api_delete.py +0 -0
  840. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_runpod_key_fingerprint.py +0 -0
  841. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_runpod_key_waterfall.py +0 -0
  842. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_runtime_capsule.py +0 -0
  843. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_serve.py +0 -0
  844. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_serve_app_launch.py +0 -0
  845. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_serve_app_manifest.py +0 -0
  846. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_serve_app_materialize.py +0 -0
  847. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_serve_app_packaging.py +0 -0
  848. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_serve_app_progress.py +0 -0
  849. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_serve_control.py +0 -0
  850. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_serve_docs.py +0 -0
  851. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_serve_modal_contract_lock.py +0 -0
  852. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_serve_modal_sdk.py +0 -0
  853. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_serve_modal_sdk_deadlines.py +0 -0
  854. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_serve_modal_teardown_identity.py +0 -0
  855. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_serve_profile_qualification.py +0 -0
  856. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_serve_profiles.py +0 -0
  857. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_serve_provisioning_common.py +0 -0
  858. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_serve_provisioning_modal.py +0 -0
  859. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_serve_resolve_provenance.py +0 -0
  860. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_serve_runtime_adapters.py +0 -0
  861. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_serve_runtime_package.py +0 -0
  862. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_server_api.py +0 -0
  863. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_server_app_coverage.py +0 -0
  864. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_server_auth_singleflight.py +0 -0
  865. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_server_billing.py +0 -0
  866. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_server_checkpoints_coverage.py +0 -0
  867. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_server_db.py +0 -0
  868. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_server_envs_coverage.py +0 -0
  869. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_server_locks_coverage.py +0 -0
  870. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_server_serving_resources.py +0 -0
  871. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_serving_conformance_gate.py +0 -0
  872. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_serving_context_preflight.py +0 -0
  873. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_serving_contract.py +0 -0
  874. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_serving_schema_coverage.py +0 -0
  875. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_sft_chunked_nll.py +0 -0
  876. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_sft_example_selection.py +0 -0
  877. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_sft_gc_off.py +0 -0
  878. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_sft_max_context.py +0 -0
  879. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_sft_step_floor.py +0 -0
  880. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_sft_train.py +0 -0
  881. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_sft_workload.py +0 -0
  882. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_source_attestation_flow.py +0 -0
  883. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_source_layout.py +0 -0
  884. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_source_snapshot.py +0 -0
  885. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_spec_and_validation.py +0 -0
  886. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_spec_contract_bytes.py +0 -0
  887. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_staged_environment.py +0 -0
  888. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_step_floor.py +0 -0
  889. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_step_metrics.py +0 -0
  890. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_step_timing.py +0 -0
  891. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_structured_outputs.py +0 -0
  892. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_teacher_broker.py +0 -0
  893. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_teacher_encoding_contract.py +0 -0
  894. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_terminal_artifacts.py +0 -0
  895. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_thinking_config.py +0 -0
  896. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_train_context_preflight.py +0 -0
  897. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_training_controls.py +0 -0
  898. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_type_comment_prose.py +0 -0
  899. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_vast_api.py +0 -0
  900. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_vast_offers.py +0 -0
  901. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_vast_provider_coverage.py +0 -0
  902. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_vast_runner.py +0 -0
  903. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_verified_revisions.py +0 -0
  904. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_verifiers.py +0 -0
  905. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_verl_checkpoint_export.py +0 -0
  906. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_verl_child_plugins.py +0 -0
  907. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_verl_silence_watchdog.py +0 -0
  908. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_version.py +0 -0
  909. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_vl_warmstart_adapter_keys.py +0 -0
  910. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_vllm_moe_lora_backport.py +0 -0
  911. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_vram_architecture.py +0 -0
  912. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_wandb_link.py +0 -0
  913. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_wandb_naming.py +0 -0
  914. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_warmstart_adapter_download.py +0 -0
  915. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_warmstart_cross_repo.py +0 -0
  916. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_warmstart_error_attribution.py +0 -0
  917. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_warmstart_image_adapters.py +0 -0
  918. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_weight_cache.py +0 -0
  919. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_worker_dryrun.py +0 -0
  920. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_worker_hardexit.py +0 -0
  921. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_worker_image.py +0 -0
  922. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_worker_init_heartbeat.py +0 -0
  923. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_worker_stack.py +0 -0
  924. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_worker_thinking.py +0 -0
  925. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_workload_profile.py +0 -0
  926. {freesolo_flash_dev-1.2.128 → freesolo_flash_dev-1.2.129}/tests/test_zero2_sharding_gate.py +0 -0
@@ -33,6 +33,9 @@ RUNPOD_API_KEY=
33
33
  LAMBDA_API_KEY=
34
34
  # Vast.ai API key.
35
35
  VAST_API_KEY=
36
+ # exact https origins Vast may return for asynchronous result retrieval. configured values replace
37
+ # the default https://s3.amazonaws.com allowlist. this belongs only on the control-plane host.
38
+ # FLASH_VAST_RESULT_ORIGINS=https://s3.amazonaws.com
36
39
 
37
40
  # --- required: artifacts ---
38
41
  # HuggingFace token with write access to the dataset repos flash creates for artifacts
@@ -39,10 +39,14 @@ jobs:
39
39
  # this only constrains manual dispatches; a non-main dispatch skips without running `modal deploy`.
40
40
  if: github.ref == 'refs/heads/main'
41
41
  runs-on: ubuntu-latest
42
- # the job's own bounded waits are two 300s readiness polls plus the remote image build; 30
43
- # minutes clears that with room while keeping a wedged deploy from holding the runner for
44
- # GitHub's 6-hour default.
45
- timeout-minutes: 30
42
+ # the job's own bounded waits now sum well past the old 30: two 300s readiness polls, the remote
43
+ # image build, a 420s canary that pays a GPU cold start, a 180s accounting deadline, and on the
44
+ # failure path a SECOND `modal deploy` plus a 300s restore poll. 60 minutes clears that worst
45
+ # case with room while keeping a wedged deploy from holding the runner for GitHub's 6-hour
46
+ # default. the headroom is specifically for the rollback: a job killed partway through the
47
+ # restore leaves the broken release live with no second attempt, which is the one outcome this
48
+ # workflow exists to prevent.
49
+ timeout-minutes: 60
46
50
  # serialize serving deploys across runs because each deploy mutates the live app. github can still
47
51
  # replace a pending run, so the gate compares against the sha reported by the deployed app rather
48
52
  # than assuming every push predecessor was deployed.
@@ -87,9 +91,14 @@ jobs:
87
91
  DEPLOYED_HEALTH_URL: https://serve.freesolo.co/healthz
88
92
  run: |
89
93
  deploy=false
90
- if [ "$EVENT" = "workflow_dispatch" ]; then
91
- deploy=true
92
- elif ! last_deployed_sha="$(python3 - <<'PY'
94
+ # the sha reported by the LIVE app is read ONCE, before any decision, because it serves
95
+ # two purposes: it bounds the undeployed diff below, and it is the rollback target for a
96
+ # failed promotion. `modal deploy` overwrites the app in place, so after that point there
97
+ # is no way left to ask what the previous release was. reading it on workflow_dispatch
98
+ # too -- where the deploy decision does not need it -- is what makes a dispatched deploy
99
+ # rollback-capable rather than one-way.
100
+ read_ok=true
101
+ last_deployed_sha="$(python3 - <<'PY'
93
102
  import json
94
103
  import os
95
104
  import re
@@ -107,7 +116,17 @@ jobs:
107
116
  raise ValueError("deployed app returned no valid source revision")
108
117
  print(revision.lower())
109
118
  PY
110
- )"; then
119
+ )" || read_ok=false
120
+ if [ "$read_ok" != "true" ]; then
121
+ last_deployed_sha=""
122
+ fi
123
+ # an empty previous sha means rollback is IMPOSSIBLE for this run. the rollback step below
124
+ # says so out loud rather than reporting a restore it never performed.
125
+ echo "previous_sha=$last_deployed_sha" >> "$GITHUB_OUTPUT"
126
+
127
+ if [ "$EVENT" = "workflow_dispatch" ]; then
128
+ deploy=true
129
+ elif [ "$read_ok" != "true" ]; then
111
130
  # a missing deployment or any health, network, or parsing failure must deploy safely.
112
131
  deploy=true
113
132
  elif ! git merge-base --is-ancestor "$last_deployed_sha" "$CURRENT_SHA" 2>/dev/null; then
@@ -282,6 +301,7 @@ jobs:
282
301
  done
283
302
 
284
303
  - name: Deploy serving
304
+ id: deploy_serving
285
305
  if: steps.gate.outputs.deploy == 'true'
286
306
  env:
287
307
  FREESOLO_DEPLOYMENT_SHA: ${{ github.sha }}
@@ -371,6 +391,124 @@ jobs:
371
391
  sleep "$sleep_seconds"
372
392
  done
373
393
 
394
+ - name: Install promotion gate dependencies
395
+ if: steps.gate.outputs.deploy == 'true'
396
+ working-directory: .
397
+ run: |
398
+ # the gate imports flash.serving.promotion, which needs httpx for the streaming canary and
399
+ # pydantic-settings for the accounting client. this job deliberately does not `uv sync`
400
+ # (see "Install Modal client"), so install exactly what the gate imports and nothing more.
401
+ # these are the exact versions uv.lock resolves, so the gate runs against the same client
402
+ # behaviour the serving tests were validated on rather than whatever pypi ships that day.
403
+ python -m pip install "httpx==0.28.1" "pydantic==2.13.4" "pydantic-settings==2.15.0"
404
+
405
+ - name: Prove the promotion with a real streaming canary
406
+ if: steps.gate.outputs.deploy == 'true'
407
+ working-directory: .
408
+ env:
409
+ # a healthy /healthz proves a ROUTER answered with the expected identity. it does not prove
410
+ # a gpu engine started, that a generation ran, that streaming works, or that usage settled
411
+ # durably. this step is the only thing standing between "the process booted" and "the
412
+ # release can actually serve", so a failure here must not be promoted.
413
+ SERVING_BASE_URL: https://serve.freesolo.co
414
+ FREESOLO_INTERNAL_KEY: ${{ secrets.FREESOLO_INTERNAL_KEY }}
415
+ SUPABASE_URL: ${{ secrets.SUPABASE_URL }}
416
+ SUPABASE_SERVICE_ROLE_KEY: ${{ secrets.SUPABASE_SERVICE_ROLE_KEY }}
417
+ GITHUB_SHA: ${{ github.sha }}
418
+ GITHUB_RUN_ID: ${{ github.run_id }}
419
+ GITHUB_RUN_ATTEMPT: ${{ github.run_attempt }}
420
+ # credentials reach the gate ONLY through the environment above. passing any of them as an
421
+ # argument would put them in the process table and in the step's own command echo.
422
+ run: python -m flash.serving.promotion.gate
423
+
424
+ - name: Restore the previous release
425
+ # `failure()` alone is too broad. It also fires for the steps that run BEFORE any deploy --
426
+ # installing Modal, verifying auth, verifying the runtime secrets, waiting for the adapter
427
+ # schema. Restoring there would `modal deploy` the previous SHA over a live app this run never
428
+ # replaced, using the very secret set whose verification just failed: a healthy release
429
+ # overwritten by a rollback that had nothing to roll back. Gating on the deploy step's own
430
+ # outcome keeps the case the previous comment was right about -- a deploy that half-succeeded
431
+ # and then failed readiness is `failure`, not skipped, so it still restores. Any outcome other
432
+ # than an attempted deploy (empty, `skipped`) means production is untouched and must stay so.
433
+ if: >-
434
+ failure() && steps.gate.outputs.deploy == 'true'
435
+ && (steps.deploy_serving.outcome == 'success' || steps.deploy_serving.outcome == 'failure')
436
+ working-directory: .
437
+ env:
438
+ PREVIOUS_SHA: ${{ steps.gate.outputs.previous_sha }}
439
+ CURRENT_SHA: ${{ github.sha }}
440
+ # a distinct attempt id so /healthz cannot report the FORWARD deploy's identity and be
441
+ # mistaken for a completed rollback.
442
+ ROLLBACK_DEPLOYMENT_ID: ${{ github.run_id }}-${{ github.run_attempt }}-rollback
443
+ HEALTH_URL: https://serve.freesolo.co/healthz
444
+ run: |
445
+ if [ -z "$PREVIOUS_SHA" ]; then
446
+ echo "::error::Promotion failed and NO previous release was recorded, so the broken release is still live. Restore production manually."
447
+ exit 1
448
+ fi
449
+ if ! git merge-base --is-ancestor "$PREVIOUS_SHA" "$CURRENT_SHA" 2>/dev/null; then
450
+ # refusing here is the safe branch: redeploying a sha that is not an ancestor of this
451
+ # head would deploy an unknown tree rather than the release that was actually live.
452
+ echo "::error::Recorded previous release ${PREVIOUS_SHA} is not an ancestor of ${CURRENT_SHA}; refusing to redeploy an unverified tree. Restore production manually."
453
+ exit 1
454
+ fi
455
+
456
+ echo "Promotion failed; restoring ${PREVIOUS_SHA}."
457
+ git checkout --quiet --force "$PREVIOUS_SHA"
458
+
459
+ # the restored app must report the RESTORED sha, deployed from the restored tree.
460
+ FREESOLO_DEPLOYMENT_SHA="$PREVIOUS_SHA" \
461
+ FREESOLO_DEPLOYMENT_ID="$ROLLBACK_DEPLOYMENT_ID" \
462
+ modal deploy flash/serving/app/modal_app.py
463
+
464
+ response_file="$(mktemp)"
465
+ trap 'rm -f "$response_file"' EXIT
466
+ deadline=$((SECONDS + 300))
467
+ restored=false
468
+ while (( SECONDS < deadline )); do
469
+ if curl --silent --show-error --output "$response_file" --fail \
470
+ --connect-timeout 5 --max-time 10 "$HEALTH_URL"; then
471
+ if python3 - "$response_file" "$PREVIOUS_SHA" "$ROLLBACK_DEPLOYMENT_ID" <<'PY'
472
+ import json
473
+ import sys
474
+
475
+
476
+ def reject_constant(_value: str) -> None:
477
+ raise ValueError
478
+
479
+
480
+ try:
481
+ with open(sys.argv[1], encoding="utf-8") as response:
482
+ payload = json.load(response, parse_constant=reject_constant)
483
+ except (OSError, UnicodeDecodeError, ValueError):
484
+ sys.exit(1)
485
+
486
+ restored = (
487
+ isinstance(payload, dict)
488
+ and payload.get("ok") is True
489
+ and payload.get("deployment_sha") == sys.argv[2]
490
+ and payload.get("deployment_id") == sys.argv[3]
491
+ )
492
+ sys.exit(0 if restored else 1)
493
+ PY
494
+ then
495
+ restored=true
496
+ break
497
+ fi
498
+ fi
499
+ sleep 10
500
+ done
501
+
502
+ if [ "$restored" != "true" ]; then
503
+ echo "::error::Rollback to ${PREVIOUS_SHA} was deployed but production never reported the restored release. Production may be serving a broken release; intervene manually."
504
+ exit 1
505
+ fi
506
+ # exit nonzero regardless: a restored predecessor means production is serving again, NOT
507
+ # that this promotion succeeded. reporting green here would mark an unpromotable commit as
508
+ # deployed and let the next push build on a release that never passed its gate.
509
+ echo "::error::Promotion failed; production was restored to ${PREVIOUS_SHA}. This commit is NOT deployed."
510
+ exit 1
511
+
374
512
  - name: Nothing to deploy
375
513
  if: steps.gate.outputs.deploy != 'true'
376
514
  run: echo "No serving changes in this push; skipping deploy."
@@ -13,6 +13,11 @@ This file starts at 1.1.35. Earlier releases are not reconstructed here; use
13
13
 
14
14
  ### Added
15
15
 
16
+ - OpenAI chat serving now implements and offline-validates strict function tool calling for the exact
17
+ Qwen3.5 packaged and hosted paths, including validated tool history, buffered and raw SSE
18
+ `tool_calls`, and managed forwarding. Flash parses schema-valid calls but does not execute them;
19
+ malformed automatic calls remain exact assistant text. Tool calling is not live-qualified pending
20
+ exact model testing.
16
21
  - OpenAI chat serving now preserves mirror sampling controls across packaged, hosted, and managed
17
22
  entry points: up to four indexed choices, signed seeds, frequency and presence penalties, and
18
23
  OpenAI token logprobs. Buffered and raw SSE responses retain independent choice terminals and
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: freesolo-flash-dev
3
- Version: 1.2.128
3
+ Version: 1.2.129
4
4
  Summary: Flash — managed LoRA post-training (SFT/GRPO/OPD) for Freesolo environments, driven by the `flash` CLI
5
5
  Project-URL: Homepage, https://github.com/freesolo-co/flash
6
6
  Project-URL: Repository, https://github.com/freesolo-co/flash
@@ -235,6 +235,12 @@ placeholder value to set for the ones you skip.
235
235
  | Lambda | `LAMBDA_API_KEY` | |
236
236
  | Vast | `VAST_API_KEY` | |
237
237
 
238
+ Vast log retrieval accepts signed result URLs only from exact HTTPS origins in
239
+ `FLASH_VAST_RESULT_ORIGINS`. The variable is control-plane-only and comma-separated. Leaving it
240
+ unset or blank allows only `https://s3.amazonaws.com`; setting it replaces that default. Origins
241
+ must be canonical HTTPS origins without credentials, explicit ports, paths, queries, fragments,
242
+ wildcards, spaces, or control characters.
243
+
238
244
  The allocator ranks candidate GPU classes only on the substrates you configured, so a
239
245
  plane with just `VAST_API_KEY` set allocates on Vast and never proposes a class it cannot
240
246
  provision. Startup fails only when **all three** are missing.
@@ -75,6 +75,58 @@ The packaged, hosted, and managed OpenAI entry points retain the shared strict s
75
75
  - `logprobs` is a strict boolean and `top_logprobs` is an integer from 0 through 20.
76
76
  - thinking-enabled adapters reject logprobs.
77
77
 
78
+ Function tools are implemented and offline-validated only for the exact qualified Qwen3.5 packaged
79
+ and hosted profile. This path is not live-qualified pending exact model testing. The parser identity
80
+ is `qwen3_coder`; Qwen3.6 and unqualified engines reject tools after authorization and checkpoint
81
+ resolution, before generation. Declarations must be closed function objects with unique nonempty
82
+ names. Parameters use a bounded root-object JSON Schema profile with `properties`, `required`,
83
+ `additionalProperties: false`, recursive scalar, object, and array types, descriptions, enums, and
84
+ array `items`. Numeric enum members must be JSON integers; decimal and exponent numeric enum lexemes
85
+ are rejected because Flash cannot preserve them exactly across every ingress and template boundary.
86
+ Generated and historical JSON numeric literals support at most 1024 significand digits and exponent
87
+ magnitude at most 1,000,000; generated candidates outside either bound remain exact text, while
88
+ history outside either bound is rejected. A historical value within those bounds that no native
89
+ template number carries faithfully, because it
90
+ would overflow, underflow, or lose digits, is rendered as its exact compact text instead of being
91
+ converted or rejected, and a container holding such a value is rendered exactly as a whole. A
92
+ top-level boolean or null argument is likewise pre-rendered as `true`, `false`, or `null`, because the
93
+ template spells a scalar with `string` and would otherwise show the model Python's `True` and `None`;
94
+ inside a container those values stay native, since the template's `tojson` already spells them
95
+ correctly. A response carries at most 408 tool calls, and a longer run of candidates stays exact text. That is
96
+ the most any continuation could carry, not a promise that this batch replays. Replay cost depends on
97
+ the follow-up request as a whole: the prior conversation shares the same message-complexity budget,
98
+ and each result costs four nodes as a plain string, five with the optional `name`, and seven for a
99
+ single text block plus three for each additional block. A long enough history leaves no room for
100
+ even one call. Clients that intend to continue the tool lifecycle must therefore not assume any
101
+ positive call count replays under every history: a follow-up that exceeds the budget is rejected
102
+ with `messages exceed the supported complexity`. The budget counts structure rather than text, so
103
+ the remedies are to send fewer messages or fewer content blocks, drop optional result `name` fields,
104
+ use plain string results rather than text blocks, or request fewer calls; shortening the text inside
105
+ a message does not help, because a string is one node however long it is. These local
106
+ serving-contract bounds do not depend on Python's process-wide integer conversion limit. Unsupported
107
+ keywords and `strict: true` are rejected.
108
+
109
+ `tool_choice` defaults to `auto` and accepts only `auto` or `none`. `parallel_tool_calls` defaults to
110
+ `true` and accepts only exact `true`; either control requires `tools`. Tools cannot be combined with
111
+ thinking, logprobs, structured outputs, a non-text `response_format`, or image messages. Historical
112
+ assistant calls require unique IDs, function type, valid names, and JSON-string object arguments.
113
+ Each immediately following tool-result turn must resolve every declared call exactly once before a
114
+ non-tool turn. External messages remain unchanged; only a detached template copy converts argument
115
+ strings to objects.
116
+
117
+ In `auto` mode, complete schema-valid Qwen3 Coder XML candidates become OpenAI `tool_calls` with
118
+ independent call indexes and `finish_reason: "tool_calls"`. Parsed responses contain no raw Qwen
119
+ tags. Ordinary text and malformed or incomplete candidates remain exact assistant text with the
120
+ native finish reason. Candidate regions are buffered in raw SSE because argument deltas cannot be
121
+ retracted safely. Native prompt, completion, cached, and reasoning token accounting remains
122
+ authoritative and is never recomputed from serialized arguments. Flash parses calls but does not
123
+ execute or resubmit them.
124
+
125
+ The decoded convenience `chat_stream` iterator remains text-only and single-choice. It rejects
126
+ `n != 1`, logprobs, and tools before opening transport; use buffered JSON or raw SSE for those
127
+ features. Raw `/generate` and `/adapters/{id}/generate` remain tool-free. Buffered hosted responses
128
+ and raw hosted SSE are authoritative; managed serving forwards them and never reparses tool calls.
129
+
78
130
  ## Public provenance
79
131
 
80
132
  Successful run-backed responses identify only the permanent checkpoint:
@@ -33,6 +33,7 @@ from flash.client.streaming import (
33
33
  )
34
34
  from flash.core.spec import require_project_id
35
35
  from flash.serve.contract.urls import is_freesolo_hosted_url
36
+ from flash.serve.request.tool_calls import validate_tool_control_presence
36
37
 
37
38
 
38
39
  class ClientError(RuntimeError):
@@ -213,9 +214,18 @@ def _prepare_chat_request(
213
214
  max_tokens: int,
214
215
  *,
215
216
  stream: bool = False,
217
+ tools: list[dict[str, Any]] | None = None,
218
+ tool_choice: str | None = None,
219
+ parallel_tool_calls: bool | None = None,
216
220
  ) -> tuple[str, dict[str, Any]]:
217
221
  base_run_id, checkpoint_id = _parse_chat_target(target)
218
222
  _validate_chat_messages(messages)
223
+ validate_tool_control_presence(
224
+ tools,
225
+ tool_choice,
226
+ parallel_tool_calls,
227
+ error_type=ClientError,
228
+ )
219
229
  body: dict[str, Any] = {
220
230
  "checkpoint_id": checkpoint_id,
221
231
  "messages": messages,
@@ -224,6 +234,10 @@ def _prepare_chat_request(
224
234
  }
225
235
  if stream:
226
236
  body["stream"] = True
237
+ if tools is not None:
238
+ body["tools"] = tools
239
+ body["tool_choice"] = "auto" if tool_choice is None else tool_choice
240
+ body["parallel_tool_calls"] = True if parallel_tool_calls is None else parallel_tool_calls
227
241
  return base_run_id, body
228
242
 
229
243
 
@@ -767,12 +781,19 @@ class ApiClient:
767
781
  temperature: float = 0.0,
768
782
  max_tokens: int = 512,
769
783
  timeout: float | None = None,
784
+ *,
785
+ tools: list[dict[str, Any]] | None = None,
786
+ tool_choice: str | None = None,
787
+ parallel_tool_calls: bool | None = None,
770
788
  ) -> dict:
771
789
  base_run_id, body = _prepare_chat_request(
772
790
  run_id,
773
791
  messages,
774
792
  temperature,
775
793
  max_tokens,
794
+ tools=tools,
795
+ tool_choice=tool_choice,
796
+ parallel_tool_calls=parallel_tool_calls,
776
797
  )
777
798
  return self._request(
778
799
  "POST",
@@ -787,7 +808,11 @@ class ApiClient:
787
808
  messages: list[dict],
788
809
  temperature: float = 0.0,
789
810
  max_tokens: int = 512,
811
+ *,
812
+ tools: list[dict[str, Any]] | None = None,
790
813
  ) -> Iterator[str]:
814
+ if tools is not None:
815
+ raise ValueError("decoded chat_stream does not support tools")
791
816
  base_run_id, body = _prepare_chat_request(
792
817
  run_id,
793
818
  messages,
@@ -18,9 +18,9 @@ Callers differ in three ways, each a constructor argument rather than a fork in
18
18
  ``TeacherError`` so the caller does not retry a batcher that is gone.
19
19
  * ``wrap_batch_error`` re-shapes an exception raised by ``score_batch`` before it reaches the
20
20
  waiters. GRPO propagates as-is; OPD narrows to its own error type, preserving permanence.
21
- * ``recheck_closed_after_wait`` decides whether a batch assembled during the flush window is still
22
- scored once ``close`` has been called. Leaving it off scores that final partial batch; turning it
23
- on abandons it to the stranded-waiter path.
21
+ * ``cancel_undispatched_on_close`` decides whether ``close`` immediately cancels work that has not
22
+ yet won the condition-protected dispatch claim. Leaving it off gives the consumer the bounded
23
+ shutdown window to claim the final partial batch; turning it on fails that work without scoring it.
24
24
  """
25
25
 
26
26
  from __future__ import annotations
@@ -87,7 +87,7 @@ class ScoreBatcher:
87
87
  thread_name: str,
88
88
  make_error: Callable[[str], Exception] = RuntimeError,
89
89
  wrap_batch_error: Callable[[Exception], Exception] | None = None,
90
- recheck_closed_after_wait: bool = False,
90
+ cancel_undispatched_on_close: bool = False,
91
91
  ) -> None:
92
92
  if max_batch_size <= 0:
93
93
  raise ValueError(f"{label} batch size must be positive")
@@ -100,7 +100,7 @@ class ScoreBatcher:
100
100
  self.thread_name = thread_name
101
101
  self._make_error = make_error
102
102
  self._wrap_batch_error = wrap_batch_error
103
- self._recheck_closed_after_wait = bool(recheck_closed_after_wait)
103
+ self._cancel_undispatched_on_close = bool(cancel_undispatched_on_close)
104
104
  self._condition = threading.Condition()
105
105
  self._pending: list[_Waiter] = []
106
106
  self._in_flight: list[_Waiter] = []
@@ -114,9 +114,9 @@ class ScoreBatcher:
114
114
  raise self._make_error(f"{self.label} shut down")
115
115
  if self._thread is not None:
116
116
  return
117
- self._thread = threading.Thread(target=self._run, name=self.thread_name, daemon=True)
118
- thread = self._thread
119
- thread.start()
117
+ thread = threading.Thread(target=self._run, name=self.thread_name, daemon=True)
118
+ thread.start()
119
+ self._thread = thread
120
120
 
121
121
  def submit(self, request: Any) -> Any:
122
122
  """Enqueue one request and block until its batch has been scored."""
@@ -129,7 +129,8 @@ class ScoreBatcher:
129
129
  self._condition.notify_all()
130
130
  return waiter.wait(self._make_error)
131
131
 
132
- def _take_batch(self) -> list[_Waiter] | None:
132
+ def _claim_batch(self) -> list[_Waiter] | None:
133
+ """Wait for work, then atomically cancel it or claim it for dispatch."""
133
134
  with self._condition:
134
135
  while not self._pending:
135
136
  if self._closed:
@@ -141,17 +142,20 @@ class ScoreBatcher:
141
142
  if remaining <= 0:
142
143
  break
143
144
  self._condition.wait(remaining)
144
- if self._recheck_closed_after_wait and self._closed:
145
- return None
146
145
  batch = self._pending[: self.max_batch_size]
146
+ if not batch:
147
+ # `close` cancelled the queue while this held no claim: the only way the queue can
148
+ # empty between the outer loop and here. dispatching now would score an empty batch.
149
+ return None
147
150
  del self._pending[: len(batch)]
148
151
  self._in_flight = batch
152
+ self._condition.notify_all()
149
153
  return batch
150
154
 
151
155
  def _run(self) -> None:
152
156
  try:
153
157
  while True:
154
- batch = self._take_batch()
158
+ batch = self._claim_batch()
155
159
  if batch is None:
156
160
  return
157
161
  try:
@@ -163,10 +167,9 @@ class ScoreBatcher:
163
167
  wrapped = self._wrap_batch_error(error) if self._wrap_batch_error else error
164
168
  for waiter in batch:
165
169
  waiter.complete(error=wrapped)
166
- finally:
167
- with self._condition:
168
- self._in_flight = []
169
- self._condition.notify_all()
170
+ with self._condition:
171
+ self._in_flight = []
172
+ self._condition.notify_all()
170
173
  finally:
171
174
  # the thread is leaving for good, so anything still queued or in flight will never be
172
175
  # answered. fail them here rather than leaving their callers blocked forever.
@@ -181,11 +184,17 @@ class ScoreBatcher:
181
184
  waiter.complete(error=error)
182
185
 
183
186
  def close(self, timeout_s: float) -> None:
184
- """Stop accepting requests, fail what is queued, and wait out the batch in flight.
187
+ """Stop accepting requests and settle queued or claimed work within the shutdown bound.
188
+
189
+ There is exactly one cancellation point, and ``_pending`` is what it cancels: work that has
190
+ not won the condition-protected claim in ``_claim_batch``. The flag only decides whether the
191
+ consumer is given the bounded window to win that claim first, so an unbillable dispatch is
192
+ prevented by never yielding the condition rather than by a second racing check.
185
193
 
186
- The join is bounded because the scorer is a network call that can hang. A batch that lands
187
- within the bound scatters its real results -- ``complete`` is first-writer-wins, so the
188
- drain below cannot overwrite them. One that does not is failed so its callers unblock.
194
+ ``_in_flight`` is the claimed batch, so shutdown retains it through the join and the final
195
+ drain. A batch that lands within the bound scatters its real results; ``complete`` is
196
+ first-writer-wins, so the drain below cannot overwrite them. One that does not is failed so
197
+ its callers unblock.
189
198
 
190
199
  The two callers this replaced spelled the final drain differently -- one gated it on
191
200
  ``thread.is_alive()``, the other ran it unconditionally -- but the forms are equivalent, so
@@ -193,16 +202,30 @@ class ScoreBatcher:
193
202
  its own stranded waiters in ``_run``'s ``finally``, leaving nothing for the drain to find.
194
203
  """
195
204
  error = self._make_error(f"{self.label} shut down")
205
+ deadline = time.monotonic() + max(0.0, timeout_s)
196
206
  with self._condition:
197
207
  self._closed = True
198
- pending = list(self._pending)
199
- self._pending.clear()
200
208
  self._condition.notify_all()
201
209
  thread = self._thread
202
- for waiter in pending:
210
+ # the consumer cannot run while this holds the condition, so skipping the window below
211
+ # means it never gets to claim -- which is exactly what an unbillable dispatch needs.
212
+ while (
213
+ not self._cancel_undispatched_on_close
214
+ and self._pending
215
+ and thread is not None
216
+ and thread.is_alive()
217
+ ):
218
+ remaining = deadline - time.monotonic()
219
+ if remaining <= 0:
220
+ break
221
+ self._condition.wait(remaining)
222
+ cancelled = list(self._pending)
223
+ self._pending.clear()
224
+ self._condition.notify_all()
225
+ for waiter in cancelled:
203
226
  waiter.complete(error=error)
204
227
  if thread is not None:
205
- thread.join(timeout=max(0.0, timeout_s))
228
+ thread.join(timeout=max(0.0, deadline - time.monotonic()))
206
229
  # unconditional: a thread that exited already emptied `_in_flight` and settled its own
207
230
  # stranded waiters, so this is a no-op in that case rather than a second verdict.
208
231
  with self._condition:
@@ -136,8 +136,8 @@ class _TextTeacherBatcher(ScoreBatcher):
136
136
  temperature), and the teacher charges per scored item. Sending the pair once and marking the
137
137
  repeats unbilled keeps the answer identical while paying for it once.
138
138
 
139
- ``recheck_closed_after_wait`` is on: a batch assembled during the flush window after ``close``
140
- must NOT be sent, because a teacher call bills real money and the run is already shutting down.
139
+ ``cancel_undispatched_on_close`` is on: ``close`` cancels any batch that has not yet won the
140
+ dispatch claim, because a teacher call bills real money and the run is already shutting down.
141
141
  """
142
142
 
143
143
  def __init__(
@@ -158,7 +158,7 @@ class _TextTeacherBatcher(ScoreBatcher):
158
158
  thread_name="flash-opd-text-teacher-batcher",
159
159
  make_error=_permanent_teacher_error,
160
160
  wrap_batch_error=_teacher_batch_error,
161
- recheck_closed_after_wait=True,
161
+ cancel_undispatched_on_close=True,
162
162
  )
163
163
  self.teacher = teacher
164
164
  self.on_scored = on_scored
@@ -328,9 +328,9 @@ class _TeacherAlignmentBridge(TeacherFailureRecording):
328
328
  if self.max_turns <= 0:
329
329
  raise ValueError("flash OPD bridge multi-turn limit is invalid")
330
330
 
331
- def _env_call(self, method: str, *args):
331
+ def _env_call(self, method: str, *args, **kwargs):
332
332
  with self.parent_work.busy():
333
- return getattr(self.active_env, method)(*args)
333
+ return getattr(self.active_env, method)(*args, **kwargs)
334
334
 
335
335
  @staticmethod
336
336
  def _validate_session_id(session_id: str) -> str:
@@ -426,12 +426,26 @@ class _TeacherAlignmentBridge(TeacherFailureRecording):
426
426
  existing["lease_deadline"] = now + self.session_lease_s
427
427
  return {"max_turns": existing["turn_limit"]}
428
428
  with self._env_lock:
429
- state = self._env_call("new_rollout_state", prompt.example)
430
- initial_messages, fresh_descriptors = normalize_initial_prompt(
431
- prompt,
432
- state,
433
- self.processor,
429
+ state = self._env_call(
430
+ "new_rollout_state",
431
+ prompt.example,
432
+ prepared_prompt=prompt.student_messages,
434
433
  )
434
+ # the prepared prompt and its descriptors were frozen together before the child
435
+ # authenticated them. normalized image blocks intentionally carry no source, so an
436
+ # exact prepared state must reuse those frozen descriptors instead of rehydrating the
437
+ # prompt and rerunning environment preparation.
438
+ if state.get("prompt") == prompt.student_messages:
439
+ initial_messages = validate_structured_messages(
440
+ state["prompt"], source="environment initial prompt"
441
+ )
442
+ fresh_descriptors = tuple(prompt.image_descriptors)
443
+ else:
444
+ initial_messages, fresh_descriptors = normalize_initial_prompt(
445
+ prompt,
446
+ state,
447
+ self.processor,
448
+ )
435
449
  if initial_messages != frozen_prompt or fresh_descriptors != prompt.image_descriptors:
436
450
  raise ValueError(
437
451
  "multi-turn environment initial prompt changed after prompt freezing"
@@ -127,6 +127,13 @@ def require_operator_config() -> None:
127
127
  problems: list[str] = []
128
128
 
129
129
  configured = available_providers()
130
+ if "vast" in configured or "FLASH_VAST_RESULT_ORIGINS" in os.environ:
131
+ from flash.providers.vast.client.result import configured_result_origins
132
+
133
+ try:
134
+ configured_result_origins()
135
+ except ValueError as exc:
136
+ problems.append(f" - {exc}")
130
137
  if not configured:
131
138
  problems.append(
132
139
  " - no GPU provider is configured. Set at least ONE of:\n"
@@ -12,7 +12,6 @@ import json
12
12
  import time
13
13
  import urllib.error
14
14
  import urllib.parse
15
- import urllib.request
16
15
  from typing import Any
17
16
 
18
17
  from flash._internal.logging import get_logger
@@ -22,6 +21,7 @@ from flash.providers._lifecycle.net.deadline import (
22
21
  require_deadline_at,
23
22
  )
24
23
  from flash.providers._lifecycle.net.http import RestClient, is_not_found
24
+ from flash.providers.vast.client.result import VastResultError, fetch_result
25
25
 
26
26
  logger = get_logger(__name__)
27
27
 
@@ -404,13 +404,13 @@ def instance_logs(instance_id: int, *, deadline_at: float | None = None) -> str
404
404
  if remaining <= 0:
405
405
  break
406
406
  try:
407
- with urllib.request.urlopen(url, timeout=min(15.0, remaining)) as resp:
408
- body = resp.read().decode(errors="replace")
407
+ result = fetch_result(url, timeout=min(15.0, remaining))
408
+ except VastResultError:
409
+ return None
410
+ if result is not None:
411
+ body = result.decode(errors="replace")
409
412
  if body.strip():
410
413
  return body
411
- except urllib.error.HTTPError as e:
412
- if e.code != 404: # 404 = not materialized yet
413
- return None
414
414
  sleep_for = min(2.0, remaining_seconds(poll_deadline))
415
415
  if sleep_for <= 0:
416
416
  break