freesolo-flash-dev 1.2.124__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.124 → freesolo_flash_dev-1.2.128}/CHANGELOG.md +10 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/PKG-INFO +1 -1
- freesolo_flash_dev-1.2.128/docs/hosted-inference-load-testing.md +224 -0
- freesolo_flash_dev-1.2.128/flash/_internal/http.py +101 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/cli/commands/env/ops/imports.py +16 -3
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/cli/commands/env/ops/push.py +62 -12
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/cli/scaffold/TRAINING.md +4 -2
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/cli/ui/heartbeat.py +1 -1
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/client/freesolo_api.py +3 -2
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/client/http.py +4 -3
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/core/spec.py +0 -12
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/cost/spec.py +1 -1
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/entry/worker.py +11 -2
- {freesolo_flash_dev-1.2.124 → 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.124 → freesolo_flash_dev-1.2.128}/flash/providers/_lifecycle/instances/instance.py +19 -24
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/providers/_lifecycle/instances/provider.py +7 -18
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/providers/_lifecycle/net/worker.py +4 -4
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/providers/artifacts/weight_cache.py +0 -1
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/providers/core/base.py +7 -7
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/providers/lambda_/execution/provider.py +3 -7
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/providers/lambda_/jobs/__init__.py +9 -19
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/providers/lambda_/jobs/builders.py +0 -2
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/providers/lambda_/jobs/reap.py +2 -2
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/providers/runpod/execution/job_execution.py +14 -11
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/providers/runpod/execution/provider.py +6 -11
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/providers/runpod/execution/resources.py +16 -3
- {freesolo_flash_dev-1.2.124 → 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.124 → freesolo_flash_dev-1.2.128}/flash/providers/vast/execution/provider.py +4 -8
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/providers/vast/jobs/__init__.py +7 -13
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/providers/vast/jobs/builders.py +0 -2
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/runner/lifecycle/status.py +11 -3
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/runner/supervise/attach.py +4 -8
- freesolo_flash_dev-1.2.124/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.124 → freesolo_flash_dev-1.2.128}/flash/runner/supervise/lifecycle.py +29 -13
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/runner/supervise/recovery.py +1 -1
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/runtime_capsule/profiles.py +2 -1
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serve/app/http.py +9 -1
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serve/app/progress.py +7 -1
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serve/deployment/deploy.py +4 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serve/request/transport.py +15 -1
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/server/asgi/app.py +25 -24
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/server/billing/charges.py +2 -1
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/server/domain/ops/reconcile.py +2 -1
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/server/domain/registry/checkpoints.py +2 -2
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/server/domain/registry/environment_registry.py +2 -1
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/server/domain/registry/envs.py +153 -67
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/server/domain/registry/projects.py +3 -2
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/server/platform/auth.py +7 -3
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/server/platform/internal_client.py +5 -4
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/server/platform/runtime.py +6 -5
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/server/routes/serving.py +23 -21
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serving/app/README.md +6 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serving/app/modal_app.py +38 -14
- freesolo_flash_dev-1.2.128/flash/serving/loadtest/__init__.py +5 -0
- freesolo_flash_dev-1.2.128/flash/serving/loadtest/__main__.py +5 -0
- freesolo_flash_dev-1.2.128/flash/serving/loadtest/artifacts.py +195 -0
- freesolo_flash_dev-1.2.128/flash/serving/loadtest/cli.py +100 -0
- freesolo_flash_dev-1.2.128/flash/serving/loadtest/metrics.py +279 -0
- freesolo_flash_dev-1.2.128/flash/serving/loadtest/protocol.py +321 -0
- freesolo_flash_dev-1.2.128/flash/serving/loadtest/runner.py +535 -0
- freesolo_flash_dev-1.2.128/flash/serving/loadtest/schedule.py +191 -0
- freesolo_flash_dev-1.2.128/flash/serving/loadtest/schema.py +459 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serving/src/accounting/usage_facts.py +28 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serving/src/accounting/usage_outbox.py +19 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serving/src/engine/generation.py +56 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serving/src/engine/lora_engine.py +66 -10
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serving/src/io/responses.py +4 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/pyproject.toml +2 -2
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/_helpers/runner.py +1 -1
- freesolo_flash_dev-1.2.128/tests/_helpers/wire_headers.py +24 -0
- freesolo_flash_dev-1.2.128/tests/serving/hosted_loadtest_fake_scenario.json +85 -0
- freesolo_flash_dev-1.2.128/tests/serving/test_loadtest_artifacts.py +92 -0
- freesolo_flash_dev-1.2.128/tests/serving/test_loadtest_metrics.py +203 -0
- freesolo_flash_dev-1.2.128/tests/serving/test_loadtest_protocol.py +389 -0
- freesolo_flash_dev-1.2.128/tests/serving/test_loadtest_runner.py +373 -0
- freesolo_flash_dev-1.2.128/tests/serving/test_loadtest_schedule.py +87 -0
- freesolo_flash_dev-1.2.128/tests/serving/test_loadtest_schema.py +158 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/serving/test_per_model_gpu.py +16 -16
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/serving/test_router.py +8 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/serving/test_serve_structured_outputs.py +82 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/serving/test_usage_outbox.py +49 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/serving/test_usage_reporter.py +23 -4
- freesolo_flash_dev-1.2.128/tests/test_authenticated_redirects.py +340 -0
- freesolo_flash_dev-1.2.128/tests/test_bootstrap_process_groups.py +146 -0
- {freesolo_flash_dev-1.2.124 → 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.124 → 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.124 → freesolo_flash_dev-1.2.128}/tests/test_env_publish.py +10 -9
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_env_push.py +270 -5
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_env_ref_pinning.py +2 -3
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_flash_worker.py +19 -24
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_freesolo_api_transport.py +4 -3
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_gpus.py +1 -1
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_grpo_resident_sizing.py +1 -1
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_grpo_rollout_contract.py +2 -2
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_idle_endpoint_reaper.py +65 -22
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_instance_bootstrap_coverage.py +204 -4
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_jobs.py +51 -63
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_lambda_runner.py +105 -130
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_multi_gpu_gate.py +4 -8
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_opd_resume_safety.py +11 -12
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_opd_train.py +1 -2
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_orchestrator_flash.py +4 -4
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_projects.py +5 -4
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_provider_routing.py +68 -79
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_provider_teardown_robustness.py +4 -4
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_providers_symmetry.py +2 -2
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_resume_on_retry.py +36 -36
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_runmgmt.py +153 -53
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_serve_app_bootstrap_http.py +7 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_serve_app_progress.py +1 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_serve_chat_transport.py +55 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_server_api.py +127 -40
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_server_checkpoints_coverage.py +2 -6
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_server_envs_coverage.py +24 -3
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_server_standalone.py +1 -1
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_serving_contract.py +89 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_staged_environment.py +6 -2
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_teacher_broker.py +4 -7
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_training_controls.py +11 -9
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_vast_offers.py +3 -3
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_vast_provider_coverage.py +1 -1
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_vast_runner.py +115 -135
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_warmstart_cross_repo.py +1 -1
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_weight_cache.py +16 -25
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_worker_hardexit.py +153 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_worker_stack.py +25 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/uv.lock +1 -1
- freesolo_flash_dev-1.2.124/tests/test_endpoint_name.py +0 -45
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/.dockerignore +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/.env.example +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/.github/CODEOWNERS +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/.github/dependabot.yml +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/.github/workflows/auto-rebake.yml +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/.github/workflows/bake-kernel-cache.yml +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/.github/workflows/ci.yml +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/.github/workflows/deploy-modal-dev.yml +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/.github/workflows/deploy-modal.yml +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/.github/workflows/dev-kernel-cache.yml +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/.github/workflows/main-source-guard.yml +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/.github/workflows/notify-tests-repo.yml +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/.github/workflows/production-kernel-cache-ready.yml +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/.github/workflows/publish-dev.yml +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/.github/workflows/publish-image.yml +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/.github/workflows/publish-serving-image.yml +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/.github/workflows/publish.yml +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/.github/workflows/version-parity.yml +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/.github/workflows/worker-image.yml +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/.gitignore +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/CODE_OF_CONDUCT.md +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/CONTRIBUTING.md +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/Dockerfile +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/Dockerfile.serve +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/Dockerfile.worker +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/LICENSE +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/NOTICE +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/README.md +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/SECURITY.md +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/SELF_HOSTING.md +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/build/kernel_cache/.gitignore +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/build/kernel_cache/.keep +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/deploy/infisical/README.md +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/deploy/infisical/entrypoint.sh +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/docker/Dockerfile.kernelcache +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/docker/Dockerfile.kernelcache.relayer +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/docker/bake_kernel_cache.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/docker/bake_pod_entry.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/docker/extract_cudart_fix.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/docker/kernel_fingerprint.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/docker/make_rp_handler.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/docker/patch_vllm_moe_lora.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/docs/serving-contract.md +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/_internal/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/_internal/channel.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/_internal/diagnostics.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/_internal/fileio.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/_internal/logging.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/_internal/openai_sse.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/_internal/paths.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/_internal/version.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/adapters/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/adapters/artifacts.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/adapters/fused_experts.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/adapters/lora_rank.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/adapters/targets.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/cli/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/cli/__main__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/cli/commands/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/cli/commands/env/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/cli/commands/env/ops/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/cli/commands/env/ops/list.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/cli/commands/env/ops/retained.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/cli/commands/env/ops/setup.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/cli/commands/env/ops/setup_wandb.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/cli/commands/env/testing/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/cli/commands/env/testing/episode.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/cli/commands/env/testing/eval.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/cli/commands/env/testing/eval_args.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/cli/commands/env/testing/evaluations.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/cli/commands/env/testing/params.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/cli/commands/env/testing/test.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/cli/commands/env/testing/warnings.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/cli/commands/ops/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/cli/commands/ops/account.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/cli/commands/ops/catalog.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/cli/commands/ops/deploy.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/cli/commands/ops/log_follow.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/cli/commands/ops/prompt_budget.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/cli/commands/ops/runs.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/cli/commands/ops/traces.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/cli/commands/ops/train.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/cli/commands/ops/worker_output.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/cli/commands/serving/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/cli/commands/serving/deploy.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/cli/commands/serving/identity.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/cli/commands/serving/status.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/cli/commands/serving/undeploy.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/cli/parsing/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/cli/parsing/account.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/cli/parsing/env.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/cli/parsing/errors.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/cli/parsing/main.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/cli/parsing/models.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/cli/parsing/serve_parser.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/cli/parsing/traces.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/cli/parsing/training.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/cli/scaffold/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/cli/ui/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/cli/ui/cost.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/cli/ui/env_panels.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/cli/ui/render.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/cli/ui/tables.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/cli/ui/tty.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/client/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/client/config.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/client/runtime_secrets.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/client/shapes.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/client/specs.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/client/streaming.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/content/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/content/image_descriptors.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/content/multimodal.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/content/reasoning_normalization.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/content/structured_outputs.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/content/thinking.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/core/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/core/catalog.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/core/grpo.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/core/spec_persistence.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/cost/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/cost/analytical.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/cost/currency.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/cost/facts.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/cost/types.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/plan/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/plan/kv_sizing.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/plan/model_config_probe.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/plan/prompt_budget.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/plan/recipe.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/plan/steps.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/plan/vram.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/profiling/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/profiling/dataset_profile.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/profiling/image_tokens.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/profiling/reasoning_render.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/profiling/sft_image_rows.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/profiling/sft_workload.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/profiling/tokenizer.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/profiling/workload_profile.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/result/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/result/accounting.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/result/rollout_samples.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/support/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/support/huggingface.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/support/verl_checkpoint.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/support/verl_policy.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/support/worker_entrypoint.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/__main__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/entry/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/entry/opd.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/entry/rl.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/entry/sft.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/io/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/io/heartbeat.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/io/hf.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/io/prefetch.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/io/wandb_log.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/model/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/model/adapter.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/model/chatml_mask.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/model/decoding.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/model/lora.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/model/packing.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/perf/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/perf/diagnostics.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/perf/lifecycle.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/perf/liger.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/perf/memory.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/runtime/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/runtime/kernel_warmup.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/runtime/rng.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/runtime/state.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/teacher/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/teacher/client.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/teacher/encoding.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/teacher/tokenizer_align.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/core/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/core/child/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/core/child/glue.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/core/child/runtime.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/core/lifecycle/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/core/lifecycle/finalize.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/core/lifecycle/ledger.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/core/lifecycle/step_timing.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/entry/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/entry/backend_common.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/entry/opd_train.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/entry/opd_train_runner.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/entry/prompt_rows.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/entry/rl_train.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/entry/rl_train_runner.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/entry/score_batcher.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/entry/sft_train.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/entry/sft_train_runner.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/opd/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/opd/bridging/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/opd/bridging/batching.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/opd/bridging/bridge.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/opd/bridging/failures.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/opd/bridging/prompts.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/opd/bridging/scoring.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/opd/child/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/opd/child/bridge.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/opd/child/entry.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/opd/child/multiturn.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/opd/child/plugin.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/opd/child/replay_guard.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/opd/child/runtime.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/opd/child/structured.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/opd/child/tensors.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/opd/multiturn/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/opd/multiturn/media.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/opd/multiturn/validation.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/opd/orchestration/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/opd/orchestration/failures.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/opd/orchestration/gkd.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/opd/orchestration/overrides.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/opd/orchestration/progress.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/opd/orchestration/prompt_preparation.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/opd/orchestration/protocol.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/opd/orchestration/reporting.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/opd/orchestration/state.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/opd/orchestration/validation.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/rl/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/rl/child/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/rl/child/entry.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/rl/child/multiturn.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/rl/child/patches.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/rl/child/plugin.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/rl/launch/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/rl/launch/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/rl/launch/config.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/rl/launch/inputs.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/rl/launch/verl_config.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/rl/rollout/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/rl/rollout/identity.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/rl/rollout/multi_turn.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/rl/rollout/reward_module.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/rl/rollout/scoring.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/rl/rollout/single_turn.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/sft/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/sft/child/entry.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/sft/child/plugin.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/sft/setup/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/sft/setup/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/train/sft/setup/config.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/verl/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/verl/capabilities.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/verl/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/verl/child_io.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/verl/diagnostics.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/verl/parallelism.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/verl/parent_work.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/engine/worker/verl/process_census.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/envs/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/envs/loading/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/envs/loading/adapter.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/envs/loading/base.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/envs/loading/loader.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/envs/loading/pull.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/envs/loading/staged.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/envs/meta/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/envs/meta/cache_security.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/envs/meta/dataset_selection.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/envs/meta/evaluations.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/envs/meta/identity.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/envs/meta/namespace_listing.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/envs/package/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/envs/package/direct_tokens.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/envs/package/limits.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/envs/package/unpack.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/providers/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/providers/_lifecycle/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/providers/_lifecycle/bootstrapping/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/providers/_lifecycle/bootstrapping/console.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/providers/_lifecycle/bootstrapping/pip.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/providers/_lifecycle/bootstrapping/secrets.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/providers/_lifecycle/host/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/providers/_lifecycle/host/deadline_sleep.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/providers/_lifecycle/host/failmark.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/providers/_lifecycle/host/hostlog.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/providers/_lifecycle/instances/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/providers/_lifecycle/instances/poll.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/providers/_lifecycle/instances/poll_instance.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/providers/_lifecycle/instances/terminal_artifacts.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/providers/_lifecycle/net/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/providers/_lifecycle/net/auth.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/providers/_lifecycle/net/deadline.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/providers/_lifecycle/net/http.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/providers/artifacts/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/providers/artifacts/hf.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/providers/artifacts/preload_runpod.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/providers/core/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/providers/core/allocator.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/providers/core/fit_errors.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/providers/core/preflight.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/providers/core/realized.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/providers/core/registry.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/providers/core/sharding.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/providers/lambda_/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/providers/lambda_/client/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/providers/lambda_/client/api.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/providers/lambda_/client/auth.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/providers/lambda_/client/gpus.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/providers/lambda_/client/preflight.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/providers/lambda_/client/pricing.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/providers/lambda_/execution/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/providers/runpod/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/providers/runpod/client/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/providers/runpod/client/api.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/providers/runpod/client/auth.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/providers/runpod/client/cost.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/providers/runpod/client/gpus.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/providers/runpod/client/preflight.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/providers/runpod/client/pricing.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/providers/runpod/execution/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/providers/runpod/execution/jobs.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/providers/runpod/execution/polling.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/providers/runpod/serverless/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/providers/vast/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/providers/vast/client/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/providers/vast/client/api.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/providers/vast/client/auth.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/providers/vast/client/preflight.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/providers/vast/client/pricing.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/providers/vast/execution/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/py.typed +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/runner/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/runner/accounting/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/runner/accounting/artifacts.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/runner/accounting/costs.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/runner/accounting/reconciliation.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/runner/accounting/weight_cache.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/runner/lifecycle/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/runner/lifecycle/attempts.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/runner/lifecycle/claim_lock.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/runner/lifecycle/deadlines.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/runner/lifecycle/preparation.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/runner/lifecycle/reporting.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/runner/lifecycle/state.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/runner/lifecycle/submit.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/runner/results/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/runner/results/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/runner/results/verified_revisions.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/runner/supervise/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/runner/supervise/attach_reconcile.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/runner/supervise/deploy.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/runner/supervise/errors.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/runner/supervise/retry_decision.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/runner/supervise/transitions.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/runtime_capsule/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/runtime_capsule/build.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/runtime_capsule/manifest.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/schema/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/schema/fields.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serve/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serve/app/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serve/app/__main__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serve/app/bootstrap.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serve/app/chat_stream.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serve/app/launch.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serve/app/manifest.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serve/app/materialize.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serve/app/openai.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serve/contract/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serve/contract/errors.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serve/contract/protocol.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serve/contract/provenance.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serve/contract/responses.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serve/contract/urls.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serve/control/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serve/control/_canonical.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serve/control/_serialization.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serve/control/_urls.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serve/control/credentials.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serve/control/planning.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serve/control/types.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serve/deployment/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serve/deployment/adapter_check.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serve/deployment/export.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serve/deployment/preflight.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serve/deployment/profiles.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serve/deployment/readiness.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serve/deployment/resolve.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serve/provisioning/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serve/provisioning/common/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serve/provisioning/common/records.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serve/provisioning/modal/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serve/provisioning/modal/execution/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serve/provisioning/modal/execution/deployment.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serve/provisioning/modal/execution/lifecycle.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serve/provisioning/modal/execution/operations.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serve/provisioning/modal/execution/sdk.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serve/provisioning/modal/planning/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serve/provisioning/modal/planning/plan.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serve/provisioning/modal/planning/resources.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serve/provisioning/modal/planning/wrapper.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serve/provisioning/modal/readiness_checks/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serve/provisioning/modal/readiness_checks/probe.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serve/provisioning/modal/readiness_checks/readiness.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serve/provisioning/modal/readiness_checks/teardown.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serve/request/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serve/request/openai.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serve/request/runtime_support.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serve/request/streaming.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serve/request/thinking.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serve/request/validation.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serve/runtime/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serve/runtime/adapters.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serve/runtime/engine.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serve/runtime/errors.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serve/runtime/multimodal.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serve/runtime/prompt.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serve/runtime/sampling.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serve/runtime/structured_outputs.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serve/runtime/types.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/server/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/server/__main__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/server/asgi/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/server/asgi/cli.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/server/billing/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/server/billing/retry.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/server/domain/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/server/domain/ops/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/server/domain/ops/repo_cleanup.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/server/domain/ops/serving_resources.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/server/domain/registry/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/server/domain/registry/runs.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/server/domain/teacher/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/server/domain/teacher/broker.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/server/domain/teacher/errors.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/server/domain/teacher/requests.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/server/platform/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/server/platform/db.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/server/platform/deps.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/server/platform/locks.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/server/routes/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/server/routes/envs.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/server/routes/meta.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/server/routes/runs.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/server/routes/serving_chat.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/server/routes/serving_completion.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/server/routes/serving_revisions.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/server/routes/serving_smoke.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/server/routes/teacher.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serving/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serving/app/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serving/src/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serving/src/accounting/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serving/src/accounting/usage.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serving/src/engine/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serving/src/engine/boot.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serving/src/engine/errors.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serving/src/engine/lora_entries.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serving/src/engine/model_config.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serving/src/engine/prequant_config.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serving/src/engine/support.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serving/src/http/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serving/src/http/adapter_routes.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serving/src/http/body_limit.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serving/src/http/context.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serving/src/http/headers.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serving/src/http/inference_routes.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serving/src/http/router.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serving/src/http/routing.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serving/src/io/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serving/src/io/multimodal.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serving/src/io/openai_request.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serving/src/io/openai_stream.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serving/src/io/provenance.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serving/src/io/requests.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serving/src/io/schemas.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serving/src/io/streaming.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serving/src/io/structured_outputs.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serving/src/store/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serving/src/store/access.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serving/src/store/lookup.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serving/src/store/persisted_columns.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serving/src/store/persistence.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serving/src/store/registration.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serving/src/store/registry.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serving/src/store/settings.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serving/src/store/supabase_rest.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/serving/src/store/undeploy.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/snapshot/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/snapshot/archive.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/teacher/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/teacher/limits.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/teacher/provider_status.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/flash/teacher/retry_contract.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/scripts/build_dev_dist.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/scripts/check_file_size.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/scripts/check_function_size.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/scripts/check_rollout_identity_actor.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/scripts/check_source_layout.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/scripts/check_verl_pin_exists.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/scripts/qualify_serving_profile.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/scripts/scrub_history.sh +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/serve_launch.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/_helpers/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/_helpers/chat_provenance.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/_helpers/chat_transport.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/_helpers/managed_chat.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/_helpers/profile.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/_helpers/server_api_plugin.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/_helpers/source_snapshot.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/_helpers/specs.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/_helpers/teacher.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/_helpers/vast.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/capture_image_sft_processor_oracle.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/capture_qwen38_27b_metadata.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/conftest.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/fixtures/image_sft_processor_oracle.json +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/fixtures/qwen35_9b_target_metadata.json +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/fixtures/qwen38_27b_target_metadata.json +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/fixtures/vllm_023_moe_lora/lora_context.py.gz +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/fixtures/vllm_023_moe_lora/modular_kernel.py.gz +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/fixtures/vllm_023_moe_lora/triton_moe.py.gz +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/live/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/live/conftest.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/live/test_lambda_live.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/live/test_runpod_live.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/live/test_sft_thinking_render_live.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/live/test_vast_live.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/serving/checkpoint_fixtures.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/serving/conftest.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/serving/test_base_model_serving.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/serving/test_chat_auth.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/serving/test_chat_authorizer.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/serving/test_checkpoint_identity_repairs.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/serving/test_checkpoint_model_validation.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/serving/test_engine_error_status.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/serving/test_fp8_config.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/serving/test_immutable_engine.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/serving/test_immutable_revisions.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/serving/test_immutable_schemas.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/serving/test_mirror_sampling_parity.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/serving/test_modal_deploy_identity.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/serving/test_modal_image_paths.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/serving/test_model_config.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/serving/test_multimodal.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/serving/test_openai_stream_options.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/serving/test_persistence.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/serving/test_pre_first_disconnect.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/serving/test_prequant_config.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/serving/test_registry.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/serving/test_registry_coverage.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/serving/test_request_body_limit.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/serving/test_router_coverage.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/serving/test_router_edge_coverage.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/serving/test_schemas_coverage.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/serving/test_serve_reasoning_split.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/serving/test_serve_thinking.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/serving/test_settings.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/serving/test_structured_outputs.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/serving/test_structured_outputs_coverage.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/serving/test_supabase_rest_coverage.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/serving_conformance/__init__.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/serving_conformance/conftest.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/serving_conformance/test_contract.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_accounting_coverage.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_adapter_shard_completeness.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_agent_flash_cli_contract.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_algorithms.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_allocator.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_backend_common.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_backend_jobspec_contract.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_bake_kernel_cache.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_base_model_provenance.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_billing_retry.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_build_context_contract.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_capture_qwen38_metadata.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_catalog_consistency.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_catalog_only_models.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_charge_pricing.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_chat_foundations.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_checkpoint_lifecycle.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_cli_commands.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_cli_commands_coverage.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_cli_credential_shadowing.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_cli_errors.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_cli_estimate.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_cli_gpus_flag.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_cli_help.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_cli_main_coverage.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_cli_managed.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_cli_render_coverage.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_cli_render_theme.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_cli_serve_deploy.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_cli_serve_status.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_cli_serve_undeploy.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_cli_traces.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_cli_wandb_warning.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_client.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_client_import_purity.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_client_server_integration.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_client_stream_reads.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_config_env_vars.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_config_overrides.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_console_upload.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_controlled_experiment_repairs.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_cost_analytical.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_cost_currency.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_cost_equation.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_cost_estimate.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_cost_hardware.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_cost_models.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_dataset_profile.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_deploy_latency.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_dev_channel.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_disk_gb.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_env_cache_evict.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_env_delete.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_env_download_api.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_env_evaluations.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_env_list_api.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_env_list_cli.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_env_list_hub.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_env_no_install.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_env_pull.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_env_pull_coverage.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_env_pull_loader_coverage.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_env_pull_managed_control_plane.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_env_rate_limit_resolve.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_env_test.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_envs_coverage.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_export.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_flash_mvp.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_flashinfer_cache_dirs.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_fused_expert_warmstart.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_github_urlopen_retry.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_gpu_type_single_field.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_grpo_checkpoint_durability.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_grpo_params.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_grpo_process_census.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_grpo_reward_batching.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_grpo_rollout_identity.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_health_liveness.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_hf_retry.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_image_environment_capability.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_image_incremental_processor.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_image_sft_markers.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_image_sft_processor_parity.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_image_tokens.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_infisical_secrets.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_internal_client.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_kernel_cache.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_kernel_fingerprint.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_kv_util.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_lambda_api_coverage.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_logging.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_login_perms.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_lora_rank_coverage.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_lora_rank_nested_rung.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_lora_rank_preflight.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_lora_targeting.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_lora_targeting_pinned_verl.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_managed_config_fields.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_managed_hf_repo.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_metrics_schema_agent_contract.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_mig_guard.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_mirror_sampling_parity.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_multimodal_training.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_named_reward_metrics.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_oom_escalate_gpu.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_opd.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_opd_limits.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_opd_multiturn_eos_boundary.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_opd_multiturn_failure_exit.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_opd_replay_guard.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_packing.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_packing_coverage.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_parasail_teacher.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_persisted_spec_envelope.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_poll_helpers.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_preflight.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_prompt_budget.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_provider_preflight_coverage.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_realized_cost.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_repo_cleanup.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_resolve_params_b.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_retry_decision.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_rl_train.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_rollout_samples.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_run_registry_lifecycle.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_runpod_api_delete.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_runpod_key_fingerprint.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_runpod_key_waterfall.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_runtime_capsule.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_serve.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_serve_app_launch.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_serve_app_manifest.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_serve_app_materialize.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_serve_app_packaging.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_serve_control.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_serve_docs.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_serve_modal_contract_lock.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_serve_modal_sdk.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_serve_modal_sdk_deadlines.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_serve_modal_teardown_identity.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_serve_profile_qualification.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_serve_profiles.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_serve_provisioning_common.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_serve_provisioning_modal.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_serve_reasoning_content.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_serve_resolve_provenance.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_serve_runtime_adapters.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_serve_runtime_engine.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_serve_runtime_package.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_serve_runtime_types.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_server_app_coverage.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_server_auth_singleflight.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_server_billing.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_server_db.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_server_locks_coverage.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_server_managed_chat_requests.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_server_serving_resources.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_serving_conformance_gate.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_serving_context_preflight.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_serving_schema_coverage.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_sft_chunked_nll.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_sft_example_selection.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_sft_gc_off.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_sft_max_context.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_sft_step_floor.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_sft_train.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_sft_workload.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_source_attestation_flow.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_source_layout.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_source_snapshot.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_spec_and_validation.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_spec_contract_bytes.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_step_floor.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_step_metrics.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_step_timing.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_structured_outputs.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_teacher_encoding_contract.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_terminal_artifacts.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_thinking_config.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_train_context_preflight.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_type_comment_prose.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_vast_api.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_vast_api_coverage.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_verified_revisions.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_verifiers.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_verl_checkpoint_export.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_verl_child_plugins.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_verl_silence_watchdog.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_version.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_vl_warmstart_adapter_keys.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_vllm_moe_lora_backport.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_vram_architecture.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_wandb_link.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_wandb_naming.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_warmstart_adapter_download.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_warmstart_error_attribution.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_warmstart_image_adapters.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_worker_dryrun.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_worker_image.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_worker_init_heartbeat.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_worker_thinking.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_workflow_contracts.py +0 -0
- {freesolo_flash_dev-1.2.124 → freesolo_flash_dev-1.2.128}/tests/test_workload_profile.py +0 -0
- {freesolo_flash_dev-1.2.124 → 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
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
# Hosted inference load testing
|
|
2
|
+
|
|
3
|
+
The `flash.serving.loadtest` package is an operator-only, public-HTTP load harness for the hosted
|
|
4
|
+
inference front door. It is not imported by production serving and it does not create, resize, inspect,
|
|
5
|
+
or destroy provider resources. Operators run it explicitly with the serving extra:
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
uv run --extra serving python -m flash.serving.loadtest validate scenario.json
|
|
9
|
+
uv run --extra serving python -m flash.serving.loadtest discover scenario.json
|
|
10
|
+
uv run --extra serving python -m flash.serving.loadtest run scenario.json results/fake-five-phase
|
|
11
|
+
uv run --extra serving python -m flash.serving.loadtest summarize results/fake-five-phase
|
|
12
|
+
uv run --extra serving python -m flash.serving.loadtest verify results/fake-five-phase
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
`validate` is allocation-free and performs no HTTP request. `discover` calls only `GET /healthz`.
|
|
16
|
+
`run` calls only `GET /healthz` and `POST /v1/chat/completions`. The credential value is read from the
|
|
17
|
+
environment variable named by `credential_env`; never put a credential value in a scenario file.
|
|
18
|
+
There are no request retries.
|
|
19
|
+
|
|
20
|
+
## Evidence boundary
|
|
21
|
+
|
|
22
|
+
The harness verifies exact deployment SHA and deployment id, required capabilities, required base
|
|
23
|
+
models, and immutable adapter response provenance. It checks health before and after every phase and
|
|
24
|
+
at the midpoint of each duration phase. Its evidence remains HTTP-only:
|
|
25
|
+
|
|
26
|
+
- it cannot prove that a live replica scaled out;
|
|
27
|
+
- it cannot prove that an engine was actually cold or at scale zero;
|
|
28
|
+
- it cannot distinguish a dispatch deadline from the underlying resource constraint;
|
|
29
|
+
- it cannot establish an availability SLA;
|
|
30
|
+
- fake and test runs cannot support production claims.
|
|
31
|
+
|
|
32
|
+
A `cold_burst` therefore records either `cold_scale_out_intent_http_unattested` or
|
|
33
|
+
`true_scale_zero_intent_http_unattested`. That is an honest statement of the authored intent, not an
|
|
34
|
+
attestation of provider state.
|
|
35
|
+
|
|
36
|
+
## Strict scenario
|
|
37
|
+
|
|
38
|
+
Scenarios are strict Pydantic v2 JSON. Unknown fields and fields that belong to another phase kind are
|
|
39
|
+
rejected. The authored `phases` list may contain any subset of the five supported discriminated kinds
|
|
40
|
+
in any order, except that a present `cold_burst` must be the first inference-producing phase. A complete
|
|
41
|
+
five-phase scenario uses `cold_burst`, `warm`, `sustained`, `mixed`, then `overload`.
|
|
42
|
+
|
|
43
|
+
Dynamic base-model discovery reads `base_models` from `/healthz`, then applies `include`, `exclude`, and
|
|
44
|
+
`require`. `require` is a hard gate.
|
|
45
|
+
|
|
46
|
+
Explicit adapter targets must name the immutable model id, base model, and checkpoint. The request
|
|
47
|
+
carries `X-Freesolo-Expected-Checkpoint` and the response must match `X-Freesolo-Checkpoint`.
|
|
48
|
+
|
|
49
|
+
`adapter_revision` and `hf_revision` are optional, because the hosted app does not emit them on every
|
|
50
|
+
deployment. Omitting one verifies checkpoint identity alone rather than passing a header check the
|
|
51
|
+
deployment never answered. Supplying one asserts that the deployment does emit it, so a response that
|
|
52
|
+
omits or changes it is a provenance mismatch, never a skipped assertion. A supplied `hf_revision` must
|
|
53
|
+
still be a canonical 40-character hub commit SHA.
|
|
54
|
+
|
|
55
|
+
`/healthz` is read for `ok`, deployment identity, capabilities, and `base_models`. `accounting_ok` is
|
|
56
|
+
optional: a deployment that does not report it is not treated as an accounting failure, while an
|
|
57
|
+
explicit `false` stops the run. Note that `/healthz.gpus` is the configured supported-base-model engine
|
|
58
|
+
count, not a live container count, so it can never be read as a replica count.
|
|
59
|
+
|
|
60
|
+
This fake example covers every phase kind:
|
|
61
|
+
|
|
62
|
+
```json
|
|
63
|
+
{
|
|
64
|
+
"schema_version": 1,
|
|
65
|
+
"name": "fake five-phase hosted inference",
|
|
66
|
+
"endpoint": "https://example.invalid",
|
|
67
|
+
"expected_deployment": {
|
|
68
|
+
"sha": "94210a3",
|
|
69
|
+
"deployment_id": "fake-deployment-1"
|
|
70
|
+
},
|
|
71
|
+
"credential_env": "FAKE_SERVING_TOKEN",
|
|
72
|
+
"required_capabilities": ["permanent_checkpoint_identity"],
|
|
73
|
+
"discovery": {
|
|
74
|
+
"enabled": true,
|
|
75
|
+
"include": ["model-a", "model-b", "model-c"],
|
|
76
|
+
"exclude": ["model-b"],
|
|
77
|
+
"require": ["model-a"]
|
|
78
|
+
},
|
|
79
|
+
"targets": [],
|
|
80
|
+
"profiles": [
|
|
81
|
+
{
|
|
82
|
+
"name": "short",
|
|
83
|
+
"weight": 1.0,
|
|
84
|
+
"messages": [{ "role": "user", "content": "Return one short sentence." }],
|
|
85
|
+
"max_tokens": 16,
|
|
86
|
+
"temperature": 0.0,
|
|
87
|
+
"top_p": 0.95
|
|
88
|
+
}
|
|
89
|
+
],
|
|
90
|
+
"client": {
|
|
91
|
+
"connect_timeout_seconds": 5.0,
|
|
92
|
+
"read_timeout_seconds": 30.0,
|
|
93
|
+
"write_timeout_seconds": 10.0,
|
|
94
|
+
"pool_timeout_seconds": 5.0,
|
|
95
|
+
"max_in_flight": 8,
|
|
96
|
+
"max_scheduling_lag_ms": 100.0
|
|
97
|
+
},
|
|
98
|
+
"seed": 17,
|
|
99
|
+
"fake": true,
|
|
100
|
+
"phases": [
|
|
101
|
+
{
|
|
102
|
+
"name": "cold",
|
|
103
|
+
"kind": "cold_burst",
|
|
104
|
+
"requests": 4,
|
|
105
|
+
"burst_window_seconds": 0.2,
|
|
106
|
+
"cold_intent": "cold_scale_out"
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
"name": "warm",
|
|
110
|
+
"kind": "warm",
|
|
111
|
+
"requests": 4,
|
|
112
|
+
"concurrency": 2
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
"name": "sustained",
|
|
116
|
+
"kind": "sustained",
|
|
117
|
+
"duration_seconds": 2.0,
|
|
118
|
+
"rate_rps": 2.0
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
"name": "mixed",
|
|
122
|
+
"kind": "mixed",
|
|
123
|
+
"duration_seconds": 2.0,
|
|
124
|
+
"rate_rps": 3.0
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
"name": "overload",
|
|
128
|
+
"kind": "overload",
|
|
129
|
+
"expects_capacity_contract": false,
|
|
130
|
+
"stages": [
|
|
131
|
+
{ "duration_seconds": 1.0, "rate_rps": 4.0 },
|
|
132
|
+
{ "duration_seconds": 1.0, "rate_rps": 8.0 }
|
|
133
|
+
]
|
|
134
|
+
}
|
|
135
|
+
]
|
|
136
|
+
}
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
`warm` is the only closed-loop phase. Its authored request count is completed with bounded
|
|
140
|
+
concurrency. Every other phase is open-loop. Its dispatch offsets are computed before the phase
|
|
141
|
+
starts. If the client cannot admit an offset within `max_in_flight` and `max_scheduling_lag_ms`, the
|
|
142
|
+
harness writes a terminal `client_admission_missed` record instead of converting that offered request
|
|
143
|
+
into delayed closed-loop work. Overload stages use the same rule and never retry.
|
|
144
|
+
|
|
145
|
+
## Stream and artifact contract
|
|
146
|
+
|
|
147
|
+
Streaming requests ask for usage. Every SSE `data:` payload must be valid JSON, followed by exactly
|
|
148
|
+
one `[DONE]`; data after `[DONE]`, a missing terminal finish reason, or a missing `[DONE]` is a protocol
|
|
149
|
+
error. The first nonempty `content` or `reasoning_content` delta defines time to first generated token.
|
|
150
|
+
The first nonempty visible `content` delta is measured separately. Missing usage makes token throughput
|
|
151
|
+
unavailable for that request; the harness never estimates tokens from chunks.
|
|
152
|
+
|
|
153
|
+
Only HTTP 503 with error code `serving_capacity_unavailable` and `Retry-After: 1` is counted as exact
|
|
154
|
+
capacity rejection. Other 503 responses and 429 responses are separate classes.
|
|
155
|
+
|
|
156
|
+
An error body can echo the request back, so only a machine error code is read out of it. A code that
|
|
157
|
+
does not look like a slug is recorded as `unrecognized_code`, and a free-text `message` is never
|
|
158
|
+
persisted.
|
|
159
|
+
|
|
160
|
+
### Overload cannot be demonstrated without a capacity contract
|
|
161
|
+
|
|
162
|
+
Current Flash `dev` implements no retryable capacity contract. Its engine error mapping returns 504
|
|
163
|
+
for an engine timeout and 502 for other upstream failures; there is no capacity 503 and no
|
|
164
|
+
`Retry-After: 1`. An overload phase run against such a deployment therefore cannot produce a clean
|
|
165
|
+
rejection signal at all.
|
|
166
|
+
|
|
167
|
+
An overload phase declares this with `expects_capacity_contract`, which defaults to `false`. The flag
|
|
168
|
+
never changes how a response is classified. It only records whether an absence of capacity rejections
|
|
169
|
+
is an accurate description of the deployment or a failed expectation:
|
|
170
|
+
|
|
171
|
+
| observed | `expects_capacity_contract` | verdict |
|
|
172
|
+
| ------------------------------- | --------------------------- | ----------------------------------------------------- |
|
|
173
|
+
| at least one exact capacity 503 | either | `capacity_rejection_observed` |
|
|
174
|
+
| none | `false` | `overload_not_demonstrated` |
|
|
175
|
+
| none | `true` | `overload_not_demonstrated_despite_declared_contract` |
|
|
176
|
+
|
|
177
|
+
**An absence of capacity rejections is never evidence of headroom.** A deployment without a capacity
|
|
178
|
+
contract sheds load in ways this harness cannot distinguish from ordinary failure over public HTTP.
|
|
179
|
+
When any overload phase declares no capacity contract, the summary carries that limitation explicitly.
|
|
180
|
+
No overload phase is ever summarized as a success on the strength of a quiet run.
|
|
181
|
+
|
|
182
|
+
Each run claims a new result directory and writes:
|
|
183
|
+
|
|
184
|
+
- `scenario.authored.json`, with prompt content redacted;
|
|
185
|
+
- `scenario.resolved.json`, with discovered targets and cold-intent labels;
|
|
186
|
+
- `events.jsonl`, through one event writer with one terminal row per scheduled request;
|
|
187
|
+
- `summary.json`, atomically;
|
|
188
|
+
- `complete.json`, last, with row counts, byte counts, and SHA-256 hashes.
|
|
189
|
+
|
|
190
|
+
An interrupted run closes the event stream but never writes `complete.json`. It remains inspectable and
|
|
191
|
+
`verify` rejects it as incomplete. Version 1 has no partial-phase resume.
|
|
192
|
+
|
|
193
|
+
Artifacts never contain credentials, authorization or request headers, generated text, raw response
|
|
194
|
+
bodies, or per-request prompts. Persisted response headers are limited to content type, retry-after,
|
|
195
|
+
and immutable provenance.
|
|
196
|
+
|
|
197
|
+
## Metrics
|
|
198
|
+
|
|
199
|
+
`summary.json` reports overall and per-phase, per-target, and per-profile values:
|
|
200
|
+
|
|
201
|
+
- scheduled, dispatched, completed, successful, and client-admission-missed counts;
|
|
202
|
+
- offered, dispatch, and completion rates with explicit denominator seconds and basis;
|
|
203
|
+
- scheduling, header, first-generated, first-visible, and total latency p50, p90, p95, p99, and max;
|
|
204
|
+
- usage coverage and token totals, aggregate output token rate, and decode token rate;
|
|
205
|
+
- peak client in-flight, HTTP status and error counts, retry count, exact capacity ratio, and 429 count;
|
|
206
|
+
- authored versus achieved target and profile mix;
|
|
207
|
+
- explicit sustained and mixed authored, scheduling, dispatch, and completion windows.
|
|
208
|
+
|
|
209
|
+
## B200 owner handoff
|
|
210
|
+
|
|
211
|
+
The harness does not allocate a B200 and does not attest provider state. The B200 deployment owner must
|
|
212
|
+
complete the provider-side handoff before an operator runs a non-fake scenario:
|
|
213
|
+
|
|
214
|
+
1. identify the already deployed endpoint, exact release SHA, deployment id, and intended base models;
|
|
215
|
+
2. confirm the B200 resource is owned, budgeted, and governed outside this harness;
|
|
216
|
+
3. decide whether the cold intent is `cold_scale_out` or `true_scale_zero`, and establish that state
|
|
217
|
+
through the provider control plane without using the harness;
|
|
218
|
+
4. provide only the name of the existing credential environment variable in the scenario;
|
|
219
|
+
5. run `validate`, then `discover`, and confirm the resolved two-of-three or other intended model set;
|
|
220
|
+
6. run into a new result directory, then run `verify` before interpreting `summary.json`;
|
|
221
|
+
7. retain provider-side replica and hardware evidence separately if a scale-out or B200 claim is needed.
|
|
222
|
+
|
|
223
|
+
A successful HTTP load run is not provider-side proof of B200 identity, replica count, scale-to-zero,
|
|
224
|
+
or autoscaler behavior.
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"""authenticated stdlib HTTP that does not let the stdlib replay a credential across a redirect.
|
|
2
|
+
|
|
3
|
+
`urllib.request.Request` keeps two header bags. `headers` survives a redirect:
|
|
4
|
+
`HTTPRedirectHandler.redirect_request` builds the follow-up request by copying it, stripping only
|
|
5
|
+
content headers. `unredirected_hdrs` does not survive, and `AbstractHTTPHandler.do_open` sends both.
|
|
6
|
+
application code that writes `Request(url, headers={"Authorization": ...})` lands the credential in
|
|
7
|
+
the surviving bag, so the stdlib replays the token against whatever host the `Location` names.
|
|
8
|
+
|
|
9
|
+
the fix is to move the caller's credential into the bag a redirect cannot copy. it survives any
|
|
10
|
+
transport that forwards the request as it was handed over, so it still holds for a tracing or
|
|
11
|
+
compatibility wrapper that only delegates.
|
|
12
|
+
|
|
13
|
+
two things it does not cover, both because the credential ends up on an object this module never
|
|
14
|
+
touched:
|
|
15
|
+
|
|
16
|
+
- a transport that rebuilds the request. `Request.header_items()` merges both bags, so a wrapper
|
|
17
|
+
that reconstructs with `Request(url, headers=dict(req.header_items()))` puts the credential back
|
|
18
|
+
in the redirectable bag, and its inner call follows redirects normally.
|
|
19
|
+
- a credential a handler adds mid-open. `redirect_request` builds each hop as a fresh `Request`, so
|
|
20
|
+
anything scoped to the object we were handed is gone by the second hop; a credentialed
|
|
21
|
+
`ProxyHandler` re-adds `Proxy-Authorization` to that fresh request and no work on ours reaches it.
|
|
22
|
+
|
|
23
|
+
containing either is the redirect refusal's job, not this function's.
|
|
24
|
+
|
|
25
|
+
on top of that the stdlib path refuses the hop outright. no flash or freesolo endpoint answers 3xx,
|
|
26
|
+
so this rejects rather than deciding which hops are safe, and surfaces as an `HTTPError` that every
|
|
27
|
+
caller already classifies.
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
from __future__ import annotations
|
|
31
|
+
|
|
32
|
+
import urllib.request
|
|
33
|
+
from collections.abc import Callable
|
|
34
|
+
from typing import Any
|
|
35
|
+
|
|
36
|
+
_UrlOpen = Callable[..., Any]
|
|
37
|
+
|
|
38
|
+
# headers that authenticate the request and must never reach a redirect target.
|
|
39
|
+
_CREDENTIAL_HEADERS = ("authorization", "proxy-authorization", "cookie", "x-api-key")
|
|
40
|
+
|
|
41
|
+
# the stdlib transport as it was before any test replaced it. comparing against the live
|
|
42
|
+
# `urllib.request.urlopen` instead would defeat the check: a replaced attribute is trivially
|
|
43
|
+
# identical to itself, so every fake would be routed through the opener stack and never called.
|
|
44
|
+
_STDLIB_URLOPEN: _UrlOpen = urllib.request.urlopen
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class _NoRedirectHandler(urllib.request.HTTPRedirectHandler):
|
|
48
|
+
"""raise 3xx instead of following it."""
|
|
49
|
+
|
|
50
|
+
def redirect_request(self, req, fp, code, msg, headers, newurl):
|
|
51
|
+
return None
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def _move_credentials_to_the_unredirected_bag(request: urllib.request.Request) -> None:
|
|
55
|
+
"""move the caller's credential headers into the bag `redirect_request` does not copy.
|
|
56
|
+
|
|
57
|
+
`do_open` sends `unredirected_hdrs` and `headers` together, so the request is unchanged on the
|
|
58
|
+
wire. only the follow-up request a redirect would build loses them.
|
|
59
|
+
"""
|
|
60
|
+
|
|
61
|
+
for name in list(request.headers):
|
|
62
|
+
if name.lower() not in _CREDENTIAL_HEADERS:
|
|
63
|
+
continue
|
|
64
|
+
# `do_open` gives `unredirected_hdrs` precedence, so an entry already there is the value
|
|
65
|
+
# being sent. dropping the redirectable duplicate keeps that principal on the wire;
|
|
66
|
+
# promoting it instead would silently authenticate as someone else.
|
|
67
|
+
canonical = request.unredirected_hdrs.get(name)
|
|
68
|
+
value = request.headers[name]
|
|
69
|
+
# `remove_header` pops from both bags, so it has to run before the value is re-added.
|
|
70
|
+
request.remove_header(name)
|
|
71
|
+
request.add_unredirected_header(name, value if canonical is None else canonical)
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def _urlopen_no_redirect(
|
|
75
|
+
request: urllib.request.Request,
|
|
76
|
+
*,
|
|
77
|
+
timeout: float,
|
|
78
|
+
urlopen: _UrlOpen | None = None,
|
|
79
|
+
):
|
|
80
|
+
"""open one authenticated request through a transport that refuses redirects.
|
|
81
|
+
|
|
82
|
+
the transport is read at call time rather than bound at import, because many tests replace
|
|
83
|
+
`urllib.request.urlopen` with a fake. a replaced transport is called directly: it is not the
|
|
84
|
+
stdlib opener stack, so routing it through a no-redirect opener would not reach it. every
|
|
85
|
+
authenticated call site in flash passes either nothing or `urllib.request.urlopen` itself, so
|
|
86
|
+
production always takes the refusing opener below; the direct branch exists for those fakes.
|
|
87
|
+
|
|
88
|
+
that makes the refusal guarantee conditional on the transport, and the condition is the global
|
|
89
|
+
being the one this module imported. rebinding `urllib.request.urlopen` after import - a test
|
|
90
|
+
fake, an apm shim installed at runtime - routes the call to the direct branch, which does not
|
|
91
|
+
refuse. relocation still runs first and still holds, so the credential cannot ride a hop the
|
|
92
|
+
replacement forwards as handed over; what is lost is refusal, and with it containment of the
|
|
93
|
+
two rebuild-and-handler gaps the module docstring names. a replacement transport owns its own
|
|
94
|
+
redirect policy.
|
|
95
|
+
"""
|
|
96
|
+
|
|
97
|
+
_move_credentials_to_the_unredirected_bag(request)
|
|
98
|
+
transport = urlopen if urlopen is not None else urllib.request.urlopen
|
|
99
|
+
if transport is not _STDLIB_URLOPEN:
|
|
100
|
+
return transport(request, timeout=timeout)
|
|
101
|
+
return urllib.request.build_opener(_NoRedirectHandler()).open(request, timeout=timeout)
|
{freesolo_flash_dev-1.2.124 → 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.124 → 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
|
|
@@ -9,6 +9,7 @@ import urllib.request
|
|
|
9
9
|
from typing import Any
|
|
10
10
|
|
|
11
11
|
from flash._internal.channel import CLI_NAME
|
|
12
|
+
from flash._internal.http import _urlopen_no_redirect
|
|
12
13
|
from flash.client.http import (
|
|
13
14
|
FREESOLO_AUTH_VERIFY_PATH,
|
|
14
15
|
FREESOLO_EVAL_RUNS_PATH,
|
|
@@ -34,7 +35,7 @@ def verify_freesolo_key(api_key: str, base_url: str | None = None) -> None:
|
|
|
34
35
|
headers={"Authorization": f"Bearer {api_key}", "Content-Type": "application/json"},
|
|
35
36
|
)
|
|
36
37
|
try:
|
|
37
|
-
with
|
|
38
|
+
with _urlopen_no_redirect(req, timeout=30) as resp:
|
|
38
39
|
resp.read()
|
|
39
40
|
except urllib.error.HTTPError as exc:
|
|
40
41
|
if exc.code in (401, 403):
|
|
@@ -77,7 +78,7 @@ def _freesolo_request(
|
|
|
77
78
|
headers={"Authorization": f"Bearer {api_key}", "Content-Type": "application/json"},
|
|
78
79
|
)
|
|
79
80
|
try:
|
|
80
|
-
with
|
|
81
|
+
with _urlopen_no_redirect(req, timeout=timeout) as resp:
|
|
81
82
|
raw = resp.read()
|
|
82
83
|
except urllib.error.HTTPError as exc:
|
|
83
84
|
if exc.code == 401:
|
|
@@ -15,6 +15,7 @@ from collections.abc import Iterator, Mapping
|
|
|
15
15
|
from typing import Any
|
|
16
16
|
|
|
17
17
|
from flash._internal.channel import CLI_NAME
|
|
18
|
+
from flash._internal.http import _urlopen_no_redirect
|
|
18
19
|
from flash._internal.openai_sse import (
|
|
19
20
|
DeltaEvent,
|
|
20
21
|
ErrorEvent,
|
|
@@ -408,7 +409,7 @@ class ApiClient:
|
|
|
408
409
|
deadline = time.monotonic() + body_deadline if body_deadline is not None else None
|
|
409
410
|
with (
|
|
410
411
|
self._translate_http_errors(),
|
|
411
|
-
|
|
412
|
+
_urlopen_no_redirect(
|
|
412
413
|
req, timeout=_capped_timeout(timeout or self.timeout, deadline)
|
|
413
414
|
) as resp,
|
|
414
415
|
):
|
|
@@ -435,7 +436,7 @@ class ApiClient:
|
|
|
435
436
|
)
|
|
436
437
|
with (
|
|
437
438
|
self._translate_http_errors(),
|
|
438
|
-
|
|
439
|
+
_urlopen_no_redirect(req, timeout=timeout or self.timeout) as resp,
|
|
439
440
|
):
|
|
440
441
|
if max_bytes is not None:
|
|
441
442
|
return _read_capped_response(resp, max_bytes)
|
|
@@ -804,7 +805,7 @@ class ApiClient:
|
|
|
804
805
|
decoder = codecs.getincrementaldecoder("utf-8")()
|
|
805
806
|
with (
|
|
806
807
|
self._translate_http_errors(),
|
|
807
|
-
|
|
808
|
+
_urlopen_no_redirect(req, timeout=30 * 60) as resp,
|
|
808
809
|
):
|
|
809
810
|
content_type = resp.headers.get("Content-Type", "")
|
|
810
811
|
media_type = content_type.partition(";")[0].strip().lower()
|
|
@@ -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
|