freesolo-flash-dev 1.2.127__tar.gz → 1.2.128__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.127 → freesolo_flash_dev-1.2.128}/CHANGELOG.md +10 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/PKG-INFO +1 -1
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/cli/commands/env/ops/imports.py +16 -3
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/cli/commands/env/ops/push.py +62 -12
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/cli/scaffold/TRAINING.md +4 -2
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/cli/ui/heartbeat.py +1 -1
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/core/spec.py +0 -12
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/cost/spec.py +1 -1
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/entry/worker.py +11 -2
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/_lifecycle/bootstrapping/bootstrap.py +44 -8
- freesolo_flash_dev-1.2.128/flash/providers/_lifecycle/bootstrapping/processes.py +110 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/_lifecycle/instances/instance.py +19 -24
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/_lifecycle/instances/provider.py +7 -18
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/_lifecycle/net/worker.py +4 -4
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/artifacts/weight_cache.py +0 -1
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/core/base.py +7 -7
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/lambda_/execution/provider.py +3 -7
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/lambda_/jobs/__init__.py +9 -19
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/lambda_/jobs/builders.py +0 -2
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/lambda_/jobs/reap.py +2 -2
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/runpod/execution/job_execution.py +14 -11
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/runpod/execution/provider.py +6 -11
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/runpod/execution/resources.py +16 -3
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/runpod/serverless/endpoints.py +8 -50
- freesolo_flash_dev-1.2.128/flash/providers/runpod/serverless/naming.py +93 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/vast/execution/provider.py +4 -8
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/vast/jobs/__init__.py +7 -13
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/vast/jobs/builders.py +0 -2
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/runner/lifecycle/status.py +11 -3
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/runner/supervise/attach.py +4 -8
- freesolo_flash_dev-1.2.127/flash/runner/supervise/seed_submission.py → freesolo_flash_dev-1.2.128/flash/runner/supervise/attempt_supervision.py +12 -18
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/runner/supervise/lifecycle.py +29 -13
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/runner/supervise/recovery.py +1 -1
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/runtime_capsule/profiles.py +2 -1
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serve/app/http.py +9 -1
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serve/app/progress.py +7 -1
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serve/deployment/deploy.py +4 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/server/asgi/app.py +25 -24
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/server/domain/registry/envs.py +153 -67
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/server/platform/runtime.py +6 -5
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/server/routes/serving.py +23 -21
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serving/app/modal_app.py +38 -14
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serving/src/accounting/usage_facts.py +28 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serving/src/accounting/usage_outbox.py +19 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serving/src/engine/generation.py +56 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serving/src/engine/lora_engine.py +66 -10
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serving/src/io/responses.py +4 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/pyproject.toml +2 -2
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/_helpers/runner.py +1 -1
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/serving/test_per_model_gpu.py +16 -16
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/serving/test_router.py +8 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/serving/test_serve_structured_outputs.py +82 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/serving/test_usage_outbox.py +49 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/serving/test_usage_reporter.py +23 -4
- freesolo_flash_dev-1.2.128/tests/test_bootstrap_process_groups.py +146 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_cancel_remote.py +66 -23
- freesolo_flash_dev-1.2.128/tests/test_endpoint_name.py +142 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_env_download.py +1 -1
- freesolo_flash_dev-1.2.128/tests/test_env_git_auth.py +319 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_env_publish.py +7 -7
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_env_push.py +270 -5
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_env_ref_pinning.py +2 -3
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_flash_worker.py +19 -24
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_gpus.py +1 -1
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_grpo_resident_sizing.py +1 -1
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_grpo_rollout_contract.py +2 -2
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_idle_endpoint_reaper.py +65 -22
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_instance_bootstrap_coverage.py +204 -4
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_jobs.py +51 -63
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_lambda_runner.py +105 -130
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_multi_gpu_gate.py +4 -8
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_opd_resume_safety.py +11 -12
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_opd_train.py +1 -2
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_orchestrator_flash.py +4 -4
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_provider_routing.py +68 -79
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_provider_teardown_robustness.py +4 -4
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_providers_symmetry.py +2 -2
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_resume_on_retry.py +36 -36
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_runmgmt.py +153 -53
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_serve_app_bootstrap_http.py +7 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_serve_app_progress.py +1 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_server_api.py +127 -40
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_server_envs_coverage.py +3 -3
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_server_standalone.py +1 -1
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_serving_contract.py +89 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_staged_environment.py +6 -2
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_teacher_broker.py +4 -7
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_training_controls.py +11 -9
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_vast_offers.py +3 -3
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_vast_provider_coverage.py +1 -1
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_vast_runner.py +115 -135
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_warmstart_cross_repo.py +1 -1
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_weight_cache.py +16 -25
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_worker_hardexit.py +153 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_worker_stack.py +25 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/uv.lock +1 -1
- freesolo_flash_dev-1.2.127/tests/test_endpoint_name.py +0 -45
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/.dockerignore +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/.env.example +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/.github/CODEOWNERS +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/.github/dependabot.yml +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/.github/workflows/auto-rebake.yml +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/.github/workflows/bake-kernel-cache.yml +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/.github/workflows/ci.yml +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/.github/workflows/deploy-modal-dev.yml +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/.github/workflows/deploy-modal.yml +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/.github/workflows/dev-kernel-cache.yml +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/.github/workflows/main-source-guard.yml +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/.github/workflows/notify-tests-repo.yml +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/.github/workflows/production-kernel-cache-ready.yml +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/.github/workflows/publish-dev.yml +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/.github/workflows/publish-image.yml +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/.github/workflows/publish-serving-image.yml +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/.github/workflows/publish.yml +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/.github/workflows/version-parity.yml +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/.github/workflows/worker-image.yml +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/.gitignore +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/CODE_OF_CONDUCT.md +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/CONTRIBUTING.md +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/Dockerfile +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/Dockerfile.serve +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/Dockerfile.worker +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/LICENSE +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/NOTICE +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/README.md +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/SECURITY.md +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/SELF_HOSTING.md +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/build/kernel_cache/.gitignore +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/build/kernel_cache/.keep +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/deploy/infisical/README.md +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/deploy/infisical/entrypoint.sh +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/docker/Dockerfile.kernelcache +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/docker/Dockerfile.kernelcache.relayer +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/docker/bake_kernel_cache.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/docker/bake_pod_entry.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/docker/extract_cudart_fix.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/docker/kernel_fingerprint.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/docker/make_rp_handler.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/docker/patch_vllm_moe_lora.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/docs/hosted-inference-load-testing.md +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/docs/serving-contract.md +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/_internal/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/_internal/channel.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/_internal/diagnostics.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/_internal/fileio.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/_internal/http.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/_internal/logging.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/_internal/openai_sse.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/_internal/paths.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/_internal/version.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/adapters/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/adapters/artifacts.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/adapters/fused_experts.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/adapters/lora_rank.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/adapters/targets.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/cli/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/cli/__main__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/cli/commands/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/cli/commands/env/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/cli/commands/env/ops/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/cli/commands/env/ops/list.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/cli/commands/env/ops/retained.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/cli/commands/env/ops/setup.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/cli/commands/env/ops/setup_wandb.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/cli/commands/env/testing/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/cli/commands/env/testing/episode.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/cli/commands/env/testing/eval.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/cli/commands/env/testing/eval_args.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/cli/commands/env/testing/evaluations.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/cli/commands/env/testing/params.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/cli/commands/env/testing/test.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/cli/commands/env/testing/warnings.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/cli/commands/ops/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/cli/commands/ops/account.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/cli/commands/ops/catalog.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/cli/commands/ops/deploy.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/cli/commands/ops/log_follow.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/cli/commands/ops/prompt_budget.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/cli/commands/ops/runs.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/cli/commands/ops/traces.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/cli/commands/ops/train.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/cli/commands/ops/worker_output.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/cli/commands/serving/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/cli/commands/serving/deploy.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/cli/commands/serving/identity.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/cli/commands/serving/status.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/cli/commands/serving/undeploy.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/cli/parsing/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/cli/parsing/account.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/cli/parsing/env.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/cli/parsing/errors.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/cli/parsing/main.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/cli/parsing/models.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/cli/parsing/serve_parser.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/cli/parsing/traces.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/cli/parsing/training.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/cli/scaffold/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/cli/ui/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/cli/ui/cost.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/cli/ui/env_panels.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/cli/ui/render.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/cli/ui/tables.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/cli/ui/tty.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/client/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/client/config.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/client/freesolo_api.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/client/http.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/client/runtime_secrets.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/client/shapes.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/client/specs.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/client/streaming.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/content/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/content/image_descriptors.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/content/multimodal.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/content/reasoning_normalization.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/content/structured_outputs.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/content/thinking.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/core/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/core/catalog.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/core/grpo.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/core/spec_persistence.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/cost/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/cost/analytical.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/cost/currency.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/cost/facts.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/cost/types.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/plan/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/plan/kv_sizing.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/plan/model_config_probe.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/plan/prompt_budget.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/plan/recipe.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/plan/steps.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/plan/vram.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/profiling/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/profiling/dataset_profile.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/profiling/image_tokens.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/profiling/reasoning_render.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/profiling/sft_image_rows.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/profiling/sft_workload.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/profiling/tokenizer.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/profiling/workload_profile.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/result/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/result/accounting.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/result/rollout_samples.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/support/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/support/huggingface.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/support/verl_checkpoint.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/support/verl_policy.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/support/worker_entrypoint.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/__main__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/entry/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/entry/opd.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/entry/rl.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/entry/sft.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/io/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/io/heartbeat.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/io/hf.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/io/prefetch.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/io/wandb_log.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/model/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/model/adapter.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/model/chatml_mask.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/model/decoding.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/model/lora.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/model/packing.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/perf/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/perf/diagnostics.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/perf/lifecycle.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/perf/liger.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/perf/memory.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/runtime/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/runtime/kernel_warmup.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/runtime/rng.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/runtime/state.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/teacher/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/teacher/client.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/teacher/encoding.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/teacher/tokenizer_align.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/core/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/core/child/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/core/child/glue.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/core/child/runtime.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/core/lifecycle/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/core/lifecycle/finalize.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/core/lifecycle/ledger.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/core/lifecycle/step_timing.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/entry/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/entry/backend_common.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/entry/opd_train.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/entry/opd_train_runner.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/entry/prompt_rows.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/entry/rl_train.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/entry/rl_train_runner.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/entry/score_batcher.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/entry/sft_train.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/entry/sft_train_runner.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/opd/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/opd/bridging/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/opd/bridging/batching.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/opd/bridging/bridge.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/opd/bridging/failures.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/opd/bridging/prompts.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/opd/bridging/scoring.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/opd/child/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/opd/child/bridge.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/opd/child/entry.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/opd/child/multiturn.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/opd/child/plugin.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/opd/child/replay_guard.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/opd/child/runtime.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/opd/child/structured.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/opd/child/tensors.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/opd/multiturn/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/opd/multiturn/media.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/opd/multiturn/validation.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/opd/orchestration/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/opd/orchestration/failures.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/opd/orchestration/gkd.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/opd/orchestration/overrides.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/opd/orchestration/progress.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/opd/orchestration/prompt_preparation.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/opd/orchestration/protocol.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/opd/orchestration/reporting.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/opd/orchestration/state.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/opd/orchestration/validation.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/rl/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/rl/child/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/rl/child/entry.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/rl/child/multiturn.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/rl/child/patches.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/rl/child/plugin.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/rl/launch/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/rl/launch/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/rl/launch/config.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/rl/launch/inputs.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/rl/launch/verl_config.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/rl/rollout/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/rl/rollout/identity.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/rl/rollout/multi_turn.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/rl/rollout/reward_module.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/rl/rollout/scoring.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/rl/rollout/single_turn.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/sft/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/sft/child/entry.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/sft/child/plugin.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/sft/setup/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/sft/setup/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/sft/setup/config.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/verl/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/verl/capabilities.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/verl/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/verl/child_io.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/verl/diagnostics.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/verl/parallelism.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/verl/parent_work.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/verl/process_census.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/envs/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/envs/loading/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/envs/loading/adapter.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/envs/loading/base.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/envs/loading/loader.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/envs/loading/pull.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/envs/loading/staged.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/envs/meta/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/envs/meta/cache_security.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/envs/meta/dataset_selection.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/envs/meta/evaluations.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/envs/meta/identity.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/envs/meta/namespace_listing.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/envs/package/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/envs/package/direct_tokens.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/envs/package/limits.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/envs/package/unpack.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/_lifecycle/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/_lifecycle/bootstrapping/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/_lifecycle/bootstrapping/console.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/_lifecycle/bootstrapping/pip.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/_lifecycle/bootstrapping/secrets.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/_lifecycle/host/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/_lifecycle/host/deadline_sleep.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/_lifecycle/host/failmark.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/_lifecycle/host/hostlog.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/_lifecycle/instances/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/_lifecycle/instances/poll.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/_lifecycle/instances/poll_instance.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/_lifecycle/instances/terminal_artifacts.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/_lifecycle/net/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/_lifecycle/net/auth.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/_lifecycle/net/deadline.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/_lifecycle/net/http.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/artifacts/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/artifacts/hf.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/artifacts/preload_runpod.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/core/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/core/allocator.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/core/fit_errors.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/core/preflight.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/core/realized.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/core/registry.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/core/sharding.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/lambda_/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/lambda_/client/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/lambda_/client/api.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/lambda_/client/auth.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/lambda_/client/gpus.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/lambda_/client/preflight.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/lambda_/client/pricing.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/lambda_/execution/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/runpod/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/runpod/client/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/runpod/client/api.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/runpod/client/auth.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/runpod/client/cost.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/runpod/client/gpus.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/runpod/client/preflight.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/runpod/client/pricing.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/runpod/execution/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/runpod/execution/jobs.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/runpod/execution/polling.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/runpod/serverless/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/vast/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/vast/client/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/vast/client/api.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/vast/client/auth.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/vast/client/preflight.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/vast/client/pricing.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/providers/vast/execution/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/py.typed +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/runner/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/runner/accounting/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/runner/accounting/artifacts.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/runner/accounting/costs.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/runner/accounting/reconciliation.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/runner/accounting/weight_cache.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/runner/lifecycle/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/runner/lifecycle/attempts.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/runner/lifecycle/claim_lock.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/runner/lifecycle/deadlines.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/runner/lifecycle/preparation.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/runner/lifecycle/reporting.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/runner/lifecycle/state.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/runner/lifecycle/submit.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/runner/results/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/runner/results/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/runner/results/verified_revisions.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/runner/supervise/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/runner/supervise/attach_reconcile.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/runner/supervise/deploy.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/runner/supervise/errors.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/runner/supervise/retry_decision.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/runner/supervise/transitions.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/runtime_capsule/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/runtime_capsule/build.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/runtime_capsule/manifest.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/schema/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/schema/fields.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serve/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serve/app/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serve/app/__main__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serve/app/bootstrap.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serve/app/chat_stream.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serve/app/launch.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serve/app/manifest.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serve/app/materialize.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serve/app/openai.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serve/contract/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serve/contract/errors.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serve/contract/protocol.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serve/contract/provenance.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serve/contract/responses.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serve/contract/urls.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serve/control/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serve/control/_canonical.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serve/control/_serialization.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serve/control/_urls.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serve/control/credentials.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serve/control/planning.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serve/control/types.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serve/deployment/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serve/deployment/adapter_check.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serve/deployment/export.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serve/deployment/preflight.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serve/deployment/profiles.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serve/deployment/readiness.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serve/deployment/resolve.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serve/provisioning/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serve/provisioning/common/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serve/provisioning/common/records.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serve/provisioning/modal/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serve/provisioning/modal/execution/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serve/provisioning/modal/execution/deployment.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serve/provisioning/modal/execution/lifecycle.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serve/provisioning/modal/execution/operations.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serve/provisioning/modal/execution/sdk.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serve/provisioning/modal/planning/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serve/provisioning/modal/planning/plan.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serve/provisioning/modal/planning/resources.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serve/provisioning/modal/planning/wrapper.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serve/provisioning/modal/readiness_checks/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serve/provisioning/modal/readiness_checks/probe.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serve/provisioning/modal/readiness_checks/readiness.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serve/provisioning/modal/readiness_checks/teardown.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serve/request/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serve/request/openai.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serve/request/runtime_support.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serve/request/streaming.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serve/request/thinking.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serve/request/transport.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serve/request/validation.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serve/runtime/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serve/runtime/adapters.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serve/runtime/engine.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serve/runtime/errors.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serve/runtime/multimodal.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serve/runtime/prompt.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serve/runtime/sampling.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serve/runtime/structured_outputs.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serve/runtime/types.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/server/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/server/__main__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/server/asgi/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/server/asgi/cli.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/server/billing/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/server/billing/charges.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/server/billing/retry.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/server/domain/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/server/domain/ops/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/server/domain/ops/reconcile.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/server/domain/ops/repo_cleanup.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/server/domain/ops/serving_resources.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/server/domain/registry/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/server/domain/registry/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/server/domain/registry/environment_registry.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/server/domain/registry/projects.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/server/domain/registry/runs.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/server/domain/teacher/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/server/domain/teacher/broker.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/server/domain/teacher/errors.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/server/domain/teacher/requests.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/server/platform/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/server/platform/auth.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/server/platform/db.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/server/platform/deps.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/server/platform/internal_client.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/server/platform/locks.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/server/routes/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/server/routes/envs.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/server/routes/meta.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/server/routes/runs.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/server/routes/serving_chat.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/server/routes/serving_completion.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/server/routes/serving_revisions.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/server/routes/serving_smoke.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/server/routes/teacher.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serving/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serving/app/README.md +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serving/app/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serving/loadtest/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serving/loadtest/__main__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serving/loadtest/artifacts.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serving/loadtest/cli.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serving/loadtest/metrics.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serving/loadtest/protocol.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serving/loadtest/runner.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serving/loadtest/schedule.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serving/loadtest/schema.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serving/src/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serving/src/accounting/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serving/src/accounting/usage.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serving/src/engine/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serving/src/engine/boot.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serving/src/engine/errors.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serving/src/engine/lora_entries.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serving/src/engine/model_config.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serving/src/engine/prequant_config.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serving/src/engine/support.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serving/src/http/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serving/src/http/adapter_routes.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serving/src/http/body_limit.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serving/src/http/context.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serving/src/http/headers.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serving/src/http/inference_routes.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serving/src/http/router.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serving/src/http/routing.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serving/src/io/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serving/src/io/multimodal.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serving/src/io/openai_request.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serving/src/io/openai_stream.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serving/src/io/provenance.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serving/src/io/requests.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serving/src/io/schemas.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serving/src/io/streaming.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serving/src/io/structured_outputs.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serving/src/store/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serving/src/store/access.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serving/src/store/lookup.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serving/src/store/persisted_columns.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serving/src/store/persistence.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serving/src/store/registration.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serving/src/store/registry.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serving/src/store/settings.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serving/src/store/supabase_rest.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/serving/src/store/undeploy.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/snapshot/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/snapshot/archive.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/teacher/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/teacher/limits.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/teacher/provider_status.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/teacher/retry_contract.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/scripts/build_dev_dist.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/scripts/check_file_size.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/scripts/check_function_size.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/scripts/check_rollout_identity_actor.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/scripts/check_source_layout.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/scripts/check_verl_pin_exists.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/scripts/qualify_serving_profile.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/scripts/scrub_history.sh +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/serve_launch.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/_helpers/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/_helpers/chat_provenance.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/_helpers/chat_transport.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/_helpers/managed_chat.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/_helpers/profile.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/_helpers/server_api_plugin.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/_helpers/source_snapshot.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/_helpers/specs.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/_helpers/teacher.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/_helpers/vast.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/_helpers/wire_headers.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/capture_image_sft_processor_oracle.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/capture_qwen38_27b_metadata.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/conftest.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/fixtures/image_sft_processor_oracle.json +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/fixtures/qwen35_9b_target_metadata.json +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/fixtures/qwen38_27b_target_metadata.json +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/fixtures/vllm_023_moe_lora/lora_context.py.gz +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/fixtures/vllm_023_moe_lora/modular_kernel.py.gz +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/fixtures/vllm_023_moe_lora/triton_moe.py.gz +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/live/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/live/conftest.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/live/test_lambda_live.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/live/test_runpod_live.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/live/test_sft_thinking_render_live.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/live/test_vast_live.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/serving/checkpoint_fixtures.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/serving/conftest.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/serving/hosted_loadtest_fake_scenario.json +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/serving/test_base_model_serving.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/serving/test_chat_auth.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/serving/test_chat_authorizer.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/serving/test_checkpoint_identity_repairs.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/serving/test_checkpoint_model_validation.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/serving/test_engine_error_status.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/serving/test_fp8_config.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/serving/test_immutable_engine.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/serving/test_immutable_revisions.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/serving/test_immutable_schemas.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/serving/test_loadtest_artifacts.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/serving/test_loadtest_metrics.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/serving/test_loadtest_protocol.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/serving/test_loadtest_runner.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/serving/test_loadtest_schedule.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/serving/test_loadtest_schema.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/serving/test_mirror_sampling_parity.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/serving/test_modal_deploy_identity.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/serving/test_modal_image_paths.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/serving/test_model_config.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/serving/test_multimodal.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/serving/test_openai_stream_options.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/serving/test_persistence.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/serving/test_pre_first_disconnect.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/serving/test_prequant_config.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/serving/test_registry.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/serving/test_registry_coverage.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/serving/test_request_body_limit.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/serving/test_router_coverage.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/serving/test_router_edge_coverage.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/serving/test_schemas_coverage.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/serving/test_serve_reasoning_split.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/serving/test_serve_thinking.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/serving/test_settings.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/serving/test_structured_outputs.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/serving/test_structured_outputs_coverage.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/serving/test_supabase_rest_coverage.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/serving_conformance/__init__.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/serving_conformance/conftest.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/serving_conformance/test_contract.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_accounting_coverage.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_adapter_shard_completeness.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_agent_flash_cli_contract.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_algorithms.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_allocator.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_authenticated_redirects.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_backend_common.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_backend_jobspec_contract.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_bake_kernel_cache.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_base_model_provenance.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_billing_retry.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_build_context_contract.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_capture_qwen38_metadata.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_catalog_consistency.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_catalog_only_models.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_charge_pricing.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_chat_foundations.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_checkpoint_lifecycle.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_cli_commands.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_cli_commands_coverage.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_cli_credential_shadowing.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_cli_errors.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_cli_estimate.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_cli_gpus_flag.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_cli_help.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_cli_main_coverage.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_cli_managed.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_cli_render_coverage.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_cli_render_theme.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_cli_serve_deploy.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_cli_serve_status.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_cli_serve_undeploy.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_cli_traces.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_cli_wandb_warning.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_client.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_client_import_purity.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_client_server_integration.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_client_stream_reads.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_config_env_vars.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_config_overrides.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_console_upload.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_controlled_experiment_repairs.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_cost_analytical.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_cost_currency.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_cost_equation.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_cost_estimate.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_cost_hardware.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_cost_models.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_dataset_profile.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_deploy_latency.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_dev_channel.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_disk_gb.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_env_cache_evict.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_env_delete.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_env_download_api.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_env_evaluations.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_env_list_api.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_env_list_cli.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_env_list_hub.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_env_no_install.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_env_pull.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_env_pull_coverage.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_env_pull_loader_coverage.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_env_pull_managed_control_plane.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_env_rate_limit_resolve.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_env_test.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_envs_coverage.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_export.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_flash_mvp.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_flashinfer_cache_dirs.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_freesolo_api_transport.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_fused_expert_warmstart.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_github_urlopen_retry.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_gpu_type_single_field.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_grpo_checkpoint_durability.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_grpo_params.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_grpo_process_census.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_grpo_reward_batching.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_grpo_rollout_identity.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_health_liveness.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_hf_retry.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_image_environment_capability.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_image_incremental_processor.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_image_sft_markers.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_image_sft_processor_parity.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_image_tokens.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_infisical_secrets.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_internal_client.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_kernel_cache.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_kernel_fingerprint.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_kv_util.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_lambda_api_coverage.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_logging.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_login_perms.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_lora_rank_coverage.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_lora_rank_nested_rung.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_lora_rank_preflight.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_lora_targeting.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_lora_targeting_pinned_verl.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_managed_config_fields.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_managed_hf_repo.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_metrics_schema_agent_contract.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_mig_guard.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_mirror_sampling_parity.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_multimodal_training.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_named_reward_metrics.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_oom_escalate_gpu.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_opd.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_opd_limits.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_opd_multiturn_eos_boundary.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_opd_multiturn_failure_exit.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_opd_replay_guard.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_packing.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_packing_coverage.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_parasail_teacher.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_persisted_spec_envelope.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_poll_helpers.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_preflight.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_projects.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_prompt_budget.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_provider_preflight_coverage.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_realized_cost.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_repo_cleanup.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_resolve_params_b.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_retry_decision.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_rl_train.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_rollout_samples.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_run_registry_lifecycle.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_runpod_api_delete.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_runpod_key_fingerprint.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_runpod_key_waterfall.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_runtime_capsule.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_serve.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_serve_app_launch.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_serve_app_manifest.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_serve_app_materialize.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_serve_app_packaging.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_serve_chat_transport.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_serve_control.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_serve_docs.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_serve_modal_contract_lock.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_serve_modal_sdk.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_serve_modal_sdk_deadlines.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_serve_modal_teardown_identity.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_serve_profile_qualification.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_serve_profiles.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_serve_provisioning_common.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_serve_provisioning_modal.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_serve_reasoning_content.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_serve_resolve_provenance.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_serve_runtime_adapters.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_serve_runtime_engine.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_serve_runtime_package.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_serve_runtime_types.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_server_app_coverage.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_server_auth_singleflight.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_server_billing.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_server_checkpoints_coverage.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_server_db.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_server_locks_coverage.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_server_managed_chat_requests.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_server_serving_resources.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_serving_conformance_gate.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_serving_context_preflight.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_serving_schema_coverage.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_sft_chunked_nll.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_sft_example_selection.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_sft_gc_off.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_sft_max_context.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_sft_step_floor.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_sft_train.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_sft_workload.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_source_attestation_flow.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_source_layout.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_source_snapshot.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_spec_and_validation.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_spec_contract_bytes.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_step_floor.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_step_metrics.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_step_timing.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_structured_outputs.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_teacher_encoding_contract.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_terminal_artifacts.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_thinking_config.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_train_context_preflight.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_type_comment_prose.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_vast_api.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_vast_api_coverage.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_verified_revisions.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_verifiers.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_verl_checkpoint_export.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_verl_child_plugins.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_verl_silence_watchdog.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_version.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_vl_warmstart_adapter_keys.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_vllm_moe_lora_backport.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_vram_architecture.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_wandb_link.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_wandb_naming.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_warmstart_adapter_download.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_warmstart_error_attribution.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_warmstart_image_adapters.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_worker_dryrun.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_worker_image.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_worker_init_heartbeat.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_worker_thinking.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_workflow_contracts.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_workload_profile.py +0 -0
- {freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/tests/test_zero2_sharding_gate.py +0 -0
|
@@ -25,6 +25,16 @@ This file starts at 1.1.35. Earlier releases are not reconstructed here; use
|
|
|
25
25
|
|
|
26
26
|
### Changed
|
|
27
27
|
|
|
28
|
+
- A Flash run is one seed and may execute several attempts. The provider seed argument threaded
|
|
29
|
+
beside `spec.seed` is gone, so the spec is the only seed channel and no caller can supply a
|
|
30
|
+
second one to disagree with it; `Provider.submit_run`/`poll` are now `submit_attempt`/
|
|
31
|
+
`poll_attempt`; and `runner/supervise/seed_submission.py` is `attempt_supervision.py`. Instance
|
|
32
|
+
labels drop the redundant seed field (`<run>-s<seed>-a<n>` becomes `<run>-a<n>`), and every
|
|
33
|
+
RunPod endpoint carries an explicit `-a<n>` ordinal including attempt zero, replacing the `r<n>`
|
|
34
|
+
retry suffix that made a retry ordinal an identity and left the base name ambiguous between a run
|
|
35
|
+
and its first attempt. Names that exceed the provider budget now raise rather than truncate,
|
|
36
|
+
since a clipped ordinal is one two attempts of a run can collide on.
|
|
37
|
+
|
|
28
38
|
- Run-backed adapters now use only explicit permanent checkpoint identities, `<run_id>/final` and
|
|
29
39
|
`<run_id>/step-N`. Bare run aliases, composite source-revision identities, activation, implicit
|
|
30
40
|
checkpoint fallback, and public artifact provenance have been removed across hosted, managed, 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.128
|
|
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
|
{freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/cli/commands/env/ops/imports.py
RENAMED
|
@@ -17,6 +17,7 @@ from pathlib import Path
|
|
|
17
17
|
|
|
18
18
|
from flash.cli.commands.env.ops.push import (
|
|
19
19
|
_ENV_EVALUATIONS_SIDECAR,
|
|
20
|
+
_decode_env_entrypoint_source,
|
|
20
21
|
_ignore_env_push_path,
|
|
21
22
|
_raise_walk_error,
|
|
22
23
|
)
|
|
@@ -149,6 +150,18 @@ def _imported_module_names(tree, *, relative_names_are_siblings: bool = True) ->
|
|
|
149
150
|
return names
|
|
150
151
|
|
|
151
152
|
|
|
153
|
+
def _read_env_module_source(path: Path) -> str:
|
|
154
|
+
"""Read one packaged Python file under the interpreter's own encoding contract.
|
|
155
|
+
|
|
156
|
+
the publish path decodes the entrypoint with `tokenize.detect_encoding`, so a file carrying a
|
|
157
|
+
non-utf-8 encoding cookie is publishable. reading it as utf-8 here raises instead, and every
|
|
158
|
+
caller below treats that as "no imports" -- so the sibling helpers never enter the archive and
|
|
159
|
+
`env push` exits 0 with an environment that only fails once a gpu has been rented. one decoder
|
|
160
|
+
for both paths is what keeps "publishable" and "walked for imports" the same set of files.
|
|
161
|
+
"""
|
|
162
|
+
return _decode_env_entrypoint_source(path.read_bytes())[0]
|
|
163
|
+
|
|
164
|
+
|
|
152
165
|
def _helper_imports(helper: Path, *, env_root: Path) -> set[str]:
|
|
153
166
|
"""Return imports needed by a packaged helper.
|
|
154
167
|
|
|
@@ -160,7 +173,7 @@ def _helper_imports(helper: Path, *, env_root: Path) -> set[str]:
|
|
|
160
173
|
return set()
|
|
161
174
|
try:
|
|
162
175
|
return _imported_module_names(
|
|
163
|
-
ast.parse(helper
|
|
176
|
+
ast.parse(_read_env_module_source(helper), filename=str(helper)),
|
|
164
177
|
relative_names_are_siblings=helper.parent == env_root,
|
|
165
178
|
)
|
|
166
179
|
except (OSError, SyntaxError, UnicodeDecodeError):
|
|
@@ -295,7 +308,7 @@ def _iter_env_sidecar_files(
|
|
|
295
308
|
# GPU has been rented and the worker imports the module. parsed with the same reader as
|
|
296
309
|
# every other module here, so a lazily imported helper (inside load_environment) counts.
|
|
297
310
|
try:
|
|
298
|
-
entry_tree = ast.parse(entrypoint
|
|
311
|
+
entry_tree = ast.parse(_read_env_module_source(entrypoint), filename=str(entrypoint))
|
|
299
312
|
except (OSError, SyntaxError, UnicodeDecodeError):
|
|
300
313
|
# the entrypoint is validated for syntax on its own path, and a push that cannot read
|
|
301
314
|
# it fails there with a better message. an unreadable file here just means no closure.
|
|
@@ -325,7 +338,7 @@ def _iter_env_sidecar_files(
|
|
|
325
338
|
yielded.add(sidecar)
|
|
326
339
|
yield sidecar, sidecar.relative_to(env_root)
|
|
327
340
|
try:
|
|
328
|
-
tree = ast.parse(sidecar
|
|
341
|
+
tree = ast.parse(_read_env_module_source(sidecar), filename=str(sidecar))
|
|
329
342
|
except SyntaxError as exc:
|
|
330
343
|
raise ValueError(
|
|
331
344
|
f"{sidecar}: invalid evaluation sidecar syntax: {exc.msg}"
|
{freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/cli/commands/env/ops/push.py
RENAMED
|
@@ -382,15 +382,40 @@ def _env_name_error(raw: str) -> str:
|
|
|
382
382
|
return f"env name invalid: {text!r} has no usable characters"
|
|
383
383
|
|
|
384
384
|
|
|
385
|
+
def _validate_env_entrypoint_source(source: bytes) -> None:
|
|
386
|
+
"""Reject exact Python bytes that cannot execute as an environment module."""
|
|
387
|
+
compile(source, _ENV_ENTRYPOINT, "exec")
|
|
388
|
+
|
|
389
|
+
|
|
390
|
+
def _decode_env_entrypoint_source(source: bytes) -> tuple[str, str]:
|
|
391
|
+
"""Decode Python bytes with the interpreter's encoding-cookie and BOM contract."""
|
|
392
|
+
import io
|
|
393
|
+
import tokenize
|
|
394
|
+
|
|
395
|
+
encoding, _ = tokenize.detect_encoding(io.BytesIO(source).readline)
|
|
396
|
+
return source.decode(encoding), encoding
|
|
397
|
+
|
|
398
|
+
|
|
399
|
+
def _python_preamble_lines(lines: list[str]) -> int:
|
|
400
|
+
"""Return the shebang and encoding-cookie lines that must remain first."""
|
|
401
|
+
if not lines:
|
|
402
|
+
return 0
|
|
403
|
+
encoding_cookie = re.compile(r"^[ \t\f]*#.*?coding[:=][ \t]*[-\w.]+", re.ASCII)
|
|
404
|
+
blank_or_comment = re.compile(r"^[ \t\f]*(?:#|[\r\n]|$)", re.ASCII)
|
|
405
|
+
if encoding_cookie.match(lines[0]):
|
|
406
|
+
return 1
|
|
407
|
+
if len(lines) > 1 and blank_or_comment.match(lines[0]) and encoding_cookie.match(lines[1]):
|
|
408
|
+
return 2
|
|
409
|
+
return 1 if lines[0].startswith("#!") else 0
|
|
410
|
+
|
|
411
|
+
|
|
385
412
|
def _with_syspath_bootstrap(env_source: str) -> str:
|
|
386
|
-
"""
|
|
413
|
+
"""Insert the sys.path bootstrap after the Python module preamble."""
|
|
387
414
|
import ast
|
|
388
415
|
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
return _ENV_SYSPATH_BOOTSTRAP + env_source
|
|
393
|
-
insert_after = 0
|
|
416
|
+
tree = ast.parse(env_source, filename=_ENV_ENTRYPOINT)
|
|
417
|
+
lines = env_source.splitlines(keepends=True)
|
|
418
|
+
insert_after = _python_preamble_lines(lines)
|
|
394
419
|
body = tree.body
|
|
395
420
|
i = 0
|
|
396
421
|
if (
|
|
@@ -399,13 +424,27 @@ def _with_syspath_bootstrap(env_source: str) -> str:
|
|
|
399
424
|
and isinstance(getattr(body[0], "value", None), ast.Constant)
|
|
400
425
|
and isinstance(body[0].value.value, str)
|
|
401
426
|
):
|
|
402
|
-
insert_after = body[0].end_lineno or 0
|
|
427
|
+
insert_after = max(insert_after, body[0].end_lineno or 0)
|
|
403
428
|
i = 1
|
|
404
429
|
while i < len(body) and isinstance(body[i], ast.ImportFrom) and body[i].module == "__future__":
|
|
405
|
-
insert_after = body[i].end_lineno or
|
|
430
|
+
insert_after = max(insert_after, body[i].end_lineno or 0)
|
|
406
431
|
i += 1
|
|
407
|
-
|
|
408
|
-
|
|
432
|
+
prefix = "".join(lines[:insert_after])
|
|
433
|
+
if prefix and not prefix.endswith(("\n", "\r")):
|
|
434
|
+
prefix += "\n"
|
|
435
|
+
published_source = prefix + _ENV_SYSPATH_BOOTSTRAP + "".join(lines[insert_after:])
|
|
436
|
+
if not env_source.endswith(("\n", "\r")):
|
|
437
|
+
published_source = published_source.removesuffix("\n")
|
|
438
|
+
return published_source
|
|
439
|
+
|
|
440
|
+
|
|
441
|
+
def _prepare_env_entrypoint_source(env_source: bytes) -> bytes:
|
|
442
|
+
"""Validate the authored bytes and return the exact validated archive bytes."""
|
|
443
|
+
_validate_env_entrypoint_source(env_source)
|
|
444
|
+
decoded_source, encoding = _decode_env_entrypoint_source(env_source)
|
|
445
|
+
published_source = _with_syspath_bootstrap(decoded_source).encode(encoding)
|
|
446
|
+
_validate_env_entrypoint_source(published_source)
|
|
447
|
+
return published_source
|
|
409
448
|
|
|
410
449
|
|
|
411
450
|
def _raise_walk_error(error: OSError) -> None:
|
|
@@ -674,6 +713,18 @@ def cmd_env_push(args) -> int:
|
|
|
674
713
|
except ValueError as exc:
|
|
675
714
|
return _err(str(exc))
|
|
676
715
|
|
|
716
|
+
try:
|
|
717
|
+
published_source = _prepare_env_entrypoint_source(entrypoint.read_bytes())
|
|
718
|
+
except (SyntaxError, UnicodeError, ValueError) as exc:
|
|
719
|
+
location = (
|
|
720
|
+
f"line {exc.lineno}" if getattr(exc, "lineno", None) is not None else "unknown line"
|
|
721
|
+
)
|
|
722
|
+
return _err(
|
|
723
|
+
f"cannot publish {src}: environment entrypoint has invalid Python syntax ({location})"
|
|
724
|
+
)
|
|
725
|
+
except OSError:
|
|
726
|
+
return _err(f"cannot publish {src}: environment entrypoint could not be read")
|
|
727
|
+
|
|
677
728
|
try:
|
|
678
729
|
_check_env_push_limits(
|
|
679
730
|
env_root,
|
|
@@ -686,8 +737,7 @@ def cmd_env_push(args) -> int:
|
|
|
686
737
|
|
|
687
738
|
with tempfile.TemporaryDirectory(prefix="flash-env-push-") as tmp:
|
|
688
739
|
pkg = Path(tmp)
|
|
689
|
-
|
|
690
|
-
(pkg / _ENV_ENTRYPOINT).write_text(_with_syspath_bootstrap(module_source))
|
|
740
|
+
(pkg / _ENV_ENTRYPOINT).write_bytes(published_source)
|
|
691
741
|
_write_entrypoint_alias(pkg, entrypoint=entrypoint)
|
|
692
742
|
_copy_env_sidecars(
|
|
693
743
|
env_root,
|
|
@@ -255,7 +255,7 @@ model = "Qwen/Qwen3.5-9B" # see `flash models list`
|
|
|
255
255
|
project = "PROJECT_UUID" # required UUID from `flash projects create`
|
|
256
256
|
algorithm = "sft" # "sft" (supervised), "grpo" (RL), or "opd" (on-policy distillation)
|
|
257
257
|
# thinking = true # opt-in reasoning mode, for models that support it
|
|
258
|
-
# seed = 42 #
|
|
258
|
+
# seed = 42 # the run's one seed; omitted defaults to 42
|
|
259
259
|
|
|
260
260
|
[environment]
|
|
261
261
|
id = "your-org/your-project/my-env" # the id printed by `flash env push`
|
|
@@ -364,7 +364,9 @@ remove that failover, and cannot be combined with `providers`. An unknown name i
|
|
|
364
364
|
time and the error lists the names your plane accepts. `[gpu] type` pins one exact active
|
|
365
365
|
validated GPU class. Run artifacts are stored in a
|
|
366
366
|
private environment-scoped repo with content-addressed Flash code snapshots. Set `seed` only at the
|
|
367
|
-
top level
|
|
367
|
+
top level: a run has exactly one seed, and if a host fails Flash executes another attempt of that
|
|
368
|
+
same run rather than a new one, so every attempt trains on the seed you set here.
|
|
369
|
+
Compose or tweak configs without editing files: `--config extra.toml` (deep-merge) and
|
|
368
370
|
`--set key=value` (e.g. `--set train.epochs=3`). `--gpus N` is
|
|
369
371
|
shorthand for `--set gpu.count=N`; both land in one override list, so repeats resolve left to
|
|
370
372
|
right.
|
|
@@ -69,7 +69,7 @@ def live_attempt(obj: dict) -> int | None:
|
|
|
69
69
|
def heartbeat_is_current_attempt(obj: dict, heartbeat: dict) -> bool:
|
|
70
70
|
"""False only when the heartbeat provably belongs to a superseded retry attempt.
|
|
71
71
|
|
|
72
|
-
|
|
72
|
+
Every attempt of a run shares one heartbeat path, so a recovered run flips back to ``running`` for the
|
|
73
73
|
replacement worker while ``last_heartbeat`` can still be the previous attempt's setup ping until
|
|
74
74
|
the new worker publishes one. ``remote.attempt`` is the live attempt; ``last_heartbeat.attempt``
|
|
75
75
|
is the one that produced the ping. When the live attempt is known, keep the reassurance only for a
|
|
@@ -268,18 +268,6 @@ CONTROL_PLANE_OWNED_ENV_KEYS = frozenset(
|
|
|
268
268
|
TRAINER_BACKEND = "verl"
|
|
269
269
|
|
|
270
270
|
|
|
271
|
-
def require_matching_seed(spec: JobSpec, seed: Any) -> int:
|
|
272
|
-
"""Require the retained provider seed argument to match the authoritative JobSpec seed."""
|
|
273
|
-
provided = parse_seed(seed)
|
|
274
|
-
canonical = parse_seed(spec.seed)
|
|
275
|
-
if provided != canonical:
|
|
276
|
-
raise ValueError(
|
|
277
|
-
f"provider seed {provided} does not match JobSpec.seed {canonical}; "
|
|
278
|
-
"use spec.seed as the provider seed"
|
|
279
|
-
)
|
|
280
|
-
return canonical
|
|
281
|
-
|
|
282
|
-
|
|
283
271
|
def _model_revision(value: Any) -> str:
|
|
284
272
|
"""parse an optional exact model-repository revision."""
|
|
285
273
|
if not isinstance(value, str):
|
|
@@ -134,7 +134,7 @@ def _rollout_batch_for_quote(spec) -> int:
|
|
|
134
134
|
|
|
135
135
|
|
|
136
136
|
def spec_steps(spec) -> int:
|
|
137
|
-
"""Per-
|
|
137
|
+
"""Per-run optimizer steps implied by a train spec (mirrors the worker).
|
|
138
138
|
|
|
139
139
|
sft reads the horizon its workload profile measured: the profile already resolved epochs,
|
|
140
140
|
retained rows, realized batch, and ``max_steps`` against the exact tokenized dataset, so
|
{freesolo_flash_dev-1.2.127 → freesolo_flash_dev-1.2.128}/flash/engine/worker/entry/worker.py
RENAMED
|
@@ -17,6 +17,7 @@ import flash.engine.worker.runtime.kernel_warmup as kernel_warmup
|
|
|
17
17
|
import flash.engine.worker.train.entry.backend_common as backend_common
|
|
18
18
|
from flash._internal.diagnostics import sanitize_diagnostic
|
|
19
19
|
from flash.core.spec import gpu_count_of
|
|
20
|
+
from flash.engine.support.huggingface import hub_error_transience
|
|
20
21
|
from flash.engine.worker.runtime import state
|
|
21
22
|
from flash.envs.loading.staged import (
|
|
22
23
|
StagedEnvironmentTransientError,
|
|
@@ -67,6 +68,7 @@ def _run_worker_mode() -> None:
|
|
|
67
68
|
# Idempotency: check DONE before any env-mutating pip install (fla fast path).
|
|
68
69
|
if state.HF_REPO:
|
|
69
70
|
from huggingface_hub import hf_hub_download
|
|
71
|
+
from huggingface_hub.errors import RemoteEntryNotFoundError
|
|
70
72
|
|
|
71
73
|
try:
|
|
72
74
|
hf_hub_download(
|
|
@@ -76,8 +78,15 @@ def _run_worker_mode() -> None:
|
|
|
76
78
|
token=os.environ.get("HF_TOKEN"),
|
|
77
79
|
)
|
|
78
80
|
done = True
|
|
79
|
-
except Exception:
|
|
80
|
-
|
|
81
|
+
except Exception as exc:
|
|
82
|
+
if type(exc) is RemoteEntryNotFoundError:
|
|
83
|
+
done = False
|
|
84
|
+
elif hub_error_transience(exc) is True:
|
|
85
|
+
raise worker_perf.RetriableInfraError(
|
|
86
|
+
f"DONE marker read failed transiently ({type(exc).__name__})"
|
|
87
|
+
) from exc
|
|
88
|
+
else:
|
|
89
|
+
raise
|
|
81
90
|
remaining = state._remaining_worker_wall_seconds()
|
|
82
91
|
if remaining is not None and remaining <= 0:
|
|
83
92
|
raise RuntimeError("worker run wall deadline exceeded")
|
|
@@ -22,6 +22,7 @@ from email.utils import parsedate_to_datetime
|
|
|
22
22
|
if __package__:
|
|
23
23
|
from flash.providers._lifecycle.bootstrapping import console as _bootstrap_console
|
|
24
24
|
from flash.providers._lifecycle.bootstrapping import pip as bootstrap_pip
|
|
25
|
+
from flash.providers._lifecycle.bootstrapping import processes as _bootstrap_processes
|
|
25
26
|
from flash.providers._lifecycle.bootstrapping.secrets import (
|
|
26
27
|
_payload_secrets,
|
|
27
28
|
_read_console_tail,
|
|
@@ -34,6 +35,7 @@ else:
|
|
|
34
35
|
import archive as _source_snapshot # type: ignore[no-redef]
|
|
35
36
|
import bootstrap_console as _bootstrap_console # type: ignore[no-redef]
|
|
36
37
|
import bootstrap_pip # type: ignore[no-redef]
|
|
38
|
+
import bootstrap_processes as _bootstrap_processes # type: ignore[no-redef]
|
|
37
39
|
from bootstrap_secrets import ( # type: ignore[no-redef]
|
|
38
40
|
_payload_secrets,
|
|
39
41
|
_read_console_tail,
|
|
@@ -297,9 +299,26 @@ def _upload_cleanup_deadlines(deadline_at: float) -> tuple[float, float]:
|
|
|
297
299
|
|
|
298
300
|
|
|
299
301
|
def _worker_execution_deadline(upload_deadline_at: float) -> float:
|
|
302
|
+
"""When the worker must be done, leaving the console upload window intact behind it."""
|
|
300
303
|
return upload_deadline_at - _CONSOLE_UPLOAD_STOP_TIMEOUT_S - _CONSOLE_UPLOAD_FINAL_TIMEOUT_S
|
|
301
304
|
|
|
302
305
|
|
|
306
|
+
def _group_teardown_deadline(upload_deadline_at: float) -> float:
|
|
307
|
+
"""How long killing the worker's process group may take once the wall-clock cap has fired.
|
|
308
|
+
|
|
309
|
+
Teardown begins at the worker deadline, so it cannot be bounded by that same instant: a group
|
|
310
|
+
supervised against its own start time gets a zero wait, SIGKILL is never given time to be
|
|
311
|
+
reaped, and an ordinary capped run is reported as a surviving group holding the gpu.
|
|
312
|
+
|
|
313
|
+
What it must not eat into is the final console tail, since that tail carries the survivor line
|
|
314
|
+
to the user -- hence stopping one full ``_CONSOLE_UPLOAD_FINAL_TIMEOUT_S`` short of the upload
|
|
315
|
+
deadline. The uploader stop that runs in between is capped by its own constant against the same
|
|
316
|
+
absolute deadline, so it is not squeezed by a teardown that runs long. And running long is only
|
|
317
|
+
ever the stuck case: a group that dies on SIGKILL is reaped in milliseconds.
|
|
318
|
+
"""
|
|
319
|
+
return upload_deadline_at - _CONSOLE_UPLOAD_FINAL_TIMEOUT_S
|
|
320
|
+
|
|
321
|
+
|
|
303
322
|
def _join_upload_process_before(process, deadline_at: float, max_wait_s: float) -> None:
|
|
304
323
|
remaining = max(
|
|
305
324
|
0.0,
|
|
@@ -604,6 +623,7 @@ def run_mode(payload: dict, env: dict, mode: str, deadline_ts: float) -> int:
|
|
|
604
623
|
console = f"/tmp/console_{mode}.txt"
|
|
605
624
|
upload_deadline_at, reaping_deadline_at = _upload_cleanup_deadlines(deadline_ts)
|
|
606
625
|
worker_deadline_at = _worker_execution_deadline(upload_deadline_at)
|
|
626
|
+
teardown_deadline_at = _group_teardown_deadline(upload_deadline_at)
|
|
607
627
|
# cap work from its actual start: the absolute deadline includes boot grace, whose unused
|
|
608
628
|
# portion must not extend the declared wall-time budget.
|
|
609
629
|
budget = payload.get("run_max_wall_seconds")
|
|
@@ -615,12 +635,15 @@ def run_mode(payload: dict, env: dict, mode: str, deadline_ts: float) -> int:
|
|
|
615
635
|
_finite_positive_number(time.time(), "current clock") + budget,
|
|
616
636
|
)
|
|
617
637
|
timed_out = False
|
|
638
|
+
survived_teardown = ""
|
|
618
639
|
|
|
619
640
|
with open(console, "w", buffering=1) as cf:
|
|
620
641
|
code_dir = _code_dir(payload)
|
|
621
642
|
if worker_deadline_at - _finite_positive_number(time.time(), "current clock") <= 0:
|
|
622
643
|
raise TimeoutError(f"worker mode '{mode}' exceeded the wall-clock cap")
|
|
623
|
-
|
|
644
|
+
# own group: the worker fans out into torchrun/vllm children that hold cuda contexts, and
|
|
645
|
+
# signalling only the leader leaves them holding the gpu after the cap kills the run.
|
|
646
|
+
proc, worker_process_group_id = _bootstrap_processes.start_process_group(
|
|
624
647
|
[sys.executable, "-m", "flash.engine.support.worker_entrypoint"],
|
|
625
648
|
cwd=code_dir,
|
|
626
649
|
env={
|
|
@@ -679,13 +702,18 @@ def run_mode(payload: dict, env: dict, mode: str, deadline_ts: float) -> int:
|
|
|
679
702
|
proc.wait(timeout=remaining)
|
|
680
703
|
except subprocess.TimeoutExpired:
|
|
681
704
|
timed_out = True
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
705
|
+
# the whole group, not just the leader: a surviving child keeps the gpu busy for
|
|
706
|
+
# every later run on this box. a survivor is recorded rather than raised here, so
|
|
707
|
+
# the console tail below still uploads and explains why the run was killed.
|
|
708
|
+
try:
|
|
709
|
+
_bootstrap_processes.terminate_process_group(
|
|
710
|
+
proc,
|
|
711
|
+
process_group_id=worker_process_group_id,
|
|
712
|
+
deadline_at=teardown_deadline_at,
|
|
713
|
+
)
|
|
714
|
+
except RuntimeError as exc:
|
|
715
|
+
survived_teardown = str(exc)
|
|
716
|
+
print(survived_teardown, flush=True)
|
|
689
717
|
|
|
690
718
|
drain_timeout = max(
|
|
691
719
|
0.0,
|
|
@@ -711,6 +739,8 @@ def run_mode(payload: dict, env: dict, mode: str, deadline_ts: float) -> int:
|
|
|
711
739
|
extra = ""
|
|
712
740
|
if timed_out:
|
|
713
741
|
extra = f"\n--- bootstrap: mode '{mode}' hit the wall-clock cap; killed ---\n"
|
|
742
|
+
if survived_teardown:
|
|
743
|
+
extra += f"--- bootstrap: {survived_teardown} ---\n"
|
|
714
744
|
if upload_deadline_at <= _finite_positive_number(time.time(), "current clock"):
|
|
715
745
|
print("final console upload skipped; uploader reaping reserve reached", flush=True)
|
|
716
746
|
elif not _upload_console_tail_bounded(
|
|
@@ -728,6 +758,12 @@ def run_mode(payload: dict, env: dict, mode: str, deadline_ts: float) -> int:
|
|
|
728
758
|
flush=True,
|
|
729
759
|
)
|
|
730
760
|
if timed_out:
|
|
761
|
+
if survived_teardown:
|
|
762
|
+
# the box is still occupied, so this is not a clean capped run: say so loudly enough
|
|
763
|
+
# that the failure is not filed as an ordinary timeout.
|
|
764
|
+
raise TimeoutError(
|
|
765
|
+
f"worker mode '{mode}' exceeded the wall-clock cap and {survived_teardown}"
|
|
766
|
+
)
|
|
731
767
|
raise TimeoutError(f"worker mode '{mode}' exceeded the wall-clock cap")
|
|
732
768
|
return proc.returncode
|
|
733
769
|
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"""Process-group teardown for the worker the bootstrap launches.
|
|
2
|
+
|
|
3
|
+
Stdlib only -- this ships inside the instance capsule alongside ``bootstrap.py`` and runs on the
|
|
4
|
+
rented host, where the ``flash`` package is not importable. The worker's own
|
|
5
|
+
``flash.engine.worker.train.entry.backend_common.kill_process_group`` solves the same problem one
|
|
6
|
+
layer down, but the bootstrap cannot import it, so the group teardown it needs lives here.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import contextlib
|
|
12
|
+
import os
|
|
13
|
+
import signal
|
|
14
|
+
import subprocess
|
|
15
|
+
import time
|
|
16
|
+
|
|
17
|
+
_TERM_GRACE_S = 10.0
|
|
18
|
+
_KILL_GRACE_S = 5.0
|
|
19
|
+
_POLL_S = 0.1
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def _bounded_graces(
|
|
23
|
+
term_grace_s: float, kill_grace_s: float, deadline_at: float | None
|
|
24
|
+
) -> tuple[float, float]:
|
|
25
|
+
"""Split the time actually left before ``deadline_at`` across the term and kill waits.
|
|
26
|
+
|
|
27
|
+
The term wait yields first because the kill is the escalation that actually frees the gpu: with
|
|
28
|
+
a tight budget it is better to signal SIGKILL early and spend what remains waiting for it than
|
|
29
|
+
to burn the whole window on a SIGTERM the group is ignoring.
|
|
30
|
+
"""
|
|
31
|
+
if deadline_at is None:
|
|
32
|
+
return max(0.0, term_grace_s), max(0.0, kill_grace_s)
|
|
33
|
+
remaining = max(0.0, deadline_at - time.time())
|
|
34
|
+
kill_wait = min(max(0.0, kill_grace_s), remaining)
|
|
35
|
+
term_wait = min(max(0.0, term_grace_s), remaining - kill_wait)
|
|
36
|
+
return term_wait, kill_wait
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def _group_exists(process_group_id: int) -> bool:
|
|
40
|
+
"""Report whether any process still belongs to the group."""
|
|
41
|
+
try:
|
|
42
|
+
os.killpg(process_group_id, 0)
|
|
43
|
+
except ProcessLookupError:
|
|
44
|
+
return False
|
|
45
|
+
except PermissionError:
|
|
46
|
+
# visible but not ours to signal, so treat it as alive rather than silently done.
|
|
47
|
+
return True
|
|
48
|
+
return True
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def _group_exists_after_reaping(process: subprocess.Popen, process_group_id: int) -> bool:
|
|
52
|
+
"""Reap the leader before probing, so a zombie leader does not read as a live group."""
|
|
53
|
+
process.poll()
|
|
54
|
+
return _group_exists(process_group_id)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def _wait_for_group_exit(
|
|
58
|
+
process: subprocess.Popen, process_group_id: int, timeout_s: float
|
|
59
|
+
) -> bool:
|
|
60
|
+
deadline = time.monotonic() + max(0.0, timeout_s)
|
|
61
|
+
while time.monotonic() < deadline:
|
|
62
|
+
if not _group_exists_after_reaping(process, process_group_id):
|
|
63
|
+
return True
|
|
64
|
+
time.sleep(_POLL_S)
|
|
65
|
+
return not _group_exists_after_reaping(process, process_group_id)
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def terminate_process_group(
|
|
69
|
+
process: subprocess.Popen,
|
|
70
|
+
*,
|
|
71
|
+
process_group_id: int,
|
|
72
|
+
term_grace_s: float = _TERM_GRACE_S,
|
|
73
|
+
kill_grace_s: float = _KILL_GRACE_S,
|
|
74
|
+
deadline_at: float | None = None,
|
|
75
|
+
) -> None:
|
|
76
|
+
"""SIGTERM the group, wait, escalate to SIGKILL, and verify the group is gone.
|
|
77
|
+
|
|
78
|
+
Signalling the group rather than the leader pid is the point: a training worker fans out into
|
|
79
|
+
torchrun and vllm children that hold cuda contexts, and one survivor strands a paid gpu for
|
|
80
|
+
every later run on that box.
|
|
81
|
+
|
|
82
|
+
``deadline_at`` caps the whole supervision against the wall clock. Without it a group that
|
|
83
|
+
ignores SIGTERM costs the full term-then-kill grace, which is time the caller has already
|
|
84
|
+
budgeted for what comes after teardown -- the final console upload that carries the survivor
|
|
85
|
+
line. The kill still goes out when the term grace is spent, so the escalation is never skipped,
|
|
86
|
+
only the waiting is bounded.
|
|
87
|
+
"""
|
|
88
|
+
term_wait, kill_wait = _bounded_graces(term_grace_s, kill_grace_s, deadline_at)
|
|
89
|
+
with contextlib.suppress(ProcessLookupError, PermissionError):
|
|
90
|
+
os.killpg(process_group_id, signal.SIGTERM)
|
|
91
|
+
if not _wait_for_group_exit(process, process_group_id, term_wait):
|
|
92
|
+
with contextlib.suppress(ProcessLookupError, PermissionError):
|
|
93
|
+
os.killpg(process_group_id, signal.SIGKILL)
|
|
94
|
+
_wait_for_group_exit(process, process_group_id, kill_wait)
|
|
95
|
+
with contextlib.suppress(subprocess.TimeoutExpired):
|
|
96
|
+
process.wait(timeout=0)
|
|
97
|
+
if _group_exists(process_group_id):
|
|
98
|
+
raise RuntimeError(f"process group {process_group_id} survived term and kill supervision")
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def start_process_group(args, **kwargs) -> tuple[subprocess.Popen, int]:
|
|
102
|
+
"""Start one process as its own group leader and return it with its group id.
|
|
103
|
+
|
|
104
|
+
The group id is captured at launch because ``os.getpgid`` stops working once the leader is
|
|
105
|
+
reaped, which is exactly when the surviving descendants still need addressing.
|
|
106
|
+
"""
|
|
107
|
+
if "start_new_session" in kwargs:
|
|
108
|
+
raise ValueError("start_new_session is owned by process-group supervision")
|
|
109
|
+
process = subprocess.Popen(args, start_new_session=True, **kwargs)
|
|
110
|
+
return process, process.pid
|
|
@@ -55,29 +55,28 @@ def run_label_prefix(run_id: str) -> str:
|
|
|
55
55
|
|
|
56
56
|
|
|
57
57
|
def label_matches_run(label: str, prefix: str) -> bool:
|
|
58
|
-
"""True iff ``label`` belongs to the run whose prefix is ``prefix``
|
|
59
|
-
followed by the ``-
|
|
60
|
-
``flash-1000-...`` (or vice versa). The single label-ownership test every instance provider's
|
|
61
|
-
and run-scoped teardown shares."""
|
|
62
|
-
return label == prefix or label.startswith(prefix + "-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
def instance_label(run_id: str,
|
|
66
|
-
"""Instance name: run
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
58
|
+
"""True iff ``label`` belongs to the run whose prefix is ``prefix`` -- an EXACT match, or the
|
|
59
|
+
prefix followed by the ``-a`` attempt boundary. Boundary-anchored so ``flash-100`` never matches
|
|
60
|
+
``flash-1000-...`` (or vice versa). The single label-ownership test every instance provider's
|
|
61
|
+
sweep and run-scoped teardown shares."""
|
|
62
|
+
return label == prefix or label.startswith(prefix + "-a")
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def instance_label(run_id: str, attempt: int) -> str:
|
|
66
|
+
"""Instance name: run plus the attempt executing on this host.
|
|
67
|
+
|
|
68
|
+
Run-derived so ``sweep_orphans`` can tell ours from anything else on the account, and bounded
|
|
69
|
+
(via ``run_label_prefix``) so the provider never truncates it. The seed is not part of the name:
|
|
70
|
+
a run has exactly one, so it distinguished nothing here while competing with the attempt for the
|
|
71
|
+
digit budget, and a truncated attempt is one two attempts of a run can collide on.
|
|
72
|
+
"""
|
|
72
73
|
attempt_i = _attempt_int(attempt)
|
|
73
74
|
if attempt_i is None:
|
|
74
75
|
raise ValueError("instance attempt identity is invalid")
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
seed_s = seed_s[: max(0, digit_budget - len(attempt_s))]
|
|
80
|
-
return f"{run_label_prefix(run_id)}-s{seed_s}-a{attempt_s}"
|
|
76
|
+
attempt_s = str(attempt_i)
|
|
77
|
+
if len(attempt_s) > _SUFFIX_BUDGET - len("-a"):
|
|
78
|
+
raise ValueError("instance attempt identity exceeds the provider name budget")
|
|
79
|
+
return f"{run_label_prefix(run_id)}-a{attempt_s}"
|
|
81
80
|
|
|
82
81
|
|
|
83
82
|
@dataclass
|
|
@@ -183,7 +182,6 @@ fi
|
|
|
183
182
|
|
|
184
183
|
def build_payload(
|
|
185
184
|
spec,
|
|
186
|
-
seed: int,
|
|
187
185
|
attempt: int,
|
|
188
186
|
*,
|
|
189
187
|
arm: str,
|
|
@@ -197,7 +195,6 @@ def build_payload(
|
|
|
197
195
|
"""The bootstrap's input — field-compatible with the RunPod ``_train_body`` payload, plus the
|
|
198
196
|
bits the instance can't infer (HF prefix for markers, wall cap, attempt, and the substrate
|
|
199
197
|
``arm`` that the bootstrap stamps as FLASH_ARM + the marker name)."""
|
|
200
|
-
from flash.core.spec import require_matching_seed
|
|
201
198
|
from flash.envs.loading.base import worker_pip_with_extras
|
|
202
199
|
from flash.providers._lifecycle.net.worker import (
|
|
203
200
|
build_worker_env,
|
|
@@ -205,12 +202,10 @@ def build_payload(
|
|
|
205
202
|
)
|
|
206
203
|
from flash.snapshot.archive import parse_descriptor
|
|
207
204
|
|
|
208
|
-
canonical_seed = require_matching_seed(spec, seed)
|
|
209
205
|
# strip the runpod-only volume redirect; point base-model prefetch at this provider's cache unless the user overrode it.
|
|
210
206
|
env = strip_runpod_volume_env(
|
|
211
207
|
build_worker_env(
|
|
212
208
|
spec,
|
|
213
|
-
canonical_seed,
|
|
214
209
|
runtime_secrets=runtime_secrets,
|
|
215
210
|
)
|
|
216
211
|
)
|