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