freesolo-flash-dev 1.2.115__tar.gz → 1.2.116__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 (798) hide show
  1. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/PKG-INFO +1 -1
  2. freesolo_flash_dev-1.2.116/flash/_internal/openai_sse.py +167 -0
  3. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/client/http.py +53 -2
  4. freesolo_flash_dev-1.2.116/flash/engine/verl_checkpoint.py +142 -0
  5. freesolo_flash_dev-1.2.116/flash/engine/verl_policy.py +20 -0
  6. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/opd_train_runner.py +10 -2
  7. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/rl_train_runner.py +5 -1
  8. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/sft_train.py +31 -6
  9. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/sft_train_runner.py +10 -2
  10. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/train/opd/failures.py +21 -12
  11. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/train/opd/overrides.py +4 -3
  12. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/train/opd/state.py +4 -0
  13. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/train/rl/checkpoints.py +31 -6
  14. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/train/rl/inputs.py +4 -0
  15. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/train/rl/verl_config.py +4 -3
  16. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/train/sft/config.py +2 -1
  17. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/verl/capabilities.py +4 -29
  18. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/verl/checkpoints.py +77 -75
  19. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/providers/artifacts/hf.py +166 -69
  20. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/runner/attempts.py +7 -3
  21. freesolo_flash_dev-1.2.116/flash/serve/_chat_transport.py +350 -0
  22. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serve/app/openai.py +23 -141
  23. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serve/deploy.py +126 -118
  24. freesolo_flash_dev-1.2.116/flash/serve/openai_request.py +294 -0
  25. freesolo_flash_dev-1.2.116/flash/serve/provenance.py +168 -0
  26. freesolo_flash_dev-1.2.116/flash/serve/readiness.py +47 -0
  27. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serve/streaming.py +109 -127
  28. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serve/thinking.py +10 -8
  29. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/server/app.py +2 -0
  30. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/server/routes/serving.py +142 -73
  31. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/server/routes/serving_revisions.py +52 -15
  32. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serving/README.md +4 -2
  33. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serving/modal_app.py +24 -52
  34. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serving/src/context.py +98 -40
  35. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serving/src/engine_support.py +30 -0
  36. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serving/src/inference_routes.py +97 -51
  37. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serving/src/lora_engine.py +29 -42
  38. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serving/src/router.py +25 -22
  39. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serving/src/schemas.py +13 -0
  40. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serving/src/serving_io.py +2 -0
  41. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serving/src/settings.py +4 -5
  42. freesolo_flash_dev-1.2.116/flash/serving/src/streaming.py +476 -0
  43. freesolo_flash_dev-1.2.116/flash/serving/src/usage.py +215 -0
  44. freesolo_flash_dev-1.2.116/flash/serving/src/usage_facts.py +54 -0
  45. freesolo_flash_dev-1.2.116/flash/serving/src/usage_outbox.py +986 -0
  46. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/teacher/retry_contract.py +0 -28
  47. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/pyproject.toml +2 -2
  48. freesolo_flash_dev-1.2.116/tests/_helpers/chat_provenance.py +28 -0
  49. freesolo_flash_dev-1.2.116/tests/_helpers/chat_transport.py +63 -0
  50. freesolo_flash_dev-1.2.116/tests/_helpers/managed_chat.py +44 -0
  51. freesolo_flash_dev-1.2.116/tests/_helpers/server_api_plugin.py +3 -0
  52. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/serving/conftest.py +31 -0
  53. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/serving/test_base_model_serving.py +94 -30
  54. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/serving/test_chat_auth.py +4 -2
  55. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/serving/test_chat_authorizer.py +24 -14
  56. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/serving/test_checkpoint_model_validation.py +2 -1
  57. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/serving/test_engine_error_status.py +14 -3
  58. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/serving/test_immutable_revisions.py +10 -6
  59. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/serving/test_modal_image_paths.py +2 -0
  60. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/serving/test_multimodal.py +19 -12
  61. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/serving/test_per_model_gpu.py +18 -7
  62. freesolo_flash_dev-1.2.116/tests/serving/test_pre_first_disconnect.py +472 -0
  63. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/serving/test_request_body_limit.py +3 -2
  64. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/serving/test_router.py +69 -568
  65. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/serving/test_router_coverage.py +47 -76
  66. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/serving/test_router_edge_coverage.py +5 -10
  67. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/serving/test_serve_reasoning_split.py +11 -5
  68. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/serving/test_serve_structured_outputs.py +61 -3
  69. freesolo_flash_dev-1.2.116/tests/serving/test_usage_outbox.py +1934 -0
  70. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/serving/test_usage_reporter.py +48 -230
  71. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_backend_common.py +22 -20
  72. freesolo_flash_dev-1.2.116/tests/test_chat_foundations.py +371 -0
  73. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_client_import_purity.py +22 -0
  74. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_client_stream_reads.py +84 -0
  75. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_deploy_latency.py +2 -0
  76. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_opd_resume_safety.py +151 -26
  77. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_opd_train.py +135 -24
  78. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_resume_on_retry.py +224 -33
  79. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_rl_train.py +49 -22
  80. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_serve.py +0 -421
  81. freesolo_flash_dev-1.2.116/tests/test_serve_chat_transport.py +769 -0
  82. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_serve_reasoning_content.py +36 -3
  83. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_server_api.py +5 -811
  84. freesolo_flash_dev-1.2.116/tests/test_server_managed_chat_requests.py +794 -0
  85. freesolo_flash_dev-1.2.116/tests/test_server_managed_chat_revisions.py +696 -0
  86. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_sft_train.py +28 -5
  87. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/uv.lock +1 -1
  88. freesolo_flash_dev-1.2.115/flash/serving/src/streaming.py +0 -370
  89. freesolo_flash_dev-1.2.115/flash/serving/src/usage.py +0 -117
  90. freesolo_flash_dev-1.2.115/tests/serving/test_pre_first_disconnect.py +0 -419
  91. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/.dockerignore +0 -0
  92. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/.env.example +0 -0
  93. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/.github/CODEOWNERS +0 -0
  94. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  95. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  96. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  97. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  98. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/.github/dependabot.yml +0 -0
  99. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/.github/workflows/auto-rebake.yml +0 -0
  100. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/.github/workflows/bake-kernel-cache.yml +0 -0
  101. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/.github/workflows/ci.yml +0 -0
  102. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/.github/workflows/deploy-modal-dev.yml +0 -0
  103. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/.github/workflows/deploy-modal.yml +0 -0
  104. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/.github/workflows/dev-kernel-cache.yml +0 -0
  105. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/.github/workflows/main-source-guard.yml +0 -0
  106. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/.github/workflows/notify-tests-repo.yml +0 -0
  107. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/.github/workflows/production-kernel-cache-ready.yml +0 -0
  108. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/.github/workflows/publish-dev.yml +0 -0
  109. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/.github/workflows/publish-image.yml +0 -0
  110. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/.github/workflows/publish-serving-image.yml +0 -0
  111. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/.github/workflows/publish.yml +0 -0
  112. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/.github/workflows/version-parity.yml +0 -0
  113. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/.github/workflows/worker-image.yml +0 -0
  114. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/.gitignore +0 -0
  115. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/CHANGELOG.md +0 -0
  116. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/CODE_OF_CONDUCT.md +0 -0
  117. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/CONTRIBUTING.md +0 -0
  118. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/Dockerfile +0 -0
  119. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/Dockerfile.serve +0 -0
  120. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/Dockerfile.worker +0 -0
  121. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/LICENSE +0 -0
  122. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/NOTICE +0 -0
  123. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/README.md +0 -0
  124. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/SECURITY.md +0 -0
  125. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/SELF_HOSTING.md +0 -0
  126. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/build/kernel_cache/.gitignore +0 -0
  127. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/build/kernel_cache/.keep +0 -0
  128. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/deploy/infisical/README.md +0 -0
  129. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/deploy/infisical/entrypoint.sh +0 -0
  130. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/docker/Dockerfile.kernelcache +0 -0
  131. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/docker/Dockerfile.kernelcache.relayer +0 -0
  132. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/docker/bake_kernel_cache.py +0 -0
  133. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/docker/bake_pod_entry.py +0 -0
  134. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/docker/extract_cudart_fix.py +0 -0
  135. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/docker/kernel_fingerprint.py +0 -0
  136. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/docker/make_rp_handler.py +0 -0
  137. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/docs/serving-contract.md +0 -0
  138. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/__init__.py +0 -0
  139. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/_internal/__init__.py +0 -0
  140. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/_internal/channel.py +0 -0
  141. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/_internal/diagnostics.py +0 -0
  142. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/_internal/fileio.py +0 -0
  143. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/_internal/logging.py +0 -0
  144. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/_internal/paths.py +0 -0
  145. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/adapters/__init__.py +0 -0
  146. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/adapters/artifacts.py +0 -0
  147. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/adapters/fused_experts.py +0 -0
  148. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/adapters/lora_rank.py +0 -0
  149. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/adapters/targets.py +0 -0
  150. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/cli/__init__.py +0 -0
  151. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/cli/__main__.py +0 -0
  152. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/cli/commands/__init__.py +0 -0
  153. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/cli/commands/deploy.py +0 -0
  154. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/cli/commands/env/__init__.py +0 -0
  155. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/cli/commands/env/episode.py +0 -0
  156. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/cli/commands/env/eval.py +0 -0
  157. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/cli/commands/env/eval_args.py +0 -0
  158. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/cli/commands/env/imports.py +0 -0
  159. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/cli/commands/env/list.py +0 -0
  160. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/cli/commands/env/push.py +0 -0
  161. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/cli/commands/env/retained.py +0 -0
  162. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/cli/commands/env/setup.py +0 -0
  163. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/cli/commands/env/setup_wandb.py +0 -0
  164. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/cli/commands/env/test.py +0 -0
  165. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/cli/commands/env/test_evaluations.py +0 -0
  166. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/cli/commands/env/test_params.py +0 -0
  167. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/cli/commands/env/test_warnings.py +0 -0
  168. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/cli/commands/log_follow.py +0 -0
  169. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/cli/commands/prompt_budget.py +0 -0
  170. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/cli/commands/serve_deploy.py +0 -0
  171. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/cli/commands/serve_identity.py +0 -0
  172. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/cli/commands/serve_status.py +0 -0
  173. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/cli/commands/serve_undeploy.py +0 -0
  174. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/cli/commands/traces.py +0 -0
  175. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/cli/commands/train_cost.py +0 -0
  176. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/cli/commands/worker_output.py +0 -0
  177. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/cli/errors.py +0 -0
  178. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/cli/scaffold/TRAINING.md +0 -0
  179. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/cli/scaffold/__init__.py +0 -0
  180. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/cli/serve_parser.py +0 -0
  181. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/cli/ui/__init__.py +0 -0
  182. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/cli/ui/cost.py +0 -0
  183. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/cli/ui/env_panels.py +0 -0
  184. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/cli/ui/heartbeat.py +0 -0
  185. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/cli/ui/render.py +0 -0
  186. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/cli/ui/tables.py +0 -0
  187. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/cli/ui/tty.py +0 -0
  188. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/client/__init__.py +0 -0
  189. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/client/config.py +0 -0
  190. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/client/freesolo_api.py +0 -0
  191. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/client/runtime_secrets.py +0 -0
  192. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/client/shapes.py +0 -0
  193. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/client/specs.py +0 -0
  194. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/client/streaming.py +0 -0
  195. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/content/__init__.py +0 -0
  196. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/content/image_descriptors.py +0 -0
  197. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/content/multimodal.py +0 -0
  198. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/content/reasoning_normalization.py +0 -0
  199. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/content/structured_outputs.py +0 -0
  200. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/content/thinking.py +0 -0
  201. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/core/__init__.py +0 -0
  202. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/core/catalog.py +0 -0
  203. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/core/grpo.py +0 -0
  204. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/core/spec.py +0 -0
  205. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/core/spec_persistence.py +0 -0
  206. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/cost/__init__.py +0 -0
  207. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/cost/analytical.py +0 -0
  208. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/cost/currency.py +0 -0
  209. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/cost/facts.py +0 -0
  210. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/cost/spec.py +0 -0
  211. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/cost/types.py +0 -0
  212. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/__init__.py +0 -0
  213. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/huggingface.py +0 -0
  214. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/plan/__init__.py +0 -0
  215. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/plan/kv_sizing.py +0 -0
  216. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/plan/model_config_probe.py +0 -0
  217. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/plan/prompt_budget.py +0 -0
  218. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/plan/recipe.py +0 -0
  219. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/plan/steps.py +0 -0
  220. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/plan/vram.py +0 -0
  221. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/profiling/__init__.py +0 -0
  222. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/profiling/dataset_profile.py +0 -0
  223. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/profiling/image_tokens.py +0 -0
  224. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/profiling/reasoning_render.py +0 -0
  225. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/profiling/sft_image_rows.py +0 -0
  226. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/profiling/sft_workload.py +0 -0
  227. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/profiling/tokenizer.py +0 -0
  228. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/profiling/workload_profile.py +0 -0
  229. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/result/__init__.py +0 -0
  230. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/result/accounting.py +0 -0
  231. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/result/rollout_samples.py +0 -0
  232. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/__init__.py +0 -0
  233. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/__main__.py +0 -0
  234. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/backend_common.py +0 -0
  235. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/entry/__init__.py +0 -0
  236. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/entry/opd.py +0 -0
  237. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/entry/rl.py +0 -0
  238. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/entry/sft.py +0 -0
  239. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/io/__init__.py +0 -0
  240. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/io/heartbeat.py +0 -0
  241. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/io/hf.py +0 -0
  242. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/io/prefetch.py +0 -0
  243. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/io/wandb_log.py +0 -0
  244. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/model/__init__.py +0 -0
  245. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/model/adapter.py +0 -0
  246. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/model/chatml_mask.py +0 -0
  247. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/model/decoding.py +0 -0
  248. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/model/lora.py +0 -0
  249. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/model/packing.py +0 -0
  250. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/opd_train.py +0 -0
  251. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/perf/__init__.py +0 -0
  252. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/perf/diagnostics.py +0 -0
  253. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/perf/lifecycle.py +0 -0
  254. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/perf/liger.py +0 -0
  255. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/perf/memory.py +0 -0
  256. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/rl_train.py +0 -0
  257. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/runtime/__init__.py +0 -0
  258. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/runtime/kernel_warmup.py +0 -0
  259. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/runtime/pkg_proxy.py +0 -0
  260. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/runtime/rng.py +0 -0
  261. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/score_batcher.py +0 -0
  262. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/teacher/__init__.py +0 -0
  263. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/teacher/client.py +0 -0
  264. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/teacher/encoding.py +0 -0
  265. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/teacher/tokenizer_align.py +0 -0
  266. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/train/__init__.py +0 -0
  267. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/train/core/__init__.py +0 -0
  268. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/train/core/checkpoint_lifecycle.py +0 -0
  269. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/train/core/child/__init__.py +0 -0
  270. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/train/core/child/glue.py +0 -0
  271. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/train/core/child/runtime.py +0 -0
  272. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/train/core/prompt_rows.py +0 -0
  273. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/train/core/step_timing.py +0 -0
  274. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/train/finalize.py +0 -0
  275. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/train/opd/__init__.py +0 -0
  276. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/train/opd/batching.py +0 -0
  277. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/train/opd/bridge.py +0 -0
  278. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/train/opd/bridge_failures.py +0 -0
  279. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/train/opd/child/__init__.py +0 -0
  280. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/train/opd/child/bridge.py +0 -0
  281. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/train/opd/child/entry.py +0 -0
  282. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/train/opd/child/multiturn.py +0 -0
  283. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/train/opd/child/plugin.py +0 -0
  284. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/train/opd/child/replay_guard.py +0 -0
  285. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/train/opd/child/runtime.py +0 -0
  286. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/train/opd/child/structured.py +0 -0
  287. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/train/opd/gkd.py +0 -0
  288. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/train/opd/multiturn_media.py +0 -0
  289. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/train/opd/multiturn_validation.py +0 -0
  290. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/train/opd/prompt_preparation.py +0 -0
  291. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/train/opd/prompts.py +0 -0
  292. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/train/opd/reporting.py +0 -0
  293. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/train/opd/scoring.py +0 -0
  294. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/train/opd/validation.py +0 -0
  295. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/train/rl/__init__.py +0 -0
  296. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/train/rl/child/__init__.py +0 -0
  297. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/train/rl/child/entry.py +0 -0
  298. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/train/rl/child/multiturn.py +0 -0
  299. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/train/rl/child/patches.py +0 -0
  300. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/train/rl/child/plugin.py +0 -0
  301. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/train/rl/config.py +0 -0
  302. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/train/rl/identity.py +0 -0
  303. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/train/rl/multi_turn.py +0 -0
  304. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/train/rl/reward_module.py +0 -0
  305. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/train/rl/scoring.py +0 -0
  306. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/train/rl/single_turn.py +0 -0
  307. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/train/sft/__init__.py +0 -0
  308. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/train/sft/checkpoints.py +0 -0
  309. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/train/sft/child/entry.py +0 -0
  310. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/train/sft/child/plugin.py +0 -0
  311. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/verl/__init__.py +0 -0
  312. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/verl/child_io.py +0 -0
  313. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/verl/diagnostics.py +0 -0
  314. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/verl/parallelism.py +0 -0
  315. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/verl/parent_work.py +0 -0
  316. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker/verl/process_census.py +0 -0
  317. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/engine/worker_entrypoint.py +0 -0
  318. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/envs/__init__.py +0 -0
  319. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/envs/adapter.py +0 -0
  320. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/envs/base.py +0 -0
  321. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/envs/cache_security.py +0 -0
  322. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/envs/dataset_selection.py +0 -0
  323. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/envs/evaluations.py +0 -0
  324. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/envs/identity.py +0 -0
  325. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/envs/loader.py +0 -0
  326. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/envs/namespace_listing.py +0 -0
  327. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/envs/package/__init__.py +0 -0
  328. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/envs/package/direct_tokens.py +0 -0
  329. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/envs/package/limits.py +0 -0
  330. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/envs/package/unpack.py +0 -0
  331. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/envs/pull.py +0 -0
  332. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/envs/staged.py +0 -0
  333. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/providers/__init__.py +0 -0
  334. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/providers/_lifecycle/__init__.py +0 -0
  335. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/providers/_lifecycle/auth.py +0 -0
  336. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/providers/_lifecycle/bootstrap.py +0 -0
  337. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/providers/_lifecycle/bootstrap_console.py +0 -0
  338. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/providers/_lifecycle/bootstrap_pip.py +0 -0
  339. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/providers/_lifecycle/bootstrap_secrets.py +0 -0
  340. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/providers/_lifecycle/deadline.py +0 -0
  341. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/providers/_lifecycle/host/__init__.py +0 -0
  342. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/providers/_lifecycle/host/deadline_sleep.py +0 -0
  343. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/providers/_lifecycle/host/failmark.py +0 -0
  344. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/providers/_lifecycle/host/hostlog.py +0 -0
  345. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/providers/_lifecycle/http.py +0 -0
  346. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/providers/_lifecycle/instance.py +0 -0
  347. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/providers/_lifecycle/poll.py +0 -0
  348. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/providers/_lifecycle/poll_instance.py +0 -0
  349. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/providers/_lifecycle/provider.py +0 -0
  350. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/providers/_lifecycle/terminal_artifacts.py +0 -0
  351. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/providers/_lifecycle/worker.py +0 -0
  352. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/providers/allocator.py +0 -0
  353. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/providers/artifacts/__init__.py +0 -0
  354. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/providers/artifacts/preload_runpod.py +0 -0
  355. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/providers/artifacts/weight_cache.py +0 -0
  356. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/providers/base.py +0 -0
  357. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/providers/fit_errors.py +0 -0
  358. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/providers/lambda_/__init__.py +0 -0
  359. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/providers/lambda_/api.py +0 -0
  360. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/providers/lambda_/auth.py +0 -0
  361. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/providers/lambda_/gpus.py +0 -0
  362. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/providers/lambda_/jobs/__init__.py +0 -0
  363. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/providers/lambda_/jobs/builders.py +0 -0
  364. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/providers/lambda_/jobs/reap.py +0 -0
  365. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/providers/lambda_/preflight.py +0 -0
  366. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/providers/lambda_/pricing.py +0 -0
  367. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/providers/preflight.py +0 -0
  368. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/providers/realized.py +0 -0
  369. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/providers/runpod/__init__.py +0 -0
  370. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/providers/runpod/api.py +0 -0
  371. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/providers/runpod/auth.py +0 -0
  372. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/providers/runpod/cost.py +0 -0
  373. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/providers/runpod/gpus.py +0 -0
  374. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/providers/runpod/job_execution.py +0 -0
  375. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/providers/runpod/jobs.py +0 -0
  376. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/providers/runpod/preflight.py +0 -0
  377. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/providers/runpod/pricing.py +0 -0
  378. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/providers/runpod/resources.py +0 -0
  379. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/providers/runpod/serverless/__init__.py +0 -0
  380. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/providers/runpod/serverless/endpoints.py +0 -0
  381. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/providers/sharding.py +0 -0
  382. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/providers/vast/__init__.py +0 -0
  383. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/providers/vast/api.py +0 -0
  384. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/providers/vast/auth.py +0 -0
  385. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/providers/vast/jobs/__init__.py +0 -0
  386. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/providers/vast/jobs/builders.py +0 -0
  387. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/providers/vast/preflight.py +0 -0
  388. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/providers/vast/pricing.py +0 -0
  389. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/py.typed +0 -0
  390. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/runner/__init__.py +0 -0
  391. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/runner/artifacts.py +0 -0
  392. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/runner/costs.py +0 -0
  393. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/runner/deadlines.py +0 -0
  394. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/runner/preparation.py +0 -0
  395. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/runner/reconciliation.py +0 -0
  396. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/runner/results/__init__.py +0 -0
  397. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/runner/results/checkpoints.py +0 -0
  398. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/runner/results/verified_revisions.py +0 -0
  399. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/runner/status.py +0 -0
  400. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/runner/submit.py +0 -0
  401. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/runner/supervise/__init__.py +0 -0
  402. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/runner/supervise/attach.py +0 -0
  403. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/runner/supervise/deploy.py +0 -0
  404. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/runner/supervise/lifecycle.py +0 -0
  405. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/runner/supervise/recovery.py +0 -0
  406. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/runner/supervise/retry_decision.py +0 -0
  407. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/runner/supervise/seed_submission.py +0 -0
  408. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/runner/supervise/transitions.py +0 -0
  409. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/runner/weight_cache.py +0 -0
  410. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/runtime_capsule/__init__.py +0 -0
  411. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/runtime_capsule/build.py +0 -0
  412. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/runtime_capsule/manifest.py +0 -0
  413. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/runtime_capsule/profiles.py +0 -0
  414. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/schema/__init__.py +0 -0
  415. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/schema/fields.py +0 -0
  416. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serve/__init__.py +0 -0
  417. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serve/adapter_check.py +0 -0
  418. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serve/app/__init__.py +0 -0
  419. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serve/app/__main__.py +0 -0
  420. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serve/app/bootstrap.py +0 -0
  421. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serve/app/http.py +0 -0
  422. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serve/app/launch.py +0 -0
  423. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serve/app/manifest.py +0 -0
  424. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serve/app/materialize.py +0 -0
  425. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serve/app/progress.py +0 -0
  426. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serve/contract.py +0 -0
  427. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serve/control/__init__.py +0 -0
  428. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serve/control/_canonical.py +0 -0
  429. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serve/control/_serialization.py +0 -0
  430. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serve/control/_urls.py +0 -0
  431. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serve/control/credentials.py +0 -0
  432. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serve/control/planning.py +0 -0
  433. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serve/control/types.py +0 -0
  434. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serve/errors.py +0 -0
  435. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serve/export.py +0 -0
  436. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serve/preflight.py +0 -0
  437. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serve/profiles.py +0 -0
  438. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serve/provisioning/__init__.py +0 -0
  439. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serve/provisioning/_common.py +0 -0
  440. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serve/provisioning/_modal_deployment.py +0 -0
  441. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serve/provisioning/_modal_lifecycle.py +0 -0
  442. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serve/provisioning/_modal_plan.py +0 -0
  443. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serve/provisioning/_modal_probe.py +0 -0
  444. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serve/provisioning/_modal_readiness.py +0 -0
  445. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serve/provisioning/_modal_resources.py +0 -0
  446. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serve/provisioning/_modal_sdk.py +0 -0
  447. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serve/provisioning/_modal_teardown.py +0 -0
  448. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serve/provisioning/_modal_wrapper.py +0 -0
  449. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serve/provisioning/_runpod_lifecycle.py +0 -0
  450. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serve/provisioning/_runpod_mutations.py +0 -0
  451. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serve/provisioning/_runpod_plan.py +0 -0
  452. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serve/provisioning/_runpod_probe.py +0 -0
  453. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serve/provisioning/_runpod_protocol.py +0 -0
  454. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serve/provisioning/_runpod_readiness.py +0 -0
  455. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serve/provisioning/_runpod_resources.py +0 -0
  456. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serve/provisioning/_runpod_transport.py +0 -0
  457. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serve/provisioning/modal.py +0 -0
  458. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serve/provisioning/runpod.py +0 -0
  459. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serve/request_validation.py +0 -0
  460. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serve/resolve.py +0 -0
  461. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serve/responses.py +0 -0
  462. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serve/runtime/__init__.py +0 -0
  463. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serve/runtime/adapters.py +0 -0
  464. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serve/runtime/engine.py +0 -0
  465. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serve/runtime/errors.py +0 -0
  466. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serve/runtime/multimodal.py +0 -0
  467. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serve/runtime/prompt.py +0 -0
  468. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serve/runtime/structured_outputs.py +0 -0
  469. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serve/runtime/types.py +0 -0
  470. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serve/runtime_support.py +0 -0
  471. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serve/urls.py +0 -0
  472. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/server/__init__.py +0 -0
  473. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/server/__main__.py +0 -0
  474. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/server/billing/__init__.py +0 -0
  475. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/server/billing/charges.py +0 -0
  476. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/server/billing/retry.py +0 -0
  477. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/server/domain/__init__.py +0 -0
  478. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/server/domain/checkpoints.py +0 -0
  479. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/server/domain/environment_registry.py +0 -0
  480. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/server/domain/envs.py +0 -0
  481. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/server/domain/projects.py +0 -0
  482. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/server/domain/reconcile.py +0 -0
  483. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/server/domain/repo_cleanup.py +0 -0
  484. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/server/domain/run_registry.py +0 -0
  485. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/server/domain/serving_resources.py +0 -0
  486. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/server/domain/teacher_broker.py +0 -0
  487. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/server/domain/teacher_errors.py +0 -0
  488. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/server/domain/teacher_requests.py +0 -0
  489. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/server/platform/__init__.py +0 -0
  490. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/server/platform/auth.py +0 -0
  491. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/server/platform/db.py +0 -0
  492. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/server/platform/deps.py +0 -0
  493. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/server/platform/internal_client.py +0 -0
  494. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/server/platform/locks.py +0 -0
  495. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/server/platform/runtime.py +0 -0
  496. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/server/routes/__init__.py +0 -0
  497. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/server/routes/envs.py +0 -0
  498. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/server/routes/meta.py +0 -0
  499. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/server/routes/runs.py +0 -0
  500. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/server/routes/serving_completion.py +0 -0
  501. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/server/routes/serving_smoke.py +0 -0
  502. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/server/routes/teacher.py +0 -0
  503. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serving/__init__.py +0 -0
  504. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serving/src/__init__.py +0 -0
  505. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serving/src/adapter_routes.py +0 -0
  506. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serving/src/body_limit.py +0 -0
  507. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serving/src/engine_boot.py +0 -0
  508. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serving/src/engine_errors.py +0 -0
  509. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serving/src/http_headers.py +0 -0
  510. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serving/src/lookup.py +0 -0
  511. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serving/src/lora_entries.py +0 -0
  512. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serving/src/model_config.py +0 -0
  513. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serving/src/multimodal.py +0 -0
  514. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serving/src/persisted_columns.py +0 -0
  515. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serving/src/persistence.py +0 -0
  516. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serving/src/prequant_config.py +0 -0
  517. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serving/src/registration.py +0 -0
  518. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serving/src/registry.py +0 -0
  519. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serving/src/responses.py +0 -0
  520. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serving/src/routing.py +0 -0
  521. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serving/src/structured_outputs.py +0 -0
  522. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serving/src/supabase_rest.py +0 -0
  523. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/serving/src/undeploy.py +0 -0
  524. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/source_snapshot.py +0 -0
  525. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/teacher/__init__.py +0 -0
  526. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/teacher/limits.py +0 -0
  527. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/flash/teacher/provider_status.py +0 -0
  528. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/scripts/build_dev_dist.py +0 -0
  529. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/scripts/check_file_size.py +0 -0
  530. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/scripts/check_function_size.py +0 -0
  531. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/scripts/check_rollout_identity_actor.py +0 -0
  532. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/scripts/check_verl_pin_exists.py +0 -0
  533. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/scripts/scrub_history.sh +0 -0
  534. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/serve_launch.py +0 -0
  535. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/__init__.py +0 -0
  536. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/_helpers/__init__.py +0 -0
  537. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/_helpers/profile.py +0 -0
  538. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/_helpers/runner.py +0 -0
  539. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/_helpers/source_snapshot.py +0 -0
  540. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/_helpers/specs.py +0 -0
  541. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/_helpers/teacher.py +0 -0
  542. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/_helpers/vast.py +0 -0
  543. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/capture_image_sft_processor_oracle.py +0 -0
  544. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/capture_qwen38_27b_metadata.py +0 -0
  545. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/conftest.py +0 -0
  546. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/fixtures/image_sft_processor_oracle.json +0 -0
  547. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/fixtures/qwen35_9b_target_metadata.json +0 -0
  548. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/fixtures/qwen38_27b_target_metadata.json +0 -0
  549. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/live/__init__.py +0 -0
  550. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/live/conftest.py +0 -0
  551. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/live/test_lambda_live.py +0 -0
  552. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/live/test_runpod_live.py +0 -0
  553. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/live/test_sft_thinking_render_live.py +0 -0
  554. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/live/test_vast_live.py +0 -0
  555. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/serving/test_fp8_config.py +0 -0
  556. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/serving/test_immutable_engine.py +0 -0
  557. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/serving/test_immutable_schemas.py +0 -0
  558. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/serving/test_modal_deploy_identity.py +0 -0
  559. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/serving/test_model_config.py +0 -0
  560. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/serving/test_openai_stream_options.py +0 -0
  561. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/serving/test_persistence.py +0 -0
  562. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/serving/test_prequant_config.py +0 -0
  563. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/serving/test_registry.py +0 -0
  564. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/serving/test_registry_coverage.py +0 -0
  565. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/serving/test_schemas_coverage.py +0 -0
  566. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/serving/test_serve_thinking.py +0 -0
  567. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/serving/test_settings.py +0 -0
  568. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/serving/test_structured_outputs.py +0 -0
  569. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/serving/test_structured_outputs_coverage.py +0 -0
  570. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/serving/test_supabase_rest_coverage.py +0 -0
  571. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/serving_conformance/__init__.py +0 -0
  572. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/serving_conformance/conftest.py +0 -0
  573. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/serving_conformance/test_contract.py +0 -0
  574. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_accounting_coverage.py +0 -0
  575. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_adapter_shard_completeness.py +0 -0
  576. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_agent_flash_cli_contract.py +0 -0
  577. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_algorithms.py +0 -0
  578. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_allocator.py +0 -0
  579. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_backend_jobspec_contract.py +0 -0
  580. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_bake_kernel_cache.py +0 -0
  581. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_base_model_provenance.py +0 -0
  582. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_billing_retry.py +0 -0
  583. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_build_context_contract.py +0 -0
  584. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_cancel_remote.py +0 -0
  585. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_capture_qwen38_metadata.py +0 -0
  586. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_catalog_consistency.py +0 -0
  587. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_catalog_only_models.py +0 -0
  588. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_charge_pricing.py +0 -0
  589. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_checkpoint_lifecycle.py +0 -0
  590. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_checkpoints.py +0 -0
  591. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_cli_commands.py +0 -0
  592. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_cli_commands_coverage.py +0 -0
  593. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_cli_credential_shadowing.py +0 -0
  594. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_cli_errors.py +0 -0
  595. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_cli_estimate.py +0 -0
  596. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_cli_gpus_flag.py +0 -0
  597. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_cli_help.py +0 -0
  598. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_cli_main_coverage.py +0 -0
  599. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_cli_managed.py +0 -0
  600. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_cli_render_coverage.py +0 -0
  601. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_cli_render_theme.py +0 -0
  602. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_cli_serve_deploy.py +0 -0
  603. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_cli_serve_status.py +0 -0
  604. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_cli_serve_undeploy.py +0 -0
  605. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_cli_traces.py +0 -0
  606. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_cli_wandb_warning.py +0 -0
  607. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_client.py +0 -0
  608. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_client_server_integration.py +0 -0
  609. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_config_env_vars.py +0 -0
  610. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_config_overrides.py +0 -0
  611. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_console_upload.py +0 -0
  612. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_controlled_experiment_repairs.py +0 -0
  613. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_cost_analytical.py +0 -0
  614. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_cost_currency.py +0 -0
  615. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_cost_equation.py +0 -0
  616. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_cost_estimate.py +0 -0
  617. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_cost_hardware.py +0 -0
  618. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_cost_models.py +0 -0
  619. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_dataset_profile.py +0 -0
  620. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_deploy_alias_move_warning.py +0 -0
  621. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_dev_channel.py +0 -0
  622. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_disk_gb.py +0 -0
  623. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_endpoint_name.py +0 -0
  624. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_env_cache_evict.py +0 -0
  625. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_env_delete.py +0 -0
  626. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_env_download.py +0 -0
  627. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_env_download_api.py +0 -0
  628. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_env_evaluations.py +0 -0
  629. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_env_list_api.py +0 -0
  630. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_env_list_cli.py +0 -0
  631. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_env_list_hub.py +0 -0
  632. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_env_no_install.py +0 -0
  633. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_env_publish.py +0 -0
  634. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_env_pull.py +0 -0
  635. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_env_pull_coverage.py +0 -0
  636. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_env_pull_loader_coverage.py +0 -0
  637. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_env_pull_managed_control_plane.py +0 -0
  638. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_env_push.py +0 -0
  639. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_env_rate_limit_resolve.py +0 -0
  640. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_env_ref_pinning.py +0 -0
  641. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_env_test.py +0 -0
  642. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_envs_coverage.py +0 -0
  643. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_export.py +0 -0
  644. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_flash_mvp.py +0 -0
  645. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_flash_worker.py +0 -0
  646. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_flashinfer_cache_dirs.py +0 -0
  647. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_freesolo_api_transport.py +0 -0
  648. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_fused_expert_warmstart.py +0 -0
  649. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_github_urlopen_retry.py +0 -0
  650. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_gpu_type_single_field.py +0 -0
  651. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_gpus.py +0 -0
  652. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_grpo_params.py +0 -0
  653. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_grpo_process_census.py +0 -0
  654. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_grpo_resident_sizing.py +0 -0
  655. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_grpo_reward_batching.py +0 -0
  656. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_grpo_rollout_contract.py +0 -0
  657. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_grpo_rollout_identity.py +0 -0
  658. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_health_liveness.py +0 -0
  659. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_hf_retry.py +0 -0
  660. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_idle_endpoint_reaper.py +0 -0
  661. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_image_environment_capability.py +0 -0
  662. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_image_incremental_processor.py +0 -0
  663. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_image_sft_markers.py +0 -0
  664. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_image_sft_processor_parity.py +0 -0
  665. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_image_tokens.py +0 -0
  666. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_infisical_secrets.py +0 -0
  667. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_instance_bootstrap_coverage.py +0 -0
  668. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_internal_client.py +0 -0
  669. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_jobs.py +0 -0
  670. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_kernel_cache.py +0 -0
  671. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_kernel_fingerprint.py +0 -0
  672. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_kv_util.py +0 -0
  673. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_lambda_api_coverage.py +0 -0
  674. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_lambda_runner.py +0 -0
  675. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_logging.py +0 -0
  676. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_login_perms.py +0 -0
  677. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_lora_rank_coverage.py +0 -0
  678. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_lora_rank_nested_rung.py +0 -0
  679. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_lora_rank_preflight.py +0 -0
  680. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_lora_targeting.py +0 -0
  681. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_lora_targeting_pinned_verl.py +0 -0
  682. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_managed_config_fields.py +0 -0
  683. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_managed_hf_repo.py +0 -0
  684. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_metrics_schema_agent_contract.py +0 -0
  685. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_mig_guard.py +0 -0
  686. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_multi_gpu_gate.py +0 -0
  687. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_multimodal_training.py +0 -0
  688. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_named_reward_metrics.py +0 -0
  689. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_oom_escalate_gpu.py +0 -0
  690. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_opd.py +0 -0
  691. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_opd_limits.py +0 -0
  692. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_opd_multiturn_eos_boundary.py +0 -0
  693. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_opd_multiturn_failure_exit.py +0 -0
  694. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_opd_replay_guard.py +0 -0
  695. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_orchestrator_flash.py +0 -0
  696. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_packing.py +0 -0
  697. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_packing_coverage.py +0 -0
  698. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_parasail_teacher.py +0 -0
  699. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_persisted_spec_envelope.py +0 -0
  700. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_poll_helpers.py +0 -0
  701. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_preflight.py +0 -0
  702. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_projects.py +0 -0
  703. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_prompt_budget.py +0 -0
  704. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_provider_preflight_coverage.py +0 -0
  705. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_provider_routing.py +0 -0
  706. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_provider_teardown_robustness.py +0 -0
  707. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_providers_symmetry.py +0 -0
  708. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_realized_cost.py +0 -0
  709. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_repo_cleanup.py +0 -0
  710. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_resolve_params_b.py +0 -0
  711. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_rollout_samples.py +0 -0
  712. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_runmgmt.py +0 -0
  713. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_runpod_api_delete.py +0 -0
  714. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_runpod_key_fingerprint.py +0 -0
  715. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_runpod_key_waterfall.py +0 -0
  716. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_runtime_capsule.py +0 -0
  717. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_serve_app_bootstrap_http.py +0 -0
  718. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_serve_app_launch.py +0 -0
  719. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_serve_app_manifest.py +0 -0
  720. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_serve_app_materialize.py +0 -0
  721. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_serve_app_packaging.py +0 -0
  722. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_serve_control.py +0 -0
  723. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_serve_modal_sdk.py +0 -0
  724. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_serve_modal_sdk_deadlines.py +0 -0
  725. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_serve_modal_teardown_identity.py +0 -0
  726. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_serve_profiles.py +0 -0
  727. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_serve_provisioning_common.py +0 -0
  728. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_serve_provisioning_modal.py +0 -0
  729. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_serve_provisioning_runpod.py +0 -0
  730. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_serve_resolve_provenance.py +0 -0
  731. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_serve_runtime_adapters.py +0 -0
  732. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_serve_runtime_engine.py +0 -0
  733. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_serve_runtime_package.py +0 -0
  734. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_serve_runtime_types.py +0 -0
  735. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_server_app_coverage.py +0 -0
  736. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_server_auth_singleflight.py +0 -0
  737. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_server_billing.py +0 -0
  738. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_server_checkpoints_coverage.py +0 -0
  739. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_server_db.py +0 -0
  740. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_server_envs_coverage.py +0 -0
  741. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_server_locks_coverage.py +0 -0
  742. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_server_serving_resources.py +0 -0
  743. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_server_standalone.py +0 -0
  744. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_serving_conformance_gate.py +0 -0
  745. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_serving_context_preflight.py +0 -0
  746. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_serving_contract.py +0 -0
  747. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_serving_schema_coverage.py +0 -0
  748. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_sft_chunked_nll.py +0 -0
  749. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_sft_example_selection.py +0 -0
  750. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_sft_gc_off.py +0 -0
  751. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_sft_max_context.py +0 -0
  752. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_sft_step_floor.py +0 -0
  753. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_sft_workload.py +0 -0
  754. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_source_attestation_flow.py +0 -0
  755. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_source_snapshot.py +0 -0
  756. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_spec_and_validation.py +0 -0
  757. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_spec_contract_bytes.py +0 -0
  758. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_staged_environment.py +0 -0
  759. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_step_floor.py +0 -0
  760. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_step_metrics.py +0 -0
  761. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_step_timing.py +0 -0
  762. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_structured_outputs.py +0 -0
  763. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_teacher_broker.py +0 -0
  764. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_teacher_encoding_contract.py +0 -0
  765. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_terminal_artifacts.py +0 -0
  766. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_thinking_config.py +0 -0
  767. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_train_context_preflight.py +0 -0
  768. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_training_controls.py +0 -0
  769. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_type_comment_prose.py +0 -0
  770. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_vast_api.py +0 -0
  771. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_vast_api_coverage.py +0 -0
  772. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_vast_offers.py +0 -0
  773. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_vast_provider_coverage.py +0 -0
  774. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_vast_runner.py +0 -0
  775. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_verified_revisions.py +0 -0
  776. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_verifiers.py +0 -0
  777. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_verl_checkpoint_export.py +0 -0
  778. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_verl_child_plugins.py +0 -0
  779. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_verl_silence_watchdog.py +0 -0
  780. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_version.py +0 -0
  781. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_vl_warmstart_adapter_keys.py +0 -0
  782. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_vram_architecture.py +0 -0
  783. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_wandb_link.py +0 -0
  784. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_wandb_naming.py +0 -0
  785. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_warmstart_adapter_download.py +0 -0
  786. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_warmstart_cross_repo.py +0 -0
  787. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_warmstart_error_attribution.py +0 -0
  788. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_warmstart_image_adapters.py +0 -0
  789. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_weight_cache.py +0 -0
  790. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_worker_dryrun.py +0 -0
  791. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_worker_hardexit.py +0 -0
  792. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_worker_image.py +0 -0
  793. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_worker_init_heartbeat.py +0 -0
  794. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_worker_stack.py +0 -0
  795. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_worker_thinking.py +0 -0
  796. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_workflow_contracts.py +0 -0
  797. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_workload_profile.py +0 -0
  798. {freesolo_flash_dev-1.2.115 → freesolo_flash_dev-1.2.116}/tests/test_zero2_sharding_gate.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: freesolo-flash-dev
