freesolo-flash-dev 1.2.121__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.121 → freesolo_flash_dev-1.2.123}/PKG-INFO +1 -1
  2. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/docs/serving-contract.md +1 -1
  3. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/core/catalog.py +1 -1
  4. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/app/README.md +17 -12
  5. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/app/modal_app.py +104 -63
  6. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/accounting/usage.py +10 -9
  7. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/engine/model_config.py +31 -29
  8. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/engine/prequant_config.py +4 -4
  9. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/http/context.py +6 -2
  10. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/http/headers.py +28 -0
  11. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/http/router.py +1 -1
  12. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/pyproject.toml +2 -2
  13. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_base_model_serving.py +1 -1
  14. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_chat_auth.py +1 -1
  15. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_chat_authorizer.py +12 -3
  16. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_checkpoint_identity_repairs.py +1 -1
  17. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_checkpoint_model_validation.py +1 -1
  18. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_model_config.py +16 -11
  19. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_multimodal.py +1 -1
  20. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_per_model_gpu.py +10 -8
  21. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_prequant_config.py +7 -6
  22. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_router.py +2 -2
  23. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_router_coverage.py +1 -1
  24. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_router_edge_coverage.py +1 -1
  25. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_serve_reasoning_split.py +1 -1
  26. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_usage_outbox.py +19 -29
  27. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_usage_reporter.py +27 -0
  28. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_catalog_consistency.py +2 -2
  29. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_serve.py +40 -4
  30. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/uv.lock +1 -1
  31. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/.dockerignore +0 -0
  32. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/.env.example +0 -0
  33. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/.github/CODEOWNERS +0 -0
  34. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  35. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  36. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  37. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  38. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/.github/dependabot.yml +0 -0
  39. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/.github/workflows/auto-rebake.yml +0 -0
  40. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/.github/workflows/bake-kernel-cache.yml +0 -0
  41. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/.github/workflows/ci.yml +0 -0
  42. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/.github/workflows/deploy-modal-dev.yml +0 -0
  43. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/.github/workflows/deploy-modal.yml +0 -0
  44. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/.github/workflows/dev-kernel-cache.yml +0 -0
  45. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/.github/workflows/main-source-guard.yml +0 -0
  46. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/.github/workflows/notify-tests-repo.yml +0 -0
  47. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/.github/workflows/production-kernel-cache-ready.yml +0 -0
  48. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/.github/workflows/publish-dev.yml +0 -0
  49. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/.github/workflows/publish-image.yml +0 -0
  50. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/.github/workflows/publish-serving-image.yml +0 -0
  51. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/.github/workflows/publish.yml +0 -0
  52. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/.github/workflows/version-parity.yml +0 -0
  53. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/.github/workflows/worker-image.yml +0 -0
  54. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/.gitignore +0 -0
  55. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/CHANGELOG.md +0 -0
  56. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/CODE_OF_CONDUCT.md +0 -0
  57. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/CONTRIBUTING.md +0 -0
  58. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/Dockerfile +0 -0
  59. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/Dockerfile.serve +0 -0
  60. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/Dockerfile.worker +0 -0
  61. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/LICENSE +0 -0
  62. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/NOTICE +0 -0
  63. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/README.md +0 -0
  64. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/SECURITY.md +0 -0
  65. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/SELF_HOSTING.md +0 -0
  66. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/build/kernel_cache/.gitignore +0 -0
  67. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/build/kernel_cache/.keep +0 -0
  68. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/deploy/infisical/README.md +0 -0
  69. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/deploy/infisical/entrypoint.sh +0 -0
  70. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/docker/Dockerfile.kernelcache +0 -0
  71. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/docker/Dockerfile.kernelcache.relayer +0 -0
  72. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/docker/bake_kernel_cache.py +0 -0
  73. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/docker/bake_pod_entry.py +0 -0
  74. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/docker/extract_cudart_fix.py +0 -0
  75. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/docker/kernel_fingerprint.py +0 -0
  76. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/docker/make_rp_handler.py +0 -0
  77. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/docker/patch_vllm_moe_lora.py +0 -0
  78. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/__init__.py +0 -0
  79. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/_internal/__init__.py +0 -0
  80. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/_internal/channel.py +0 -0
  81. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/_internal/diagnostics.py +0 -0
  82. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/_internal/fileio.py +0 -0
  83. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/_internal/logging.py +0 -0
  84. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/_internal/openai_sse.py +0 -0
  85. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/_internal/paths.py +0 -0
  86. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/_internal/version.py +0 -0
  87. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/adapters/__init__.py +0 -0
  88. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/adapters/artifacts.py +0 -0
  89. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/adapters/fused_experts.py +0 -0
  90. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/adapters/lora_rank.py +0 -0
  91. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/adapters/targets.py +0 -0
  92. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/__init__.py +0 -0
  93. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/__main__.py +0 -0
  94. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/commands/__init__.py +0 -0
  95. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/commands/env/__init__.py +0 -0
  96. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/commands/env/ops/__init__.py +0 -0
  97. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/commands/env/ops/imports.py +0 -0
  98. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/commands/env/ops/list.py +0 -0
  99. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/commands/env/ops/push.py +0 -0
  100. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/commands/env/ops/retained.py +0 -0
  101. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/commands/env/ops/setup.py +0 -0
  102. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/commands/env/ops/setup_wandb.py +0 -0
  103. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/commands/env/testing/__init__.py +0 -0
  104. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/commands/env/testing/episode.py +0 -0
  105. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/commands/env/testing/eval.py +0 -0
  106. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/commands/env/testing/eval_args.py +0 -0
  107. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/commands/env/testing/evaluations.py +0 -0
  108. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/commands/env/testing/params.py +0 -0
  109. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/commands/env/testing/test.py +0 -0
  110. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/commands/env/testing/warnings.py +0 -0
  111. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/commands/ops/__init__.py +0 -0
  112. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/commands/ops/account.py +0 -0
  113. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/commands/ops/catalog.py +0 -0
  114. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/commands/ops/deploy.py +0 -0
  115. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/commands/ops/log_follow.py +0 -0
  116. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/commands/ops/prompt_budget.py +0 -0
  117. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/commands/ops/runs.py +0 -0
  118. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/commands/ops/traces.py +0 -0
  119. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/commands/ops/train.py +0 -0
  120. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/commands/ops/worker_output.py +0 -0
  121. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/commands/serving/__init__.py +0 -0
  122. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/commands/serving/deploy.py +0 -0
  123. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/commands/serving/identity.py +0 -0
  124. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/commands/serving/status.py +0 -0
  125. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/commands/serving/undeploy.py +0 -0
  126. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/parsing/__init__.py +0 -0
  127. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/parsing/account.py +0 -0
  128. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/parsing/env.py +0 -0
  129. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/parsing/errors.py +0 -0
  130. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/parsing/main.py +0 -0
  131. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/parsing/models.py +0 -0
  132. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/parsing/serve_parser.py +0 -0
  133. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/parsing/traces.py +0 -0
  134. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/parsing/training.py +0 -0
  135. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/scaffold/TRAINING.md +0 -0
  136. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/scaffold/__init__.py +0 -0
  137. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/ui/__init__.py +0 -0
  138. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/ui/cost.py +0 -0
  139. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/ui/env_panels.py +0 -0
  140. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/ui/heartbeat.py +0 -0
  141. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/ui/render.py +0 -0
  142. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/ui/tables.py +0 -0
  143. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/ui/tty.py +0 -0
  144. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/client/__init__.py +0 -0
  145. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/client/config.py +0 -0
  146. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/client/freesolo_api.py +0 -0
  147. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/client/http.py +0 -0
  148. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/client/runtime_secrets.py +0 -0
  149. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/client/shapes.py +0 -0
  150. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/client/specs.py +0 -0
  151. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/client/streaming.py +0 -0
  152. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/content/__init__.py +0 -0
  153. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/content/image_descriptors.py +0 -0
  154. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/content/multimodal.py +0 -0
  155. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/content/reasoning_normalization.py +0 -0
  156. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/content/structured_outputs.py +0 -0
  157. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/content/thinking.py +0 -0
  158. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/core/__init__.py +0 -0
  159. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/core/grpo.py +0 -0
  160. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/core/spec.py +0 -0
  161. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/core/spec_persistence.py +0 -0
  162. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cost/__init__.py +0 -0
  163. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cost/analytical.py +0 -0
  164. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cost/currency.py +0 -0
  165. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cost/facts.py +0 -0
  166. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cost/spec.py +0 -0
  167. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cost/types.py +0 -0
  168. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/__init__.py +0 -0
  169. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/plan/__init__.py +0 -0
  170. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/plan/kv_sizing.py +0 -0
  171. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/plan/model_config_probe.py +0 -0
  172. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/plan/prompt_budget.py +0 -0
  173. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/plan/recipe.py +0 -0
  174. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/plan/steps.py +0 -0
  175. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/plan/vram.py +0 -0
  176. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/profiling/__init__.py +0 -0
  177. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/profiling/dataset_profile.py +0 -0
  178. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/profiling/image_tokens.py +0 -0
  179. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/profiling/reasoning_render.py +0 -0
  180. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/profiling/sft_image_rows.py +0 -0
  181. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/profiling/sft_workload.py +0 -0
  182. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/profiling/tokenizer.py +0 -0
  183. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/profiling/workload_profile.py +0 -0
  184. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/result/__init__.py +0 -0
  185. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/result/accounting.py +0 -0
  186. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/result/rollout_samples.py +0 -0
  187. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/support/__init__.py +0 -0
  188. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/support/huggingface.py +0 -0
  189. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/support/verl_checkpoint.py +0 -0
  190. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/support/verl_policy.py +0 -0
  191. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/support/worker_entrypoint.py +0 -0
  192. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/__init__.py +0 -0
  193. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/__main__.py +0 -0
  194. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/entry/__init__.py +0 -0
  195. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/entry/opd.py +0 -0
  196. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/entry/rl.py +0 -0
  197. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/entry/sft.py +0 -0
  198. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/entry/worker.py +0 -0
  199. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/io/__init__.py +0 -0
  200. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/io/heartbeat.py +0 -0
  201. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/io/hf.py +0 -0
  202. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/io/prefetch.py +0 -0
  203. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/io/wandb_log.py +0 -0
  204. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/model/__init__.py +0 -0
  205. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/model/adapter.py +0 -0
  206. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/model/chatml_mask.py +0 -0
  207. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/model/decoding.py +0 -0
  208. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/model/lora.py +0 -0
  209. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/model/packing.py +0 -0
  210. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/perf/__init__.py +0 -0
  211. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/perf/diagnostics.py +0 -0
  212. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/perf/lifecycle.py +0 -0
  213. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/perf/liger.py +0 -0
  214. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/perf/memory.py +0 -0
  215. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/runtime/__init__.py +0 -0
  216. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/runtime/kernel_warmup.py +0 -0
  217. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/runtime/rng.py +0 -0
  218. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/runtime/state.py +0 -0
  219. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/teacher/__init__.py +0 -0
  220. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/teacher/client.py +0 -0
  221. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/teacher/encoding.py +0 -0
  222. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/teacher/tokenizer_align.py +0 -0
  223. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/__init__.py +0 -0
  224. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/core/__init__.py +0 -0
  225. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/core/child/__init__.py +0 -0
  226. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/core/child/glue.py +0 -0
  227. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/core/child/runtime.py +0 -0
  228. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/core/lifecycle/__init__.py +0 -0
  229. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/core/lifecycle/finalize.py +0 -0
  230. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/core/lifecycle/ledger.py +0 -0
  231. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/core/lifecycle/step_timing.py +0 -0
  232. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/entry/__init__.py +0 -0
  233. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/entry/backend_common.py +0 -0
  234. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/entry/opd_train.py +0 -0
  235. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/entry/opd_train_runner.py +0 -0
  236. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/entry/prompt_rows.py +0 -0
  237. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/entry/rl_train.py +0 -0
  238. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/entry/rl_train_runner.py +0 -0
  239. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/entry/score_batcher.py +0 -0
  240. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/entry/sft_train.py +0 -0
  241. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/entry/sft_train_runner.py +0 -0
  242. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/__init__.py +0 -0
  243. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/bridging/__init__.py +0 -0
  244. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/bridging/batching.py +0 -0
  245. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/bridging/bridge.py +0 -0
  246. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/bridging/failures.py +0 -0
  247. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/bridging/prompts.py +0 -0
  248. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/bridging/scoring.py +0 -0
  249. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/child/__init__.py +0 -0
  250. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/child/bridge.py +0 -0
  251. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/child/entry.py +0 -0
  252. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/child/multiturn.py +0 -0
  253. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/child/plugin.py +0 -0
  254. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/child/replay_guard.py +0 -0
  255. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/child/runtime.py +0 -0
  256. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/child/structured.py +0 -0
  257. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/multiturn/__init__.py +0 -0
  258. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/multiturn/media.py +0 -0
  259. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/multiturn/validation.py +0 -0
  260. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/orchestration/__init__.py +0 -0
  261. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/orchestration/failures.py +0 -0
  262. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/orchestration/gkd.py +0 -0
  263. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/orchestration/overrides.py +0 -0
  264. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/orchestration/progress.py +0 -0
  265. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/orchestration/prompt_preparation.py +0 -0
  266. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/orchestration/protocol.py +0 -0
  267. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/orchestration/reporting.py +0 -0
  268. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/orchestration/state.py +0 -0
  269. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/orchestration/validation.py +0 -0
  270. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/rl/__init__.py +0 -0
  271. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/rl/child/__init__.py +0 -0
  272. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/rl/child/entry.py +0 -0
  273. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/rl/child/multiturn.py +0 -0
  274. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/rl/child/patches.py +0 -0
  275. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/rl/child/plugin.py +0 -0
  276. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/rl/launch/__init__.py +0 -0
  277. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/rl/launch/checkpoints.py +0 -0
  278. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/rl/launch/config.py +0 -0
  279. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/rl/launch/inputs.py +0 -0
  280. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/rl/launch/verl_config.py +0 -0
  281. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/rl/rollout/__init__.py +0 -0
  282. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/rl/rollout/identity.py +0 -0
  283. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/rl/rollout/multi_turn.py +0 -0
  284. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/rl/rollout/reward_module.py +0 -0
  285. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/rl/rollout/scoring.py +0 -0
  286. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/rl/rollout/single_turn.py +0 -0
  287. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/sft/__init__.py +0 -0
  288. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/sft/child/entry.py +0 -0
  289. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/sft/child/plugin.py +0 -0
  290. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/sft/setup/__init__.py +0 -0
  291. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/sft/setup/checkpoints.py +0 -0
  292. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/sft/setup/config.py +0 -0
  293. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/verl/__init__.py +0 -0
  294. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/verl/capabilities.py +0 -0
  295. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/verl/checkpoints.py +0 -0
  296. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/verl/child_io.py +0 -0
  297. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/verl/diagnostics.py +0 -0
  298. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/verl/parallelism.py +0 -0
  299. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/verl/parent_work.py +0 -0
  300. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/verl/process_census.py +0 -0
  301. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/envs/__init__.py +0 -0
  302. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/envs/loading/__init__.py +0 -0
  303. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/envs/loading/adapter.py +0 -0
  304. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/envs/loading/base.py +0 -0
  305. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/envs/loading/loader.py +0 -0
  306. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/envs/loading/pull.py +0 -0
  307. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/envs/loading/staged.py +0 -0
  308. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/envs/meta/__init__.py +0 -0
  309. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/envs/meta/cache_security.py +0 -0
  310. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/envs/meta/dataset_selection.py +0 -0
  311. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/envs/meta/evaluations.py +0 -0
  312. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/envs/meta/identity.py +0 -0
  313. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/envs/meta/namespace_listing.py +0 -0
  314. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/envs/package/__init__.py +0 -0
  315. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/envs/package/direct_tokens.py +0 -0
  316. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/envs/package/limits.py +0 -0
  317. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/envs/package/unpack.py +0 -0
  318. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/__init__.py +0 -0
  319. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/__init__.py +0 -0
  320. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/bootstrapping/__init__.py +0 -0
  321. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/bootstrapping/bootstrap.py +0 -0
  322. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/bootstrapping/console.py +0 -0
  323. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/bootstrapping/pip.py +0 -0
  324. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/bootstrapping/secrets.py +0 -0
  325. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/host/__init__.py +0 -0
  326. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/host/deadline_sleep.py +0 -0
  327. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/host/failmark.py +0 -0
  328. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/host/hostlog.py +0 -0
  329. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/instances/__init__.py +0 -0
  330. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/instances/instance.py +0 -0
  331. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/instances/poll.py +0 -0
  332. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/instances/poll_instance.py +0 -0
  333. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/instances/provider.py +0 -0
  334. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/instances/terminal_artifacts.py +0 -0
  335. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/net/__init__.py +0 -0
  336. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/net/auth.py +0 -0
  337. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/net/deadline.py +0 -0
  338. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/net/http.py +0 -0
  339. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/net/worker.py +0 -0
  340. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/artifacts/__init__.py +0 -0
  341. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/artifacts/hf.py +0 -0
  342. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/artifacts/preload_runpod.py +0 -0
  343. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/artifacts/weight_cache.py +0 -0
  344. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/core/__init__.py +0 -0
  345. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/core/allocator.py +0 -0
  346. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/core/base.py +0 -0
  347. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/core/fit_errors.py +0 -0
  348. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/core/preflight.py +0 -0
  349. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/core/realized.py +0 -0
  350. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/core/registry.py +0 -0
  351. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/core/sharding.py +0 -0
  352. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/lambda_/__init__.py +0 -0
  353. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/lambda_/client/__init__.py +0 -0
  354. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/lambda_/client/api.py +0 -0
  355. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/lambda_/client/auth.py +0 -0
  356. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/lambda_/client/gpus.py +0 -0
  357. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/lambda_/client/preflight.py +0 -0
  358. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/lambda_/client/pricing.py +0 -0
  359. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/lambda_/execution/__init__.py +0 -0
  360. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/lambda_/execution/provider.py +0 -0
  361. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/lambda_/jobs/__init__.py +0 -0
  362. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/lambda_/jobs/builders.py +0 -0
  363. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/lambda_/jobs/reap.py +0 -0
  364. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/runpod/__init__.py +0 -0
  365. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/runpod/client/__init__.py +0 -0
  366. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/runpod/client/api.py +0 -0
  367. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/runpod/client/auth.py +0 -0
  368. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/runpod/client/cost.py +0 -0
  369. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/runpod/client/gpus.py +0 -0
  370. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/runpod/client/preflight.py +0 -0
  371. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/runpod/client/pricing.py +0 -0
  372. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/runpod/execution/__init__.py +0 -0
  373. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/runpod/execution/job_execution.py +0 -0
  374. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/runpod/execution/jobs.py +0 -0
  375. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/runpod/execution/polling.py +0 -0
  376. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/runpod/execution/provider.py +0 -0
  377. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/runpod/execution/resources.py +0 -0
  378. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/runpod/serverless/__init__.py +0 -0
  379. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/runpod/serverless/endpoints.py +0 -0
  380. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/vast/__init__.py +0 -0
  381. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/vast/client/__init__.py +0 -0
  382. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/vast/client/api.py +0 -0
  383. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/vast/client/auth.py +0 -0
  384. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/vast/client/preflight.py +0 -0
  385. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/vast/client/pricing.py +0 -0
  386. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/vast/execution/__init__.py +0 -0
  387. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/vast/execution/provider.py +0 -0
  388. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/vast/jobs/__init__.py +0 -0
  389. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/vast/jobs/builders.py +0 -0
  390. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/py.typed +0 -0
  391. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/runner/__init__.py +0 -0
  392. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/runner/accounting/__init__.py +0 -0
  393. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/runner/accounting/artifacts.py +0 -0
  394. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/runner/accounting/costs.py +0 -0
  395. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/runner/accounting/reconciliation.py +0 -0
  396. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/runner/accounting/weight_cache.py +0 -0
  397. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/runner/lifecycle/__init__.py +0 -0
  398. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/runner/lifecycle/attempts.py +0 -0
  399. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/runner/lifecycle/deadlines.py +0 -0
  400. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/runner/lifecycle/preparation.py +0 -0
  401. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/runner/lifecycle/reporting.py +0 -0
  402. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/runner/lifecycle/state.py +0 -0
  403. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/runner/lifecycle/status.py +0 -0
  404. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/runner/lifecycle/submit.py +0 -0
  405. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/runner/results/__init__.py +0 -0
  406. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/runner/results/checkpoints.py +0 -0
  407. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/runner/results/verified_revisions.py +0 -0
  408. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/runner/supervise/__init__.py +0 -0
  409. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/runner/supervise/attach.py +0 -0
  410. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/runner/supervise/attach_reconcile.py +0 -0
  411. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/runner/supervise/deploy.py +0 -0
  412. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/runner/supervise/errors.py +0 -0
  413. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/runner/supervise/lifecycle.py +0 -0
  414. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/runner/supervise/recovery.py +0 -0
  415. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/runner/supervise/retry_decision.py +0 -0
  416. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/runner/supervise/seed_submission.py +0 -0
  417. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/runner/supervise/transitions.py +0 -0
  418. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/runtime_capsule/__init__.py +0 -0
  419. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/runtime_capsule/build.py +0 -0
  420. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/runtime_capsule/manifest.py +0 -0
  421. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/runtime_capsule/profiles.py +0 -0
  422. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/schema/__init__.py +0 -0
  423. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/schema/fields.py +0 -0
  424. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/__init__.py +0 -0
  425. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/app/__init__.py +0 -0
  426. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/app/__main__.py +0 -0
  427. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/app/bootstrap.py +0 -0
  428. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/app/chat_stream.py +0 -0
  429. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/app/http.py +0 -0
  430. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/app/launch.py +0 -0
  431. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/app/manifest.py +0 -0
  432. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/app/materialize.py +0 -0
  433. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/app/openai.py +0 -0
  434. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/app/progress.py +0 -0
  435. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/contract/__init__.py +0 -0
  436. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/contract/errors.py +0 -0
  437. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/contract/protocol.py +0 -0
  438. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/contract/provenance.py +0 -0
  439. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/contract/responses.py +0 -0
  440. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/contract/urls.py +0 -0
  441. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/control/__init__.py +0 -0
  442. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/control/_canonical.py +0 -0
  443. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/control/_serialization.py +0 -0
  444. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/control/_urls.py +0 -0
  445. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/control/credentials.py +0 -0
  446. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/control/planning.py +0 -0
  447. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/control/types.py +0 -0
  448. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/deployment/__init__.py +0 -0
  449. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/deployment/adapter_check.py +0 -0
  450. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/deployment/deploy.py +0 -0
  451. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/deployment/export.py +0 -0
  452. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/deployment/preflight.py +0 -0
  453. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/deployment/profiles.py +0 -0
  454. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/deployment/readiness.py +0 -0
  455. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/deployment/resolve.py +0 -0
  456. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/provisioning/__init__.py +0 -0
  457. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/provisioning/common/__init__.py +0 -0
  458. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/provisioning/common/records.py +0 -0
  459. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/provisioning/modal/__init__.py +0 -0
  460. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/provisioning/modal/execution/__init__.py +0 -0
  461. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/provisioning/modal/execution/deployment.py +0 -0
  462. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/provisioning/modal/execution/lifecycle.py +0 -0
  463. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/provisioning/modal/execution/operations.py +0 -0
  464. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/provisioning/modal/execution/sdk.py +0 -0
  465. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/provisioning/modal/planning/__init__.py +0 -0
  466. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/provisioning/modal/planning/plan.py +0 -0
  467. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/provisioning/modal/planning/resources.py +0 -0
  468. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/provisioning/modal/planning/wrapper.py +0 -0
  469. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/provisioning/modal/readiness_checks/__init__.py +0 -0
  470. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/provisioning/modal/readiness_checks/probe.py +0 -0
  471. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/provisioning/modal/readiness_checks/readiness.py +0 -0
  472. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/provisioning/modal/readiness_checks/teardown.py +0 -0
  473. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/request/__init__.py +0 -0
  474. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/request/openai.py +0 -0
  475. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/request/runtime_support.py +0 -0
  476. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/request/streaming.py +0 -0
  477. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/request/thinking.py +0 -0
  478. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/request/transport.py +0 -0
  479. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/request/validation.py +0 -0
  480. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/runtime/__init__.py +0 -0
  481. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/runtime/adapters.py +0 -0
  482. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/runtime/engine.py +0 -0
  483. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/runtime/errors.py +0 -0
  484. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/runtime/multimodal.py +0 -0
  485. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/runtime/prompt.py +0 -0
  486. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/runtime/sampling.py +0 -0
  487. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/runtime/structured_outputs.py +0 -0
  488. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/runtime/types.py +0 -0
  489. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/__init__.py +0 -0
  490. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/__main__.py +0 -0
  491. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/asgi/__init__.py +0 -0
  492. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/asgi/app.py +0 -0
  493. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/asgi/cli.py +0 -0
  494. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/billing/__init__.py +0 -0
  495. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/billing/charges.py +0 -0
  496. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/billing/retry.py +0 -0
  497. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/domain/__init__.py +0 -0
  498. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/domain/ops/__init__.py +0 -0
  499. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/domain/ops/reconcile.py +0 -0
  500. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/domain/ops/repo_cleanup.py +0 -0
  501. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/domain/ops/serving_resources.py +0 -0
  502. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/domain/registry/__init__.py +0 -0
  503. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/domain/registry/checkpoints.py +0 -0
  504. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/domain/registry/environment_registry.py +0 -0
  505. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/domain/registry/envs.py +0 -0
  506. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/domain/registry/projects.py +0 -0
  507. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/domain/registry/runs.py +0 -0
  508. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/domain/teacher/__init__.py +0 -0
  509. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/domain/teacher/broker.py +0 -0
  510. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/domain/teacher/errors.py +0 -0
  511. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/domain/teacher/requests.py +0 -0
  512. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/platform/__init__.py +0 -0
  513. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/platform/auth.py +0 -0
  514. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/platform/db.py +0 -0
  515. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/platform/deps.py +0 -0
  516. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/platform/internal_client.py +0 -0
  517. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/platform/locks.py +0 -0
  518. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/platform/runtime.py +0 -0
  519. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/routes/__init__.py +0 -0
  520. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/routes/envs.py +0 -0
  521. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/routes/meta.py +0 -0
  522. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/routes/runs.py +0 -0
  523. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/routes/serving.py +0 -0
  524. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/routes/serving_chat.py +0 -0
  525. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/routes/serving_completion.py +0 -0
  526. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/routes/serving_revisions.py +0 -0
  527. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/routes/serving_smoke.py +0 -0
  528. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/routes/teacher.py +0 -0
  529. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/__init__.py +0 -0
  530. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/app/__init__.py +0 -0
  531. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/__init__.py +0 -0
  532. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/accounting/__init__.py +0 -0
  533. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/accounting/usage_facts.py +0 -0
  534. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/accounting/usage_outbox.py +0 -0
  535. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/engine/__init__.py +0 -0
  536. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/engine/boot.py +0 -0
  537. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/engine/errors.py +0 -0
  538. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/engine/generation.py +0 -0
  539. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/engine/lora_engine.py +0 -0
  540. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/engine/lora_entries.py +0 -0
  541. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/engine/support.py +0 -0
  542. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/http/__init__.py +0 -0
  543. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/http/adapter_routes.py +0 -0
  544. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/http/body_limit.py +0 -0
  545. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/http/inference_routes.py +0 -0
  546. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/http/routing.py +0 -0
  547. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/io/__init__.py +0 -0
  548. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/io/multimodal.py +0 -0
  549. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/io/openai_request.py +0 -0
  550. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/io/openai_stream.py +0 -0
  551. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/io/provenance.py +0 -0
  552. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/io/requests.py +0 -0
  553. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/io/responses.py +0 -0
  554. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/io/schemas.py +0 -0
  555. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/io/streaming.py +0 -0
  556. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/io/structured_outputs.py +0 -0
  557. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/store/__init__.py +0 -0
  558. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/store/access.py +0 -0
  559. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/store/lookup.py +0 -0
  560. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/store/persisted_columns.py +0 -0
  561. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/store/persistence.py +0 -0
  562. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/store/registration.py +0 -0
  563. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/store/registry.py +0 -0
  564. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/store/settings.py +0 -0
  565. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/store/supabase_rest.py +0 -0
  566. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/store/undeploy.py +0 -0
  567. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/snapshot/__init__.py +0 -0
  568. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/snapshot/archive.py +0 -0
  569. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/teacher/__init__.py +0 -0
  570. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/teacher/limits.py +0 -0
  571. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/teacher/provider_status.py +0 -0
  572. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/teacher/retry_contract.py +0 -0
  573. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/scripts/build_dev_dist.py +0 -0
  574. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/scripts/check_file_size.py +0 -0
  575. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/scripts/check_function_size.py +0 -0
  576. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/scripts/check_rollout_identity_actor.py +0 -0
  577. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/scripts/check_source_layout.py +0 -0
  578. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/scripts/check_verl_pin_exists.py +0 -0
  579. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/scripts/qualify_serving_profile.py +0 -0
  580. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/scripts/scrub_history.sh +0 -0
  581. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/serve_launch.py +0 -0
  582. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/__init__.py +0 -0
  583. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/_helpers/__init__.py +0 -0
  584. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/_helpers/chat_provenance.py +0 -0
  585. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/_helpers/chat_transport.py +0 -0
  586. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/_helpers/managed_chat.py +0 -0
  587. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/_helpers/profile.py +0 -0
  588. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/_helpers/runner.py +0 -0
  589. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/_helpers/server_api_plugin.py +0 -0
  590. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/_helpers/source_snapshot.py +0 -0
  591. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/_helpers/specs.py +0 -0
  592. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/_helpers/teacher.py +0 -0
  593. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/_helpers/vast.py +0 -0
  594. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/capture_image_sft_processor_oracle.py +0 -0
  595. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/capture_qwen38_27b_metadata.py +0 -0
  596. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/conftest.py +0 -0
  597. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/fixtures/image_sft_processor_oracle.json +0 -0
  598. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/fixtures/qwen35_9b_target_metadata.json +0 -0
  599. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/fixtures/qwen38_27b_target_metadata.json +0 -0
  600. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/fixtures/vllm_023_moe_lora/lora_context.py.gz +0 -0
  601. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/fixtures/vllm_023_moe_lora/modular_kernel.py.gz +0 -0
  602. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/fixtures/vllm_023_moe_lora/triton_moe.py.gz +0 -0
  603. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/live/__init__.py +0 -0
  604. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/live/conftest.py +0 -0
  605. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/live/test_lambda_live.py +0 -0
  606. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/live/test_runpod_live.py +0 -0
  607. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/live/test_sft_thinking_render_live.py +0 -0
  608. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/live/test_vast_live.py +0 -0
  609. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/checkpoint_fixtures.py +0 -0
  610. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/conftest.py +0 -0
  611. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_engine_error_status.py +0 -0
  612. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_fp8_config.py +0 -0
  613. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_immutable_engine.py +0 -0
  614. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_immutable_revisions.py +0 -0
  615. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_immutable_schemas.py +0 -0
  616. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_mirror_sampling_parity.py +0 -0
  617. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_modal_deploy_identity.py +0 -0
  618. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_modal_image_paths.py +0 -0
  619. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_openai_stream_options.py +0 -0
  620. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_persistence.py +0 -0
  621. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_pre_first_disconnect.py +0 -0
  622. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_registry.py +0 -0
  623. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_registry_coverage.py +0 -0
  624. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_request_body_limit.py +0 -0
  625. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_schemas_coverage.py +0 -0
  626. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_serve_structured_outputs.py +0 -0
  627. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_serve_thinking.py +0 -0
  628. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_settings.py +0 -0
  629. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_structured_outputs.py +0 -0
  630. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_structured_outputs_coverage.py +0 -0
  631. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_supabase_rest_coverage.py +0 -0
  632. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving_conformance/__init__.py +0 -0
  633. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving_conformance/conftest.py +0 -0
  634. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving_conformance/test_contract.py +0 -0
  635. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_accounting_coverage.py +0 -0
  636. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_adapter_shard_completeness.py +0 -0
  637. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_agent_flash_cli_contract.py +0 -0
  638. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_algorithms.py +0 -0
  639. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_allocator.py +0 -0
  640. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_backend_common.py +0 -0
  641. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_backend_jobspec_contract.py +0 -0
  642. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_bake_kernel_cache.py +0 -0
  643. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_base_model_provenance.py +0 -0
  644. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_billing_retry.py +0 -0
  645. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_build_context_contract.py +0 -0
  646. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_cancel_remote.py +0 -0
  647. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_capture_qwen38_metadata.py +0 -0
  648. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_catalog_only_models.py +0 -0
  649. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_charge_pricing.py +0 -0
  650. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_chat_foundations.py +0 -0
  651. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_checkpoint_lifecycle.py +0 -0
  652. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_checkpoints.py +0 -0
  653. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_cli_commands.py +0 -0
  654. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_cli_commands_coverage.py +0 -0
  655. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_cli_credential_shadowing.py +0 -0
  656. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_cli_errors.py +0 -0
  657. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_cli_estimate.py +0 -0
  658. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_cli_gpus_flag.py +0 -0
  659. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_cli_help.py +0 -0
  660. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_cli_main_coverage.py +0 -0
  661. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_cli_managed.py +0 -0
  662. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_cli_render_coverage.py +0 -0
  663. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_cli_render_theme.py +0 -0
  664. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_cli_serve_deploy.py +0 -0
  665. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_cli_serve_status.py +0 -0
  666. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_cli_serve_undeploy.py +0 -0
  667. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_cli_traces.py +0 -0
  668. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_cli_wandb_warning.py +0 -0
  669. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_client.py +0 -0
  670. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_client_import_purity.py +0 -0
  671. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_client_server_integration.py +0 -0
  672. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_client_stream_reads.py +0 -0
  673. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_config_env_vars.py +0 -0
  674. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_config_overrides.py +0 -0
  675. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_console_upload.py +0 -0
  676. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_controlled_experiment_repairs.py +0 -0
  677. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_cost_analytical.py +0 -0
  678. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_cost_currency.py +0 -0
  679. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_cost_equation.py +0 -0
  680. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_cost_estimate.py +0 -0
  681. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_cost_hardware.py +0 -0
  682. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_cost_models.py +0 -0
  683. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_dataset_profile.py +0 -0
  684. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_deploy_latency.py +0 -0
  685. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_dev_channel.py +0 -0
  686. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_disk_gb.py +0 -0
  687. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_endpoint_name.py +0 -0
  688. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_env_cache_evict.py +0 -0
  689. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_env_delete.py +0 -0
  690. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_env_download.py +0 -0
  691. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_env_download_api.py +0 -0
  692. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_env_evaluations.py +0 -0
  693. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_env_list_api.py +0 -0
  694. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_env_list_cli.py +0 -0
  695. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_env_list_hub.py +0 -0
  696. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_env_no_install.py +0 -0
  697. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_env_publish.py +0 -0
  698. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_env_pull.py +0 -0
  699. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_env_pull_coverage.py +0 -0
  700. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_env_pull_loader_coverage.py +0 -0
  701. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_env_pull_managed_control_plane.py +0 -0
  702. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_env_push.py +0 -0
  703. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_env_rate_limit_resolve.py +0 -0
  704. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_env_ref_pinning.py +0 -0
  705. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_env_test.py +0 -0
  706. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_envs_coverage.py +0 -0
  707. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_export.py +0 -0
  708. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_flash_mvp.py +0 -0
  709. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_flash_worker.py +0 -0
  710. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_flashinfer_cache_dirs.py +0 -0
  711. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_freesolo_api_transport.py +0 -0
  712. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_fused_expert_warmstart.py +0 -0
  713. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_github_urlopen_retry.py +0 -0
  714. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_gpu_type_single_field.py +0 -0
  715. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_gpus.py +0 -0
  716. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_grpo_checkpoint_durability.py +0 -0
  717. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_grpo_params.py +0 -0
  718. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_grpo_process_census.py +0 -0
  719. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_grpo_resident_sizing.py +0 -0
  720. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_grpo_reward_batching.py +0 -0
  721. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_grpo_rollout_contract.py +0 -0
  722. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_grpo_rollout_identity.py +0 -0
  723. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_health_liveness.py +0 -0
  724. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_hf_retry.py +0 -0
  725. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_idle_endpoint_reaper.py +0 -0
  726. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_image_environment_capability.py +0 -0
  727. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_image_incremental_processor.py +0 -0
  728. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_image_sft_markers.py +0 -0
  729. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_image_sft_processor_parity.py +0 -0
  730. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_image_tokens.py +0 -0
  731. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_infisical_secrets.py +0 -0
  732. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_instance_bootstrap_coverage.py +0 -0
  733. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_internal_client.py +0 -0
  734. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_jobs.py +0 -0
  735. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_kernel_cache.py +0 -0
  736. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_kernel_fingerprint.py +0 -0
  737. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_kv_util.py +0 -0
  738. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_lambda_api_coverage.py +0 -0
  739. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_lambda_runner.py +0 -0
  740. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_logging.py +0 -0
  741. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_login_perms.py +0 -0
  742. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_lora_rank_coverage.py +0 -0
  743. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_lora_rank_nested_rung.py +0 -0
  744. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_lora_rank_preflight.py +0 -0
  745. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_lora_targeting.py +0 -0
  746. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_lora_targeting_pinned_verl.py +0 -0
  747. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_managed_config_fields.py +0 -0
  748. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_managed_hf_repo.py +0 -0
  749. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_metrics_schema_agent_contract.py +0 -0
  750. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_mig_guard.py +0 -0
  751. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_mirror_sampling_parity.py +0 -0
  752. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_multi_gpu_gate.py +0 -0
  753. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_multimodal_training.py +0 -0
  754. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_named_reward_metrics.py +0 -0
  755. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_oom_escalate_gpu.py +0 -0
  756. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_opd.py +0 -0
  757. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_opd_limits.py +0 -0
  758. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_opd_multiturn_eos_boundary.py +0 -0
  759. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_opd_multiturn_failure_exit.py +0 -0
  760. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_opd_replay_guard.py +0 -0
  761. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_opd_resume_safety.py +0 -0
  762. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_opd_train.py +0 -0
  763. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_orchestrator_flash.py +0 -0
  764. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_packing.py +0 -0
  765. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_packing_coverage.py +0 -0
  766. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_parasail_teacher.py +0 -0
  767. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_persisted_spec_envelope.py +0 -0
  768. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_poll_helpers.py +0 -0
  769. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_preflight.py +0 -0
  770. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_projects.py +0 -0
  771. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_prompt_budget.py +0 -0
  772. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_provider_preflight_coverage.py +0 -0
  773. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_provider_routing.py +0 -0
  774. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_provider_teardown_robustness.py +0 -0
  775. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_providers_symmetry.py +0 -0
  776. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_realized_cost.py +0 -0
  777. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_repo_cleanup.py +0 -0
  778. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_resolve_params_b.py +0 -0
  779. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_resume_on_retry.py +0 -0
  780. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_rl_train.py +0 -0
  781. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_rollout_samples.py +0 -0
  782. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_run_registry_lifecycle.py +0 -0
  783. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_runmgmt.py +0 -0
  784. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_runpod_api_delete.py +0 -0
  785. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_runpod_key_fingerprint.py +0 -0
  786. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_runpod_key_waterfall.py +0 -0
  787. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_runtime_capsule.py +0 -0
  788. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_serve_app_bootstrap_http.py +0 -0
  789. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_serve_app_launch.py +0 -0
  790. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_serve_app_manifest.py +0 -0
  791. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_serve_app_materialize.py +0 -0
  792. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_serve_app_packaging.py +0 -0
  793. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_serve_app_progress.py +0 -0
  794. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_serve_chat_transport.py +0 -0
  795. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_serve_control.py +0 -0
  796. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_serve_docs.py +0 -0
  797. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_serve_modal_contract_lock.py +0 -0
  798. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_serve_modal_sdk.py +0 -0
  799. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_serve_modal_sdk_deadlines.py +0 -0
  800. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_serve_modal_teardown_identity.py +0 -0
  801. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_serve_profile_qualification.py +0 -0
  802. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_serve_profiles.py +0 -0
  803. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_serve_provisioning_common.py +0 -0
  804. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_serve_provisioning_modal.py +0 -0
  805. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_serve_reasoning_content.py +0 -0
  806. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_serve_resolve_provenance.py +0 -0
  807. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_serve_runtime_adapters.py +0 -0
  808. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_serve_runtime_engine.py +0 -0
  809. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_serve_runtime_package.py +0 -0
  810. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_serve_runtime_types.py +0 -0
  811. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_server_api.py +0 -0
  812. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_server_app_coverage.py +0 -0
  813. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_server_auth_singleflight.py +0 -0
  814. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_server_billing.py +0 -0
  815. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_server_checkpoints_coverage.py +0 -0
  816. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_server_db.py +0 -0
  817. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_server_envs_coverage.py +0 -0
  818. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_server_locks_coverage.py +0 -0
  819. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_server_managed_chat_requests.py +0 -0
  820. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_server_serving_resources.py +0 -0
  821. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_server_standalone.py +0 -0
  822. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_serving_conformance_gate.py +0 -0
  823. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_serving_context_preflight.py +0 -0
  824. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_serving_contract.py +0 -0
  825. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_serving_schema_coverage.py +0 -0
  826. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_sft_chunked_nll.py +0 -0
  827. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_sft_example_selection.py +0 -0
  828. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_sft_gc_off.py +0 -0
  829. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_sft_max_context.py +0 -0
  830. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_sft_step_floor.py +0 -0
  831. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_sft_train.py +0 -0
  832. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_sft_workload.py +0 -0
  833. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_source_attestation_flow.py +0 -0
  834. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_source_layout.py +0 -0
  835. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_source_snapshot.py +0 -0
  836. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_spec_and_validation.py +0 -0
  837. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_spec_contract_bytes.py +0 -0
  838. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_staged_environment.py +0 -0
  839. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_step_floor.py +0 -0
  840. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_step_metrics.py +0 -0
  841. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_step_timing.py +0 -0
  842. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_structured_outputs.py +0 -0
  843. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_teacher_broker.py +0 -0
  844. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_teacher_encoding_contract.py +0 -0
  845. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_terminal_artifacts.py +0 -0
  846. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_thinking_config.py +0 -0
  847. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_train_context_preflight.py +0 -0
  848. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_training_controls.py +0 -0
  849. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_type_comment_prose.py +0 -0
  850. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_vast_api.py +0 -0
  851. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_vast_api_coverage.py +0 -0
  852. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_vast_offers.py +0 -0
  853. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_vast_provider_coverage.py +0 -0
  854. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_vast_runner.py +0 -0
  855. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_verified_revisions.py +0 -0
  856. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_verifiers.py +0 -0
  857. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_verl_checkpoint_export.py +0 -0
  858. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_verl_child_plugins.py +0 -0
  859. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_verl_silence_watchdog.py +0 -0
  860. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_version.py +0 -0
  861. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_vl_warmstart_adapter_keys.py +0 -0
  862. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_vllm_moe_lora_backport.py +0 -0
  863. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_vram_architecture.py +0 -0
  864. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_wandb_link.py +0 -0
  865. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_wandb_naming.py +0 -0
  866. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_warmstart_adapter_download.py +0 -0
  867. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_warmstart_cross_repo.py +0 -0
  868. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_warmstart_error_attribution.py +0 -0
  869. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_warmstart_image_adapters.py +0 -0
  870. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_weight_cache.py +0 -0
  871. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_worker_dryrun.py +0 -0
  872. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_worker_hardexit.py +0 -0
  873. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_worker_image.py +0 -0
  874. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_worker_init_heartbeat.py +0 -0
  875. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_worker_stack.py +0 -0
  876. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_worker_thinking.py +0 -0
  877. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_workflow_contracts.py +0 -0
  878. {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_workload_profile.py +0 -0
  879. {freesolo_flash_dev-1.2.121 → 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.121
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
@@ -10,7 +10,7 @@ adapters. A different base model requires a separate deployment. Use
10
10
  Customer-owned Modal is live-qualified for `Qwen/Qwen3.5-9B`, `Qwen/Qwen3.8-27B`, and
11
11
  `Qwen/Qwen3.6-35B-A3B`. The 27B and 35B-A3B qualifications are bound to the exact certified serving
12
12
  image digest; another digest remains available for offline planning but cannot allocate Modal.
13
- Hosted Qwen3.8 27B remains inactive. Its customer-owned engine runs on `H100!` and serves the pinned
13
+ Hosted Qwen3.8 27B is active on H100. Its customer-owned engine runs on `H100!` and serves the pinned
14
14
  `Qwen/Qwen3.8-27B-FP8` checkpoint while preserving `Qwen/Qwen3.8-27B` as the distinct logical base
15
15
  and tokenizer provenance. The 35B-A3B engine serves BF16 weights on one H200 with FP8 KV cache, a
16
16
  32K context, eight sequences, a 4096 batched-token cap, and six rank-64 LoRA slots.
@@ -208,7 +208,7 @@ class ModelInfo:
208
208
  DEFAULT_MODEL = "Qwen/Qwen3.5-9B"
209
209
 
210
210
  # the checkpoint each public catalog model loads for customer-owned serving. hosted activation is
211
- # a separate allowlist in flash.serving.src.engine.model_config, where qwen3.8-27b remains inactive.
211
+ # a separate allowlist in flash.serving.src.engine.model_config.
212
212
  SERVING_MODEL_REPOS: dict[str, str] = {
213
213
  "Qwen/Qwen3.5-9B": "Freesolo-Co/Qwen3.5-9B-FP8",
214
214
  "Qwen/Qwen3.8-27B": "Qwen/Qwen3.8-27B-FP8",
@@ -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
 
@@ -150,13 +154,12 @@ GPUs, so there's nothing to tune at deploy time:
150
154
  checkpoints are VL-preserving (each VL-unified base's vision tower + MoE router gates stay in
151
155
  original precision) and already published to the operator HF org. Native FP8 tensor cores need
152
156
  compute capability ≥ 8.9; every dense FP8 tier runs on an L4, L40S, or H100 (all native). No serving
153
- tier runs on A100 now that the 35B is bf16 on H200. The pending Qwen3.8 candidate allocates no
154
- hosted tier until its exact canary passes.
157
+ tier runs on A100 now that the 35B is bf16 on H200. The 27B serves the official native FP8
158
+ checkpoint on an H100.
155
159
 
156
160
  - **The real memory lever — LoRA buffers:** vLLM PRE-ALLOCATES the GPU LoRA buffers at `max_loras ×
157
161
  max_lora_rank`, regardless of how many adapters load. Both are linear levers. The qualified 9B runs
158
- **16 × 128** on L40S. Qwen3.8-27B's H100 LoRA capacity remains pending exact-checkpoint
159
- qualification. The 35B MoE runs **6 × 64** bf16 on H200. Adapters trained above the effective rank are rejected at load; a base regularly serving
162
+ **16 × 128** on L40S and the 27B runs **16 × 64** on H100. The 35B MoE runs **6 × 64** bf16 on H200. Adapters trained above the effective rank are rejected at load; a base regularly serving
160
163
  more distinct adapters than its hot limit pays a swap latency from the CPU pool unless its hot
161
164
  limit equals `MAX_CPU_LORAS`.
162
165
 
@@ -174,17 +177,19 @@ cold-boot smoke test first.
174
177
  | Base model | Checkpoint | GPU | Hot LoRA shape | Context |
175
178
  | ------------------------- | -------------------------------------------- | --------- | -------------- | ------- |
176
179
  | Qwen3.5-9B | owned FP8 (`Freesolo-Co/*-FP8`) | **L40S**§ | 16 × 128 | 32768 |
177
- | Qwen3.8-27B candidate | official native FP8 (`Qwen/Qwen3.8-27B-FP8`) | inactive‡ | pending | pending |
180
+ | Qwen3.8-27B | official native FP8 (`Qwen/Qwen3.8-27B-FP8`) | **H100**‡ | 16 × 64 | 32768 |
178
181
  | Qwen3.6-35B-A3B (MoE, VL) | official **bf16** (`Qwen/Qwen3.6-35B-A3B`) | **H200**† | 6 × 64 | 32768 |
179
182
 
180
183
  § 9B (L40S) runs **16 × 128** at 32k context with `max_num_seqs=8`, CUDA graphs
181
184
  (`enforce_eager=False`), and `gpu_memory_utilization=0.90`. Its rank-128 × 16 buffer OOMed an L4 and
182
185
  2×L4 in the real-GPU sweep, so it runs on the 48 GiB L40S, the cheapest Ada card that fits it at 32k.
183
186
 
184
- ‡ Qwen3.8-27B is not in active hosted routing, registration, base-model health, or engine deployment.
185
- Its proposed H100 tier, hot LoRA capacity, context limit, CUDA-graph behavior, throughput, and latency
186
- remain pending qualification on the exact immutable official FP8 checkpoint. Qwen3.6-27B measurements
187
- do not qualify or predict the Qwen3.8 checkpoint.
187
+ ‡ 27B (H100, 80 GiB) runs **16 × 64** at 32k with `max_num_seqs=8`, CUDA graphs
188
+ (`enforce_eager=False`), and `gpu_memory_utilization=0.90`, qualified by a real-GPU canary on the exact
189
+ immutable official FP8 checkpoint: weights loaded at 44.25 GiB, leaving 23.07 GiB of KV cache
190
+ (350,981 tokens, 10.71x concurrency at 32k) after a 0.35 GiB graph capture. Cold boot is about 20 min
191
+ (load + 137 s torch.compile + 442 s warmup dominated by the FlashInfer GDN JIT), all cached on the
192
+ serving volume. Qwen3.6-27B measurements do not qualify or predict the Qwen3.8 checkpoint.
188
193
 
189
194
  † 35B-A3B runs **bf16 on an H200** (141 GiB) at **6 × 64**, the one serving path that gives a flash
190
195
  adapter its full all-expert LoRA AND CUDA graphs at speed. It gets rank 64 like the 27B
@@ -138,8 +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
- # no autoscaling cap per base-model engine; modal adds capacity as concurrency demands.
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.
142
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
143
152
  # Concurrent requests packed onto one base-model GPU before Modal autoscales a new (costly) one.
144
153
  # A real-GPU sweep (scripts/gpu_canary.py::sweep_concurrency on A10G/Qwen2.5-1.5B) showed vLLM
145
154
  # throughput scaling near-linearly with no saturation through 128 concurrent, while TTFT stayed
@@ -424,6 +433,7 @@ def _build_engine(
424
433
  timeout=TIMEOUT_SECONDS,
425
434
  min_containers=MIN_CONTAINERS,
426
435
  max_containers=MAX_CONTAINERS,
436
+ buffer_containers=BUFFER_CONTAINERS,
427
437
  )(modal.concurrent(max_inputs=max_inputs, target_inputs=target_inputs)(_Engine))
428
438
  # Rebind the module name to the decorated handle, matching the normal ``@app.cls class X`` pattern
429
439
  # where the module attribute ends up referring to the decorated class.
@@ -552,6 +562,66 @@ _AUTH_CACHE_TTL_SECONDS = 60.0
552
562
  _AUTH_CACHE_MAX_ENTRIES = 4096
553
563
 
554
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
+
555
625
  def _build_chat_authorizer(settings: Any) -> Any:
556
626
  """Build the serving->backend chat authorizer, or None when not configured.
557
627
 
@@ -585,70 +655,30 @@ def _build_chat_authorizer(settings: Any) -> Any:
585
655
 
586
656
  # (api_key_sha256, adapter_id) -> (expires_at_monotonic, org_id); populated only on a successful
587
657
  # authorization. Per-router-container in-memory (each container reduces its own backend load).
588
- _cache: dict[tuple[str, str], tuple[float, str | None]] = {}
658
+ _cache: dict[tuple[str, str, str], tuple[float, str | None]] = {}
589
659
  # In-flight single-flight tasks so concurrent identical misses share ONE backend call.
590
- _inflight: dict[tuple[str, str], asyncio.Task[str | None]] = {}
660
+ _inflight: dict[tuple[str, str, str], asyncio.Task[str | None]] = {}
591
661
 
592
- 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":
593
665
  try:
594
- 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
+ )
595
677
  except Exception as exc: # backend unreachable -> fail closed, never serve unauthorized
596
678
  raise HTTPException(
597
679
  status.HTTP_503_SERVICE_UNAVAILABLE, "serving auth backend unreachable"
598
680
  ) from exc
599
- if resp.status_code == 200:
600
- # Return the authorized billing org so the router can meter a base-model serve to the
601
- # caller (a base model has no adapter owner). A malformed response cannot authorize an
602
- # external request because that would let base-model usage escape billing.
603
- try:
604
- org_id = resp.json().get("orgId")
605
- except Exception as exc:
606
- raise HTTPException(
607
- status.HTTP_503_SERVICE_UNAVAILABLE,
608
- "serving auth backend returned malformed response",
609
- ) from exc
610
- if not isinstance(org_id, str) or not org_id:
611
- raise HTTPException(
612
- status.HTTP_503_SERVICE_UNAVAILABLE,
613
- "serving auth backend returned malformed response",
614
- )
615
- return org_id
616
- if resp.status_code == 401:
617
- # The backend returns 401 for BOTH an invalid *user* key (our authorize route, body
618
- # code "invalid_api_key") AND a rejected serving *machine* bearer (require_internal_token,
619
- # decided before the user key is even read). Only the former is the caller's fault; the
620
- # latter is a serving misconfiguration we must not report as the user's bad key.
621
- code = ""
622
- try:
623
- detail = resp.json().get("detail")
624
- if isinstance(detail, dict):
625
- code = detail.get("code") or ""
626
- except Exception: # a non-JSON 401 is an internal-auth failure (below)
627
- code = ""
628
- if code == "invalid_api_key":
629
- raise HTTPException(status.HTTP_401_UNAUTHORIZED, "Invalid Freesolo API key")
630
- raise HTTPException(
631
- status.HTTP_503_SERVICE_UNAVAILABLE, "serving auth is misconfigured"
632
- )
633
- # Org has no budget to serve (zero balance and no card+auto-topup). The backend gates this
634
- # before generation so a broke org can't serve for free; surface it as a clean 402 rather
635
- # than letting it fall through to the retryable 503 below.
636
- if resp.status_code == 402:
637
- raise HTTPException(
638
- status.HTTP_402_PAYMENT_REQUIRED,
639
- "insufficient balance: top up or enable auto-topup to serve this model",
640
- )
641
- # Unknown adapter (404) and org mismatch (403) both collapse to 403 so we don't leak
642
- # which adapters exist to an unauthorized caller.
643
- if resp.status_code in (403, 404):
644
- raise HTTPException(
645
- status.HTTP_403_FORBIDDEN, "API key is not authorized for this adapter"
646
- )
647
- # Any backend 5xx (500/502/503/504) or other unexpected status is a transient auth-lookup
648
- # infra failure (Supabase down, backend overloaded). Surface it as a RETRYABLE 503, never a
649
- # 502: a client/load-balancer must be free to retry rather than treat it as a permanent
650
- # upstream error. The cache+single-flight above is what makes this failure rare under load.
651
- raise HTTPException(status.HTTP_503_SERVICE_UNAVAILABLE, "serving auth backend unavailable")
681
+ return _authorize_response_org(resp)
652
682
 
653
683
  def _prune(now: float) -> None:
654
684
  for expired in [k for k, (exp, _) in _cache.items() if exp <= now]:
@@ -659,10 +689,10 @@ def _build_chat_authorizer(settings: Any) -> Any:
659
689
  _cache.pop(k, None)
660
690
 
661
691
  async def _authorize_and_cache(
662
- 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]"
663
693
  ) -> "str | None":
664
694
  try:
665
- org = await _authorize_backend(api_key, adapter_id)
695
+ org = await _authorize_backend(api_key, adapter_id, scope)
666
696
  finally:
667
697
  # Drop the single-flight slot regardless of outcome so a failed lookup re-checks next
668
698
  # time (failures are never cached) and a success can be re-driven once the cache expires.
@@ -673,9 +703,19 @@ def _build_chat_authorizer(settings: Any) -> Any:
673
703
  _prune(now)
674
704
  return org
675
705
 
676
- 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":
677
709
  # do not retain raw user credentials as live dict keys beyond the request that supplied them.
678
- 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)
679
719
  cached = _cache.get(ck)
680
720
  now = time.monotonic()
681
721
  if cached is not None:
@@ -684,7 +724,7 @@ def _build_chat_authorizer(settings: Any) -> Any:
684
724
  _cache.pop(ck, None)
685
725
  task = _inflight.get(ck)
686
726
  if task is None:
687
- 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))
688
728
  # Retrieve the task's outcome even if every awaiter is cancelled (all identical clients
689
729
  # disconnect), so an orphaned single-flight failure doesn't warn "exception never retrieved".
690
730
  task.add_done_callback(lambda t: t.cancelled() or t.exception())
@@ -723,6 +763,7 @@ def _base_model_records() -> list:
723
763
  @app.function(
724
764
  secrets=runtime_secrets,
725
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
726
767
  timeout=ROUTER_TIMEOUT_SECONDS, # must cover engine cold start (see ROUTER_TIMEOUT_SECONDS)
727
768
  )
728
769
  @modal.concurrent(max_inputs=MAX_INPUTS, target_inputs=TARGET_INPUTS)
@@ -24,16 +24,17 @@ from flash.serving.src.accounting.usage_outbox import (
24
24
  from flash.serving.src.io.schemas import AdapterRecord
25
25
 
26
26
  FREESOLO_PRICING_SOURCE = "freesolo_backend_catalog"
27
- FREESOLO_PRICING_VERSION = "2026-08-24.1"
27
+ FREESOLO_PRICING_VERSION = "2026-08-27.1"
28
+ # (prompt, completion, cached prompt) usd per million tokens, one entry per active hosted model.
29
+ # these are the charged customer rates, set 5% below the lowest healthy comparable openrouter fp8
30
+ # listing for each model and token category. they are NOT cost-plus: no markup is applied, and they
31
+ # currently sit below the recorded cost basis, so do not reintroduce a multiplier here until measured
32
+ # b200 economics establish a lower truthful cost basis.
28
33
  _FREESOLO_USD_PER_MTOK: dict[str, tuple[str, str, str]] = {
29
- "Qwen/Qwen3.5-0.8B": ("0.01", "0.05", "0.002"),
30
- "Qwen/Qwen3.5-2B": ("0.02", "0.10", "0.004"),
31
- "Qwen/Qwen3.5-4B": ("0.03", "0.15", "0.006"),
32
- "Qwen/Qwen3.5-9B": ("0.114", "0.19", "0.023"),
33
- "Qwen/Qwen3.6-27B": ("0.4254", "3.055", "0.14"),
34
- "Qwen/Qwen3.6-35B-A3B": ("0.198", "1.265", "0.066"),
34
+ "Qwen/Qwen3.5-9B": ("0.095", "0.1425", "0.0276"),
35
+ "Qwen/Qwen3.8-27B": ("0.3325", "2.4225", "0.03325"),
36
+ "Qwen/Qwen3.6-35B-A3B": ("0.095", "0.9025", "0.0475"),
35
37
  }
36
- _FREESOLO_MARKUP = Decimal("1.2")
37
38
  _USD_PER_MTOK_DIVISOR = Decimal("1000000")
38
39
 
39
40
 
@@ -173,7 +174,7 @@ def freesolo_price(base_model: str) -> CapturedPrice:
173
174
  raise ValueError(f"no durable serving price for base model {base_model!r}") from exc
174
175
 
175
176
  def per_token(rate: str) -> str:
176
- return format(Decimal(rate) * _FREESOLO_MARKUP / _USD_PER_MTOK_DIVISOR, "f")
177
+ return format(Decimal(rate) / _USD_PER_MTOK_DIVISOR, "f")
177
178
 
178
179
  return CapturedPrice(
179
180
  source=FREESOLO_PRICING_SOURCE,
@@ -3,9 +3,9 @@
3
3
  The serving app runs one vLLM GPU engine per base model, each on the Modal GPU class set by its
4
4
  catalog ``gpu`` (see below). Adapters and routing key off the logical ``base_model``; the engine
5
5
  loads its configured checkpoint at that checkpoint's own dtype. The active dense 9B uses Freesolo
6
- compressed-tensors FP8. Qwen3.8-27B retains pinned candidate metadata but is excluded from active
7
- lookups until its exact canary passes. The active 35B-A3B MoE serves base bf16 weights because its
8
- fused-MoE LoRA path will not compile on FP8, as detailed below.
6
+ compressed-tensors FP8 and the active dense 27B uses the official Qwen FP8 checkpoint. The active
7
+ 35B-A3B MoE serves base bf16 weights because its fused-MoE LoRA path will not compile on FP8, as
8
+ detailed below.
9
9
  """
10
10
 
11
11
  from __future__ import annotations
@@ -27,15 +27,14 @@ from flash.serving.src.engine.prequant_config import (
27
27
  # `engine` (optional): per-model vLLM engine-arg overrides (LoRA buffer shape, scheduler/memory caps,
28
28
  # language_model_only, …). The engine's LOADED checkpoint is NOT in here — it is resolved centrally by
29
29
  # ``serve_model_for`` from ``src.prequant_config`` and injected into the overrides as ``serve_model_id``.
30
- # active models resolve through prequant_config unless an exact validated override is present. the
31
- # pending 27b candidate carries its own immutable checkpoint pin without entering active resolution.
30
+ # active models resolve through prequant_config unless an exact validated override is present.
32
31
  # ⚠ serve_model_id is pointed only at checkpoints VERIFIED to exist (a missing repo 404-crash-loops
33
32
  # the engine — the reason this mechanism was removed once); the owned repos are VL-preserving FP8
34
33
  # checkpoints published to the operator HF org.
35
34
  #
36
35
  # sizing rationale. preallocated lora buffers and loaded checkpoint weights dominate engine vram.
37
- # the active 9b uses 16 rank-128 slots on l40s and the active 35b moe uses 6 rank-64 slots on h200.
38
- # the pending 27b candidate retains its proposed h100 shape only for the exact canary.
36
+ # the active 9b uses 16 rank-128 slots on l40s, the active 27b uses 16 rank-64 slots on h100, and the
37
+ # active 35b moe uses 6 rank-64 slots on h200.
39
38
  # - Qwen3.6-35B-A3B (vision-language MoE; arch ``Qwen3_5MoeForConditionalGeneration``) -> H200
40
39
  # (141 GiB) with the base bf16 weights, 6 x 64 LoRA at 32k. bf16 (not FP8) is the one path giving
41
40
  # full-expert LoRA + CUDA graphs because the fused-MoE LoRA path won't compile on fp8e4nv. see the
@@ -108,32 +107,35 @@ SERVING_MODELS: list[dict[str, Any]] = [
108
107
  # the complete model and LoRA load is about 108 GiB on the 141 GiB H200.
109
108
  },
110
109
  },
110
+ # 27B dense on an H100 (80 GiB). the real-GPU canary measured the load at 44.25 GiB -- above the
111
+ # FP8 weight size alone, because the vision tower and the non-quantized tensors stay bf16 -- which
112
+ # still leaves 23.07 GiB of KV cache (350,981 tokens, 10.71x concurrency at 32k) after the 16
113
+ # rank-64 LoRA buffers and a 0.35 GiB graph capture. every repository here is pinned to an
114
+ # immutable revision so a served engine cannot silently follow an upstream retag; note the model
115
+ # pin names a commit in the -FP8 repo while the tokenizer/processor pins name one in the base
116
+ # repo, which are separate sha namespaces.
117
+ {
118
+ "base_model": "Qwen/Qwen3.8-27B",
119
+ "image_input_limit": 4,
120
+ "gpu": "H100",
121
+ "engine": {
122
+ "model_revision": "017b9c7af6b5689d5dd426a76e0bc077eb5ca20a",
123
+ "tokenizer_model": "Qwen/Qwen3.8-27B",
124
+ "tokenizer_revision": "1d4bf0f2ff6012fd82039f2fa52739d0dd7c60c0",
125
+ "processor_revision": "1d4bf0f2ff6012fd82039f2fa52739d0dd7c60c0",
126
+ "gpu_memory_utilization": 0.90,
127
+ "max_loras": 16,
128
+ "max_lora_rank": 64,
129
+ "max_model_len": 32768,
130
+ "max_num_seqs": 8,
131
+ "enforce_eager": False,
132
+ "reasoning_parser": "qwen3",
133
+ },
134
+ },
111
135
  ]
112
136
 
113
137
  _BY_MODEL: dict[str, dict[str, Any]] = {m["base_model"]: m for m in SERVING_MODELS}
114
138
 
115
- # inert descriptor for the exact pending canary. activation means moving this descriptor into
116
- # SERVING_MODELS, not consulting a second runtime allowlist.
117
- _QWEN38_HOSTED_CANDIDATE: dict[str, Any] = {
118
- "base_model": "Qwen/Qwen3.8-27B",
119
- "image_input_limit": 4,
120
- "gpu": "H100",
121
- "engine": {
122
- "serve_model_id": "Qwen/Qwen3.8-27B-FP8",
123
- "model_revision": "017b9c7af6b5689d5dd426a76e0bc077eb5ca20a",
124
- "tokenizer_model": "Qwen/Qwen3.8-27B",
125
- "tokenizer_revision": "1d4bf0f2ff6012fd82039f2fa52739d0dd7c60c0",
126
- "processor_revision": "1d4bf0f2ff6012fd82039f2fa52739d0dd7c60c0",
127
- "gpu_memory_utilization": 0.90,
128
- "max_loras": 16,
129
- "max_lora_rank": 64,
130
- "max_model_len": 32768,
131
- "max_num_seqs": 8,
132
- "enforce_eager": False,
133
- "reasoning_parser": "qwen3",
134
- },
135
- }
136
-
137
139
 
138
140
  def base_models() -> list[str]:
139
141
  return [model["base_model"] for model in SERVING_MODELS]
@@ -1,9 +1,8 @@
1
1
  """Prequantized checkpoint mapping for active hosted serving.
2
2
 
3
- The 9B loads a Freesolo-owned compressed-tensors FP8 checkpoint. The 35B MoE mapping remains its
4
- official FP8 default, although the validated engine override serves the base bf16 weights so
5
- full-expert LoRA and CUDA graphs coexist. Pending hosted candidates keep their pins in model_config
6
- without entering this active mapping.
3
+ The 9B loads a Freesolo-owned compressed-tensors FP8 checkpoint. The 27B loads its official FP8
4
+ checkpoint. The 35B MoE mapping remains its official FP8 default, although the validated engine
5
+ override serves the base bf16 weights so full-expert LoRA and CUDA graphs coexist.
7
6
  """
8
7
 
9
8
  from __future__ import annotations
@@ -15,6 +14,7 @@ OWNED_FP8_MODEL_REPOS: dict[str, str] = {
15
14
 
16
15
  # official qwen checkpoints active in hosted serving.
17
16
  OFFICIAL_FP8_MODEL_REPOS: dict[str, str] = {
17
+ "Qwen/Qwen3.8-27B": "Qwen/Qwen3.8-27B-FP8",
18
18
  "Qwen/Qwen3.6-35B-A3B": "Qwen/Qwen3.6-35B-A3B-FP8",
19
19
  }
20
20
 
@@ -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.121"
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.121"
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: