freesolo-flash-dev 1.2.122__tar.gz → 1.2.123__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 (879) hide show
  1. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/PKG-INFO +1 -1
  2. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/app/README.md +7 -3
  3. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/app/modal_app.py +105 -68
  4. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/http/context.py +6 -2
  5. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/http/headers.py +28 -0
  6. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/http/router.py +1 -1
  7. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/pyproject.toml +2 -2
  8. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_base_model_serving.py +1 -1
  9. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_chat_auth.py +1 -1
  10. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_chat_authorizer.py +12 -3
  11. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_checkpoint_identity_repairs.py +1 -1
  12. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_checkpoint_model_validation.py +1 -1
  13. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_multimodal.py +1 -1
  14. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_router.py +2 -2
  15. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_router_coverage.py +1 -1
  16. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_router_edge_coverage.py +1 -1
  17. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_serve_reasoning_split.py +1 -1
  18. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_usage_outbox.py +5 -5
  19. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_usage_reporter.py +22 -12
  20. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/uv.lock +1 -1
  21. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/.dockerignore +0 -0
  22. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/.env.example +0 -0
  23. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/.github/CODEOWNERS +0 -0
  24. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  25. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  26. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  27. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  28. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/.github/dependabot.yml +0 -0
  29. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/.github/workflows/auto-rebake.yml +0 -0
  30. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/.github/workflows/bake-kernel-cache.yml +0 -0
  31. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/.github/workflows/ci.yml +0 -0
  32. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/.github/workflows/deploy-modal-dev.yml +0 -0
  33. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/.github/workflows/deploy-modal.yml +0 -0
  34. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/.github/workflows/dev-kernel-cache.yml +0 -0
  35. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/.github/workflows/main-source-guard.yml +0 -0
  36. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/.github/workflows/notify-tests-repo.yml +0 -0
  37. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/.github/workflows/production-kernel-cache-ready.yml +0 -0
  38. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/.github/workflows/publish-dev.yml +0 -0
  39. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/.github/workflows/publish-image.yml +0 -0
  40. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/.github/workflows/publish-serving-image.yml +0 -0
  41. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/.github/workflows/publish.yml +0 -0
  42. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/.github/workflows/version-parity.yml +0 -0
  43. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/.github/workflows/worker-image.yml +0 -0
  44. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/.gitignore +0 -0
  45. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/CHANGELOG.md +0 -0
  46. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/CODE_OF_CONDUCT.md +0 -0
  47. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/CONTRIBUTING.md +0 -0
  48. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/Dockerfile +0 -0
  49. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/Dockerfile.serve +0 -0
  50. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/Dockerfile.worker +0 -0
  51. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/LICENSE +0 -0
  52. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/NOTICE +0 -0
  53. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/README.md +0 -0
  54. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/SECURITY.md +0 -0
  55. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/SELF_HOSTING.md +0 -0
  56. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/build/kernel_cache/.gitignore +0 -0
  57. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/build/kernel_cache/.keep +0 -0
  58. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/deploy/infisical/README.md +0 -0
  59. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/deploy/infisical/entrypoint.sh +0 -0
  60. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/docker/Dockerfile.kernelcache +0 -0
  61. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/docker/Dockerfile.kernelcache.relayer +0 -0
  62. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/docker/bake_kernel_cache.py +0 -0
  63. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/docker/bake_pod_entry.py +0 -0
  64. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/docker/extract_cudart_fix.py +0 -0
  65. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/docker/kernel_fingerprint.py +0 -0
  66. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/docker/make_rp_handler.py +0 -0
  67. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/docker/patch_vllm_moe_lora.py +0 -0
  68. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/docs/serving-contract.md +0 -0
  69. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/__init__.py +0 -0
  70. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/_internal/__init__.py +0 -0
  71. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/_internal/channel.py +0 -0
  72. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/_internal/diagnostics.py +0 -0
  73. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/_internal/fileio.py +0 -0
  74. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/_internal/logging.py +0 -0
  75. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/_internal/openai_sse.py +0 -0
  76. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/_internal/paths.py +0 -0
  77. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/_internal/version.py +0 -0
  78. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/adapters/__init__.py +0 -0
  79. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/adapters/artifacts.py +0 -0
  80. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/adapters/fused_experts.py +0 -0
  81. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/adapters/lora_rank.py +0 -0
  82. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/adapters/targets.py +0 -0
  83. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/__init__.py +0 -0
  84. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/__main__.py +0 -0
  85. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/commands/__init__.py +0 -0
  86. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/commands/env/__init__.py +0 -0
  87. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/commands/env/ops/__init__.py +0 -0
  88. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/commands/env/ops/imports.py +0 -0
  89. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/commands/env/ops/list.py +0 -0
  90. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/commands/env/ops/push.py +0 -0
  91. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/commands/env/ops/retained.py +0 -0
  92. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/commands/env/ops/setup.py +0 -0
  93. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/commands/env/ops/setup_wandb.py +0 -0
  94. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/commands/env/testing/__init__.py +0 -0
  95. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/commands/env/testing/episode.py +0 -0
  96. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/commands/env/testing/eval.py +0 -0
  97. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/commands/env/testing/eval_args.py +0 -0
  98. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/commands/env/testing/evaluations.py +0 -0
  99. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/commands/env/testing/params.py +0 -0
  100. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/commands/env/testing/test.py +0 -0
  101. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/commands/env/testing/warnings.py +0 -0
  102. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/commands/ops/__init__.py +0 -0
  103. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/commands/ops/account.py +0 -0
  104. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/commands/ops/catalog.py +0 -0
  105. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/commands/ops/deploy.py +0 -0
  106. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/commands/ops/log_follow.py +0 -0
  107. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/commands/ops/prompt_budget.py +0 -0
  108. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/commands/ops/runs.py +0 -0
  109. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/commands/ops/traces.py +0 -0
  110. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/commands/ops/train.py +0 -0
  111. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/commands/ops/worker_output.py +0 -0
  112. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/commands/serving/__init__.py +0 -0
  113. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/commands/serving/deploy.py +0 -0
  114. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/commands/serving/identity.py +0 -0
  115. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/commands/serving/status.py +0 -0
  116. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/commands/serving/undeploy.py +0 -0
  117. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/parsing/__init__.py +0 -0
  118. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/parsing/account.py +0 -0
  119. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/parsing/env.py +0 -0
  120. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/parsing/errors.py +0 -0
  121. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/parsing/main.py +0 -0
  122. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/parsing/models.py +0 -0
  123. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/parsing/serve_parser.py +0 -0
  124. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/parsing/traces.py +0 -0
  125. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/parsing/training.py +0 -0
  126. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/scaffold/TRAINING.md +0 -0
  127. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/scaffold/__init__.py +0 -0
  128. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/ui/__init__.py +0 -0
  129. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/ui/cost.py +0 -0
  130. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/ui/env_panels.py +0 -0
  131. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/ui/heartbeat.py +0 -0
  132. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/ui/render.py +0 -0
  133. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/ui/tables.py +0 -0
  134. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/ui/tty.py +0 -0
  135. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/client/__init__.py +0 -0
  136. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/client/config.py +0 -0
  137. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/client/freesolo_api.py +0 -0
  138. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/client/http.py +0 -0
  139. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/client/runtime_secrets.py +0 -0
  140. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/client/shapes.py +0 -0
  141. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/client/specs.py +0 -0
  142. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/client/streaming.py +0 -0
  143. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/content/__init__.py +0 -0
  144. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/content/image_descriptors.py +0 -0
  145. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/content/multimodal.py +0 -0
  146. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/content/reasoning_normalization.py +0 -0
  147. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/content/structured_outputs.py +0 -0
  148. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/content/thinking.py +0 -0
  149. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/core/__init__.py +0 -0
  150. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/core/catalog.py +0 -0
  151. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/core/grpo.py +0 -0
  152. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/core/spec.py +0 -0
  153. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/core/spec_persistence.py +0 -0
  154. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cost/__init__.py +0 -0
  155. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cost/analytical.py +0 -0
  156. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cost/currency.py +0 -0
  157. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cost/facts.py +0 -0
  158. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cost/spec.py +0 -0
  159. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cost/types.py +0 -0
  160. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/__init__.py +0 -0
  161. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/plan/__init__.py +0 -0
  162. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/plan/kv_sizing.py +0 -0
  163. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/plan/model_config_probe.py +0 -0
  164. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/plan/prompt_budget.py +0 -0
  165. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/plan/recipe.py +0 -0
  166. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/plan/steps.py +0 -0
  167. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/plan/vram.py +0 -0
  168. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/profiling/__init__.py +0 -0
  169. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/profiling/dataset_profile.py +0 -0
  170. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/profiling/image_tokens.py +0 -0
  171. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/profiling/reasoning_render.py +0 -0
  172. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/profiling/sft_image_rows.py +0 -0
  173. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/profiling/sft_workload.py +0 -0
  174. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/profiling/tokenizer.py +0 -0
  175. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/profiling/workload_profile.py +0 -0
  176. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/result/__init__.py +0 -0
  177. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/result/accounting.py +0 -0
  178. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/result/rollout_samples.py +0 -0
  179. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/support/__init__.py +0 -0
  180. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/support/huggingface.py +0 -0
  181. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/support/verl_checkpoint.py +0 -0
  182. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/support/verl_policy.py +0 -0
  183. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/support/worker_entrypoint.py +0 -0
  184. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/__init__.py +0 -0
  185. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/__main__.py +0 -0
  186. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/entry/__init__.py +0 -0
  187. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/entry/opd.py +0 -0
  188. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/entry/rl.py +0 -0
  189. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/entry/sft.py +0 -0
  190. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/entry/worker.py +0 -0
  191. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/io/__init__.py +0 -0
  192. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/io/heartbeat.py +0 -0
  193. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/io/hf.py +0 -0
  194. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/io/prefetch.py +0 -0
  195. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/io/wandb_log.py +0 -0
  196. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/model/__init__.py +0 -0
  197. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/model/adapter.py +0 -0
  198. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/model/chatml_mask.py +0 -0
  199. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/model/decoding.py +0 -0
  200. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/model/lora.py +0 -0
  201. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/model/packing.py +0 -0
  202. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/perf/__init__.py +0 -0
  203. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/perf/diagnostics.py +0 -0
  204. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/perf/lifecycle.py +0 -0
  205. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/perf/liger.py +0 -0
  206. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/perf/memory.py +0 -0
  207. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/runtime/__init__.py +0 -0
  208. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/runtime/kernel_warmup.py +0 -0
  209. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/runtime/rng.py +0 -0
  210. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/runtime/state.py +0 -0
  211. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/teacher/__init__.py +0 -0
  212. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/teacher/client.py +0 -0
  213. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/teacher/encoding.py +0 -0
  214. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/teacher/tokenizer_align.py +0 -0
  215. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/__init__.py +0 -0
  216. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/core/__init__.py +0 -0
  217. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/core/child/__init__.py +0 -0
  218. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/core/child/glue.py +0 -0
  219. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/core/child/runtime.py +0 -0
  220. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/core/lifecycle/__init__.py +0 -0
  221. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/core/lifecycle/finalize.py +0 -0
  222. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/core/lifecycle/ledger.py +0 -0
  223. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/core/lifecycle/step_timing.py +0 -0
  224. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/entry/__init__.py +0 -0
  225. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/entry/backend_common.py +0 -0
  226. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/entry/opd_train.py +0 -0
  227. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/entry/opd_train_runner.py +0 -0
  228. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/entry/prompt_rows.py +0 -0
  229. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/entry/rl_train.py +0 -0
  230. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/entry/rl_train_runner.py +0 -0
  231. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/entry/score_batcher.py +0 -0
  232. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/entry/sft_train.py +0 -0
  233. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/entry/sft_train_runner.py +0 -0
  234. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/__init__.py +0 -0
  235. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/bridging/__init__.py +0 -0
  236. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/bridging/batching.py +0 -0
  237. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/bridging/bridge.py +0 -0
  238. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/bridging/failures.py +0 -0
  239. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/bridging/prompts.py +0 -0
  240. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/bridging/scoring.py +0 -0
  241. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/child/__init__.py +0 -0
  242. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/child/bridge.py +0 -0
  243. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/child/entry.py +0 -0
  244. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/child/multiturn.py +0 -0
  245. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/child/plugin.py +0 -0
  246. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/child/replay_guard.py +0 -0
  247. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/child/runtime.py +0 -0
  248. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/child/structured.py +0 -0
  249. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/multiturn/__init__.py +0 -0
  250. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/multiturn/media.py +0 -0
  251. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/multiturn/validation.py +0 -0
  252. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/orchestration/__init__.py +0 -0
  253. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/orchestration/failures.py +0 -0
  254. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/orchestration/gkd.py +0 -0
  255. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/orchestration/overrides.py +0 -0
  256. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/orchestration/progress.py +0 -0
  257. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/orchestration/prompt_preparation.py +0 -0
  258. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/orchestration/protocol.py +0 -0
  259. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/orchestration/reporting.py +0 -0
  260. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/orchestration/state.py +0 -0
  261. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/orchestration/validation.py +0 -0
  262. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/rl/__init__.py +0 -0
  263. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/rl/child/__init__.py +0 -0
  264. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/rl/child/entry.py +0 -0
  265. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/rl/child/multiturn.py +0 -0
  266. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/rl/child/patches.py +0 -0
  267. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/rl/child/plugin.py +0 -0
  268. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/rl/launch/__init__.py +0 -0
  269. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/rl/launch/checkpoints.py +0 -0
  270. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/rl/launch/config.py +0 -0
  271. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/rl/launch/inputs.py +0 -0
  272. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/rl/launch/verl_config.py +0 -0
  273. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/rl/rollout/__init__.py +0 -0
  274. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/rl/rollout/identity.py +0 -0
  275. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/rl/rollout/multi_turn.py +0 -0
  276. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/rl/rollout/reward_module.py +0 -0
  277. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/rl/rollout/scoring.py +0 -0
  278. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/rl/rollout/single_turn.py +0 -0
  279. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/sft/__init__.py +0 -0
  280. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/sft/child/entry.py +0 -0
  281. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/sft/child/plugin.py +0 -0
  282. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/sft/setup/__init__.py +0 -0
  283. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/sft/setup/checkpoints.py +0 -0
  284. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/sft/setup/config.py +0 -0
  285. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/verl/__init__.py +0 -0
  286. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/verl/capabilities.py +0 -0
  287. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/verl/checkpoints.py +0 -0
  288. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/verl/child_io.py +0 -0
  289. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/verl/diagnostics.py +0 -0
  290. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/verl/parallelism.py +0 -0
  291. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/verl/parent_work.py +0 -0
  292. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/verl/process_census.py +0 -0
  293. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/envs/__init__.py +0 -0
  294. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/envs/loading/__init__.py +0 -0
  295. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/envs/loading/adapter.py +0 -0
  296. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/envs/loading/base.py +0 -0
  297. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/envs/loading/loader.py +0 -0
  298. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/envs/loading/pull.py +0 -0
  299. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/envs/loading/staged.py +0 -0
  300. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/envs/meta/__init__.py +0 -0
  301. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/envs/meta/cache_security.py +0 -0
  302. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/envs/meta/dataset_selection.py +0 -0
  303. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/envs/meta/evaluations.py +0 -0
  304. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/envs/meta/identity.py +0 -0
  305. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/envs/meta/namespace_listing.py +0 -0
  306. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/envs/package/__init__.py +0 -0
  307. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/envs/package/direct_tokens.py +0 -0
  308. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/envs/package/limits.py +0 -0
  309. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/envs/package/unpack.py +0 -0
  310. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/__init__.py +0 -0
  311. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/__init__.py +0 -0
  312. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/bootstrapping/__init__.py +0 -0
  313. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/bootstrapping/bootstrap.py +0 -0
  314. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/bootstrapping/console.py +0 -0
  315. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/bootstrapping/pip.py +0 -0
  316. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/bootstrapping/secrets.py +0 -0
  317. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/host/__init__.py +0 -0
  318. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/host/deadline_sleep.py +0 -0
  319. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/host/failmark.py +0 -0
  320. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/host/hostlog.py +0 -0
  321. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/instances/__init__.py +0 -0
  322. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/instances/instance.py +0 -0
  323. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/instances/poll.py +0 -0
  324. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/instances/poll_instance.py +0 -0
  325. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/instances/provider.py +0 -0
  326. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/instances/terminal_artifacts.py +0 -0
  327. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/net/__init__.py +0 -0
  328. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/net/auth.py +0 -0
  329. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/net/deadline.py +0 -0
  330. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/net/http.py +0 -0
  331. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/net/worker.py +0 -0
  332. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/artifacts/__init__.py +0 -0
  333. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/artifacts/hf.py +0 -0
  334. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/artifacts/preload_runpod.py +0 -0
  335. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/artifacts/weight_cache.py +0 -0
  336. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/core/__init__.py +0 -0
  337. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/core/allocator.py +0 -0
  338. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/core/base.py +0 -0
  339. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/core/fit_errors.py +0 -0
  340. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/core/preflight.py +0 -0
  341. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/core/realized.py +0 -0
  342. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/core/registry.py +0 -0
  343. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/core/sharding.py +0 -0
  344. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/lambda_/__init__.py +0 -0
  345. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/lambda_/client/__init__.py +0 -0
  346. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/lambda_/client/api.py +0 -0
  347. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/lambda_/client/auth.py +0 -0
  348. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/lambda_/client/gpus.py +0 -0
  349. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/lambda_/client/preflight.py +0 -0
  350. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/lambda_/client/pricing.py +0 -0
  351. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/lambda_/execution/__init__.py +0 -0
  352. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/lambda_/execution/provider.py +0 -0
  353. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/lambda_/jobs/__init__.py +0 -0
  354. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/lambda_/jobs/builders.py +0 -0
  355. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/lambda_/jobs/reap.py +0 -0
  356. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/runpod/__init__.py +0 -0
  357. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/runpod/client/__init__.py +0 -0
  358. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/runpod/client/api.py +0 -0
  359. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/runpod/client/auth.py +0 -0
  360. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/runpod/client/cost.py +0 -0
  361. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/runpod/client/gpus.py +0 -0
  362. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/runpod/client/preflight.py +0 -0
  363. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/runpod/client/pricing.py +0 -0
  364. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/runpod/execution/__init__.py +0 -0
  365. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/runpod/execution/job_execution.py +0 -0
  366. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/runpod/execution/jobs.py +0 -0
  367. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/runpod/execution/polling.py +0 -0
  368. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/runpod/execution/provider.py +0 -0
  369. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/runpod/execution/resources.py +0 -0
  370. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/runpod/serverless/__init__.py +0 -0
  371. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/runpod/serverless/endpoints.py +0 -0
  372. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/vast/__init__.py +0 -0
  373. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/vast/client/__init__.py +0 -0
  374. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/vast/client/api.py +0 -0
  375. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/vast/client/auth.py +0 -0
  376. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/vast/client/preflight.py +0 -0
  377. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/vast/client/pricing.py +0 -0
  378. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/vast/execution/__init__.py +0 -0
  379. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/vast/execution/provider.py +0 -0
  380. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/vast/jobs/__init__.py +0 -0
  381. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/vast/jobs/builders.py +0 -0
  382. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/py.typed +0 -0
  383. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/runner/__init__.py +0 -0
  384. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/runner/accounting/__init__.py +0 -0
  385. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/runner/accounting/artifacts.py +0 -0
  386. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/runner/accounting/costs.py +0 -0
  387. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/runner/accounting/reconciliation.py +0 -0
  388. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/runner/accounting/weight_cache.py +0 -0
  389. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/runner/lifecycle/__init__.py +0 -0
  390. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/runner/lifecycle/attempts.py +0 -0
  391. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/runner/lifecycle/deadlines.py +0 -0
  392. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/runner/lifecycle/preparation.py +0 -0
  393. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/runner/lifecycle/reporting.py +0 -0
  394. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/runner/lifecycle/state.py +0 -0
  395. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/runner/lifecycle/status.py +0 -0
  396. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/runner/lifecycle/submit.py +0 -0
  397. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/runner/results/__init__.py +0 -0
  398. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/runner/results/checkpoints.py +0 -0
  399. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/runner/results/verified_revisions.py +0 -0
  400. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/runner/supervise/__init__.py +0 -0
  401. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/runner/supervise/attach.py +0 -0
  402. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/runner/supervise/attach_reconcile.py +0 -0
  403. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/runner/supervise/deploy.py +0 -0
  404. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/runner/supervise/errors.py +0 -0
  405. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/runner/supervise/lifecycle.py +0 -0
  406. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/runner/supervise/recovery.py +0 -0
  407. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/runner/supervise/retry_decision.py +0 -0
  408. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/runner/supervise/seed_submission.py +0 -0
  409. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/runner/supervise/transitions.py +0 -0
  410. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/runtime_capsule/__init__.py +0 -0
  411. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/runtime_capsule/build.py +0 -0
  412. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/runtime_capsule/manifest.py +0 -0
  413. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/runtime_capsule/profiles.py +0 -0
  414. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/schema/__init__.py +0 -0
  415. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/schema/fields.py +0 -0
  416. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/__init__.py +0 -0
  417. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/app/__init__.py +0 -0
  418. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/app/__main__.py +0 -0
  419. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/app/bootstrap.py +0 -0
  420. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/app/chat_stream.py +0 -0
  421. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/app/http.py +0 -0
  422. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/app/launch.py +0 -0
  423. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/app/manifest.py +0 -0
  424. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/app/materialize.py +0 -0
  425. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/app/openai.py +0 -0
  426. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/app/progress.py +0 -0
  427. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/contract/__init__.py +0 -0
  428. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/contract/errors.py +0 -0
  429. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/contract/protocol.py +0 -0
  430. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/contract/provenance.py +0 -0
  431. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/contract/responses.py +0 -0
  432. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/contract/urls.py +0 -0
  433. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/control/__init__.py +0 -0
  434. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/control/_canonical.py +0 -0
  435. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/control/_serialization.py +0 -0
  436. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/control/_urls.py +0 -0
  437. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/control/credentials.py +0 -0
  438. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/control/planning.py +0 -0
  439. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/control/types.py +0 -0
  440. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/deployment/__init__.py +0 -0
  441. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/deployment/adapter_check.py +0 -0
  442. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/deployment/deploy.py +0 -0
  443. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/deployment/export.py +0 -0
  444. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/deployment/preflight.py +0 -0
  445. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/deployment/profiles.py +0 -0
  446. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/deployment/readiness.py +0 -0
  447. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/deployment/resolve.py +0 -0
  448. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/provisioning/__init__.py +0 -0
  449. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/provisioning/common/__init__.py +0 -0
  450. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/provisioning/common/records.py +0 -0
  451. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/provisioning/modal/__init__.py +0 -0
  452. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/provisioning/modal/execution/__init__.py +0 -0
  453. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/provisioning/modal/execution/deployment.py +0 -0
  454. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/provisioning/modal/execution/lifecycle.py +0 -0
  455. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/provisioning/modal/execution/operations.py +0 -0
  456. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/provisioning/modal/execution/sdk.py +0 -0
  457. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/provisioning/modal/planning/__init__.py +0 -0
  458. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/provisioning/modal/planning/plan.py +0 -0
  459. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/provisioning/modal/planning/resources.py +0 -0
  460. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/provisioning/modal/planning/wrapper.py +0 -0
  461. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/provisioning/modal/readiness_checks/__init__.py +0 -0
  462. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/provisioning/modal/readiness_checks/probe.py +0 -0
  463. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/provisioning/modal/readiness_checks/readiness.py +0 -0
  464. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/provisioning/modal/readiness_checks/teardown.py +0 -0
  465. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/request/__init__.py +0 -0
  466. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/request/openai.py +0 -0
  467. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/request/runtime_support.py +0 -0
  468. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/request/streaming.py +0 -0
  469. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/request/thinking.py +0 -0
  470. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/request/transport.py +0 -0
  471. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/request/validation.py +0 -0
  472. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/runtime/__init__.py +0 -0
  473. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/runtime/adapters.py +0 -0
  474. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/runtime/engine.py +0 -0
  475. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/runtime/errors.py +0 -0
  476. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/runtime/multimodal.py +0 -0
  477. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/runtime/prompt.py +0 -0
  478. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/runtime/sampling.py +0 -0
  479. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/runtime/structured_outputs.py +0 -0
  480. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/runtime/types.py +0 -0
  481. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/__init__.py +0 -0
  482. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/__main__.py +0 -0
  483. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/asgi/__init__.py +0 -0
  484. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/asgi/app.py +0 -0
  485. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/asgi/cli.py +0 -0
  486. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/billing/__init__.py +0 -0
  487. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/billing/charges.py +0 -0
  488. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/billing/retry.py +0 -0
  489. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/domain/__init__.py +0 -0
  490. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/domain/ops/__init__.py +0 -0
  491. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/domain/ops/reconcile.py +0 -0
  492. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/domain/ops/repo_cleanup.py +0 -0
  493. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/domain/ops/serving_resources.py +0 -0
  494. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/domain/registry/__init__.py +0 -0
  495. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/domain/registry/checkpoints.py +0 -0
  496. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/domain/registry/environment_registry.py +0 -0
  497. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/domain/registry/envs.py +0 -0
  498. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/domain/registry/projects.py +0 -0
  499. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/domain/registry/runs.py +0 -0
  500. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/domain/teacher/__init__.py +0 -0
  501. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/domain/teacher/broker.py +0 -0
  502. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/domain/teacher/errors.py +0 -0
  503. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/domain/teacher/requests.py +0 -0
  504. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/platform/__init__.py +0 -0
  505. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/platform/auth.py +0 -0
  506. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/platform/db.py +0 -0
  507. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/platform/deps.py +0 -0
  508. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/platform/internal_client.py +0 -0
  509. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/platform/locks.py +0 -0
  510. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/platform/runtime.py +0 -0
  511. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/routes/__init__.py +0 -0
  512. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/routes/envs.py +0 -0
  513. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/routes/meta.py +0 -0
  514. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/routes/runs.py +0 -0
  515. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/routes/serving.py +0 -0
  516. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/routes/serving_chat.py +0 -0
  517. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/routes/serving_completion.py +0 -0
  518. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/routes/serving_revisions.py +0 -0
  519. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/routes/serving_smoke.py +0 -0
  520. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/routes/teacher.py +0 -0
  521. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/__init__.py +0 -0
  522. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/app/__init__.py +0 -0
  523. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/__init__.py +0 -0
  524. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/accounting/__init__.py +0 -0
  525. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/accounting/usage.py +0 -0
  526. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/accounting/usage_facts.py +0 -0
  527. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/accounting/usage_outbox.py +0 -0
  528. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/engine/__init__.py +0 -0
  529. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/engine/boot.py +0 -0
  530. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/engine/errors.py +0 -0
  531. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/engine/generation.py +0 -0
  532. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/engine/lora_engine.py +0 -0
  533. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/engine/lora_entries.py +0 -0
  534. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/engine/model_config.py +0 -0
  535. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/engine/prequant_config.py +0 -0
  536. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/engine/support.py +0 -0
  537. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/http/__init__.py +0 -0
  538. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/http/adapter_routes.py +0 -0
  539. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/http/body_limit.py +0 -0
  540. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/http/inference_routes.py +0 -0
  541. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/http/routing.py +0 -0
  542. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/io/__init__.py +0 -0
  543. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/io/multimodal.py +0 -0
  544. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/io/openai_request.py +0 -0
  545. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/io/openai_stream.py +0 -0
  546. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/io/provenance.py +0 -0
  547. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/io/requests.py +0 -0
  548. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/io/responses.py +0 -0
  549. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/io/schemas.py +0 -0
  550. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/io/streaming.py +0 -0
  551. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/io/structured_outputs.py +0 -0
  552. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/store/__init__.py +0 -0
  553. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/store/access.py +0 -0
  554. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/store/lookup.py +0 -0
  555. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/store/persisted_columns.py +0 -0
  556. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/store/persistence.py +0 -0
  557. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/store/registration.py +0 -0
  558. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/store/registry.py +0 -0
  559. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/store/settings.py +0 -0
  560. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/store/supabase_rest.py +0 -0
  561. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/store/undeploy.py +0 -0
  562. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/snapshot/__init__.py +0 -0
  563. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/snapshot/archive.py +0 -0
  564. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/teacher/__init__.py +0 -0
  565. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/teacher/limits.py +0 -0
  566. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/teacher/provider_status.py +0 -0
  567. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/teacher/retry_contract.py +0 -0
  568. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/scripts/build_dev_dist.py +0 -0
  569. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/scripts/check_file_size.py +0 -0
  570. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/scripts/check_function_size.py +0 -0
  571. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/scripts/check_rollout_identity_actor.py +0 -0
  572. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/scripts/check_source_layout.py +0 -0
  573. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/scripts/check_verl_pin_exists.py +0 -0
  574. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/scripts/qualify_serving_profile.py +0 -0
  575. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/scripts/scrub_history.sh +0 -0
  576. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/serve_launch.py +0 -0
  577. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/__init__.py +0 -0
  578. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/_helpers/__init__.py +0 -0
  579. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/_helpers/chat_provenance.py +0 -0
  580. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/_helpers/chat_transport.py +0 -0
  581. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/_helpers/managed_chat.py +0 -0
  582. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/_helpers/profile.py +0 -0
  583. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/_helpers/runner.py +0 -0
  584. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/_helpers/server_api_plugin.py +0 -0
  585. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/_helpers/source_snapshot.py +0 -0
  586. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/_helpers/specs.py +0 -0
  587. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/_helpers/teacher.py +0 -0
  588. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/_helpers/vast.py +0 -0
  589. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/capture_image_sft_processor_oracle.py +0 -0
  590. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/capture_qwen38_27b_metadata.py +0 -0
  591. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/conftest.py +0 -0
  592. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/fixtures/image_sft_processor_oracle.json +0 -0
  593. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/fixtures/qwen35_9b_target_metadata.json +0 -0
  594. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/fixtures/qwen38_27b_target_metadata.json +0 -0
  595. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/fixtures/vllm_023_moe_lora/lora_context.py.gz +0 -0
  596. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/fixtures/vllm_023_moe_lora/modular_kernel.py.gz +0 -0
  597. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/fixtures/vllm_023_moe_lora/triton_moe.py.gz +0 -0
  598. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/live/__init__.py +0 -0
  599. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/live/conftest.py +0 -0
  600. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/live/test_lambda_live.py +0 -0
  601. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/live/test_runpod_live.py +0 -0
  602. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/live/test_sft_thinking_render_live.py +0 -0
  603. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/live/test_vast_live.py +0 -0
  604. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/checkpoint_fixtures.py +0 -0
  605. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/conftest.py +0 -0
  606. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_engine_error_status.py +0 -0
  607. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_fp8_config.py +0 -0
  608. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_immutable_engine.py +0 -0
  609. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_immutable_revisions.py +0 -0
  610. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_immutable_schemas.py +0 -0
  611. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_mirror_sampling_parity.py +0 -0
  612. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_modal_deploy_identity.py +0 -0
  613. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_modal_image_paths.py +0 -0
  614. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_model_config.py +0 -0
  615. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_openai_stream_options.py +0 -0
  616. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_per_model_gpu.py +0 -0
  617. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_persistence.py +0 -0
  618. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_pre_first_disconnect.py +0 -0
  619. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_prequant_config.py +0 -0
  620. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_registry.py +0 -0
  621. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_registry_coverage.py +0 -0
  622. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_request_body_limit.py +0 -0
  623. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_schemas_coverage.py +0 -0
  624. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_serve_structured_outputs.py +0 -0
  625. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_serve_thinking.py +0 -0
  626. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_settings.py +0 -0
  627. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_structured_outputs.py +0 -0
  628. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_structured_outputs_coverage.py +0 -0
  629. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_supabase_rest_coverage.py +0 -0
  630. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving_conformance/__init__.py +0 -0
  631. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving_conformance/conftest.py +0 -0
  632. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving_conformance/test_contract.py +0 -0
  633. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_accounting_coverage.py +0 -0
  634. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_adapter_shard_completeness.py +0 -0
  635. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_agent_flash_cli_contract.py +0 -0
  636. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_algorithms.py +0 -0
  637. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_allocator.py +0 -0
  638. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_backend_common.py +0 -0
  639. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_backend_jobspec_contract.py +0 -0
  640. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_bake_kernel_cache.py +0 -0
  641. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_base_model_provenance.py +0 -0
  642. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_billing_retry.py +0 -0
  643. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_build_context_contract.py +0 -0
  644. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_cancel_remote.py +0 -0
  645. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_capture_qwen38_metadata.py +0 -0
  646. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_catalog_consistency.py +0 -0
  647. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_catalog_only_models.py +0 -0
  648. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_charge_pricing.py +0 -0
  649. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_chat_foundations.py +0 -0
  650. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_checkpoint_lifecycle.py +0 -0
  651. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_checkpoints.py +0 -0
  652. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_cli_commands.py +0 -0
  653. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_cli_commands_coverage.py +0 -0
  654. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_cli_credential_shadowing.py +0 -0
  655. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_cli_errors.py +0 -0
  656. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_cli_estimate.py +0 -0
  657. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_cli_gpus_flag.py +0 -0
  658. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_cli_help.py +0 -0
  659. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_cli_main_coverage.py +0 -0
  660. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_cli_managed.py +0 -0
  661. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_cli_render_coverage.py +0 -0
  662. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_cli_render_theme.py +0 -0
  663. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_cli_serve_deploy.py +0 -0
  664. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_cli_serve_status.py +0 -0
  665. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_cli_serve_undeploy.py +0 -0
  666. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_cli_traces.py +0 -0
  667. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_cli_wandb_warning.py +0 -0
  668. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_client.py +0 -0
  669. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_client_import_purity.py +0 -0
  670. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_client_server_integration.py +0 -0
  671. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_client_stream_reads.py +0 -0
  672. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_config_env_vars.py +0 -0
  673. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_config_overrides.py +0 -0
  674. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_console_upload.py +0 -0
  675. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_controlled_experiment_repairs.py +0 -0
  676. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_cost_analytical.py +0 -0
  677. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_cost_currency.py +0 -0
  678. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_cost_equation.py +0 -0
  679. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_cost_estimate.py +0 -0
  680. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_cost_hardware.py +0 -0
  681. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_cost_models.py +0 -0
  682. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_dataset_profile.py +0 -0
  683. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_deploy_latency.py +0 -0
  684. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_dev_channel.py +0 -0
  685. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_disk_gb.py +0 -0
  686. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_endpoint_name.py +0 -0
  687. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_env_cache_evict.py +0 -0
  688. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_env_delete.py +0 -0
  689. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_env_download.py +0 -0
  690. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_env_download_api.py +0 -0
  691. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_env_evaluations.py +0 -0
  692. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_env_list_api.py +0 -0
  693. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_env_list_cli.py +0 -0
  694. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_env_list_hub.py +0 -0
  695. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_env_no_install.py +0 -0
  696. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_env_publish.py +0 -0
  697. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_env_pull.py +0 -0
  698. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_env_pull_coverage.py +0 -0
  699. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_env_pull_loader_coverage.py +0 -0
  700. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_env_pull_managed_control_plane.py +0 -0
  701. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_env_push.py +0 -0
  702. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_env_rate_limit_resolve.py +0 -0
  703. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_env_ref_pinning.py +0 -0
  704. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_env_test.py +0 -0
  705. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_envs_coverage.py +0 -0
  706. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_export.py +0 -0
  707. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_flash_mvp.py +0 -0
  708. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_flash_worker.py +0 -0
  709. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_flashinfer_cache_dirs.py +0 -0
  710. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_freesolo_api_transport.py +0 -0
  711. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_fused_expert_warmstart.py +0 -0
  712. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_github_urlopen_retry.py +0 -0
  713. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_gpu_type_single_field.py +0 -0
  714. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_gpus.py +0 -0
  715. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_grpo_checkpoint_durability.py +0 -0
  716. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_grpo_params.py +0 -0
  717. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_grpo_process_census.py +0 -0
  718. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_grpo_resident_sizing.py +0 -0
  719. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_grpo_reward_batching.py +0 -0
  720. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_grpo_rollout_contract.py +0 -0
  721. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_grpo_rollout_identity.py +0 -0
  722. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_health_liveness.py +0 -0
  723. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_hf_retry.py +0 -0
  724. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_idle_endpoint_reaper.py +0 -0
  725. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_image_environment_capability.py +0 -0
  726. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_image_incremental_processor.py +0 -0
  727. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_image_sft_markers.py +0 -0
  728. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_image_sft_processor_parity.py +0 -0
  729. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_image_tokens.py +0 -0
  730. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_infisical_secrets.py +0 -0
  731. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_instance_bootstrap_coverage.py +0 -0
  732. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_internal_client.py +0 -0
  733. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_jobs.py +0 -0
  734. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_kernel_cache.py +0 -0
  735. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_kernel_fingerprint.py +0 -0
  736. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_kv_util.py +0 -0
  737. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_lambda_api_coverage.py +0 -0
  738. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_lambda_runner.py +0 -0
  739. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_logging.py +0 -0
  740. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_login_perms.py +0 -0
  741. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_lora_rank_coverage.py +0 -0
  742. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_lora_rank_nested_rung.py +0 -0
  743. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_lora_rank_preflight.py +0 -0
  744. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_lora_targeting.py +0 -0
  745. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_lora_targeting_pinned_verl.py +0 -0
  746. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_managed_config_fields.py +0 -0
  747. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_managed_hf_repo.py +0 -0
  748. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_metrics_schema_agent_contract.py +0 -0
  749. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_mig_guard.py +0 -0
  750. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_mirror_sampling_parity.py +0 -0
  751. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_multi_gpu_gate.py +0 -0
  752. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_multimodal_training.py +0 -0
  753. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_named_reward_metrics.py +0 -0
  754. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_oom_escalate_gpu.py +0 -0
  755. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_opd.py +0 -0
  756. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_opd_limits.py +0 -0
  757. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_opd_multiturn_eos_boundary.py +0 -0
  758. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_opd_multiturn_failure_exit.py +0 -0
  759. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_opd_replay_guard.py +0 -0
  760. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_opd_resume_safety.py +0 -0
  761. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_opd_train.py +0 -0
  762. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_orchestrator_flash.py +0 -0
  763. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_packing.py +0 -0
  764. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_packing_coverage.py +0 -0
  765. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_parasail_teacher.py +0 -0
  766. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_persisted_spec_envelope.py +0 -0
  767. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_poll_helpers.py +0 -0
  768. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_preflight.py +0 -0
  769. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_projects.py +0 -0
  770. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_prompt_budget.py +0 -0
  771. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_provider_preflight_coverage.py +0 -0
  772. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_provider_routing.py +0 -0
  773. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_provider_teardown_robustness.py +0 -0
  774. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_providers_symmetry.py +0 -0
  775. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_realized_cost.py +0 -0
  776. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_repo_cleanup.py +0 -0
  777. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_resolve_params_b.py +0 -0
  778. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_resume_on_retry.py +0 -0
  779. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_rl_train.py +0 -0
  780. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_rollout_samples.py +0 -0
  781. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_run_registry_lifecycle.py +0 -0
  782. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_runmgmt.py +0 -0
  783. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_runpod_api_delete.py +0 -0
  784. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_runpod_key_fingerprint.py +0 -0
  785. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_runpod_key_waterfall.py +0 -0
  786. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_runtime_capsule.py +0 -0
  787. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_serve.py +0 -0
  788. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_serve_app_bootstrap_http.py +0 -0
  789. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_serve_app_launch.py +0 -0
  790. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_serve_app_manifest.py +0 -0
  791. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_serve_app_materialize.py +0 -0
  792. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_serve_app_packaging.py +0 -0
  793. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_serve_app_progress.py +0 -0
  794. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_serve_chat_transport.py +0 -0
  795. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_serve_control.py +0 -0
  796. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_serve_docs.py +0 -0
  797. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_serve_modal_contract_lock.py +0 -0
  798. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_serve_modal_sdk.py +0 -0
  799. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_serve_modal_sdk_deadlines.py +0 -0
  800. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_serve_modal_teardown_identity.py +0 -0
  801. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_serve_profile_qualification.py +0 -0
  802. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_serve_profiles.py +0 -0
  803. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_serve_provisioning_common.py +0 -0
  804. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_serve_provisioning_modal.py +0 -0
  805. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_serve_reasoning_content.py +0 -0
  806. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_serve_resolve_provenance.py +0 -0
  807. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_serve_runtime_adapters.py +0 -0
  808. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_serve_runtime_engine.py +0 -0
  809. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_serve_runtime_package.py +0 -0
  810. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_serve_runtime_types.py +0 -0
  811. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_server_api.py +0 -0
  812. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_server_app_coverage.py +0 -0
  813. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_server_auth_singleflight.py +0 -0
  814. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_server_billing.py +0 -0
  815. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_server_checkpoints_coverage.py +0 -0
  816. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_server_db.py +0 -0
  817. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_server_envs_coverage.py +0 -0
  818. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_server_locks_coverage.py +0 -0
  819. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_server_managed_chat_requests.py +0 -0
  820. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_server_serving_resources.py +0 -0
  821. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_server_standalone.py +0 -0
  822. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_serving_conformance_gate.py +0 -0
  823. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_serving_context_preflight.py +0 -0
  824. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_serving_contract.py +0 -0
  825. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_serving_schema_coverage.py +0 -0
  826. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_sft_chunked_nll.py +0 -0
  827. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_sft_example_selection.py +0 -0
  828. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_sft_gc_off.py +0 -0
  829. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_sft_max_context.py +0 -0
  830. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_sft_step_floor.py +0 -0
  831. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_sft_train.py +0 -0
  832. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_sft_workload.py +0 -0
  833. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_source_attestation_flow.py +0 -0
  834. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_source_layout.py +0 -0
  835. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_source_snapshot.py +0 -0
  836. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_spec_and_validation.py +0 -0
  837. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_spec_contract_bytes.py +0 -0
  838. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_staged_environment.py +0 -0
  839. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_step_floor.py +0 -0
  840. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_step_metrics.py +0 -0
  841. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_step_timing.py +0 -0
  842. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_structured_outputs.py +0 -0
  843. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_teacher_broker.py +0 -0
  844. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_teacher_encoding_contract.py +0 -0
  845. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_terminal_artifacts.py +0 -0
  846. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_thinking_config.py +0 -0
  847. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_train_context_preflight.py +0 -0
  848. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_training_controls.py +0 -0
  849. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_type_comment_prose.py +0 -0
  850. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_vast_api.py +0 -0
  851. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_vast_api_coverage.py +0 -0
  852. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_vast_offers.py +0 -0
  853. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_vast_provider_coverage.py +0 -0
  854. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_vast_runner.py +0 -0
  855. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_verified_revisions.py +0 -0
  856. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_verifiers.py +0 -0
  857. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_verl_checkpoint_export.py +0 -0
  858. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_verl_child_plugins.py +0 -0
  859. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_verl_silence_watchdog.py +0 -0
  860. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_version.py +0 -0
  861. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_vl_warmstart_adapter_keys.py +0 -0
  862. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_vllm_moe_lora_backport.py +0 -0
  863. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_vram_architecture.py +0 -0
  864. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_wandb_link.py +0 -0
  865. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_wandb_naming.py +0 -0
  866. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_warmstart_adapter_download.py +0 -0
  867. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_warmstart_cross_repo.py +0 -0
  868. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_warmstart_error_attribution.py +0 -0
  869. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_warmstart_image_adapters.py +0 -0
  870. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_weight_cache.py +0 -0
  871. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_worker_dryrun.py +0 -0
  872. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_worker_hardexit.py +0 -0
  873. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_worker_image.py +0 -0
  874. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_worker_init_heartbeat.py +0 -0
  875. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_worker_stack.py +0 -0
  876. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_worker_thinking.py +0 -0
  877. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_workflow_contracts.py +0 -0
  878. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_workload_profile.py +0 -0
  879. {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/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.122
3
+ Version: 1.2.123
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
@@ -40,9 +40,13 @@ Modal environment `dev` and that production mode does not. The mode does not cha
40
40
  engine behavior.
41
41
 
42
42
  Both environments keep `MIN_CONTAINERS = 0`, so every GPU engine scales to zero and starts on demand.
43
- The CPU router remains warm. The shared hardcoded settings remain `MAX_CONTAINERS = None`,
44
- `SCALEDOWN_WINDOW_SECONDS = 1800`, and `MAX_INPUTS = 64` with
45
- `TARGET_INPUTS = 48`.
43
+ The CPU router remains warm. The hardcoded settings remain `MAX_CONTAINERS = None`,
44
+ `BUFFER_CONTAINERS = 1` (on the router AND every engine), `SCALEDOWN_WINDOW_SECONDS = 1800`, and
45
+ `MAX_INPUTS = 64` with `TARGET_INPUTS = 48`. `MAX_CONTAINERS` is deliberately uncapped: `base_model` is a
46
+ `modal.parameter()`, so each model has its own container pool and a fixed cap would ceiling one
47
+ model's capacity rather than bounding total spend. Bound spend with workspace quotas and billing
48
+ alerts instead. `BUFFER_CONTAINERS` only provisions while a Function is active, so engines still
49
+ scale to zero when idle.
46
50
 
47
51
  ### Production
48
52
 
@@ -138,12 +138,17 @@ def scaledown_window_for(gpu: str) -> int:
138
138
  # gpu model engines scale to zero. inference and adapter registration remote calls start the matching
139
139
  # parameter-bound engine on demand.
140
140
  MIN_CONTAINERS = 0
141
- # At most 3 GPUs per base model. `base_model` is a modal.parameter(), and Modal gives each distinct
142
- # parameter value its own container pool with its own autoscaling accounting, so this bound applies
143
- # PER MODEL rather than across the catalog. Engines are TENSOR_PARALLEL_SIZE 1 on a single-card `gpu=`
144
- # request, so one container is exactly one GPU and 3 containers is exactly 3 GPUs. Raising this bounds
145
- # spend per model, not total spend: N models can still reach 3N GPUs.
146
- MAX_CONTAINERS = 3
141
+ # No autoscaling cap per base-model engine; modal adds capacity as concurrency demands. A fixed cap
142
+ # here is a hard ceiling on a SINGLE model's capacity: `base_model` is a modal.parameter() and Modal
143
+ # gives each value its own container pool, so sustained load on one model cannot borrow headroom from
144
+ # an idle one. Bound spend with workspace quotas and billing alerts, which do not silently convert
145
+ # demand into queueing on the hot tier.
146
+ MAX_CONTAINERS = None
147
+ # One spare warm container for each autoscaling pool -- every base-model engine AND the cpu router --
148
+ # so a burst past `TARGET_INPUTS` does not pay a full cold boot (420s on L40S, 900s on H100, 1010s on
149
+ # H200) before it can be served. Modal only provisions the buffer while a Function is ACTIVE, so this
150
+ # does not defeat `MIN_CONTAINERS = 0`: idle engines still scale to zero and bill nothing.
151
+ BUFFER_CONTAINERS = 1
147
152
  # Concurrent requests packed onto one base-model GPU before Modal autoscales a new (costly) one.
148
153
  # A real-GPU sweep (scripts/gpu_canary.py::sweep_concurrency on A10G/Qwen2.5-1.5B) showed vLLM
149
154
  # throughput scaling near-linearly with no saturation through 128 concurrent, while TTFT stayed
@@ -428,6 +433,7 @@ def _build_engine(
428
433
  timeout=TIMEOUT_SECONDS,
429
434
  min_containers=MIN_CONTAINERS,
430
435
  max_containers=MAX_CONTAINERS,
436
+ buffer_containers=BUFFER_CONTAINERS,
431
437
  )(modal.concurrent(max_inputs=max_inputs, target_inputs=target_inputs)(_Engine))
432
438
  # Rebind the module name to the decorated handle, matching the normal ``@app.cls class X`` pattern
433
439
  # where the module attribute ends up referring to the decorated class.
@@ -556,6 +562,66 @@ _AUTH_CACHE_TTL_SECONDS = 60.0
556
562
  _AUTH_CACHE_MAX_ENTRIES = 4096
557
563
 
558
564
 
565
+ def _authorize_response_org(resp: Any) -> "str | None":
566
+ """Translate the backend's authorize response into a billing org, or raise.
567
+
568
+ Extracted from _build_chat_authorizer only to keep that closure under the repo's
569
+ function-size limit; it reads nothing but the response, so hoisting it changes no
570
+ behaviour and makes each status mapping testable on its own.
571
+ """
572
+ from fastapi import HTTPException, status
573
+
574
+ if resp.status_code == 200:
575
+ # Return the authorized billing org so the router can meter a base-model serve to the
576
+ # caller (a base model has no adapter owner). A malformed response cannot authorize an
577
+ # external request because that would let base-model usage escape billing.
578
+ try:
579
+ org_id = resp.json().get("orgId")
580
+ except Exception as exc:
581
+ raise HTTPException(
582
+ status.HTTP_503_SERVICE_UNAVAILABLE,
583
+ "serving auth backend returned malformed response",
584
+ ) from exc
585
+ if not isinstance(org_id, str) or not org_id:
586
+ raise HTTPException(
587
+ status.HTTP_503_SERVICE_UNAVAILABLE,
588
+ "serving auth backend returned malformed response",
589
+ )
590
+ return org_id
591
+ if resp.status_code == 401:
592
+ # The backend returns 401 for BOTH an invalid *user* key (our authorize route, body
593
+ # code "invalid_api_key") AND a rejected serving *machine* bearer (require_internal_token,
594
+ # decided before the user key is even read). Only the former is the caller's fault; the
595
+ # latter is a serving misconfiguration we must not report as the user's bad key.
596
+ code = ""
597
+ try:
598
+ detail = resp.json().get("detail")
599
+ if isinstance(detail, dict):
600
+ code = detail.get("code") or ""
601
+ except Exception: # a non-JSON 401 is an internal-auth failure (below)
602
+ code = ""
603
+ if code == "invalid_api_key":
604
+ raise HTTPException(status.HTTP_401_UNAUTHORIZED, "Invalid Freesolo API key")
605
+ raise HTTPException(status.HTTP_503_SERVICE_UNAVAILABLE, "serving auth is misconfigured")
606
+ # Org has no budget to serve (zero balance and no card+auto-topup). The backend gates this
607
+ # before generation so a broke org can't serve for free; surface it as a clean 402 rather
608
+ # than letting it fall through to the retryable 503 below.
609
+ if resp.status_code == 402:
610
+ raise HTTPException(
611
+ status.HTTP_402_PAYMENT_REQUIRED,
612
+ "insufficient balance: top up or enable auto-topup to serve this model",
613
+ )
614
+ # Unknown adapter (404) and org mismatch (403) both collapse to 403 so we don't leak
615
+ # which adapters exist to an unauthorized caller.
616
+ if resp.status_code in (403, 404):
617
+ raise HTTPException(status.HTTP_403_FORBIDDEN, "API key is not authorized for this adapter")
618
+ # Any backend 5xx (500/502/503/504) or other unexpected status is a transient auth-lookup
619
+ # infra failure (Supabase down, backend overloaded). Surface it as a RETRYABLE 503, never a
620
+ # 502: a client/load-balancer must be free to retry rather than treat it as a permanent
621
+ # upstream error. The cache+single-flight above is what makes this failure rare under load.
622
+ raise HTTPException(status.HTTP_503_SERVICE_UNAVAILABLE, "serving auth backend unavailable")
623
+
624
+
559
625
  def _build_chat_authorizer(settings: Any) -> Any:
560
626
  """Build the serving->backend chat authorizer, or None when not configured.
561
627
 
@@ -589,70 +655,30 @@ def _build_chat_authorizer(settings: Any) -> Any:
589
655
 
590
656
  # (api_key_sha256, adapter_id) -> (expires_at_monotonic, org_id); populated only on a successful
591
657
  # authorization. Per-router-container in-memory (each container reduces its own backend load).
592
- _cache: dict[tuple[str, str], tuple[float, str | None]] = {}
658
+ _cache: dict[tuple[str, str, str], tuple[float, str | None]] = {}
593
659
  # In-flight single-flight tasks so concurrent identical misses share ONE backend call.
594
- _inflight: dict[tuple[str, str], asyncio.Task[str | None]] = {}
660
+ _inflight: dict[tuple[str, str, str], asyncio.Task[str | None]] = {}
595
661
 
596
- async def _authorize_backend(api_key: str, adapter_id: str) -> "str | None":
662
+ async def _authorize_backend(
663
+ api_key: str, adapter_id: str, scope: "dict[str, str]"
664
+ ) -> "str | None":
597
665
  try:
598
- resp = await _client.post(url, json={"apiKey": api_key, "modelId": adapter_id})
666
+ resp = await _client.post(
667
+ url,
668
+ json={"apiKey": api_key, "modelId": adapter_id},
669
+ # A training container authenticates with the platform internal key rather
670
+ # than a customer key, so the backend cannot resolve it via
671
+ # authenticate_api_key. It identifies the calling job from these headers and
672
+ # re-checks them against the live job row. Dropping them here is
673
+ # indistinguishable, to the backend, from a request that never had them: it
674
+ # refuses with missing_training_context and catalog sampling fails closed.
675
+ headers=scope or None,
676
+ )
599
677
  except Exception as exc: # backend unreachable -> fail closed, never serve unauthorized
600
678
  raise HTTPException(
601
679
  status.HTTP_503_SERVICE_UNAVAILABLE, "serving auth backend unreachable"
602
680
  ) from exc
603
- if resp.status_code == 200:
604
- # Return the authorized billing org so the router can meter a base-model serve to the
605
- # caller (a base model has no adapter owner). A malformed response cannot authorize an
606
- # external request because that would let base-model usage escape billing.
607
- try:
608
- org_id = resp.json().get("orgId")
609
- except Exception as exc:
610
- raise HTTPException(
611
- status.HTTP_503_SERVICE_UNAVAILABLE,
612
- "serving auth backend returned malformed response",
613
- ) from exc
614
- if not isinstance(org_id, str) or not org_id:
615
- raise HTTPException(
616
- status.HTTP_503_SERVICE_UNAVAILABLE,
617
- "serving auth backend returned malformed response",
618
- )
619
- return org_id
620
- if resp.status_code == 401:
621
- # The backend returns 401 for BOTH an invalid *user* key (our authorize route, body
622
- # code "invalid_api_key") AND a rejected serving *machine* bearer (require_internal_token,
623
- # decided before the user key is even read). Only the former is the caller's fault; the
624
- # latter is a serving misconfiguration we must not report as the user's bad key.
625
- code = ""
626
- try:
627
- detail = resp.json().get("detail")
628
- if isinstance(detail, dict):
629
- code = detail.get("code") or ""
630
- except Exception: # a non-JSON 401 is an internal-auth failure (below)
631
- code = ""
632
- if code == "invalid_api_key":
633
- raise HTTPException(status.HTTP_401_UNAUTHORIZED, "Invalid Freesolo API key")
634
- raise HTTPException(
635
- status.HTTP_503_SERVICE_UNAVAILABLE, "serving auth is misconfigured"
636
- )
637
- # Org has no budget to serve (zero balance and no card+auto-topup). The backend gates this
638
- # before generation so a broke org can't serve for free; surface it as a clean 402 rather
639
- # than letting it fall through to the retryable 503 below.
640
- if resp.status_code == 402:
641
- raise HTTPException(
642
- status.HTTP_402_PAYMENT_REQUIRED,
643
- "insufficient balance: top up or enable auto-topup to serve this model",
644
- )
645
- # Unknown adapter (404) and org mismatch (403) both collapse to 403 so we don't leak
646
- # which adapters exist to an unauthorized caller.
647
- if resp.status_code in (403, 404):
648
- raise HTTPException(
649
- status.HTTP_403_FORBIDDEN, "API key is not authorized for this adapter"
650
- )
651
- # Any backend 5xx (500/502/503/504) or other unexpected status is a transient auth-lookup
652
- # infra failure (Supabase down, backend overloaded). Surface it as a RETRYABLE 503, never a
653
- # 502: a client/load-balancer must be free to retry rather than treat it as a permanent
654
- # upstream error. The cache+single-flight above is what makes this failure rare under load.
655
- raise HTTPException(status.HTTP_503_SERVICE_UNAVAILABLE, "serving auth backend unavailable")
681
+ return _authorize_response_org(resp)
656
682
 
657
683
  def _prune(now: float) -> None:
658
684
  for expired in [k for k, (exp, _) in _cache.items() if exp <= now]:
@@ -663,10 +689,10 @@ def _build_chat_authorizer(settings: Any) -> Any:
663
689
  _cache.pop(k, None)
664
690
 
665
691
  async def _authorize_and_cache(
666
- ck: tuple[str, str], api_key: str, adapter_id: str
692
+ ck: tuple[str, str, str], api_key: str, adapter_id: str, scope: "dict[str, str]"
667
693
  ) -> "str | None":
668
694
  try:
669
- org = await _authorize_backend(api_key, adapter_id)
695
+ org = await _authorize_backend(api_key, adapter_id, scope)
670
696
  finally:
671
697
  # Drop the single-flight slot regardless of outcome so a failed lookup re-checks next
672
698
  # time (failures are never cached) and a success can be re-driven once the cache expires.
@@ -677,9 +703,19 @@ def _build_chat_authorizer(settings: Any) -> Any:
677
703
  _prune(now)
678
704
  return org
679
705
 
680
- async def authorize(api_key: str, adapter_id: str) -> "str | None":
706
+ async def authorize(
707
+ api_key: str, adapter_id: str, scope: "dict[str, str] | None" = None
708
+ ) -> "str | None":
681
709
  # do not retain raw user credentials as live dict keys beyond the request that supplied them.
682
- ck = (hashlib.sha256(api_key.encode("utf-8")).hexdigest(), adapter_id)
710
+ scope = scope or {}
711
+ # The scope is part of the key, not just the payload. Every training container presents
712
+ # the SAME platform internal key, so keying on (key, model) alone would let one job's
713
+ # cached authorization answer another job's request -- and the cached value is the
714
+ # billing org, so the second job's usage would be metered to the first job's tenant.
715
+ scope_digest = hashlib.sha256(
716
+ "\x00".join(f"{k}={scope[k]}" for k in sorted(scope)).encode("utf-8")
717
+ ).hexdigest()
718
+ ck = (hashlib.sha256(api_key.encode("utf-8")).hexdigest(), adapter_id, scope_digest)
683
719
  cached = _cache.get(ck)
684
720
  now = time.monotonic()
685
721
  if cached is not None:
@@ -688,7 +724,7 @@ def _build_chat_authorizer(settings: Any) -> Any:
688
724
  _cache.pop(ck, None)
689
725
  task = _inflight.get(ck)
690
726
  if task is None:
691
- task = asyncio.ensure_future(_authorize_and_cache(ck, api_key, adapter_id))
727
+ task = asyncio.ensure_future(_authorize_and_cache(ck, api_key, adapter_id, scope))
692
728
  # Retrieve the task's outcome even if every awaiter is cancelled (all identical clients
693
729
  # disconnect), so an orphaned single-flight failure doesn't warn "exception never retrieved".
694
730
  task.add_done_callback(lambda t: t.cancelled() or t.exception())
@@ -727,6 +763,7 @@ def _base_model_records() -> list:
727
763
  @app.function(
728
764
  secrets=runtime_secrets,
729
765
  min_containers=1, # one warm CPU front door (hardcoded; no deploy-time knob)
766
+ buffer_containers=BUFFER_CONTAINERS, # scales out with the engines; see BUFFER_CONTAINERS
730
767
  timeout=ROUTER_TIMEOUT_SECONDS, # must cover engine cold start (see ROUTER_TIMEOUT_SECONDS)
731
768
  )
732
769
  @modal.concurrent(max_inputs=MAX_INPUTS, target_inputs=TARGET_INPUTS)
@@ -20,6 +20,7 @@ from flash.serving.src.http.headers import (
20
20
  assert_internal,
21
21
  internal_org_id,
22
22
  is_trusted_internal,
23
+ training_scope_headers,
23
24
  )
24
25
  from flash.serving.src.http.routing import AdapterRouter, EnginePool
25
26
  from flash.serving.src.io.schemas import AdapterRecord
@@ -42,7 +43,10 @@ class ServingContext:
42
43
  serving_release: str,
43
44
  reload_records: Callable[[], list[AdapterRecord]] | None,
44
45
  lookup_record: Callable[[str, str], AdapterRecord | None] | None,
45
- chat_authorizer: Callable[[str, str], Awaitable[str | AuthorizedTraffic | None]] | None,
46
+ chat_authorizer: Callable[
47
+ [str, str, dict[str, str]], Awaitable[str | AuthorizedTraffic | None]
48
+ ]
49
+ | None,
46
50
  ) -> None:
47
51
  self.pool = pool
48
52
  self.router = router
@@ -83,7 +87,7 @@ class ServingContext:
83
87
  raise HTTPException(
84
88
  status.HTTP_503_SERVICE_UNAVAILABLE, "serving auth is not configured"
85
89
  )
86
- authorized = await self.chat_authorizer(token, adapter_id)
90
+ authorized = await self.chat_authorizer(token, adapter_id, training_scope_headers(request))
87
91
  if isinstance(authorized, AuthorizedTraffic):
88
92
  if authorized.principal.kind == "trusted_internal":
89
93
  raise HTTPException(
@@ -50,6 +50,34 @@ def is_trusted_internal(request: Request, trusted_keys: tuple[str, ...]) -> bool
50
50
  return any([hmac.compare_digest(presented, k) for k in trusted_keys]) # noqa: C419
51
51
 
52
52
 
53
+ # The job-scope headers a training container sends with a catalog-base sample. The backend
54
+ # re-checks all five against the live training job row before authorizing, so they have to
55
+ # survive the hop through this service -- it forwards the caller's key but is otherwise the
56
+ # only thing standing between the container and /api/serving/authorize.
57
+ TRAINING_SCOPE_HEADERS = (
58
+ "x-freesolo-org-id",
59
+ "x-freesolo-training-job-id",
60
+ "x-freesolo-project-id",
61
+ "x-freesolo-worker-id",
62
+ "x-freesolo-training-job-attempt",
63
+ )
64
+
65
+
66
+ def training_scope_headers(request: Request) -> dict[str, str]:
67
+ """The training job-scope headers present on this request, lowercased.
68
+
69
+ Absent headers are omitted rather than sent empty: a normal customer chat request
70
+ carries none of these, and forwarding five blanks would make every such request look
71
+ like a malformed training call to the backend.
72
+ """
73
+ found = {}
74
+ for name in TRAINING_SCOPE_HEADERS:
75
+ value = (request.headers.get(name) or "").strip()
76
+ if value:
77
+ found[name] = value
78
+ return found
79
+
80
+
53
81
  def _bearer_token(request: Request) -> str | None:
54
82
  header = request.headers.get("Authorization") or ""
55
83
  scheme, _, value = header.partition(" ")
@@ -56,7 +56,7 @@ def build_serving_app(
56
56
  lookup_record: Callable[[str, str], AdapterRecord | None] | None = None,
57
57
  reload_interval_seconds: float = 30.0,
58
58
  usage_store: UsageStore,
59
- chat_authorizer: Callable[[str, str], Awaitable["str | None"]] | None = None,
59
+ chat_authorizer: Callable[[str, str, dict[str, str]], Awaitable["str | None"]] | None = None,
60
60
  ):
61
61
  """Front-door FastAPI app. ``reload_records`` re-reads persisted ready adapters so a router
62
62
  that missed a (un)registration on another container still resolves it: reload once on a miss
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "freesolo-flash-dev"
3
- version = "1.2.122"
3
+ version = "1.2.123"
4
4
  description ="Flash — managed LoRA post-training (SFT/GRPO/OPD) for Freesolo environments, driven by the `flash` CLI"
5
5
  readme = "README.md"
6
6
  # RunPod Flash supports Python 3.11-3.12 (not 3.13 yet).
@@ -196,7 +196,7 @@ artifacts = ["flash/py.typed"]
196
196
  # auto-published by .github/workflows/publish-dev.yml: a push to `dev` whose version isn't yet on
197
197
  # PyPI publishes it; pushes that don't change it find it already published and no-op. So cutting a
198
198
  # dev-channel release = bump this (and [project].version) and merge to `dev`.
199
- version = "1.2.122"
199
+ version = "1.2.123"
200
200
 
201
201
  [tool.pytest.ini_options]
202
202
  pythonpath = ["."]
@@ -86,7 +86,7 @@ class FakeAuthorizer:
86
86
  self.calls = []
87
87
  self._org = org
88
88
 
89
- async def __call__(self, token, adapter_id):
89
+ async def __call__(self, token, adapter_id, scope=None):
90
90
  self.calls.append((token, adapter_id))
91
91
  return self._org
92
92
 
@@ -81,7 +81,7 @@ class FakeAuthorizer:
81
81
  self.calls: list[tuple[str, str]] = []
82
82
  self._raises = raises
83
83
 
84
- async def __call__(self, token: str, adapter_id: str) -> str:
84
+ async def __call__(self, token: str, adapter_id: str, scope: dict | None = None) -> str:
85
85
  self.calls.append((token, adapter_id))
86
86
  if self._raises is not None:
87
87
  raise self._raises
@@ -82,7 +82,7 @@ def _authorizer(modal_app_module, monkeypatch, response: Any):
82
82
  def __init__(self, *_a: Any, **_k: Any) -> None:
83
83
  pass
84
84
 
85
- async def post(self, _url: str, json: Any) -> _FakeResp:
85
+ async def post(self, _url: str, json: Any, headers: Any = None) -> _FakeResp:
86
86
  if isinstance(response, Exception):
87
87
  raise response
88
88
  return response
@@ -194,7 +194,7 @@ def _counting_client(monkeypatch, responder, *, delay: float = 0.0):
194
194
  def __init__(self, *_a: Any, **_k: Any) -> None:
195
195
  pass
196
196
 
197
- async def post(self, _url: str, json: Any) -> _FakeResp:
197
+ async def post(self, _url: str, json: Any, headers: Any = None) -> _FakeResp:
198
198
  calls["n"] += 1
199
199
  n = calls["n"]
200
200
  if delay:
@@ -413,6 +413,9 @@ def test_failed_authorization_is_not_cached(modal_app_module, monkeypatch):
413
413
  assert calls["n"] == 2
414
414
 
415
415
 
416
+ _EMPTY_SCOPE_DIGEST = hashlib.sha256(b"").hexdigest()
417
+
418
+
416
419
  def test_expired_key_is_evicted_before_reauthorization(modal_app_module, monkeypatch):
417
420
  import asyncio
418
421
  import inspect
@@ -426,7 +429,11 @@ def test_expired_key_is_evicted_before_reauthorization(modal_app_module, monkeyp
426
429
  authorize = _new_authorizer(modal_app_module)
427
430
  cache = inspect.getclosurevars(authorize).nonlocals["_cache"]
428
431
  request_key = ("synthetic-expired-key", "adapter-1")
429
- cache_key = (hashlib.sha256(request_key[0].encode("utf-8")).hexdigest(), request_key[1])
432
+ cache_key = (
433
+ hashlib.sha256(request_key[0].encode("utf-8")).hexdigest(),
434
+ request_key[1],
435
+ _EMPTY_SCOPE_DIGEST,
436
+ )
430
437
 
431
438
  async def run() -> None:
432
439
  await authorize(*request_key)
@@ -455,10 +462,12 @@ def test_prune_removes_expired_keys_below_capacity(modal_app_module, monkeypatch
455
462
  expired_key = (
456
463
  hashlib.sha256(expired_request[0].encode("utf-8")).hexdigest(),
457
464
  expired_request[1],
465
+ _EMPTY_SCOPE_DIGEST,
458
466
  )
459
467
  current_key = (
460
468
  hashlib.sha256(current_request[0].encode("utf-8")).hexdigest(),
461
469
  current_request[1],
470
+ _EMPTY_SCOPE_DIGEST,
462
471
  )
463
472
 
464
473
  async def run() -> None:
@@ -264,7 +264,7 @@ def test_hosted_authorizer_uses_freesolo_model_id_schema(monkeypatch) -> None:
264
264
  def __init__(self, *_args, **_kwargs):
265
265
  pass
266
266
 
267
- async def post(self, _url, *, json):
267
+ async def post(self, _url, *, json, headers=None):
268
268
  seen.update(json)
269
269
  return _Response()
270
270
 
@@ -72,7 +72,7 @@ class FakeAuthorizer:
72
72
  self.calls: list[tuple[str, str]] = []
73
73
  self.error = error
74
74
 
75
- async def __call__(self, token: str, adapter_id: str) -> str:
75
+ async def __call__(self, token: str, adapter_id: str, scope: dict | None = None) -> str:
76
76
  self.calls.append((token, adapter_id))
77
77
  if self.error is not None:
78
78
  raise self.error
@@ -744,7 +744,7 @@ class _Pool:
744
744
  return None
745
745
 
746
746
 
747
- async def _allow(_token: str, _adapter_id: str) -> str:
747
+ async def _allow(_token: str, _adapter_id: str, _scope: dict | None = None) -> str:
748
748
  return "org-1"
749
749
 
750
750
 
@@ -28,7 +28,7 @@ from tests.serving.checkpoint_fixtures import (
28
28
  from tests.serving.conftest import attest
29
29
 
30
30
 
31
- async def _allow(_token: str, _adapter_id: str) -> str:
31
+ async def _allow(_token: str, _adapter_id: str, _scope: dict | None = None) -> str:
32
32
  """Permissive attributed authorizer for routing tests."""
33
33
  return "org-1"
34
34
 
@@ -894,7 +894,7 @@ def test_openai_chat_stream_sets_anti_buffering_headers(app_setup):
894
894
  def test_openai_chat_rejects_non_boolean_stream_after_authorization(stream):
895
895
  authorizations: list[str] = []
896
896
 
897
- async def _authorize(_token: str, adapter_id: str) -> str:
897
+ async def _authorize(_token: str, adapter_id: str, _scope: dict | None = None) -> str:
898
898
  authorizations.append(adapter_id)
899
899
  return "org-1"
900
900
 
@@ -30,7 +30,7 @@ from flash.serving.src.io.structured_outputs import StructuredOutputsError
30
30
  QWEN = "Qwen/Qwen3.5-9B"
31
31
 
32
32
 
33
- async def _allow(_token: str, _adapter_id: str) -> str:
33
+ async def _allow(_token: str, _adapter_id: str, _scope: dict | None = None) -> str:
34
34
  return "org-1"
35
35
 
36
36
 
@@ -19,7 +19,7 @@ from tests.serving.conftest import attest
19
19
  QWEN = "Qwen/Qwen3.5-9B"
20
20
 
21
21
 
22
- async def _allow(_token: str, _adapter_id: str) -> str:
22
+ async def _allow(_token: str, _adapter_id: str, _scope: dict | None = None) -> str:
23
23
  return "org-1"
24
24
 
25
25
 
@@ -26,7 +26,7 @@ from tests.serving.conftest import attest
26
26
  QWEN = "Qwen/Qwen3.5-9B"
27
27
 
28
28
 
29
- async def _allow(_token: str, _adapter_id: str) -> str:
29
+ async def _allow(_token: str, _adapter_id: str, _scope: dict | None = None) -> str:
30
30
  return "org-1"
31
31
 
32
32
 
@@ -295,7 +295,7 @@ def test_nonstream_capture_is_awaited_before_successful_response() -> None:
295
295
  pool = _Pool()
296
296
  store = _Store()
297
297
 
298
- async def authorize(_token: str, _adapter_id: str) -> str:
298
+ async def authorize(_token: str, _adapter_id: str, _scope: dict | None = None) -> str:
299
299
  return "org-1"
300
300
 
301
301
  app = build_serving_app(
@@ -330,7 +330,7 @@ def test_stream_captures_in_progress_before_response_and_finalizes_same_id() ->
330
330
  pool = _Pool()
331
331
  store = _Store()
332
332
 
333
- async def authorize(_token: str, _adapter_id: str) -> str:
333
+ async def authorize(_token: str, _adapter_id: str, _scope: dict | None = None) -> str:
334
334
  return "org-1"
335
335
 
336
336
  app = build_serving_app(
@@ -412,7 +412,7 @@ def test_stream_finalization_preserves_first_event_attestation() -> None:
412
412
  def test_stream_capture_failure_before_headers_returns_controlled_503() -> None:
413
413
  record = _revision()
414
414
 
415
- async def authorize(_token: str, _adapter_id: str) -> str:
415
+ async def authorize(_token: str, _adapter_id: str, _scope: dict | None = None) -> str:
416
416
  return "org-1"
417
417
 
418
418
  app = build_serving_app(
@@ -439,7 +439,7 @@ def test_thinking_request_is_rejected_before_engine_dispatch() -> None:
439
439
  record = _revision().model_copy(update={"thinking": True})
440
440
  pool = _Pool()
441
441
 
442
- async def authorize(_token: str, _adapter_id: str) -> str:
442
+ async def authorize(_token: str, _adapter_id: str, _scope: dict | None = None) -> str:
443
443
  return "org-1"
444
444
 
445
445
  app = build_serving_app(
@@ -461,7 +461,7 @@ def test_thinking_request_is_rejected_before_engine_dispatch() -> None:
461
461
  def test_nonstream_capture_failure_returns_controlled_503() -> None:
462
462
  record = _revision()
463
463
 
464
- async def authorize(_token: str, _adapter_id: str) -> str:
464
+ async def authorize(_token: str, _adapter_id: str, _scope: dict | None = None) -> str:
465
465
  return "org-1"
466
466
 
467
467
  app = build_serving_app(
@@ -124,21 +124,31 @@ def test_lora_engine_scales_to_zero_by_default(modal_app_module):
124
124
  assert modal_app_module.app.function.call_args.kwargs["min_containers"] == 1
125
125
 
126
126
 
127
- def test_every_gpu_engine_is_capped_at_three_containers(modal_app_module):
128
- # At most 3 GPUs per base model. `base_model` is a modal.parameter(), so Modal gives each distinct
129
- # value its own container pool with its own autoscaling accounting -- the cap therefore binds PER
130
- # MODEL, not across the catalog. Engines are tensor-parallel 1 on a single-card `gpu=` request, so
131
- # one container is exactly one GPU. Asserted on the kwargs modal is actually CALLED with, because a
132
- # ceiling that never reaches `app.cls` does not bound anything.
133
- assert modal_app_module.MAX_CONTAINERS == 3
127
+ def test_no_gpu_engine_is_capped_and_each_keeps_one_buffer(modal_app_module):
128
+ # `base_model` is a modal.parameter(), so Modal gives each distinct value its own container pool
129
+ # with its own autoscaling accounting. A fixed cap therefore ceilings a SINGLE model's capacity
130
+ # rather than bounding total spend -- sustained load on one model cannot borrow headroom from an
131
+ # idle one, so the cap converts demand into queueing on the hot tier. Spend is bounded by workspace
132
+ # quotas and billing alerts instead. Asserted on the kwargs modal is actually CALLED with, because
133
+ # a module constant that never reaches `app.cls` governs nothing.
134
+ assert modal_app_module.MAX_CONTAINERS is None
135
+ assert modal_app_module.BUFFER_CONTAINERS == 1
134
136
 
135
137
  cls_calls = [call.kwargs for call in modal_app_module.app.cls.call_args_list]
136
138
  assert len(cls_calls) == len(modal_app_module.ENGINE_BY_KEY)
137
- assert all(kwargs["max_containers"] == 3 for kwargs in cls_calls)
138
-
139
- # The cpu router is deliberately UNCAPPED: it is the front door that triggers cold engines, and
140
- # capping it would throttle every model at once rather than bounding gpu spend per model.
141
- assert "max_containers" not in modal_app_module.app.function.call_args.kwargs
139
+ assert all(kwargs["max_containers"] is None for kwargs in cls_calls)
140
+ # One spare warm container per engine absorbs a burst past TARGET_INPUTS without a cold boot.
141
+ # `buffer_containers` only provisions while the Function is ACTIVE, so this preserves scale-to-zero
142
+ # (MIN_CONTAINERS stays 0) rather than paying for an idle gpu.
143
+ assert all(kwargs["buffer_containers"] == 1 for kwargs in cls_calls)
144
+ assert all(kwargs["min_containers"] == 0 for kwargs in cls_calls)
145
+
146
+ # The cpu router is likewise uncapped: it is the front door that triggers cold engines, and
147
+ # capping it would throttle every model at once rather than bounding gpu spend per model. It
148
+ # carries the same buffer, so a burst does not queue behind the front door it just cleared.
149
+ router_kwargs = modal_app_module.app.function.call_args.kwargs
150
+ assert "max_containers" not in router_kwargs
151
+ assert router_kwargs["buffer_containers"] == 1
142
152
 
143
153
 
144
154
  def test_scaledown_window_is_per_tier_and_cheaper_tiers_release_sooner(modal_app_module):
@@ -1480,7 +1480,7 @@ wheels = [
1480
1480
 
1481
1481
  [[package]]
1482
1482
  name = "freesolo-flash"
1483
- version = "1.2.122"
1483
+ version = "1.2.123"
1484
1484
  source = { editable = "." }
1485
1485
 
1486
1486
  [package.optional-dependencies]