3
- Version: 1.2.115
3
+ Version: 1.2.116
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
@@ -0,0 +1,167 @@
1
+ """pure-stdlib decoding for openai-compatible server-sent events."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import json
6
+ from collections.abc import Iterable, Iterator
7
+ from dataclasses import dataclass
8
+
9
+
10
+ class OpenAISSEError(ValueError):
11
+ """one decoded event stream violated the openai sse contract."""
12
+
13
+
14
+ @dataclass(frozen=True, slots=True)
15
+ class DeltaEvent:
16
+ reasoning_content: str | None
17
+ content: str | None
18
+
19
+
20
+ @dataclass(frozen=True, slots=True)
21
+ class ErrorEvent:
22
+ message: str
23
+
24
+
25
+ @dataclass(frozen=True, slots=True)
26
+ class DoneEvent:
27
+ pass
28
+
29
+
30
+ OpenAISSEEvent = DeltaEvent | ErrorEvent | DoneEvent
31
+
32
+ _UTF8_BOM = chr(0xFEFF)
33
+
34
+
35
+ def _next_sse_line(buffered: str, *, final: bool = False) -> tuple[str, str] | None:
36
+ for index, character in enumerate(buffered):
37
+ if character == "\n":
38
+ return buffered[:index], buffered[index + 1 :]
39
+ if character != "\r":
40
+ continue
41
+ if index + 1 == len(buffered) and not final:
42
+ return None
43
+ delimiter_length = 2 if buffered[index + 1 : index + 2] == "\n" else 1
44
+ return buffered[:index], buffered[index + delimiter_length :]
45
+ return None
46
+
47
+
48
+ def iter_openai_sse_events(chunks: Iterable[str]) -> Iterator[OpenAISSEEvent]:
49
+ """decode arbitrary text chunks and require one terminal event."""
50
+
51
+ buffered = ""
52
+ frame_lines: list[str] = []
53
+ first_line = True
54
+ for chunk in chunks:
55
+ buffered += chunk
56
+ while parsed := _next_sse_line(buffered):
57
+ line, buffered = parsed
58
+ if first_line:
59
+ line = line.removeprefix(_UTF8_BOM)
60
+ first_line = False
61
+ if line:
62
+ frame_lines.append(line)
63
+ continue
64
+ for event in _events_from_frame(frame_lines):
65
+ yield event
66
+ if isinstance(event, DoneEvent | ErrorEvent):
67
+ return
68
+ frame_lines = []
69
+ while parsed := _next_sse_line(buffered, final=True):
70
+ line, buffered = parsed
71
+ if first_line:
72
+ line = line.removeprefix(_UTF8_BOM)
73
+ first_line = False
74
+ if line:
75
+ frame_lines.append(line)
76
+ continue
77
+ for event in _events_from_frame(frame_lines):
78
+ yield event
79
+ if isinstance(event, DoneEvent | ErrorEvent):
80
+ return
81
+ frame_lines = []
82
+ if buffered or frame_lines:
83
+ raise OpenAISSEError("chat stream ended with an incomplete server-sent event frame")
84
+ raise OpenAISSEError("chat stream ended before the terminal [DONE] event")
85
+
86
+
87
+ def sse_data_is_terminal(data: bytes) -> bool:
88
+ """return whether one complete raw sse frame is terminal."""
89
+
90
+ normalized = data.replace(b"\r\n", b"\n").replace(b"\r", b"\n")
91
+ data_lines = [
92
+ line.removeprefix(b"data:").strip()
93
+ for line in normalized.split(b"\n")
94
+ if line.startswith(b"data:")
95
+ ]
96
+ if not data_lines:
97
+ return False
98
+ raw = b"\n".join(data_lines)
99
+ if raw == b"[DONE]":
100
+ return True
101
+ try:
102
+ payload = json.loads(raw)
103
+ except (UnicodeDecodeError, json.JSONDecodeError):
104
+ return False
105
+ if not isinstance(payload, dict):
106
+ return False
107
+ if isinstance(payload.get("error"), dict):
108
+ return True
109
+ choices = payload.get("choices") or []
110
+ return isinstance(choices, list) and any(
111
+ isinstance(choice, dict) and choice.get("finish_reason") == "error" for choice in choices
112
+ )
113
+
114
+
115
+ def _events_from_frame(lines: list[str]) -> tuple[OpenAISSEEvent, ...]:
116
+ data_lines = []
117
+ for line in lines:
118
+ if not line.startswith("data:"):
119
+ continue
120
+ data = line.removeprefix("data:")
121
+ data_lines.append(data.removeprefix(" "))
122
+ if not data_lines:
123
+ return ()
124
+ data = "\n".join(data_lines)
125
+ if not data:
126
+ return ()
127
+ if data == "[DONE]":
128
+ return (DoneEvent(),)
129
+ try:
130
+ payload = json.loads(data)
131
+ except json.JSONDecodeError as exc:
132
+ raise OpenAISSEError("chat stream contained invalid openai sse json") from exc
133
+ if not isinstance(payload, dict):
134
+ raise OpenAISSEError("chat stream contained a non-object openai sse payload")
135
+ if "error" in payload:
136
+ error = payload["error"]
137
+ if not isinstance(error, dict):
138
+ raise OpenAISSEError("chat stream error must be an object")
139
+ return (ErrorEvent(str(error.get("message") or "chat stream ended with an error")),)
140
+ choices = payload.get("choices", [])
141
+ if not isinstance(choices, list):
142
+ raise OpenAISSEError("chat stream choices must be an array")
143
+ events: list[DeltaEvent | ErrorEvent] = []
144
+ for choice in choices:
145
+ if not isinstance(choice, dict):
146
+ raise OpenAISSEError("chat stream choice must be an object")
147
+ if choice.get("finish_reason") == "error":
148
+ events.append(ErrorEvent("chat stream ended with an engine error"))
149
+ continue
150
+ delta = choice.get("delta", {})
151
+ if not isinstance(delta, dict):
152
+ raise OpenAISSEError("chat stream delta must be an object")
153
+ reasoning = delta.get("reasoning_content")
154
+ content = delta.get("content")
155
+ if reasoning is not None and not isinstance(reasoning, str):
156
+ raise OpenAISSEError("chat stream reasoning_content must be a string or null")
157
+ if content is not None and not isinstance(content, str):
158
+ raise OpenAISSEError("chat stream content must be a string or null")
159
+ normalized_reasoning = reasoning if isinstance(reasoning, str) else None
160
+ normalized_content = content if isinstance(content, str) else None
161
+ if normalized_reasoning is not None or normalized_content is not None:
162
+ events.append(DeltaEvent(normalized_reasoning, normalized_content))
163
+ if not events:
164
+ return ()
165
+ if len(events) > 1:
166
+ raise OpenAISSEError("chat stream contained multiple text choices")
167
+ return (events[0],)
@@ -15,6 +15,12 @@ from collections.abc import Iterator, Mapping
15
15
  from typing import Any
16
16
 
17
17
  from flash._internal.channel import CLI_NAME
18
+ from flash._internal.openai_sse import (
19
+ DeltaEvent,
20
+ ErrorEvent,
21
+ OpenAISSEError,
22
+ iter_openai_sse_events,
23
+ )
18
24
  from flash.client.config import load_credentials_with_source
19
25
  from flash.client.shapes import RequireSpec, matches_require
20
26
  from flash.client.streaming import (
@@ -232,6 +238,42 @@ def _prepare_chat_request(
232
238
  return base_run_id, body
233
239
 
234
240
 
241
+ def _openai_sse_text(chunks: Iterator[str]) -> Iterator[str]:
242
+ """render normalized openai events for cli and environment evaluation."""
243
+
244
+ reasoning_open = False
245
+ reasoning_done = False
246
+ try:
247
+ for event in iter_openai_sse_events(chunks):
248
+ if isinstance(event, ErrorEvent):
249
+ if reasoning_open:
250
+ reasoning_open = False
251
+ yield "</think>"
252
+ raise ClientError(event.message)
253
+ if not isinstance(event, DeltaEvent):
254
+ continue
255
+ reasoning = event.reasoning_content
256
+ if reasoning is not None:
257
+ if not reasoning_open and not (reasoning_done and not reasoning):
258
+ reasoning_open = True
259
+ yield "<think>"
260
+ if reasoning:
261
+ yield reasoning
262
+ content = event.content
263
+ if content:
264
+ if reasoning_open:
265
+ reasoning_open = False
266
+ reasoning_done = True
267
+ yield "</think>"
268
+ yield content
269
+ except OpenAISSEError as exc:
270
+ if reasoning_open:
271
+ yield "</think>"
272
+ raise ClientError(str(exc)) from exc
273
+ if reasoning_open:
274
+ yield "</think>"
275
+
276
+
235
277
  def _parse_adapter_target(target: str) -> tuple[str, int | None]:
236
278
  from flash.schema import parse_checkpoint_ref
237
279
 
@@ -815,7 +857,8 @@ class ApiClient:
815
857
  urllib.request.urlopen(req, timeout=30 * 60) as resp,
816
858
  ):
817
859
  content_type = resp.headers.get("Content-Type", "")
818
- if "application/json" in content_type:
860
+ media_type = content_type.partition(";")[0].strip().lower()
861
+ if media_type == "application/json":
819
862
  payload = self._decode_response(
820
863
  f"/v1/runs/{base_run_id}/chat",
821
864
  resp.read(),
@@ -829,7 +872,8 @@ class ApiClient:
829
872
  read1 = getattr(resp, "read1", None)
830
873
  read = read1 if read1 is not None else resp.read
831
874
  read_size = 4096 if read1 is not None else 1
832
- try:
875
+
876
+ def decoded_chunks() -> Iterator[str]:
833
877
  while raw := read(read_size):
834
878
  state = decoder.getstate()
835
879
  try:
@@ -844,6 +888,13 @@ class ApiClient:
844
888
  raise exc
845
889
  yield from decoded
846
890
  yield from decoder.decode(b"", final=True)
891
+
892
+ try:
893
+ chunks = decoded_chunks()
894
+ if media_type == "text/event-stream":
895
+ yield from _openai_sse_text(chunks)
896
+ else:
897
+ yield from chunks
847
898
  except (http.client.IncompleteRead, ConnectionError) as exc:
848
899
  # the server aborts the chunked response when the serving backend fails
849
900
  # mid-generation; urllib reports the missing terminating chunk (or reset) here.
@@ -0,0 +1,142 @@
1
+ """Dependency-light validation for native Verl FSDP checkpoint manifests."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import json
6
+ import re
7
+ from collections.abc import Iterable
8
+ from dataclasses import dataclass
9
+
10
+ from flash._internal.fileio import reject_duplicate_keys
11
+ from flash.engine.verl_policy import FsdpGeneration
12
+
13
+ VERL_FSDP_CONFIG_FILE = "fsdp_config.json"
14
+ _MAX_NATIVE_FSDP_WORLD_SIZE = 8
15
+ _REQUIRED_SHARD_CLASSES = ("model", "optim", "extra_state")
16
+ _SHARD_RE = re.compile(r"(model|optim|extra_state)_world_size_(\d+)_rank_(\d+)\.pt")
17
+ _REJECT_DUPLICATE_CONFIG_KEYS = reject_duplicate_keys(
18
+ lambda key: ValueError(f"duplicate fsdp config key: {key}")
19
+ )
20
+
21
+
22
+ @dataclass(frozen=True)
23
+ class FsdpManifestFile:
24
+ """One direct actor-manifest member and its known size, if available."""
25
+
26
+ name: str
27
+ size: int | None
28
+
29
+
30
+ @dataclass(frozen=True)
31
+ class FsdpCheckpointInspection:
32
+ """One parsed native checkpoint verdict shared by selection and diagnostics."""
33
+
34
+ loadable: bool
35
+ generation: int | None
36
+ width: int | None
37
+ rejection_reason: str | None = None
38
+ missing_path: str | None = None
39
+
40
+ def diagnostic(self) -> str:
41
+ detail = self.rejection_reason or "loadable native checkpoint"
42
+ return f"{detail}: {self.missing_path}" if self.missing_path else detail
43
+
44
+
45
+ def _positive_int(value: object) -> int | None:
46
+ if isinstance(value, int) and not isinstance(value, bool) and value >= 1:
47
+ return value
48
+ return None
49
+
50
+
51
+ def parse_fsdp_stamp(raw: bytes | str | None) -> tuple[int, int] | None:
52
+ """Parse Verl's strict generation and width stamp without worker dependencies."""
53
+ if raw is None:
54
+ return None
55
+ try:
56
+ text = raw.decode("utf-8") if isinstance(raw, bytes) else raw
57
+ decoded = json.loads(text, object_pairs_hook=_REJECT_DUPLICATE_CONFIG_KEYS)
58
+ except (UnicodeDecodeError, ValueError, TypeError):
59
+ return None
60
+ if not isinstance(decoded, dict):
61
+ return None
62
+ generation = _positive_int(decoded.get("FSDP_version"))
63
+ width = _positive_int(decoded.get("world_size"))
64
+ if generation is None or width is None or width > _MAX_NATIVE_FSDP_WORLD_SIZE:
65
+ return None
66
+ return generation, width
67
+
68
+
69
+ def inspect_fsdp_checkpoint_manifest(
70
+ stamp_raw: bytes | str | None,
71
+ files: Iterable[FsdpManifestFile],
72
+ *,
73
+ expected_generation: FsdpGeneration,
74
+ expected_world_size: int | None,
75
+ ) -> FsdpCheckpointInspection:
76
+ """Validate the exact canonical native shard set for one stamped actor directory."""
77
+ stamp = parse_fsdp_stamp(stamp_raw)
78
+ if stamp is None:
79
+ return FsdpCheckpointInspection(False, None, None, "invalid or missing fsdp stamp")
80
+ generation, width = stamp
81
+ if generation != expected_generation:
82
+ return FsdpCheckpointInspection(
83
+ False,
84
+ generation,
85
+ width,
86
+ f"fsdp generation mismatch (stamped {generation}, expected {expected_generation})",
87
+ )
88
+ if expected_world_size is not None and width != expected_world_size:
89
+ return FsdpCheckpointInspection(
90
+ False,
91
+ generation,
92
+ width,
93
+ f"fsdp world-size mismatch (stamped {width}, expected {expected_world_size})",
94
+ )
95
+
96
+ actual: dict[str, int | None] = {}
97
+ for item in files:
98
+ name = item.name
99
+ if name in actual:
100
+ return FsdpCheckpointInspection(False, generation, width, "malformed shard name", name)
101
+ match = _SHARD_RE.fullmatch(name)
102
+ if match is None:
103
+ if any(name.startswith(f"{kind}_world_size_") for kind in _REQUIRED_SHARD_CLASSES):
104
+ return FsdpCheckpointInspection(
105
+ False, generation, width, "malformed shard name", name
106
+ )
107
+ continue
108
+ _kind, width_text, rank_text = match.groups()
109
+ parsed_width = int(width_text)
110
+ parsed_rank = int(rank_text)
111
+ if width_text != str(parsed_width) or rank_text != str(parsed_rank):
112
+ return FsdpCheckpointInspection(False, generation, width, "malformed shard name", name)
113
+ actual[name] = item.size
114
+
115
+ expected = tuple(
116
+ f"{kind}_world_size_{width}_rank_{rank}.pt"
117
+ for kind in _REQUIRED_SHARD_CLASSES
118
+ for rank in range(width)
119
+ )
120
+ for name in expected:
121
+ if name not in actual:
122
+ return FsdpCheckpointInspection(False, generation, width, "missing shard", name)
123
+ extras = sorted(set(actual) - set(expected))
124
+ if extras:
125
+ return FsdpCheckpointInspection(
126
+ False,
127
+ generation,
128
+ width,
129
+ "malformed shard name",
130
+ extras[0],
131
+ )
132
+ for name in expected:
133
+ size = actual[name]
134
+ if size is not None and (isinstance(size, bool) or not isinstance(size, int) or size <= 0):
135
+ return FsdpCheckpointInspection(
136
+ False,
137
+ generation,
138
+ width,
139
+ "empty or unreadable shard",
140
+ name,
141
+ )
142
+ return FsdpCheckpointInspection(True, generation, width)
@@ -0,0 +1,20 @@
1
+ """Private Verl strategy policy shared by control-plane and worker paths."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from collections.abc import Sequence
6
+ from typing import Literal
7
+
8
+ FsdpGeneration = Literal[1, 2]
9
+
10
+
11
+ def _resolve_fsdp_generation(
12
+ algorithm: str,
13
+ target_parameters: Sequence[str] | None,
14
+ ) -> FsdpGeneration:
15
+ """Return the only validated FSDP generation for one resolved workload."""
16
+ if algorithm == "sft" or algorithm == "grpo":
17
+ return 2
18
+ if algorithm == "opd":
19
+ return 2 if target_parameters else 1
20
+ raise ValueError(f"unsupported Verl algorithm for FSDP policy: {algorithm!r}")
@@ -14,6 +14,7 @@ from typing import Any
14
14
  from flash.adapters.targets import resolve_lora_targeting
15
15
  from flash.core.catalog import get_model
16
16
  from flash.engine.plan.steps import rl_data_parallel_cards
17
+ from flash.engine.verl_policy import _resolve_fsdp_generation
17
18
  from flash.engine.worker import opd_train as _opd_train
18
19
  from flash.engine.worker.train.core.child.runtime import TEXT_LORA_TARGET_SHIM
19
20
  from flash.engine.worker.train.core.prompt_rows import canonical_prompt_messages
@@ -171,6 +172,8 @@ def _prepare_workload(
171
172
  target_modules = targeting.target_modules
172
173
  if isinstance(target_modules, set | frozenset):
173
174
  target_modules = sorted(target_modules)
175
+ target_parameters = tuple(targeting.target_parameters) if targeting.target_parameters else None
176
+ fsdp_generation = _resolve_fsdp_generation("opd", target_parameters)
174
177
  lora_rank = int(lora_config.r)
175
178
  return _WorkloadState(
176
179
  prompts_per_step,
@@ -191,6 +194,8 @@ def _prepare_workload(
191
194
  lora_rank,
192
195
  int(lora_config.lora_alpha),
193
196
  target_modules,
197
+ target_parameters,
198
+ fsdp_generation,
194
199
  targeting.exclude_modules,
195
200
  _opd_train._warmstart_adapter_path(
196
201
  request.model_id,
@@ -238,9 +243,11 @@ def _materialize_child_files(
238
243
  workload.local_dir,
239
244
  prompt_pool_fingerprint=workload.prompt_pool_fingerprint,
240
245
  update_horizon=workload.update_horizon,
241
- # the same count this attempt hands verl as n_gpus_per_node, which is the DATA-parallel
246
+ # the same count this attempt hands verl as n_gpus_per_node, which is the data-parallel
242
247
  # width: ulysses is pinned to 1, so every rank is a dp rank.
243
248
  world_size=gpu_count,
249
+ # native state is generation-specific, so use the same resolved policy as the child config.
250
+ expected_fsdp_generation=workload.fsdp_generation,
244
251
  )
245
252
  bridge = _opd_train._TeacherAlignmentBridge(
246
253
  prompts=prompt_state.prompts,
@@ -384,7 +391,8 @@ def _build_base_config(
384
391
  "lora_alpha": workload.lora_alpha,
385
392
  "target_modules": workload.target_modules,
386
393
  "exclude_modules": None,
387
- "target_parameters": _opd_train._w.lora_target_parameters(request.model_id),
394
+ "target_parameters": workload.target_parameters,
395
+ "fsdp_generation": workload.fsdp_generation,
388
396
  "lora_adapter_path": workload.warmstart_adapter,
389
397
  "learning_rate": knobs.learning_rate,
390
398
  "local_dir": workload.local_dir,
@@ -148,7 +148,11 @@ def _prepare_rl_files(inp, prompts):
148
148
  # width this attempt actually launches verl at. NOT the rented card count: the clamp that bounds
149
149
  # the launch by the step's sequences can make those differ, and a mismatch here silently discards
150
150
  # a loadable checkpoint and restarts the run from step 0.
151
- resume_step = _rl_train()._restore_verl_resume(local_dir, world_size=int(inp["dp_cards"]))
151
+ resume_step = _rl_train()._restore_verl_resume(
152
+ local_dir,
153
+ world_size=int(inp["dp_cards"]),
154
+ expected_fsdp_generation=inp["fsdp_generation"],
155
+ )
152
156
  train_pq = os.path.join(workdir, "train.parquet")
153
157
  val_pq = os.path.join(workdir, "val.parquet")
154
158
  reward_py = os.path.join(workdir, "reward.py")
@@ -16,9 +16,11 @@ import time
16
16
 
17
17
  from flash._internal.diagnostics import SECRET_ENV_KEYS_ENV
18
18
  from flash.adapters.lora_rank import alpha_from_adapter_config, rank_from_adapter_config
19
+ from flash.engine.verl_checkpoint import FsdpCheckpointInspection
20
+ from flash.engine.verl_policy import FsdpGeneration
19
21
  from flash.engine.worker.runtime.kernel_warmup import KERNEL_CACHE_ENV_SUBDIRS
20
22
  from flash.engine.worker.runtime.pkg_proxy import W as _w
21
- from flash.engine.worker.verl.checkpoints import resume_checkpoint_is_loadable
23
+ from flash.engine.worker.verl.checkpoints import inspect_resume_checkpoint
22
24
  from flash.engine.worker.verl.parallelism import ULYSSES_SEQUENCE_PARALLEL_SIZE
23
25
 
24
26
  # todo: run the two-gpu sft smoke on the exact runpod image and command assembled below.
@@ -126,7 +128,12 @@ def _verl_image_message_content(content) -> str:
126
128
  return "".join(parts)
127
129
 
128
130
 
129
- def _restore_verl_resume(local_dir: str, *, world_size: int) -> int:
131
+ def _restore_verl_resume(
132
+ local_dir: str,
133
+ *,
134
+ world_size: int,
135
+ expected_fsdp_generation: FsdpGeneration,
136
+ ) -> int:
130
137
  """stage this run's streamed resume checkpoint; 0 when there is nothing usable to resume from.
131
138
 
132
139
  ``world_size`` is the rank count this attempt launches verl at; a checkpoint written at a
@@ -134,12 +141,30 @@ def _restore_verl_resume(local_dir: str, *, world_size: int) -> int:
134
141
  prefers a lower loadable checkpoint over a higher incompatible one, so a repeated discard cannot
135
142
  starve a compatible checkpoint uploaded after the one this attempt already rejected.
136
143
  """
137
- resume = _w.hf_resume_checkpoint(
138
- prefer=lambda path: resume_checkpoint_is_loadable(path, world_size=world_size)
139
- )
144
+ inspections: dict[str, FsdpCheckpointInspection] = {}
145
+
146
+ def prefer(path: str) -> bool:
147
+ inspection = inspections.get(path)
148
+ if inspection is None:
149
+ inspection = inspect_resume_checkpoint(
150
+ path,
151
+ world_size=world_size,
152
+ expected_fsdp_generation=expected_fsdp_generation,
153
+ )
154
+ inspections[path] = inspection
155
+ return inspection.loadable
156
+
157
+ resume = _w.hf_resume_checkpoint(prefer=prefer)
140
158
  if not resume:
141
159
  return 0
142
- return stage_verl_resume(resume, local_dir, job_label="SFT", world_size=world_size)
160
+ return stage_verl_resume(
161
+ resume,
162
+ local_dir,
163
+ job_label="SFT",
164
+ world_size=world_size,
165
+ expected_fsdp_generation=expected_fsdp_generation,
166
+ inspection=inspections.get(resume),
167
+ )
143
168
 
144
169
 
145
170
  def _durable_required_save_steps(required_steps: tuple[int, ...], resume_step: int) -> set[int]:
@@ -17,6 +17,7 @@ from math import gcd
17
17
  from flash.adapters.targets import resolve_lora_targeting
18
18
  from flash.core.catalog import get_model
19
19
  from flash.engine.plan.steps import sft_data_parallel_cards, widest_usable_dp_width
20
+ from flash.engine.verl_policy import _resolve_fsdp_generation
20
21
  from flash.engine.worker import sft_train as _sft_train
21
22
  from flash.engine.worker.train.core.child.runtime import TEXT_LORA_TARGET_SHIM
22
23
  from flash.engine.worker.verl.parallelism import ULYSSES_SEQUENCE_PARALLEL_SIZE
@@ -620,6 +621,8 @@ def _prepare_sft_child(
620
621
  # probe is part of the setup silence that wrap exists to cover, and because a packed run must
621
622
  # take the RAISING gate there rather than the soft form.
622
623
  world_size, micro_batch = _resolve_sft_width_and_micro_batch(options, data, model)
624
+ target_parameters = _w.lora_target_parameters(options.model_id)
625
+ fsdp_generation = _resolve_fsdp_generation("sft", target_parameters)
623
626
  config = {
624
627
  "train_files": data.train_file,
625
628
  "train_batch_size": model.train_batch_size,
@@ -632,7 +635,8 @@ def _prepare_sft_child(
632
635
  "lora_alpha": model.lora_alpha,
633
636
  "target_modules": model.target_modules,
634
637
  "exclude_modules": None,
635
- "target_parameters": _w.lora_target_parameters(options.model_id),
638
+ "target_parameters": target_parameters,
639
+ "fsdp_generation": fsdp_generation,
636
640
  "lora_adapter_path": model.warmstart_adapter,
637
641
  "ulysses_sp_size": ULYSSES_SEQUENCE_PARALLEL_SIZE,
638
642
  "lr": options.learning_rate,
@@ -683,7 +687,11 @@ def _prepare_sft_child(
683
687
  # shards by data and the width is bounded by the batch and the row count, so the two differ
684
688
  # whenever either fails to divide the allocation -- passing gpu_count here would discard a
685
689
  # checkpoint that matches the run about to start, and keep one that does not.
686
- resume_step = _sft_train._restore_verl_resume(options.paths.local_dir, world_size=world_size)
690
+ resume_step = _sft_train._restore_verl_resume(
691
+ options.paths.local_dir,
692
+ world_size=world_size,
693
+ expected_fsdp_generation=fsdp_generation,
694
+ )
687
695
  watcher = _sft_train._VerlCheckpointWatcher(
688
696
  local_dir=options.paths.local_dir,
689
697
  export_root=options.paths.export_root,
@@ -18,6 +18,7 @@ import shutil
18
18
  from dataclasses import dataclass
19
19
  from pathlib import Path
20
20
 
21
+ from flash.engine.verl_policy import FsdpGeneration
21
22
  from flash.engine.worker.runtime.pkg_proxy import W as _w
22
23
  from flash.engine.worker.sft_train import (
23
24
  SHIM_FRAGMENT_FAILED_EXIT_CODE,
@@ -27,8 +28,7 @@ from flash.engine.worker.sft_train import (
27
28
  from flash.engine.worker.train.opd.bridge import _TeacherAlignmentBridge
28
29
  from flash.engine.worker.train.opd.child.bridge import _render_rollout_failure
29
30
  from flash.engine.worker.verl.checkpoints import (
30
- checkpoint_world_size,
31
- resume_checkpoint_is_loadable,
31
+ inspect_resume_checkpoint,
32
32
  resume_topology_matches,
33
33
  resume_upload_unavailable,
34
34
  )
@@ -364,6 +364,7 @@ def _restore_verl_resume(
364
364
  prompt_pool_fingerprint: str,
365
365
  update_horizon: int,
366
366
  world_size: int,
367
+ expected_fsdp_generation: FsdpGeneration,
367
368
  ) -> tuple[int, dict | None]:
368
369
  revision = _w.OPD_RESUME_REVISION or None
369
370
  # no `prefer`: opd pins an exact commit via OPD_RESUME_REVISION with fail_closed, and
@@ -382,19 +383,27 @@ def _restore_verl_resume(
382
383
  # a pinned revision means a prior attempt crossed optimizer.step(): the control-plane
383
384
  # gate (verify_opd_replacement_safe) authorized this replacement only to continue from
384
385
  # exactly this checkpoint. discarding it and restarting from step 0 would repeat
385
- # already-billed teacher work and optimizer steps outside what the gate approved, so a
386
- # topology mismatch fails closed here instead of falling through to a fresh run.
387
- if not resume_checkpoint_is_loadable(resume, world_size=world_size):
388
- written = checkpoint_world_size(resume)
386
+ # already-billed teacher work and optimizer steps outside what the gate approved, so an
387
+ # incompatible native checkpoint fails closed here instead of starting fresh.
388
+ inspection = inspect_resume_checkpoint(
389
+ resume,
390
+ world_size=world_size,
391
+ expected_fsdp_generation=expected_fsdp_generation,
392
+ )
393
+ if not inspection.loadable:
389
394
  raise RuntimeError(
390
395
  f"permanent OPD resume failure: pinned resume revision {revision!r} names "
391
- f"checkpoint {os.path.basename(resume)}, whose fsdp shards were written at "
392
- f"world size {written if written is not None else 'unknown'} while this "
393
- f"attempt runs at world size {world_size}. restarting from step 0 would "
394
- "violate the pinned-resume contract, so this attempt refuses to train; "
395
- "relaunch the retry at the checkpoint's gpu count."
396
+ f"checkpoint {os.path.basename(resume)}, rejected because "
397
+ f"{inspection.diagnostic()}. restarting from step 0 would violate the pinned-resume "
398
+ "contract, so this attempt refuses to train; relaunch from a compatible complete "
399
+ f"fsdp{expected_fsdp_generation} checkpoint."
396
400
  )
397
- elif not resume_topology_matches(resume, world_size=world_size, job_label="OPD"):
401
+ elif not resume_topology_matches(
402
+ resume,
403
+ world_size=world_size,
404
+ expected_fsdp_generation=expected_fsdp_generation,
405
+ job_label="OPD",
406
+ ):
398
407
  return 0, None
399
408
  with open(os.path.join(resume, "opd_state.json"), encoding="utf-8") as file:
400
409
  state = validate_opd_resume_state_metadata(